TV Shows : Mon module Netvibes (3ème partie)
Lundi 14 janvier 2008 à 14 h 25
Précédemment sur ce blog:
Nous avons donc deux types de données à récupérer :
- La liste des séries actuelles qui est disponible sur cette page : http://epguides.com/menu/current.shtml.
- La liste des épisodes pour une série : http://epguides.com/Lost/.
Le traitement des données se fera donc en PHP. J’expliquerai sur mon prochain billet comment je récupère ces données (terminé) et on se penchera sur le design du widget (en cours).

Nous allons d'abord nous pencher sur la récupération des séries actuelles. J'ai décidé (ce n'est pas forcement le meilleur choix, à vrai dire, il serait plus logique de récupérer cette liste avec un fichier XML, mais je voulais tester le getFeed de l'UWA) de récupérer la liste des séries en cours via un fichier RSS. Tout d'abord pour récupérer une page distante via mon serveur, je dois passer par un proxy. J'ai donc choisit de récupérer sur le net une classe PHP gérant déjà ça : Class_Http et Proxy de Troy Wolf.
La première étape est d'ouvrir la page distante en lecture :
$dataFile = fopen("http://domain.com/proxy.php?proxy_url=http://epguides.com/menu/current.shtml", "r");
Etant donné que je souhaite produire un fichier RSS au final, j'indique les informations nécessaires afin que mon navigateur comprenne bien qu'il lit un fichier RSS :
header('Content-type: application/rss+xml');
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>
<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">
<channel>
<title>epguides.com - Current US TV Shows</title>
<description>Current US TV Shows from epguides.com RSS feed</description>
<language>en-us</language>
<ttl>60</ttl>
<link>http://domain.com</link>
<atom:link href=\"http://domain.com/getShows.php\" rel=\"self\" type=\"application/rss+xml\" />";
Une fois le début de fichier déclaré, on passe au listing d'items en soi. Je vais donc parcourir ma page html et récupérer les informations qui m'intéressent afin de les injecter dans mon flux RSS.
/** On vérifie l'ouverture du fichier **/
if ( $dataFile )
{
/** On indique que le parsing ne doit pas encore commencer **/
$parsing = false;
/** On lit le fichier jusqu'au bout **/
while (!feof($dataFile))
{
/** On récupère ligne par ligne **/
/** Exemple : <li><b><a href="../Lost/">Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
$buffer = fgets($dataFile, 4096);
/** Si le parsing est enclenché **/
if($parsing) {
/** On check la présence de "<li><b>" présentes avant chaque titre de série **/
if(stripos($buffer, '<li><b>')!== false) {
/** On récupère dans la ligne $buffer le contenu de <li><b> à la fin de la ligne **/
/** $tvshow = <li><b><a href="../Lost/">Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
$tvshow = strstr($buffer, '<li><b>');
/** Tableau des string à supprimer **/
$delete = array("<li><b><a href=\"../", "/\">");
/** On supprime <li><b><a href=\"../ de la ligne **/
$toprint = str_replace($delete[0], "", $tvshow);
/** On supprime /\"> de la ligne **/
$toprint = str_replace($delete[1], " - ", $toprint);
/** $toprint = Lost - Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
/** On récupère la position de </a></b> afin de récupérer seulement ce qui se trouve avant **/
/** Après exécution du substr $toprint = Lost - Lost **/
$pos = stripos($toprint, "</a></b>");
$toprint = substr($toprint, 0, $pos);
/** On génère l'item RSS avec : **/
/** - pour lien http://jeremyselier.com/apis/getEpisodes.php?show=Lost (id série pour epguides.com) qui me permet de récupérer la liste des épisodes **/
/** - pour titre Lost (ce qui se situe après " - ") **/
/** - pour lien guid (id unique) domain.com-Lost **/
/** - pour description l'id série d'epguides.com : Lost **/
echo "\n<item>\n\t<link>http://jeremyselier.com/apis/getEpisodes.php?show=".substr($toprint, 0, strpos($toprint, " - "))."</link>\n\t<title>".substr($toprint, strpos($toprint, " - ")+3)."</title>\n\t<guid>domain.com-".substr($toprint, 0, strpos($toprint, " - "))."</guid>\n\t<description>".substr($toprint, 0, strpos($toprint, " - "))."</description>\n</item>";
}
}
/** Lorsqu'on trouve la phrase 'Shortcuts to sections of this page:' on indique que le parsing peut commencer **/
if(stripos($buffer, 'Shortcuts to sections of this page:')!== false) $parsing = true;
}
echo "\n";
/** On ferme le fichier **/
fclose($dataFile);
}
else
{
die( "fopen failed" ) ;
}
Et voilà le résultat : getShows.php. Cela va me permettre, dans mon widget, de remplir un select qui contiendra toutes les séries actuelles. Le site étant fiable, si une série vient à être créée ou supprimée, il en sera de même automatiquement dans ma liste.
Penchons-nous maintenant sur le design du widget : Celui est assez basique, voici une liste de screenshots :

