PageRenderTime 47ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/ppa/tvdownloader/tvdownloader-0.6/src/plugins/Arte.py

https://code.google.com/p/tvdownloader/
Python | 489 lines | 341 code | 36 blank | 112 comment | 20 complexity | 2a20e9a173be3816dbe699e076f6414f MD5 | raw file
Possible License(s): GPL-2.0, GPL-3.0, LGPL-2.1
  1. #!/usr/bin/env python
  2. # -*- coding:Utf-8 -*-
  3. #########################################
  4. # Licence : GPL2 ; voir fichier COPYING #
  5. #########################################
  6. # Ce programme est libre, vous pouvez le redistribuer et/ou le modifier selon les termes de la Licence Publique Générale GNU publiée par la Free Software Foundation (version 2 ou bien toute autre version ultérieure choisie par vous).
  7. # Ce programme est distribué car potentiellement utile, mais SANS AUCUNE GARANTIE, ni explicite ni implicite, y compris les garanties de commercialisation ou d'adaptation dans un but spécifique. Reportez-vous ŕ la Licence Publique Générale GNU pour plus de détails.
  8. # Vous devez avoir reçu une copie de la Licence Publique Générale GNU en męme temps que ce programme ; si ce n'est pas le cas, écrivez ŕ la Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, États-Unis.
  9. ###########
  10. # Modules #
  11. ###########
  12. import os
  13. from Plugin import Plugin
  14. from Fichier import Fichier
  15. from urllib import quote,unquote
  16. import re,unicodedata
  17. import time,rfc822 # for RFC822 datetime format (rss feed)
  18. from htmlentitydefs import name2codepoint
  19. ##########
  20. # Classe #
  21. ##########
  22. class Arte( Plugin ):
  23. """Classe abstraite Plugin dont doit heriter chacun des plugins"""
  24. ##
  25. ## Arte Live Web
  26. ##
  27. #
  28. # A/ Recherche des émissions
  29. #
  30. # 1. On liste les catégories ŕ partir de la page d'accueil.
  31. # Chaque catégorie est une "émission" de la chaine Arte Live Web
  32. #
  33. # B/ Recherche des fichiers d'une émission
  34. #
  35. # 1. On recherche la page du flux RSS ŕ partir de la page de la catégorie choisie.
  36. # 2. On extrait la liste des fichiers (les pages de chaque enregistrement proposé)
  37. # 3. On recherche le numéro eventID ŕ partir de la page de l'enregistrement
  38. # 4. On recherche les détails de l'enregistrement dans la page xml associée ŕ l'eventID
  39. #
  40. ##
  41. ## Arte+7
  42. ##
  43. ## Utilisation de la méthode de Pascal92
  44. ## http://www.encodage.org/phpBB/viewtopic.php?f=26&t=90
  45. ##
  46. #
  47. # A/ Recherche des émissions
  48. #
  49. # 1. On liste les chaines/programmes ŕ partir de la page d'accueil.
  50. # Chaque chaine/programme est une "émission" de la chaine Arte+7
  51. #
  52. # B/ Recherche des fichiers d'une émission
  53. #
  54. # 1. On charge la page spéciale "videoArtePlusSeptChaineBaseUrl" contenant les fichiers de la chaine choisie
  55. # 2. On extrait la liste des fichiers (les pages ainsi que nom et date de chaque enregistrement proposé)
  56. # 3. On recherche le numéro de référence de la vidéo ŕ partir de la page de l'enregistrement
  57. # 4. On recherche les détails de l'enregistrement dans la page xml associée ŕ la référence
  58. #
  59. ##
  60. ## Arte Live Web
  61. ##
  62. nomArteLiveWeb = "Arte Live Web"
  63. # Page permettant de lister les catégories
  64. listeArteLiveWebCategoriesUrl = "http://liveweb.arte.tv/"
  65. # Expression réguličre pour extraire les catégories
  66. # Version initiale
  67. #~ listeArteLiveWebCategoriesPattern = re.compile("<a href=\"http://liveweb.arte.tv/fr/cat/(.*?)\">(.*?)</a>", re.DOTALL)
  68. # Mise a jour du 30/09/2010
  69. listeArteLiveWebCategoriesPattern = re.compile("<li><a href=\"http://liveweb.arte.tv/fr/cat/(.*?)\" class=\"accueil\">(.*?)</a></li>", re.DOTALL)
  70. # Rang dans le résultat de l'expression réguličre précédente
  71. categorieArteLiveWeb_LIEN = 0
  72. categorieArteLiveWeb_NOM = 1
  73. # Base de la page catégorie, permettant de retrouver le lien du flux RSS
  74. videoArteLiveWebCategorieBaseUrl = "http://liveweb.arte.tv/fr/cat/"
  75. # Expression réguličre pour extraire le lien du flux RSS
  76. videoArteLiveWebRSSPattern = re.compile("<a href=\"(http://download.liveweb.arte.tv/o21/liveweb/rss/home.*?\.rss)\"", re.DOTALL)
  77. # Expression réguličre pour extraire le lien vers la page de la video, ainsi que sa date
  78. videoArteLiveWebVideosPattern = re.compile("<link>(http://liveweb.arte.tv/fr/video/.*?)</link>.*?<pubDate>(.*?)</pubDate>", re.DOTALL)
  79. videoArteLiveWebEventIDPattern = re.compile("new LwEvent\('(.*?)', ''\);", re.DOTALL)
  80. videoArteLiveWebInfosBaseUrl = "http://arte.vo.llnwd.net/o21/liveweb/events/event-" # ".xml"
  81. videoArteLiveWebTitrePattern = re.compile("<nameFr>(.*?)</nameFr>", re.DOTALL)
  82. videoArteLiveWebLienPatternHD = re.compile("<urlHd>(.*?)</urlHd>", re.DOTALL)
  83. videoArteLiveWebLienPatternSD = re.compile("<urlSd>(.*?)</urlSd>", re.DOTALL)
  84. #~ videoArteLiveWebDatePattern = re.compile("<dateEvent>(.*?)</dateEvent>", re.DOTALL)
  85. ##
  86. ## Arte+7
  87. ##
  88. nomArtePlusSept = "Arte+7"
  89. # Page permettant de lister les chaines
  90. # Version initiale
  91. #~ listeArtePlusSeptChainesUrl = "http://videos.arte.tv/fr/videos/arte7"
  92. # Mise a jour du 30/09/2010
  93. listeArtePlusSeptChainesUrl = "http://videos.arte.tv/fr/videos"
  94. # Expression réguličre pour extraire les chaines
  95. # Version initiale
  96. #~ listeArtePlusSeptChainesPattern = re.compile("<a href=\"/fr/videos/chaines/(.*?)\".*?>(.*?)</a>", re.DOTALL)
  97. # Mise a jour du 30/09/2010
  98. listeArtePlusSeptChainesPattern = re.compile("<input type=\"checkbox\" value=\"(.*?)\"/>.*?<a href=\"#\">(.*?)</a>", re.DOTALL)
  99. # Rang dans le résultat de l'expression réguličre précédente
  100. categorieArtePlusSept_LIEN = 0
  101. categorieArtePlusSept_NOM = 1
  102. # Expression réguličre pour extraire le channelID du lien de la chaine
  103. # Version initiale
  104. #~ chaineArtePlusSeptChannelIDPattern = re.compile(".*?/index-(.*?)\.html", re.DOTALL)
  105. # Mise a jour du 30/09/2010
  106. # --> inutile ŕ présent
  107. # Base de la page chaine, permettant de retrouver les fichiers (lien donné par "listViewUrl" dans la page principale)
  108. # Version initiale
  109. #~ videoArtePlusSeptChaineBaseUrl = "http://videos.arte.tv/fr/do_delegate/videos/arte7/index-3211552,view,asList.html?hash=fr/list/date//1/250/channel-%channel%-program-"
  110. # Mise a jour du 30/09/2010
  111. videoArtePlusSeptChaineBaseUrl = "http://videos.arte.tv/fr/do_delegate/videos/index-%channel%-3188698,view,asList.html?hash=fr/list/date//1/250/"
  112. # Expression réguličre pour extraire le lien vers la page de la video, son titre ainsi que sa date
  113. videoArtePlusSeptVideosPattern = re.compile("<a href=\"(/fr/videos/.*?\.html)\"><span class=\"teaserTitle\">(.*?)</span></a>.*?<td class=\"col2\"><em>(.*?)</em></td>", re.DOTALL)
  114. # Base de la page permettant de rechercher la référence de la video
  115. videoArtePlusSeptVideoBaseUrl = "http://videos.arte.tv"
  116. # Expression réguličre pour extraire la référence de la vidéo ŕ lire
  117. videoArtePlusSeptVideoRefPattern = re.compile("addToPlaylistOpen {ajaxUrl:'/fr/do_addToPlaylist/videos/.*?-(.*?)\.html'}", re.DOTALL)
  118. videoArtePlusSeptPlayerPattern = re.compile("<param name=\"movie\" value=\"(.*?\.swf)", re.DOTALL)
  119. # Base de la page XML décrivant la vidéo, ses liens
  120. videoArtePlusSeptXMLBaseURL = "http://videos.arte.tv/fr/do_delegate/videos/360_geo-%video%,view,asPlayerXml.xml"
  121. videoArtePlusSeptLienPatternHD = re.compile("<url quality=\"hd\">(.*?)</url>", re.DOTALL)
  122. videoArtePlusSeptLienPatternSD = re.compile("<url quality=\"sd\">(.*?)</url>", re.DOTALL)
  123. # Ordre des éléments dans le tuple "chaine"
  124. chaine_NOM = 1
  125. chaine_LIEN = 0
  126. nom = "Arte"
  127. url = "http://www.arte.tv/"
  128. def __init__( self ):
  129. Plugin.__init__(self, self.nom, self.url)
  130. #~ Plugin.__init__(self)
  131. self.listeChaines = {}
  132. self.listeFichiers = {}
  133. if os.path.exists( self.fichierCache ):
  134. self.listeChaines = self.chargerCache()
  135. def htmlentitydecode(self, s):
  136. # http://wiki.python.org/moin/EscapingHtml
  137. return re.sub('&(%s);' % '|'.join(name2codepoint),
  138. lambda m: unichr(name2codepoint[m.group(1)]), s)
  139. # Fonction parse_date recopiée de l'application arte+7recorder
  140. time_re = re.compile("^\d\d[h:]\d\d$")
  141. fr_monthes = ["janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aoűt", "septembre", "octobre", "novembre", "décembre"]
  142. de_monthes = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"]
  143. def parse_date(self, date_str):
  144. date_array = date_str.split(",")
  145. if self.time_re.search( date_array[-1].strip() ) is None:
  146. return ""
  147. time_ = date_array[-1].strip()
  148. if date_array[0].strip() in ("Aujourd'hui", "Heute"):
  149. date_ = time.strftime( "%Y/%m/%d" )
  150. elif date_array[0].strip() in ("Hier", "Gestern"):
  151. date_ = time.strftime( "%Y/%m/%d", time.localtime(time.time() - (24*60*60)) )
  152. else:
  153. array = date_array[1].split()
  154. day = array[0].strip(".")
  155. month = array[1]
  156. for arr in (self.fr_monthes, self.de_monthes):
  157. if array[1] in arr:
  158. month = "%02d" % (arr.index(array[1])+1)
  159. year = array[2]
  160. date_ = "%s/%s/%s" % (year, month, day)
  161. #print date_ + ", " + time_
  162. return date_ + ", " + time_
  163. def listerOptions(self):
  164. # Qualité ŕ rechercher SD ou HD ?
  165. self.optionChoixUnique("qualite", "Qualité des vidéos", "HD", ["HD", "SD"])
  166. # Nombre maximum de fichiers ŕ rechercher (0 = aucune limite)
  167. self.optionTexte("maxdepth", "Nombre d'enregistrementrs ŕ rechercher (0=pas de limite)", 0)
  168. # Renommer les fichiers ŕ partir du titre de l'émission
  169. self.optionBouleen("rename", "Renommer les fichiers ŕ partir du titre de l'émission (attention, plusieurs enregistrements peuvent avoir le męme nom)", False)
  170. def rafraichir( self ):
  171. self.afficher("Création de la liste des chaines...")
  172. ##
  173. ## Arte Live Web
  174. ##
  175. self.afficher("Récupération de la liste des catégories "+self.nomArteLiveWeb+"...")
  176. # On crée la chaine
  177. self.listeChaines[self.nomArteLiveWeb] = []
  178. # On recherche toutes les catégories
  179. for item in re.findall(self.listeArteLiveWebCategoriesPattern, self.API.getPage(self.listeArteLiveWebCategoriesUrl)):
  180. lien = item[self.categorieArteLiveWeb_LIEN]
  181. nom = item[self.categorieArteLiveWeb_NOM]
  182. self.afficher("... Catégorie "+nom+" : "+lien+"...")
  183. #~ nom = unicode(nom, "iso-8859-1", "replace")
  184. itemLive = []
  185. itemLive.insert (self.chaine_LIEN, lien)
  186. itemLive.insert (self.chaine_NOM, nom)
  187. # On ajoute la catégorie trouvée si elle n'est pas déjŕ présente
  188. if (itemLive not in self.listeChaines[self.nomArteLiveWeb]):
  189. self.listeChaines[self.nomArteLiveWeb].append(itemLive)
  190. ##
  191. ## Arte+7
  192. ##
  193. self.afficher("Récupération de la liste des chaines "+self.nomArtePlusSept+"...")
  194. # On crée la chaine
  195. self.listeChaines[self.nomArtePlusSept] = []
  196. # On recherche toutes les catégories
  197. for item in re.findall(self.listeArtePlusSeptChainesPattern, self.API.getPage(self.listeArtePlusSeptChainesUrl)):
  198. lien = item[self.categorieArtePlusSept_LIEN]
  199. nom = item[self.categorieArtePlusSept_NOM]
  200. self.afficher("... Chaine "+nom+" : "+lien+"...")
  201. #~ nom = unicode(nom, "utf8", "replace")
  202. #~ nom = self.htmlentitydecode(nom)
  203. #~ nom = nom.encode("utf-8", "replace")
  204. itemPlusSept = []
  205. itemPlusSept.insert (self.chaine_LIEN, lien)
  206. itemPlusSept.insert (self.chaine_NOM, nom)
  207. # On ajoute la catégorie trouvée si elle n'est pas déjŕ présente
  208. if (itemPlusSept not in self.listeChaines[self.nomArtePlusSept]):
  209. self.listeChaines[self.nomArtePlusSept].append(itemPlusSept)
  210. self.sauvegarderCache(self.listeChaines)
  211. def getLienEmission(self, emission):
  212. #~ emission = unicode( emission, "utf8", "replace" )
  213. # Cherche dans quelle chaine se trouve l'émission
  214. #~ self.afficher("Recherche de : "+emission)
  215. #~ for chaine in self.listeChaines.keys():
  216. #~ #~ self.afficher("Chaine : "+chaine)
  217. chaine = self.derniereChaine
  218. for item in self.listeChaines[chaine]:
  219. s = item[self.chaine_NOM]
  220. #~ self.afficher("Item : "+s)
  221. if (cmp(s, emission)==0):
  222. s = item[self.chaine_LIEN]
  223. if (s==""):
  224. return None
  225. else:
  226. return quote(s.encode( 'ascii','ignore' ))
  227. def listerChaines( self ):
  228. t = self.listeChaines.keys()
  229. t.sort()
  230. for chaine in t:
  231. self.ajouterChaine(chaine)
  232. def listerEmissions( self, chaine ):
  233. t = []
  234. self.derniereChaine = chaine
  235. if self.listeChaines.has_key(chaine):
  236. for item in self.listeChaines[chaine]:
  237. s = item[self.chaine_NOM]
  238. #~ t.append(s.decode("iso-8859-1"))
  239. t.append(s)
  240. t.sort()
  241. for emission in t:
  242. self.ajouterEmission(chaine, emission)
  243. def listerFichiersArteLiveWeb( self, emission ):
  244. """Renvoi la liste des fichiers disponibles pour une emission donnnee"""
  245. # Renvoi la liste des fichiers (utilisation de la classe Fichier)
  246. # [ Fichier ( nom, date, lien) , Fichier( ... ), ... ]
  247. if self.listeFichiers.has_key(emission):
  248. return self.listeFichiers[emission]
  249. lien = self.getLienEmission(emission)
  250. if lien == None:
  251. self.afficher ("Erreur de recherche du lien pour \""+emission+"\"")
  252. else:
  253. self.afficher("Récupération de la liste des fichiers pour \""+emission+"\"...")
  254. # Reconstitution du lien complet
  255. lien = self.videoArteLiveWebCategorieBaseUrl+lien
  256. # On recherche l'adresse de la page RSS
  257. self.afficher ("Recherche du flux RSS \""+emission+"\" ŕ l'adresse "+lien)
  258. feedURL = re.search(self.videoArteLiveWebRSSPattern, self.API.getPage(lien)).group(1)
  259. # On recherche toutes les émissions contenues dans le flux RSS
  260. self.afficher ("Recherche des émissions dans le flux : "+feedURL)
  261. videos = re.findall(self.videoArteLiveWebVideosPattern, self.API.getPage(feedURL))
  262. liste = []
  263. if videos == None:
  264. return liste
  265. # Pour chacune des vidéos trouvées
  266. curDepth = 0
  267. for fichier in videos:
  268. #~ curDepth = curDepth+1
  269. curDepth += 1
  270. opt_maxDepth = int(self.getOption("maxdepth"))
  271. if (opt_maxDepth>0 and curDepth>opt_maxDepth):
  272. break
  273. self.afficher ("Émission trouvée "+fichier[0])
  274. # Recherche de l'eventID dans la page de l'emission
  275. fichierInfosEventID_match = re.search (self.videoArteLiveWebEventIDPattern, self.API.getPage(fichier[0]))
  276. if fichierInfosEventID_match == None:
  277. continue
  278. self.afficher ("... eventID : "+fichierInfosEventID_match.group(1))
  279. # Chargement de la page XML de l'eventID trouvé
  280. fichierInfos = self.API.getPage(self.videoArteLiveWebInfosBaseUrl+fichierInfosEventID_match.group(1)+".xml")
  281. titre = re.search(self.videoArteLiveWebTitrePattern, fichierInfos)
  282. if titre != None:
  283. titre = titre.group(1)
  284. else:
  285. curDepth -= 1 # On n'est pas tombé sur une vidéo valide (pas de titre trouvé ?!)
  286. continue
  287. opt_qual = self.getOption("qualite")
  288. if opt_qual == "HD":
  289. lien = re.search(self.videoArteLiveWebLienPatternHD, fichierInfos)
  290. else:
  291. lien = re.search(self.videoArteLiveWebLienPatternSD, fichierInfos)
  292. if lien != None:
  293. lien = lien.group(1)
  294. opt_rename = self.getOption("rename")
  295. if opt_rename:
  296. nomFichierSortie = titre.replace(" ","_")+".mp4"
  297. nomFichierSortie = nomFichierSortie.replace(":","_")
  298. nomFichierSortie = nomFichierSortie.replace("/","_")
  299. nomFichierSortie = nomFichierSortie.replace("\\","_")
  300. nomFichierSortie = nomFichierSortie.replace("?","_")
  301. else:
  302. nomFichierSortie = lien.split('/')[-1]
  303. else:
  304. curDepth -= 1 # On n'est pas tombé sur une vidéo valide (pas de lien, vidéo Live ŕ venir ??)
  305. continue
  306. #~ date = re.search(self.videoDatePattern, fichierInfos)
  307. date = fichier[1]
  308. if date != None:
  309. rfc_date = rfc822.parsedate(date)
  310. # Format année/mois/jour, mieux pour effectuer un tri
  311. date = str(rfc_date[0])+"/"+str(rfc_date[1]).zfill(2)+"/"+str(rfc_date[2]).zfill(2)
  312. else:
  313. continue
  314. if not(lien):
  315. continue
  316. self.afficher ("... Titre : "+titre)
  317. self.afficher ("... Date : "+date)
  318. self.afficher ("... Lien : "+lien)
  319. self.afficher ("... nomFichierSortie : "+nomFichierSortie)
  320. self.ajouterFichier(emission, Fichier( titre, date, lien, nomFichierSortie ) )
  321. liste.append(Fichier(titre, date, lien))
  322. self.afficher(str(len(liste))+" fichiers trouvés.")
  323. self.listeFichiers[emission] = liste
  324. #~ return liste
  325. def listerFichiersArtePlusSept( self, emission ):
  326. """Renvoi la liste des fichiers disponibles pour une emission donnnee"""
  327. # Renvoi la liste des fichiers (utilisation de la classe Fichier)
  328. # [ Fichier ( nom, date, lien) , Fichier( ... ), ... ]
  329. if self.listeFichiers.has_key(emission):
  330. return self.listeFichiers[emission]
  331. # Code de la "chaine" Arte+7
  332. #~ channel = re.search (self.chaineArtePlusSeptChannelIDPattern, self.getLienEmission(emission)).group(1)
  333. channel = self.getLienEmission(emission)
  334. if channel == None:
  335. self.afficher ("Erreur de recherche du code pour \""+emission+"\"")
  336. else:
  337. self.afficher("Récupération de la liste des fichiers pour \""+emission+"\"("+channel+")...")
  338. # Construction du lien contenant toutes les émissions de cette chaine
  339. lien = self.videoArtePlusSeptChaineBaseUrl.replace ("%channel%", channel)
  340. if lien == None:
  341. self.afficher ("Erreur de recherche du lien pour \""+emission+"\"")
  342. else:
  343. self.afficher("Récupération de la liste des fichiers pour \""+emission+"\"...")
  344. # On recherche toutes les émissions de la chaine
  345. self.afficher ("Recherche des émissions de la chaine \""+emission+"\" ŕ l'adresse "+lien)
  346. videos = re.findall(self.videoArtePlusSeptVideosPattern, self.API.getPage(lien))
  347. liste = []
  348. if videos == None:
  349. return liste
  350. # Pour chacune des vidéos trouvées
  351. curDepth = 0
  352. for fichier in videos:
  353. #~ curDepth = curDepth+1
  354. curDepth += 1
  355. opt_maxDepth = int(self.getOption("maxdepth"))
  356. if (opt_maxDepth>0 and curDepth>opt_maxDepth):
  357. break
  358. self.afficher ("Émission trouvée "+fichier[0])
  359. fichierInfos = self.API.getPage(self.videoArtePlusSeptVideoBaseUrl+fichier[0])
  360. # Recherche de la référence de la vidéo dans la page de l'emission
  361. fichierInfosVideoRef_match = re.search (self.videoArtePlusSeptVideoRefPattern, fichierInfos)
  362. if fichierInfosVideoRef_match == None:
  363. continue
  364. self.afficher ("... videoRef : "+fichierInfosVideoRef_match.group(1))
  365. # Recherche l'adresse du player video, pour la suite
  366. fichierInfosPlayer_match = re.search (self.videoArtePlusSeptPlayerPattern, fichierInfos)
  367. if fichierInfosPlayer_match == None:
  368. continue
  369. self.afficher ("... Player : "+fichierInfosPlayer_match.group(1))
  370. #~ # Chargement de la page XML de la référence trouvée
  371. fichierInfos = self.API.getPage(self.videoArtePlusSeptXMLBaseURL.replace("%video%",fichierInfosVideoRef_match.group(1)))
  372. #~ file = open(self.fichierCache+"_web", "w")
  373. #~ file.write (fichierInfos)
  374. #~ file.close()
  375. titre = fichier[1]
  376. opt_qual = self.getOption("qualite")
  377. if opt_qual == "HD":
  378. lien = re.search(self.videoArtePlusSeptLienPatternHD, fichierInfos)
  379. else:
  380. lien = re.search(self.videoArtePlusSeptLienPatternSD, fichierInfos)
  381. if lien != None:
  382. lien = lien.group(1)
  383. opt_rename = self.getOption("rename")
  384. if opt_rename:
  385. nomFichierSortie = titre.replace(" ","_")+".mp4"
  386. nomFichierSortie = nomFichierSortie.replace(":","_")
  387. nomFichierSortie = nomFichierSortie.replace("/","_")
  388. nomFichierSortie = nomFichierSortie.replace("\\","_")
  389. nomFichierSortie = nomFichierSortie.replace("?","_")
  390. else:
  391. nomFichierSortie = lien.split('/')[-1]
  392. if nomFichierSortie.index('?')>0:
  393. nomFichierSortie = nomFichierSortie.split('?')[0]
  394. nomFichierSortie = nomFichierSortie+".mp4"
  395. #~ nomFichierSortie = titre.replace(" ","_").replace(":","_").replace("/","_")+".mp4"
  396. #~ lien = lien.group(1)
  397. # Workaround : on ajoute le nom du player directement ici
  398. lien = lien+" -W "+fichierInfosPlayer_match.group(1)
  399. else:
  400. continue
  401. date = self.parse_date(fichier[2])
  402. if not(lien):
  403. continue
  404. self.afficher ("... Titre : "+titre)
  405. self.afficher ("... Date : "+date)
  406. self.afficher ("... Lien : "+lien)
  407. self.afficher ("... nomFichierSortie : "+nomFichierSortie)
  408. self.ajouterFichier(emission, Fichier( titre, date, lien, nomFichierSortie ) )
  409. liste.append(Fichier(titre, date, lien))
  410. self.afficher(str(len(liste))+" fichiers trouvés.")
  411. self.listeFichiers[emission] = liste
  412. #~ return liste
  413. def listerFichiers( self, emission ):
  414. if (self.derniereChaine == self.nomArteLiveWeb):
  415. #~ return self.listerFichiersArteLiveWeb (emission)
  416. self.listerFichiersArteLiveWeb (emission)
  417. elif (self.derniereChaine == self.nomArtePlusSept):
  418. #~ return self.listerFichiersArtePlusSept (emission)
  419. self.listerFichiersArtePlusSept (emission)
  420. else:
  421. self.afficher("Chaine non prise en compte actuellement")