URL: https://linuxfr.org/users/lebouquetin/journaux/bref-jai-fait-un-script-python Title: Bref, j'ai fait un script python. Authors: LeBouquetin Date: 2011年11月20日T12:55:23+01:00 License: CC By-SA Tags: debian Score: 24 Bref c'était un dimanche et je moulais sur mon PC. Je moulais tranquillement sur mes sites habituels – ~~xhamster.com~~ [linuxfr.org](https://linuxfr.org/), [slashdot.org](http://slashdot.org/), quand tout à coup est apparu un journal sur LinuxFR : [Bref, j'ai fait un flux atom de bref.](https://linuxfr.org/users/lucsky2003/journaux/bref-jai-fait-un-flux-atom-de-bref) Alors j'me suis dit : "Bref, j'ai bien cette série, il faut que je fais un script pour récupérer directement les épisodes et que je les mets sur ma freebox". Je sais, je suis mauvais en conjugaison, mais il fallait quand même que je les mets sur ma freebox. Bref. J'ai donc récupéré le flux Atom et j'ai tenté de parser le flux pour récupérer les url des épisodes en HD. La HD, c'est mieux, parce que t'as plus de pixel à l'écran, et vu que j'ai un projecteur dans mon salon, bah les flux HD c'est mieux. Bref. Le problème, c'est que mon colloc avait pas croqué la pomme depuis 6 mois et que là il voulait que je vais lui acheter des capotes à la pharmacie. Et puis en fait, parser le flux Atom, c'était plus sioux que de parser directement le flux XML original, qui est utilisé dans le script de [Luke SKy](https://linuxfr.org/users/lucsky2003). Bref, j'ai décidé de parser directement le [flux XML original](http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/search/bref). Bon. A ce moment-là, j'avais juste le flux des vidéos en HD, mais j'en faisais rien. Il était déjà tard. Et c'est là que je me suis demandé comment télécharger les flux [[RTMP]] parce que moi je voulais télécharger les épisodes, pas les regarder en direct. Alors j'ai cherché un peu et j'ai découvert l'outil [rtmpdump](http://rtmpdump.mplayerhq.hu/). J'ai regardé l'aide et j'ai trouvé que ça serait facile de télécharger un épisode à partir de son url rtmp:// : ```bash /usr/bin/rtmpdump -r '' -o '' ``` Là, j'avais les fichiers sur mon serveur local, une Debian qui va bien et qui tourne sur du matériel plutôt économe en énergie : une petite [Eee Box](http://en.wikipedia.org/wiki/ASUS_EeeBox_PC). Une tâche cron pour lancer la vérification toutes les 6h, pour pas louper un épisode : ```bash # Verifier et telecharger les episodes de "bref" chaque jour a 3h, 9h, 15h et 21h 0 3,9,15,21 * * * python /opt/perso/bref/dl.bref.py 2>&1 1>>/var/log/dl.bref.log ``` Il restait plus qu'à les pousser sur la freebox, pour pouvoir les mater ensuite en grand écran. J'ai donc décidé d'utiliser le client ftp en ligne de commande [ncftpput](http://www.ncftp.com/ncftp/) : ```bash ncftpput -u freebox -p '/Disque dur/Enregistrements/Bref/' ``` Bon, c'était nickel, ça marchait bien, mais je savais pas quand un nouvel épisode était disponible. Je récupérais les épisodes automatiquement, mais sans le savoir. Je perdais l'intérêt de l'automatisation. Bref. J'ai décidé de m'envoyer des alertes parce que comme ça je saurais quand un nouvel épisode était disponible. J'ai décidé d'utiliser [[XMPP]], parce que XMPP, c'est bien. Et puis j'ai fait ça en python parce que python c'est bien. Et j'ai fait deux trois bricoles pour que ça marche mieux, pour que ça ne recharge pas systématiquement les vidéos déjà téléchargées, j'ai fait quelques requêtes [[Xpath]], j'ai rendu les fichiers accessibles par http et ftp, j'ai créé un utilisateur [Bender](http://aux.iconpedia.net/uploads/1618835790807432011.png) sur mon serveur XMPP et j'ai fait beaucoup d'essais. Bref, j'ai fait un script python. ```python #!/usr/bin/env python # -*- coding: utf-8 -*- # # * parser le xml pour récupérer les url HD # * extraire le nom du fichier (après le dernier "/") # * vérifier que le fichier n'existe pas # * le sauvegarder lsXmlFeedUrl = "http://www.canalplus.fr/rest/bootstrap.php?/bigplayer/search/bref" lsSaveFolder = "/opt/perso/bref/episodes" lsXmppSmsList = "{{mon_jid}}" # exemple : bender@monserveurxmpp.net lsXmppSmsMessageTemplate = "Un nouvel épisode de 'Bref' est disponible : http://{{ip_du_serveur_download}}/perso/bref/%s" import libxml2 import os.path import subprocess import xmpp class Episode(object): def __init__(self, psUrl, psFilename, pbLocallyAvailable = False): self._sUrl = psUrl self._sFilename = psFilename self._bLocallyAvailable = pbLocallyAvailable def getName(self): return self._sFilename def getFilename(self): return self._sFilename def getFilePath(self, psPathRoot = ""): lsFilePath = self._sFilename if psPathRoot!="": lsFilePath = "%s/%s" % (psPathRoot, lsFilePath) return lsFilePath def getUrl(self): return self._sUrl class XmppShortMessageService(object): def __init__(self, psXmppServerName, psXmppServerPort, psXmppSenderUserName, psXmppSenderUserPass, psXmppSenderUserRsc): self._sXmppServerName = psXmppServerName self._sXmppServerPort = psXmppServerPort self._sXmppSenderUserName = psXmppSenderUserName self._sXmppSenderUserPass = psXmppSenderUserPass self._sXmppSenderUserRsc = psXmppSenderUserRsc self._oXmppClient = None def connect(self): if self._oXmppClient==None: self._oXmppClient = xmpp.Client(self._sXmppServerName) self._oXmppClient.connect(server=(self._sXmppServerName, self._sXmppServerPort)) self._oXmppClient.auth(self._sXmppSenderUserName, self._sXmppSenderUserPass, self._sXmppSenderUserRsc) self._oXmppClient.sendInitPresence() def send(self, psMsgText, psMsgTo): self.connect() lsXmppMessage = xmpp.Message(psMsgTo, psMsgText) lsXmppMessage.setAttr('type', 'chat') self._oXmppClient.send(lsXmppMessage) if __name__ == '__main__': # 1. download XML # 2. search episode urls # 3. check if the episodes found are already downloaded # 4. download required files # STEP 1 loXmlStreamDom = libxml2.parseFile(lsXmlFeedUrl) loVideoElements = loXmlStreamDom.xpathEval('//VIDEO[./RUBRIQUAGE/RUBRIQUE="BREF"]') loEpisodeList = list() for loVideoElement in loVideoElements: loHdVideoFileUrl = loVideoElement.xpathEval('./MEDIA/VIDEOS/HD')[0] # there is only one HD lsHdVideoFileUrl = loHdVideoFileUrl.content.strip() lsHdVideoFileName = lsHdVideoFileUrl.rsplit("/", 1)[1] loNewEpisode = Episode(lsHdVideoFileUrl, lsHdVideoFileName, False) loEpisodeList.append(loNewEpisode) print "Found Episode: %s" % (loNewEpisode.getName()) for loEpisode in loEpisodeList: lsLocalFilePath = "%s/%s" % (lsSaveFolder, loEpisode.getFilename()) if os.path.isfile(lsLocalFilePath)==True: print "Skipping %s [already downloaded]" % loEpisode.getName() else: lsCmd = "/usr/bin/rtmpdump -r \"%s\" -o \"%s\"" % (loEpisode.getUrl(), loEpisode.getFilePath(lsSaveFolder)) print "Download %s" % (loEpisode.getName()) os.system(lsCmd) lsCmd = "ncftpput -u freebox -p {{freebox_ftp_password}} {{freebox_ip}} '/Disque dur/Enregistrements/Bref/' %s" % (loEpisode.getFilePath(lsSaveFolder)) print "Upload to freebox: %s" % (loEpisode.getName()) os.system(lsCmd) # Send an XMPP notification including a link to see the episode loXmppSms = XmppShortMessageService('{{mon_server_xmpp}}', '5223', 'bender', 'mynameisbender', 'BrefDownloadBot') loXmppSms.send(lsXmppSmsMessageTemplate % (loEpisode.getFilename(), loEpisode.getFilename()), lsXmppSmsList) ```

AltStyle によって変換されたページ (->オリジナル) /