La fonction "Vu/Non vu" n'est pas encore mise en place car je ne sais pas encore comment l'implémenter (des idées ?). La prochaine fois, j'expliquerais comment je récupère la liste des épisodes qui m'intéresse et le fonctionnement de mon widget en UWA. Et vous pourrez normalement commencer à beta-tester le widget pour m'aider à le debugger. Si vous avez des choses à me dire afin d'améliorer ce widget, n'hésitez pas !
Nous avons donc deux types de données à récupérer :
- La liste des séries actuelles qui est disponible sur cette page : http://epguides.com/menu/current.shtml.
- La liste des épisodes pour une série : http://epguides.com/Lost/.
Le traitement des données se fera donc en PHP. J’expliquerai sur mon prochain billet comment je récupère ces données (terminé) et on se penchera sur le design du widget (en cours).

Nous allons d'abord nous pencher sur la récupération des séries actuelles. J'ai décidé (ce n'est pas forcement le meilleur choix, à vrai dire, il serait plus logique de récupérer cette liste avec un fichier XML, mais je voulais tester le getFeed de l'UWA) de récupérer la liste des séries en cours via un fichier RSS. Tout d'abord pour récupérer une page distante via mon serveur, je dois passer par un proxy. J'ai donc choisit de récupérer sur le net une classe PHP gérant déjà ça : Class_Http et Proxy de Troy Wolf.
La première étape est d'ouvrir la page distante en lecture :
$dataFile = fopen("http://domain.com/proxy.php?proxy_url=http://epguides.com/menu/current.shtml", "r");
Etant donné que je souhaite produire un fichier RSS au final, j'indique les informations nécessaires afin que mon navigateur comprenne bien qu'il lit un fichier RSS :
header('Content-type: application/rss+xml');
echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>
<rss version=\"2.0\" xmlns:atom=\"http://www.w3.org/2005/Atom\">
<channel>
<title>epguides.com - Current US TV Shows</title>
<description>Current US TV Shows from epguides.com RSS feed</description>
<language>en-us</language>
<ttl>60</ttl>
<link>http://domain.com</link>
<atom:link href=\"http://domain.com/getShows.php\" rel=\"self\" type=\"application/rss+xml\" />";
Une fois le début de fichier déclaré, on passe au listing d'items en soi. Je vais donc parcourir ma page html et récupérer les informations qui m'intéressent afin de les injecter dans mon flux RSS.
/** On vérifie l'ouverture du fichier **/
if ( $dataFile )
{
/** On indique que le parsing ne doit pas encore commencer **/
$parsing = false;
/** On lit le fichier jusqu'au bout **/
while (!feof($dataFile))
{
/** On récupère ligne par ligne **/
/** Exemple : <li><b><a href="../Lost/">Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
$buffer = fgets($dataFile, 4096);
/** Si le parsing est enclenché **/
if($parsing) {
/** On check la présence de "<li><b>" présentes avant chaque titre de série **/
if(stripos($buffer, '<li><b>')!== false) {
/** On récupère dans la ligne $buffer le contenu de <li><b> à la fin de la ligne **/
/** $tvshow = <li><b><a href="../Lost/">Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
$tvshow = strstr($buffer, '<li><b>');
/** Tableau des string à supprimer **/
$delete = array("<li><b><a href=\"../", "/\">");
/** On supprime <li><b><a href=\"../ de la ligne **/
$toprint = str_replace($delete[0], "", $tvshow);
/** On supprime /\"> de la ligne **/
$toprint = str_replace($delete[1], " - ", $toprint);
/** $toprint = Lost - Lost</a></b> [on hiatus] <span class='red'>returns Jan 31</span></li> **/
/** On récupère la position de </a></b> afin de récupérer seulement ce qui se trouve avant **/
/** Après exécution du substr $toprint = Lost - Lost **/
$pos = stripos($toprint, "</a></b>");
$toprint = substr($toprint, 0, $pos);
/** On génère l'item RSS avec : **/
/** - pour lien http://jeremyselier.com/apis/getEpisodes.php?show=Lost (id série pour epguides.com) qui me permet de récupérer la liste des épisodes **/
/** - pour titre Lost (ce qui se situe après " - ") **/
/** - pour lien guid (id unique) domain.com-Lost **/
/** - pour description l'id série d'epguides.com : Lost **/
echo "\n<item>\n\t<link>http://jeremyselier.com/apis/getEpisodes.php?show=".substr($toprint, 0, strpos($toprint, " - "))."</link>\n\t<title>".substr($toprint, strpos($toprint, " - ")+3)."</title>\n\t<guid>domain.com-".substr($toprint, 0, strpos($toprint, " - "))."</guid>\n\t<description>".substr($toprint, 0, strpos($toprint, " - "))."</description>\n</item>";
}
}
/** Lorsqu'on trouve la phrase 'Shortcuts to sections of this page:' on indique que le parsing peut commencer **/
if(stripos($buffer, 'Shortcuts to sections of this page:')!== false) $parsing = true;
}
echo "\n";
/** On ferme le fichier **/
fclose($dataFile);
}
else
{
die( "fopen failed" ) ;
}
Et voilà le résultat : getShows.php. Cela va me permettre, dans mon widget, de remplir un select qui contiendra toutes les séries actuelles. Le site étant fiable, si une série vient à être créée ou supprimée, il en sera de même automatiquement dans ma liste.
Penchons-nous maintenant sur le design du widget : Celui est assez basique, voici une liste de screenshots :

