Outils pour utilisateurs

Outils du site


issue70:programmer_en_python

Table des matières

1

Last month, we started our command line version of a library to talk to the TVRAGE web API. This month we will continue adding to that library. If you don’t have the code from last month, please get it now from pastebin (http://pastebin.com/6iw5NQrW) because we will be adding to that code. The way we left the code, you would run the program and enter in the terminal window the name of a TV show you want information on. Remember, we used the show Continuum. Once you pressed <Enter>, the program would call the api and search by the name of the show, and then return a list of show names that matches your input. You then would select from the list by entering a number and it would show “ShowID selected was 30789”. Now, we will create the code that will use that ShowID to get the series information. One other thing to keep in mind: the display routines are there pretty much to prove the routine works. The ultimate goal here is to create a reusable library that can be used in something like a GUI program. Feel free to modify the display routines if you want to do more with the standalone capabilities of the library.

Le mois dernier, nous avons commencé notre version en ligne de commande d'une bibliothèque pour discuter avec l'API Web TVRage. Ce mois-ci, nous allons continuer à ajouter du code à cette bibliothèque. Si vous n'avez pas le code du mois dernier, veuillez le récupérer sur pastebin (http://pastebin.com/8F3Bd1Xd) puisque que nous allons compléter ce code.

Dans l'état où nous avons laissé le code, vous devez exécuter le programme et entrer dans la fenêtre du terminal le nom d'une émission de télévision pour laquelle vous souhaitez obtenir des informations. Rappelez-vous, nous avons utilisé la série Continuum. Une fois que vous avez appuyé sur <Entrée>, le programme appelait l'API et faisait une recherche avec le nom de l'émission, puis renvoyait une liste de noms d'émissions correspondant à votre saisie. Vous pouviez ensuite sélectionner dans la liste en entrant un numéro et il affichait « le ShowID choisi est 30789 ». Maintenant, nous allons écrire le code qui va utiliser ce ShowID pour obtenir les informations sur la série. Une autre chose à garder à l'esprit : les routines d'affichage sont là simplement pour prouver que les routines fonctionnent. Le but ultime est de créer une bibliothèque réutilisable qui peut être utilisée dans un programme graphique. N'hésitez pas à modifier les routines d'affichage si vous voulez faire plus avec les capacités autonomes de la bibliothèque.

2

The last routine we created in the class was “DisplayShowResult”. Right after that, and before the routine “main,” is where we will put our next routine. The information that will be returned (there is other information, but we will use only the list below) will be in a dictionary and will contain (if available): • Show ID • Show Name • Show Link • Origin Country of network • Number of seasons • Series image • Year Started • Date Started • Date Ended • Status (canceled, returning, current, etc) • Classification (scripted, reality, etc) • Series Summary • Genre(s) • Runtime in minutes • Name of the network that originally aired the show • Network country (pretty much the same thing as Origin Country) • Air time • Air Day (of week) • TimeZone

La dernière routine que nous avons créée dans la classe était « AfficheResultatsEmission ». Nous allons placer notre prochaine routine juste après, et avant la routine « main ». L'information qui sera retournée (il y en a d'autres, mais nous allons utiliser uniquement la liste ci-dessous) sera dans un dictionnaire et contiendra (si disponible) : • identifiant de l'émission ; • nom de l'émission ; • lien de l'émission ; • pays d'origine ; • nombre de saisons ; • image de la série ; • année de démarrage ; • date de démarrage ; • date de fin ; • état (annulé, rediffusion, actuel, etc.) ; • classification (fiction, réalité, etc.) ; • résumé de la série ; • genre(s) ; • durée en minutes ; • nom de la chaîne qui a diffusé l'émission pour la première fois ; • pays de la chaîne (c'est à peu près la même chose que pays d'origine) ; • heure de diffusion ; • jour de diffusion (dans la semaine) ; • fuseau horaire.

3

Shown above is the beginning of the code. You should recognize most of the code from last time. There’s really not much changed. Here’s more code (shown below). As you can see (above), there’s nothing really new in this bit of code either, if you’ve been keeping up with the series. We are using a for loop, checking each tag in the XML file for a specific value. If we find it, we assign it to a dictionary item. Now things get a bit more complicated. We are going to check for the tag “genres”. This has child tags underneath it with the name of “genre”. For any given show, there can be multiple genres. We’ll have to append the genres to a string as they come up and separate them with a vertical bar and two spaces like this “ | “ (shown top right).

