Hello
Grand merci pour les améliorations et bonne année!
Je me suis amusé à télécharger le code (très bien écrit!) et j'ai quelques autres suggestions, notamment pour TF1 (je voudrais pouvoir télécharger le jt complet).
1- l'url de la catégorie du jt-20h est en ce moment dans habitv "http://videos.tf1.fr/jt-20h/" mais cette url ne contient que quelques extraits du dernier journal. Les épisodes complets sont dans "http://videos.tf1.fr/jt-20h/video-integrale/". Cette url est disponible dans TF1Conf.HOME_URL mais ils faudrait juste la parser différemment (extraction de rel_url ci dessous):
Code : Tout sélectionner
public static Set<CategoryDTO> findCategory() {
final Set<CategoryDTO> categories = new HashSet<>();
...
if (attr.contains("|")) {
final String key = attr.split("\\|")[3];
//==============================<changement>=========================
final String rel_url = url.startsWith(TF1Conf.HOME_URL) ? url.substring(TF1Conf.HOME_URL.length()) : key;
categories.add(new CategoryDTO(TF1Conf.NAME, key, rel_url, TF1Conf.EXTENSION));
//==============================</changement>=========================
...
}
2-le journal de tf1 est fragmenté... on peut récupérer l'url de tous les fragments dans le <div/> carousel dispo dans la page de chaque épisode. Pour plus de simplicité de mon côté, je télécharge tous les fragments en tant qu'épisodes. Ça permet d'avoir un téléchargement en parallèle sans trop de difficulté (je ne suis pas capable de changer le code en profondeur). Par contre ça pose des difficultés pour rassembler les morceaux - je pense que ça devrait pouvoir être fait dans un exporter et je travaille dessus maintenant.
Code : Tout sélectionner
public static Set<EpisodeDTO> findEpisode(final CategoryDTO category) {
final Set<EpisodeDTO> episodes = new HashSet<>();
try {
final Connection con = Jsoup.connect(TF1Conf.HOME_URL + "/" + category.getId());
final Elements select = con.get().select(".teaser");
for (final Element element : select) {
try {
final Element divInfoIntegrale = element.child(1);
if (("description".equals(divInfoIntegrale.attr("class")) || "infosTeaser".equals(divInfoIntegrale.attr("class")) || "infosIntegrale"
.equals(divInfoIntegrale.attr("class"))) && divInfoIntegrale.children().size() > 1) {
final Element child = divInfoIntegrale.child(1);
if (!child.children().isEmpty()) {
final String title = child.child(0).text();
final String url = child.child(0).attr("href");
//==============================<changement>=========================
if(category.getId().startsWith("jt-")) {
final Connection episode = Jsoup.connect(TF1Conf.HOME_URL + url);
final Elements carouselList = episode.get().select("div[id^=carousel]");
if(!carouselList.isEmpty()) {
final Elements chunkBlocks = carouselList.first().select("[class^=teaser]");
int i = 0;
for (final Element chunkBlock : chunkBlocks) {
++i;
final String chunk_title = title + " (" + String.format("%02d", i) + "/" + String.format("%02d", chunkBlocks.size()) + ") " + chunkBlock.getElementsByTag("img").first().attr("alt");
final String chunk_url = chunkBlock.getElementsByTag("a").get(2).attr("href");
episodes.add(new EpisodeDTO(category, chunk_title, chunk_url));
}
}
}
else episodes.add(new EpisodeDTO(category, title, url));
//==============================</changement>=========================
}
}
} catch (final IndexOutOfBoundsException e) {
LOGGER.error(element, e);
throw new TechnicalException(e);
}
}
} catch (final IOException e) {
throw new TechnicalException(e);
}
return episodes;
}
Note: "jt-" est méchamment hardcodé car dans certaines catégories comme "reportages": le <div> carousel contient *tous* les épisodes sur beaucoup de pages donc ça engendre un très grand nombre de téléchargements dupliqués.
3- Pluzz fait aussi appel à des fragments (bien qu'en beaucoup plus grand nombre que TF1). Il serait donc peut être intéressant d'introduire un niveau supplémentaire channel > category > episode > fragment, et avoir la possibilité de télécharger les fragments en parallele et demander au framework de faire l'assemblage quand tous les fragments sont téléchargés (je suis incapable d'écrire ce code et je me doute que ce serait un changement en profondeur dans l'application).
Encore une fois ce ne sont que des suggestions, je te laisse peser les pour et les contre. Le plugin TF1 doit te paraître comme des vacances comparé au plugin pluzz!
sergiogiogio