La fonction "Vu/Non vu" n'est pas encore mise en place car je ne sais pas encore comment l'implémenter (des idées ?). La prochaine fois, j'expliquerais comment je récupère la liste des épisodes qui m'intéresse et le fonctionnement de mon widget en UWA. Et vous pourrez normalement commencer à beta-tester le widget pour m'aider à le debugger. Si vous avez des choses à me dire afin d'améliorer ce widget, n'hésitez pas !
J'ai récupéré pas mal de modules netvibes mais aucun ne le fait (donc quand je vois qu'il y a les experts, je suis obligé de regarder sur laquelle des 32 chaines il est diffusé ...)
J'avais pas compris que ton but était différent (chaines US toussa) !
Si tu souhaites un widget qui t'affiche les séries en France et leur date de diffusion + chaînes en France (ou un autre pays). Je pourrais très bien adapter ce widget une fois terminé. Par contre il me faut un site de qualité permettant de récuperer toutes les infos (comme le fait epguides.com pour les séries US). Si tu as ça, et bien je pourrais te faire ça.
Juste une question : ça se fait de pomper le contenu d'un site, comme ça, à l'insu du créateur ?
un complément avec les liens .str vers subway ou ssub serait le top du top..
pr l'instant le seul widget de série que j'utilise c'est celui de subway, alors un mixe serait parfait
pr le vu/pas vu, pourquoi pas la couleur ? sélèctionné a l'avance dans une liste 2x01, 2x02, 2x03 les épisodes, et enfin lors de la diffusion, si "déjà vu" en bleu ou autre..
@Caroline : Le soucis c'est que tu utilises un programme TV classique, pour mon widget j'ai besoin d'une liste de série (il me faudrait donc une liste de série qui passe en françe/suisse/whatever ainsi que le programme, là j'ai que le programme).
@Gonzague : Super interessant, je vais du coup surement me pencher pour en faire une version Windows. J'ai récuperer le code source et ça n'a pas l'air trés complexe. Ils se basent entierement sur les flux rss des teams qui release (selon eux) toutes les séries. Mon widget se base sur TOUTES les séries sans exception, qu'elles soient ripper par des teams ou non.
@GiovanniPanzani : Ca peut etre sympa en effet de rajouter un truc pour les sous-titres, j'y reflechirais. Peux tu me linker le widget subway ? En ce qui concerne le vu/pas vu. J'expliquerai comment je vois les choses dans le prochain poste.
@Anon : Vu le nombre de série en tout, non tu ne pourras pas TOUT afficher, tu devras surement te taper les 20 séries à ajouter. Mais une fois que ca sera fait tu n'auras rien à refaire.
Et j'aime bien voir tout ce qui passe pour repérer les nouveaux trucs et les choper :)