Ci-dessus, le début du code.

Vous devez reconnaître la plupart du code de la dernière fois. Il n'a vraiment pas beaucoup changé. Voici plus de code (voir ci-dessous).

Comme vous pouvez le voir (ci-dessus), il n'y a rien de vraiment nouveau dans ce morceau de code non plus, si vous avez suivi la série. Nous utilisons une boucle for pour vérifier chaque balise dans le fichier XML par rapport à une valeur spécifique. Si nous la trouvons, nous l'assignons à une entrée du dictionnaire.

Maintenant les choses se compliquent un peu. Nous allons chercher la balise « genres ». Elle a des balises enfants en dessous d'elle avec le nom de « genre ». Pour un spectacle donné, il peut y avoir plusieurs genres. Nous devrons ajouter les genres à une chaîne au fur et à mesure qu'ils arrivent et les séparer par une barre verticale et deux espaces comme ceci « | » (voir en haut à droite).

4

Now we are pretty much back to “normal” code (shown middle right) that you’ve already seen. The only thing that’s a bit different is the tag “network” which has an attribute “country”. We grab the attribute data by looking for “child.attrib[‘attributetag’]” instead of “child.text”. That’s the end of this routine. Now (below) we’ll need some way to display the information we worked so hard to get. We’ll create a routine called “DisplayShowInfo”. Now, we must update the “main” routine (next page, shown top right) to support our two new routines. I’m giving the entire routine below, but the new code is shown in black. Next page, bottom left, is what the output of “DisplayShowInfo” should look like, assuming you chose “Continuum” as the show.

Maintenant, nous sommes à peu près revenus au code « normal » (affiché au milieu à droite) que vous avez déjà vu. La seule chose un peu différente, c'est le tag « chaîne » qui a un attribut « pays ». Nous récupérons les données d'attribut par la recherche de « child.attrib['attributetag'] » au lieu de « child.text ».

C'est la fin de cette routine. Maintenant (ci-dessous), nous avons besoin d'une méthode pour afficher les informations que nous avons obtenues par ce si dur travail. Nous allons créer une routine appelée « AfficheInfoEmission ».

Maintenant, nous devons mettre à jour la routine « main » (page suivante, en haut à droite) pour prendre en compte nos deux nouvelles routines. Je donne la routine entière ci-dessous, mais le nouveau code est affiché en noir.

En bas à gauche de la page suivante, on voit à quoi devrait ressembler la sortie de « AfficheInfoEmission », en supposant que vous avez choisi « Continuum » comme émission.

5

Please notice that I’m not displaying the time zone information here, but feel free to add it if you wish. Next, we need to work on the episode list routines for the series. The “worker” routine will be called “GetEpisodeList” and will provide the following information… • Season • Episode Number • Season Episode Number (the number of the episode within the season) • Production Number • Air Date • Link • Title • Summary • Rating • Screen Capture Image of Episode (if available)

Veuillez noter que je n'inclus pas l'affichage des informations de fuseau horaire ici, mais n'hésitez pas à l'ajouter si vous le souhaitez.

Ensuite, nous devons travailler sur la routine qui liste les épisodes pour la série. La routine « qui travaille » sera appelée « TrouveListeEpisodes » et fournira les informations suivantes : • Saison ; • numéro de l'épisode ; • numéro de l'épisode au sein de la saison ; • numéro de production ; • date de diffusion ; • lien ; • titre ; • résumé ; • évaluation ; • capture d'image de l'épisode (si disponible).

6

Before we start with the code, it would be helpful to revisit what the episode list request to the API returns. It looks something like that shown on the next page, top right. The information for each episode is in the “episode” tag – which is a child of “Season” – which is a child of “Episodelist” – which is a child of “Show”. We have to be careful how we parse this. As with most of our “worker” routines this time, the first few lines (below) are fairly easy to understand by now. Now we need to look for the “name” and “totalseasons” tags below the “root” tag “Show”. Once we’ve dealt with them, we look for the “Episodelist”, “Season” tags. Notice above that the “Season” tag has an attribute. You might notice (in the code above) that we aren’t including the “Showname” or “Totalseasons” data in the dictionary. We are assigning them to a variable that will be returned at the end of the routine to the calling code. Now that we have that portion of the data, we deal with the episode specific information (shown below).

