5 from Components.ActionMap import ActionMap
6 from Components.config import config, ConfigSelection, ConfigSubsection, ConfigText, ConfigYesNo, getConfigListEntry
7 from Components.ConfigList import ConfigListScreen
\r
8 from Components.FileList import FileList
9 from Components.Label import Label
10 from Components.Language import language
\r
11 from Components.MenuList import MenuList
12 from Components.PluginComponent import plugins
13 from Components.ProgressBar import ProgressBar
\r
14 from enigma import eServiceReference, eTimer
15 from os import environ, system
16 from Plugins.Plugin import PluginDescriptor
17 from Screens.InfoBar import MoviePlayer
18 from Screens.MessageBox import MessageBox
19 from Screens.Screen import Screen
20 from Tools.BoundFunction import boundFunction
21 from Tools.Directories import fileExists, resolveFilename, SCOPE_LANGUAGE, SCOPE_PLUGINS
22 from Tools.Downloader import downloadWithProgress
23 from twisted.web.client import getPage
24 from xml.etree.cElementTree import parse
27 ###################################################
30 lang = language.getLanguage()
31 environ["LANGUAGE"] = lang[:2]
\r
32 gettext.bindtextdomain("enigma2", resolveFilename(SCOPE_LANGUAGE))
\r
33 gettext.textdomain("enigma2")
34 gettext.bindtextdomain("Podcast", "%s%s" % (resolveFilename(SCOPE_PLUGINS), "Extensions/Podcast/locale/"))
37 t = gettext.dgettext("Podcast", txt)
\r
39 t = gettext.gettext(txt)
\r
43 language.addCallback(localeInit)
45 ###################################################
48 system('rm "' + file + '"')
50 ###################################################
52 class ChangedMoviePlayer(MoviePlayer):
53 def __init__(self, session, service):
54 MoviePlayer.__init__(self, session, service)
55 self.skinName = "MoviePlayer"
57 def leavePlayer(self):
58 self.session.openWithCallback(self.leavePlayerConfirmed, MessageBox, _("Stop playing this movie?"))
60 def leavePlayerConfirmed(self, answer):
64 def doEofInternal(self, playing):
67 def getPluginList(self):
69 for p in plugins.getPlugins(where=PluginDescriptor.WHERE_EXTENSIONSMENU):
70 if p.name != _("Podcast"):
71 list.append(((boundFunction(self.getPluginName, p.name), boundFunction(self.runPlugin, p), lambda: True), None))
77 ###################################################
79 config.plugins.Podcast = ConfigSubsection()
80 config.plugins.Podcast.buffer = ConfigYesNo(default=True)
81 config.plugins.Podcast.bufferDevice = ConfigText(default="/media/hdd/", fixed_size=False)
82 config.plugins.Podcast.keepStored = ConfigSelection(choices={"delete": _("delete"), "keep": _("keep on device"), "ask": _("ask me")}, default="delete")
84 ###################################################
87 url = url.replace("&", "&")
88 url = url.replace("<", "<")
89 url = url.replace(">", ">")
90 url = url.replace("'", "'")
91 url = url.replace(""", '"')
92 url = url.replace("*", "*")
93 url = url.replace("|", "|")
94 url = url.replace("'", "'")
95 url = url.replace("»", ">>")
98 ###################################################
100 class BufferThread():
103 self.downloading = False
107 def startDownloading(self, url, file):
109 self.downloading = True
111 self.download = downloadWithProgress(url, file)
112 self.download.addProgress(self.httpProgress)
113 self.download.start().addCallback(self.httpFinished).addErrback(self.httpFailed)
115 def httpProgress(self, recvbytes, totalbytes):
116 self.progress = int(100 * recvbytes / float(totalbytes))
118 def httpFinished(self, string=""):
119 self.downloading = False
120 if string is not None:
121 self.error = str(string)
125 def httpFailed(self, failure_instance=None, error_message=""):
126 self.downloading = False
127 if error_message == "" and failure_instance is not None:
128 error_message = failure_instance.getErrorMessage()
129 self.error = str(error_message)
133 self.downloading = False
137 bufferThread = BufferThread()
139 ###################################################
141 class PodcastBuffer(Screen):
143 <screen position="center,center" size="520,80" title="%s" >
\r
144 <widget name="info" position="5,5" size="510,40" font="Regular;18" halign="center" valign="center" />
145 <widget name="progress" position="100,50" size="320,14" pixmap="skin_default/progress_big.png" borderWidth="2" borderColor="#cccccc" />
\r
146 </screen>""" % _("Podcast")
148 def __init__(self, session, url, file):
149 self.session = session
150 Screen.__init__(self, session)
155 self.infoTimer = eTimer()
156 self.infoTimer.timeout.get().append(self.updateInfo)
158 self["info"] = Label(_("Downloading movie: %s") % self.file)
159 self["progress"] = ProgressBar()
161 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.okClicked, "cancel": self.exit}, -1)
163 self.onLayoutFinish.append(self.downloadMovie)
165 def downloadMovie(self):
166 bufferThread.startDownloading(self.url, self.file)
167 self.infoTimer.start(300, False)
169 def updateInfo(self):
170 if bufferThread.error != "":
171 self["info"].setText(bufferThread.error)
172 self.infoTimer.stop()
174 progress = int(bufferThread.progress)
175 self["progress"].setValue(progress)
177 self.infoTimer.stop()
181 if int(bufferThread.progress) > 0:
182 self.infoTimer.stop()
186 bufferThread.download.stop()
189 ###################################################
191 class PodcastMovies(Screen):
193 <screen position="center,center" size="420,360" title="%s" >
\r
194 <widget name="list" position="5,5" size="410,250" scrollbarMode="showOnDemand" />
\r
195 <eLabel position="5,260" size="420,2" backgroundColor="#ffffff" />
\r
196 <widget name="info" position="5,265" size="420,90" font="Regular;18" />
\r
197 </screen>""" % _("Podcast")
199 def __init__(self, session, url):
200 self.session = session
201 Screen.__init__(self, session)
208 self["list"] = MenuList([])
209 self["list"].onSelectionChanged.append(self.showInfo)
210 self["info"] = Label()
212 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
214 self.onLayoutFinish.append(self.downloadMovies)
217 if self.working == False:
218 if len(self.list) > 0:
\r
219 idx = self["list"].getSelectionIndex()
\r
220 (url, length, type) = self.splitExtraInfo(self.movies[idx][1])
221 if config.plugins.Podcast.buffer.value:
223 while file.__contains__("/"):
224 idx = file.index("/")
226 self.file = "%s%s" % (config.plugins.Podcast.bufferDevice.value, file)
227 self.session.openWithCallback(self.bufferCallback, PodcastBuffer, url, self.file)
229 ref = eServiceReference(4097, 0, url)
230 self.session.open(ChangedMoviePlayer, ref)
232 def bufferCallback(self, callback):
233 if callback is not None:
234 ref = eServiceReference(4097, 0, self.file)
235 self.session.openWithCallback(self.delete, ChangedMoviePlayer, ref)
237 def delete(self, callback=None):
238 if bufferThread.downloading: #still downloading?
240 if config.plugins.Podcast.keepStored.value == "delete":
242 elif config.plugins.Podcast.keepStored.value == "ask":
243 self.session.openWithCallback(self.deleteCallback, MessageBox, _("Delete this movie?"))
245 def deleteCallback(self, callback):
250 if self.working == False:
253 def downloadMovies(self):
254 getPage(self.url).addCallback(self.showMovies).addErrback(self.error)
256 def showMovies(self, page):
258 reonecat = re.compile(r'<item>(.+?)</item>', re.DOTALL)
259 items = reonecat.findall(page)
263 if '<description></description>' in item:
264 reonecat2 = re.compile(r'<title>(.+?)</title>.+?<enclosure(.+?)/>.+?', re.DOTALL)
\r
265 for title, extra in reonecat2.findall(item):
266 if title.startswith("<![CDATA["):
268 if title.endswith("]]>"):
270 self.list.append(encodeUrl(title))
\r
271 self.movies.append(["", extra])
273 reonecat2 = re.compile(r'<title>(.+?)</title>.+?<description>(.+?)</description>.+?<enclosure(.+?)/>.+?', re.DOTALL)
274 for title, description, extra in reonecat2.findall(item):
275 if title.startswith("<![CDATA["):
277 if title.endswith("]]>"):
279 if description.__contains__("<![CDATA["):
280 idx = description.index("<![CDATA[")
281 description = description[idx+10:]
282 if description.endswith("]]>"):
283 description = description[:-3]
\r
284 self.list.append(encodeUrl(title))
\r
285 self.movies.append([description, extra])
\r
286 self["list"].setList(self.list)
\r
290 def error(self, error=""):
291 print "[Podcast] Error:", error
292 self.instance.setTitle(_("Error getting movies"))
293 self.working = False
\r
295 def showInfo(self):
\r
296 if len(self.list) > 0:
\r
297 idx = self["list"].getSelectionIndex()
\r
298 description = self.movies[idx][0]
\r
299 (url, length, type) = self.splitExtraInfo(self.movies[idx][1])
\r
300 self["info"].setText("%s: %s %s: %s\n%s" % (_("Length"), length, _("Type"), type, encodeUrl(description)))
\r
302 def splitExtraInfo(self, info):
\r
303 if info.__contains__('url="'):
\r
304 idx = info.index('url="')
\r
306 idx = url.index('"')
\r
312 if info.__contains__('length="'):
\r
313 idx = info.index('length="')
\r
314 length = info[idx+8:]
\r
315 idx = length.index('"')
\r
316 length = length[:idx]
318 length = str((int(length) / 1024) / 1024) + " MB"
\r
320 if info.__contains__('type="'):
\r
321 idx = info.index('type="')
\r
322 type = info[idx+6:]
\r
323 idx = type.index('"')
\r
328 return (url, length, type)
330 ###################################################
332 class PodcastPodcasts(Screen):
334 <screen position="center,center" size="420,360" title="%s" >
\r
335 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
336 </screen>""" % _("Podcast")
338 def __init__(self, session, provider):
339 self.session = session
340 Screen.__init__(self, session)
342 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.close}, -1)
346 for podcast in provider.findall("podcast"):
347 name = podcast.get("name") or None
348 name = name.encode("UTF-8") or name
349 url = podcast.get("url") or None
352 self.urls.append(url)
353 self["list"] = MenuList(list)
356 if len(self.urls) > 0:
357 cur = self.urls[self["list"].getSelectedIndex()]
358 self.session.open(PodcastMovies, cur)
360 ###################################################
362 class PodcastProvider(Screen):
364 <screen position="center,center" size="420,360" title="%s" >
365 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
366 </screen>""" % _("Podcast")
368 def __init__(self, session, language):
369 self.session = session
370 Screen.__init__(self, session)
372 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.close}, -1)
376 for provider in language.findall("provider"):
377 name = provider.get("name") or None
378 name = name.encode("UTF-8") or name
381 self.providers.append(provider)
382 self["list"] = MenuList(list)
385 if len(self.providers) > 0:
386 cur = self.providers[self["list"].getSelectedIndex()]
387 self.session.open(PodcastPodcasts, cur)
389 ###################################################
391 class PodcastXML(Screen):
393 <screen position="center,center" size="420,360" title="%s" >
\r
394 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
395 </screen>""" % _("Podcast")
397 def __init__(self, session):
398 self.session = session
399 Screen.__init__(self, session)
401 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.close}, -1)
405 file = "/etc/podcast/podcasts.xml"
407 xml = parse(file).getroot()
408 for language in xml.findall("language"):
409 name = language.get("name") or None
410 name = name.encode("UTF-8") or name
413 self.languages.append(language)
414 self["list"] = MenuList(list)
417 if len(self.languages) > 0:
418 cur = self.languages[self["list"].getSelectedIndex()]
419 self.session.open(PodcastProvider, cur)
421 ###################################################
423 class PodcastComGenre2(Screen):
425 <screen position="center,center" size="420,360" title="%s" >
\r
426 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
427 </screen>""" % _("Podcast")
429 def __init__(self, session, url):
430 self.session = session
431 Screen.__init__(self, session)
433 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
438 self["list"] = MenuList([])
440 self.onLayoutFinish.append(self.downloadGenres)
443 if self.working == False:
444 if len(self.urls) > 0:
446 cur = self.urls[self["list"].getSelectedIndex()]
447 getPage(cur).addCallback(self.getRssUrl).addErrback(self.error2)
449 def getRssUrl(self, page):
450 idx = page.index('">rss feed</a><br>')
452 while page.__contains__("http://"):
453 idx = page.index("http://")
456 self.session.open(PodcastMovies, "h%s"%page)
459 if self.working == False:
462 def downloadGenres(self):
463 getPage(self.url).addCallback(self.getGenres).addErrback(self.error)
465 def getGenres(self, page):
467 reonecat = re.compile(r'height="19"><a href="(.+?)">(.+?)</a>', re.DOTALL)
\r
468 for url, title in reonecat.findall(page):
\r
469 list.append(encodeUrl(title))
\r
470 self.urls.append(url)
\r
471 self["list"].setList(list)
474 def error(self, error=""):
475 print "[Podcast] Error:", error
476 self.instance.setTitle(_("Error getting genres"))
479 def error2(self, error=""):
480 print "[Podcast] Error:", error
481 self.instance.setTitle(_("Error getting rss feed"))
484 ###################################################
486 class PodcastComGenre(Screen):
488 <screen position="center,center" size="420,360" title="%s" >
489 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
490 </screen>""" % _("Podcast")
492 def __init__(self, session, url):
493 self.session = session
494 Screen.__init__(self, session)
496 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
501 self["list"] = MenuList([])
503 self.onLayoutFinish.append(self.downloadSite)
506 if self.working == False:
507 if len(self.urls) > 0:
508 cur = self.urls[self["list"].getSelectedIndex()]
509 self.session.open(PodcastComGenre2, cur)
512 if self.working == False:
515 def downloadSite(self):
516 getPage(self.url).addCallback(self.getUrl).addErrback(self.error)
518 def getUrl(self, page):
519 reonecat = re.compile(r'Get this podcast channel on your mobile phone:</strong><br><a href="(.+?)"', re.DOTALL)
520 list = reonecat.findall(page)
522 getPage(list[0]).addCallback(self.getGenres).addErrback(self.error)
524 self.error("Error getting movies-url")
526 def getGenres(self, page):
528 reonecat = re.compile(r'height="17"><a title="(.+?)" href="(.+?)">(.+?)</a>', re.DOTALL)
\r
529 for title2, url, title in reonecat.findall(page):
\r
530 list.append(encodeUrl(title))
\r
531 self.urls.append(url)
\r
532 self["list"].setList(list)
535 def error(self, error=""):
536 print "[Podcast] Error:", error
537 self.instance.setTitle(_("Error getting genres"))
540 ###################################################
542 class PodcastCom(Screen):
544 <screen position="center,center" size="420,360" title="%s" >
545 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
546 </screen>""" % _("Podcast")
548 def __init__(self, session):
549 self.session = session
550 Screen.__init__(self, session)
555 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
557 self["list"] = MenuList([])
559 self.onLayoutFinish.append(self.downloadMovies)
562 if self.working == False:
563 if len(self.urls) > 0:
564 cur = self.urls[self["list"].getSelectedIndex()]
565 self.session.open(PodcastComGenre, cur)
568 if self.working == False:
571 def downloadMovies(self):
572 getPage("http://podcast.com/home.php?subpage=_pages/channels_home.php").addCallback(self.showGenres).addErrback(self.error)
574 def showGenres(self, page):
576 reonecat = re.compile(r'<li><a href="(.+?)" title="(.+?)">(.+?)</a></li>', re.DOTALL)
\r
577 for url, title2, title in reonecat.findall(page):
578 if not title.startswith("<"):
\r
579 list.append(encodeUrl(title))
\r
580 self.urls.append(url)
\r
581 self["list"].setList(list)
584 def error(self, error=""):
585 print "[Podcast] Error:", error
586 self.instance.setTitle(_("Error getting genres"))
589 ###################################################
591 class LocationSelection(Screen):
593 <screen position="center,center" size="560,300" title="%s">
594 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
595 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
596 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
597 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
598 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
599 <widget name="filelist" position="10,45" size="550,255" scrollbarMode="showOnDemand" />
600 </screen>""" % _("Podcast")
\r
602 def __init__(self, session, dir="/"):
\r
603 Screen.__init__(self, session)
\r
605 self["key_green"] = Label(_("Select"))
\r
607 try: self["filelist"] = FileList(dir, showDirectories=True, showFiles=False)
\r
608 except: self["filelist"] = FileList("/", showDirectories, showFiles)
\r
610 self["actions"] = ActionMap(["ColorActions", "OkCancelActions"],
\r
612 "ok": self.okClicked,
\r
613 "cancel": self.exit,
\r
614 "green": self.select
\r
617 self.onLayoutFinish.append(self.updateDirectoryName)
\r
619 def okClicked(self):
\r
620 if self["filelist"].canDescent():
\r
621 self["filelist"].descent()
\r
622 self["filelist"].instance.moveSelectionTo(0)
\r
623 self.updateDirectoryName()
\r
629 dir = self["filelist"].getCurrentDirectory()
\r
630 if dir is not None:
\r
635 def updateDirectoryName(self):
637 dir = self["filelist"].getCurrentDirectory()
638 self.instance.setTitle(dir)
640 self.instance.setTitle("?")
642 ###################################################
644 class PodcastConfig(ConfigListScreen, Screen):
646 <screen position="center,center" size="560,180" title="%s">
647 <ePixmap pixmap="skin_default/buttons/red.png" position="0,0" size="140,40" transparent="1" alphatest="on" />
648 <ePixmap pixmap="skin_default/buttons/green.png" position="140,0" size="140,40" transparent="1" alphatest="on" />
649 <ePixmap pixmap="skin_default/buttons/yellow.png" position="280,0" size="140,40" transparent="1" alphatest="on" />
650 <ePixmap pixmap="skin_default/buttons/blue.png" position="420,0" size="140,40" transparent="1" alphatest="on" />
651 <widget name="key_green" position="140,0" zPosition="1" size="140,40" font="Regular;20" valign="center" halign="center" backgroundColor="#1f771f" transparent="1" />
652 <widget name="config" position="10,45" size="550,125" scrollbarMode="showOnDemand" />
653 </screen>""" % _("Podcast")
655 def __init__(self, session):
656 Screen.__init__(self, session)
658 self["key_green"] = Label(_("Save"))
660 ConfigListScreen.__init__(self, [])
663 self["actions"] = ActionMap(["OkCancelActions", "ColorActions"], {"green": self.save, "cancel": self.exit}, -1)
665 self.onLayoutFinish.append(self.createConfig)
667 def createConfig(self):
668 self.deviceEntry = ConfigSelection(choices=[config.plugins.Podcast.bufferDevice.value], default=config.plugins.Podcast.bufferDevice.value)
669 self["config"].list = [
670 getConfigListEntry(_("Buffer:"), config.plugins.Podcast.buffer),
671 getConfigListEntry(_("Buffer device:"), self.deviceEntry),
672 getConfigListEntry(_("Buffer file handling:"), config.plugins.Podcast.keepStored)]
675 ConfigListScreen.keyLeft(self)
676 self.handleKeysLeftAndRight()
679 ConfigListScreen.keyRight(self)
680 self.handleKeysLeftAndRight()
682 def handleKeysLeftAndRight(self):
683 sel = self["config"].getCurrent()[1]
684 if sel == self.deviceEntry:
685 self.session.openWithCallback(self.locationSelected, LocationSelection, config.plugins.Podcast.bufferDevice.value)
687 def locationSelected(self, dir):
688 if dir is not None and dir != "?":
689 config.plugins.Podcast.bufferDevice.value = dir
690 config.plugins.Podcast.bufferDevice.save()
694 for x in self["config"].list:
699 for x in self["config"].list:
703 ###################################################
705 class PodcastDeEpisodes(Screen):
707 <screen position="center,center" size="420,360" title="%s" >
708 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
709 </screen>""" % _("Podcast")
711 def __init__(self, session, url):
712 self.session = session
713 Screen.__init__(self, session)
719 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
721 self["list"] = MenuList([])
723 self.onLayoutFinish.append(self.downloadMovies)
726 if self.working == False:
727 self.instance.setTitle(_("Podcast"))
728 if len(self.urls) > 0:
729 cur = self.urls[self["list"].getSelectedIndex()]
731 getPage(cur).addCallback(self.playPodcast).addErrback(self.error2)
733 def playPodcast(self, url):
734 if url.__contains__('" id="control_download"'):
736 idx = url.index('" id="control_download"')
738 while url.__contains__("http://"):
739 idx = url.index("http://")
743 if config.plugins.Podcast.buffer.value:
745 while file.__contains__("/"):
746 idx = file.index("/")
748 self.file = "%s%s" % (config.plugins.Podcast.bufferDevice.value, file)
749 self.session.openWithCallback(self.bufferCallback, PodcastBuffer, url, self.file)
751 ref = eServiceReference(4097, 0, url)
752 self.session.open(ChangedMoviePlayer, ref)
756 def bufferCallback(self, callback):
757 if callback is not None:
758 ref = eServiceReference(4097, 0, self.file)
759 self.session.openWithCallback(self.delete, ChangedMoviePlayer, ref)
761 def delete(self, callback=None):
762 if bufferThread.downloading: #still downloading?
764 if config.plugins.Podcast.keepStored.value == "delete":
766 elif config.plugins.Podcast.keepStored.value == "ask":
767 self.session.openWithCallback(self.deleteCallback, MessageBox, _("Delete this movie?"))
769 def deleteCallback(self, callback):
774 if self.working == False:
777 def downloadMovies(self):
778 getPage(self.url).addCallback(self.showEpisodes).addErrback(self.error)
780 def showEpisodes(self, page):
782 idx = page.index('<h3>')
784 idx = page.index('</div></div>')
786 reonecat = re.compile(r'<a href="(.+?)" title="(.+?)">', re.DOTALL)
\r
787 for url, title in reonecat.findall(page):
788 if title.startswith("Episode: "):
790 list.append(encodeUrl(title))
\r
791 self.urls.append(url)
\r
792 self["list"].setList(list)
795 def error(self, error=""):
796 print "[Podcast] Error:", error
797 self.instance.setTitle(_("Error getting episodes"))
800 def error2(self, error=""):
801 print "[Podcast] Error: Error getting podcast url"
802 self.instance.setTitle(_("Error getting podcast url"))
805 ###################################################
807 class PodcastDePodcasts(Screen):
809 <screen position="center,center" size="420,360" title="%s" >
810 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
811 </screen>""" % _("Podcast")
813 def __init__(self, session, url):
814 self.session = session
815 Screen.__init__(self, session)
821 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
823 self["list"] = MenuList([])
825 self.onLayoutFinish.append(self.downloadMovies)
828 if self.working == False:
829 if len(self.urls) > 0:
830 cur = self.urls[self["list"].getSelectedIndex()]
831 self.session.open(PodcastDeEpisodes, cur)
834 if self.working == False:
837 def downloadMovies(self):
838 getPage(self.url).addCallback(self.showPodcasts).addErrback(self.error)
840 def showPodcasts(self, page):
842 idx = page.index('<h4>Podcasts</h4>')
844 idx = page.index('</div>')
846 reonecat = re.compile(r'alt="(.+?)" class="(.+?)<a href="(.+?)" title="(.+?)">(.+?)<span class="(.+?)"></span>', re.DOTALL)
\r
847 for title, x, url, x2, x3, type in reonecat.findall(page):
848 if type.__contains__("content_type_1_icon"):
851 text = _(" (Video)")
\r
852 list.append(encodeUrl(title+text))
\r
853 self.urls.append(url)
\r
854 self["list"].setList(list)
857 def error(self, error=""):
858 print "[Podcast] Error:", error
859 self.instance.setTitle(_("Error getting podcasts"))
862 ###################################################
864 class PodcastDeCategories(Screen):
866 <screen position="center,center" size="420,360" title="%s" >
867 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
868 </screen>""" % _("Podcast")
870 def __init__(self, session, url):
871 self.session = session
872 Screen.__init__(self, session)
878 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
880 self["list"] = MenuList([])
882 self.onLayoutFinish.append(self.downloadMovies)
885 if self.working == False:
886 if len(self.urls) > 0:
887 cur = self.urls[self["list"].getSelectedIndex()]
888 self.session.open(PodcastDePodcasts, cur)
891 if self.working == False:
894 def downloadMovies(self):
895 getPage(self.url).addCallback(self.showCategories).addErrback(self.error)
897 def showCategories(self, page):
899 idx = page.index('<h3>')
901 idx = page.index('</div>')
903 reonecat = re.compile(r'<a href="(.+?)" title="(.+?)">', re.DOTALL)
\r
904 for url, title in reonecat.findall(page):
\r
905 list.append(encodeUrl(title))
\r
906 self.urls.append(url)
\r
907 self["list"].setList(list)
910 def error(self, error=""):
911 print "[Podcast] Error:", error
912 self.instance.setTitle(_("Error getting categories"))
915 ###################################################
917 class PodcastDe(Screen):
919 <screen position="center,center" size="420,360" title="%s" >
920 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
921 </screen>""" % _("Podcast")
923 def __init__(self, session):
924 self.session = session
925 Screen.__init__(self, session)
930 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.exit}, -1)
932 self["list"] = MenuList([])
934 self.onLayoutFinish.append(self.downloadMovies)
937 if self.working == False:
938 if len(self.urls) > 0:
939 cur = self.urls[self["list"].getSelectedIndex()]
940 self.session.open(PodcastDeCategories, cur)
943 if self.working == False:
946 def downloadMovies(self):
947 getPage("http://m.podcast.de/kategorien").addCallback(self.showCategories).addErrback(self.error)
949 def showCategories(self, page):
951 idx = page.index('<h3>')
953 idx = page.index('</div>')
955 reonecat = re.compile(r'<a href="(.+?)" title="(.+?)">', re.DOTALL)
\r
956 for url, title in reonecat.findall(page):
\r
957 list.append(encodeUrl(title))
\r
958 self.urls.append(url)
\r
959 self["list"].setList(list)
962 def error(self, error=""):
963 print "[Podcast] Error:", error
964 self.instance.setTitle(_("Error getting categories"))
967 ###################################################
969 class Podcast(Screen):
971 <screen position="center,center" size="420,360" title="%s" >
972 <widget name="list" position="0,0" size="420,350" scrollbarMode="showOnDemand" />
\r
973 </screen>""" % _("Podcast")
975 def __init__(self, session):
976 self.session = session
977 Screen.__init__(self, session)
979 self["actions"] = ActionMap(["OkCancelActions"], {"ok": self.ok, "cancel": self.close}, -1)
981 self["list"] = MenuList([
988 cur = self["list"].getCurrent()
989 if cur == _("podcast.de"):
990 self.session.open(PodcastDe)
991 elif cur == _("podcast.com"):
992 self.session.open(PodcastCom)
993 elif cur == _("from xml"):
994 self.session.open(PodcastXML)
996 self.session.open(PodcastConfig)
998 ###################################################
1000 def main(session, **kwargs):
1001 session.open(Podcast)
1003 def Plugins(**kwargs):
1004 return PluginDescriptor(name=_("Podcast"), where=PluginDescriptor.WHERE_EXTENSIONSMENU, fnc=main)