Avant que nous commencions avec le code, il serait utile de revenir sur ce que l'API retourne lors de la demande de la liste des épisodes. Cela ressemble à ce qui est en haut à droite de la page suivante.

Les informations pour chaque épisode sont dans la balise « épisode » - qui est un enfant de « saison » - qui est un enfant de « ListeEpisodes » - qui est un enfant de « Emission ». Nous devons faire attention à la façon dont nous analysons ceci. Comme avec la plupart de nos routines « utilitaires » de cette fois-ci, les quelques premières lignes (ci-dessous) sont assez faciles à comprendre à présent.

Maintenant, nous devons chercher les balises « Nom » et « SaisonsTotal » en dessous de la balise racine « Emission ». Une fois que nous les avons traitées, nous cherchrons les balises « ListeEpisodes » et « Saison ». Remarquez ci-dessus que la balise « Saison » a un attribut. Vous remarquerez peut-être (dans le code ci-dessus) que nous n'incluons pas les données « NomEmission » ni «SaisonsTotal » dans le dictionnaire. Nous les assignons à une variable qui sera renvoyée au code appelant à la fin de la routine.

Maintenant que nous avons cette partie des données, nous traitons les informations spécifiques à l'épisode (voir ci-dessous).

7

All that’s left now (bottom right) is to append the episode specific information (that we’ve put into the dictionary) to our list, and keep going. Once we are done with all the episodes, we return to the calling routine and, as I stated earlier, return three items of data, “ShowName”, “TotalSeasons” and the list of dictionaries. Next, we need to create our display routine. Again, it’s fairly straightforward. The only thing that you might not recognize is the “if e.has_key(‘keynamehere’)“ lines. This is a check to make sure that there is actually data in the “Rating” and “Summary” variables. Some shows don’t have this information, so we include the check to make our print-to-screen data a little prettier (shown above right).

Tout ce qui reste à faire (en bas à droite) est d'ajouter les informations spécifiques de l'épisode (que nous avons mises dans le dictionnaire) à notre liste, et de continuer. Une fois que nous avons fini avec tous les épisodes, nous revenons à la routine d'appel et, comme je l'ai dit plus tôt, retournons trois données, « NomEmission », « SaisonsTotal » et la liste des dictionnaires.

Ensuite, nous devons créer notre routine d'affichage. Encore une fois, c'est assez simple. La seule chose que vous pourriez ne pas reconnaître, c'est le « if e.has_key('keynamehere') ». C'est une vérification pour s'assurer qu'il y a effectivement des données dans les variables « Évaluation » et « Résumé ». Certaines émissions n'ont pas cette information, aussi nous incluons la vérification pour améliorer les données que nous afficherons à l'écran (ci-dessus à droite).

8

All that’s left is to update our “main” routine (next page, shown top right). Once again, I’m going to provide the full “main” routine with the newest code in black bold. Now, if you save and run the program, the output of the “GetEpisodeList” and “DisplayEpisodeList” will work. Shown bottom right is a snippet of the Episode information. That’s it for this month. As always, you can find the full source code on pastebin at http://pastebin.com/kWSEfs2E. I hope you enjoy playing with the library. There is additional data available from the API that you can include. Please remember, TVRage provides this information for free, so consider donating to them to help their efforts at updating the API and for all their hard work. I’ll see you next time. Enjoy.

Tout ce qui reste à faire est de mettre à jour notre routine « main » (en haut à droite de la page suivante). Encore une fois, je vais donner la routine « main » complète avec le nouveau code en caractères gras.

Maintenant, si vous enregistrez et exécutez le programme, la sortie de « TrouveListeEpisodes » et « AfficheListeEpisodes » va fonctionner. En bas à droite se trouve un extrait de l'information d'un épisode.

C'est tout pour ce mois-ci. Comme toujours, vous pouvez trouver le code source complet sur ​​pastebin : http://pastebin.com/gU5XSPcq. J'espère que jouer avec la bibliothèque vous amuse. Il existe des données supplémentaires disponibles avec l'API que vous pouvez utiliser. S'il vous plaît rappelez-vous que TVRage fournit cette information gratuitement, alors pensez à leur faire un don pour aider leurs efforts dans la mise à jour de l'API et en guise de remerciements pour leur travail acharné.

Je vous verrai la prochaine fois. Amusez-vous bien.

issue70/programmer_en_python.txt · Dernière modification : 2013/06/18 20:50 de fredphil91