-# -*- coding: utf8 -*-
+# -*- coding: UTF-8 -*-
from Plugins.Plugin import PluginDescriptor
from twisted.web.client import downloadPage
-from enigma import ePicLoad
+from enigma import ePicLoad, eServiceReference
from Screens.Screen import Screen
+from Screens.EpgSelection import EPGSelection
+from Screens.ChannelSelection import SimpleChannelSelection
from Components.ActionMap import ActionMap
from Components.Pixmap import Pixmap
from Components.Label import Label
from Components.Language import language
from Components.ProgressBar import ProgressBar
from Tools.Directories import resolveFilename, SCOPE_PLUGINS, SCOPE_SKIN_IMAGE
-from Tools.LoadPixmap import LoadPixmap
+from os import environ as os_environ
import re
import htmlentitydefs
import urllib
+import gettext
+
+def localeInit():
+ lang = language.getLanguage()[:2] # getLanguage returns e.g. "fi_FI" for "language_country"
+ os_environ["LANGUAGE"] = lang # Enigma doesn't set this (or LC_ALL, LC_MESSAGES, LANG). gettext needs it!
+ gettext.bindtextdomain("IMDb", resolveFilename(SCOPE_PLUGINS, "Extensions/IMDb/locale"))
+
+def _(txt):
+ t = gettext.dgettext("IMDb", txt)
+ if t == txt:
+ print "[IMDb] fallback to default translation for", txt
+ t = gettext.gettext(txt)
+ return t
+
+localeInit()
+language.addCallback(localeInit)
+
+class IMDBChannelSelection(SimpleChannelSelection):
+ def __init__(self, session):
+ SimpleChannelSelection.__init__(self, session, _("Channel Selection"))
+ self.skinName = "SimpleChannelSelection"
+
+ self["ChannelSelectEPGActions"] = ActionMap(["ChannelSelectEPGActions"],
+ {
+ "showEPGList": self.channelSelected
+ }
+ )
+
+ def channelSelected(self):
+ ref = self.getCurrentSelection()
+ if (ref.flags & 7) == 7:
+ self.enterPath(ref)
+ elif not (ref.flags & eServiceReference.isMarker):
+ self.session.openWithCallback(
+ self.epgClosed,
+ IMDBEPGSelection,
+ ref,
+ openPlugin = False
+ )
+
+ def epgClosed(self, ret = None):
+ if ret:
+ self.close(ret)
+
+class IMDBEPGSelection(EPGSelection):
+ def __init__(self, session, ref, openPlugin = True):
+ EPGSelection.__init__(self, session, ref)
+ self.skinName = "EPGSelection"
+ self["key_green"].setText(_("Lookup"))
+ self.openPlugin = openPlugin
+
+ def infoKeyPressed(self):
+ self.timerAdd()
+
+ def timerAdd(self):
+ cur = self["list"].getCurrent()
+ evt = cur[0]
+ sref = cur[1]
+ if not evt:
+ return
+
+ if self.openPlugin:
+ self.session.open(
+ IMDB,
+ evt.getEventName()
+ )
+ else:
+ self.close(evt.getEventName())
+
+ def onSelectionChanged(self):
+ pass
class IMDB(Screen):
skin = """
<widget name="stars" position="340,40" size="210,21" pixmap="/usr/lib/enigma2/python/Plugins/Extensions/IMDb/starsbar_filled.png" transparent="1" />
</screen>"""
- def __init__(self, session, eventName, args = None):
- self.skin = IMDB.skin
+ def __init__(self, session, eventName, callbackNeeded=False):
Screen.__init__(self, session)
self.eventName = eventName
+
+ self.callbackNeeded = callbackNeeded
+ self.callbackData = ""
+ self.callbackGenre = ""
self.dictionary_init()
self["starsbg"].hide()
self.ratingstars = -1
- self["titellabel"] = Label("The Internet Movie Database")
+ self["titellabel"] = Label(_("The Internet Movie Database"))
self["detailslabel"] = ScrollLabel("")
self["castlabel"] = ScrollLabel("")
self["extralabel"] = ScrollLabel("")
self["menu"] = MenuList(self.resultlist)
self["menu"].hide()
- self["key_red"] = Button(self._("Exit"))
+ self["key_red"] = Button(_("Exit"))
self["key_green"] = Button("")
self["key_yellow"] = Button("")
self["key_blue"] = Button("")
self["actions"] = ActionMap(["OkCancelActions", "ColorActions", "MovieSelectionActions", "DirectionActions"],
{
"ok": self.showDetails,
- "cancel": self.close,
+ "cancel": self.exit,
"down": self.pageDown,
"up": self.pageUp,
- "red": self.close,
+ "red": self.exit,
"green": self.showMenu,
"yellow": self.showDetails,
"blue": self.showExtras,
+ "contextMenu": self.openChannelSelection,
"showEventInfo": self.showDetails
}, -1)
self.getIMDB()
+ def exit(self):
+ if self.callbackNeeded:
+ self.close([self.callbackData, self.callbackGenre])
+ else:
+ self.close()
+
def dictionary_init(self):
syslang = language.getLanguage()
- if syslang.find("de") is -1:
+ if "de" not in syslang:
self.IMDBlanguage = "" # set to empty ("") for english version
else:
self.IMDBlanguage = "german." # it's a subdomain, so add a '.' at the end
- self.dict = {}
- self.dict["of"]="von"
- self.dict[" as "]=" als "
- self.dict["Ambiguous results"]="Kein eindeutiger Treffer"
- self.dict["Please select the matching entry"]="Bitte passenden Eintrag auswählen"
- self.dict["No IMDb match."]="Keine passenden Einträge gefunden."
- self.dict["IMDb query failed!"]="IMDb-Query fehlgeschlagen!"
- self.dict["No details found."]="Keine Details gefunden."
- self.dict["no user rating yet"]="noch keine Nutzerwertung"
- self.dict["Cast: "]="Darsteller: "
- self.dict["No cast list found in the database."]="Keine Darstellerliste in der Datenbank gefunden."
- self.dict["Exit"]="Beenden"
- self.dict["Extra Info"]="Zusatzinfos"
- self.dict["Title Menu"]="Titelauswahl"
-
self.htmltags = re.compile('<.*?>')
self.generalinfomask = re.compile(
'<h1>(?P<title>.*?) <.*?</h1>.*?'
- '(?:.*?<h5>(?P<g_director>Regisseur|Directors?):</h5>.*?>(?P<director>.*?)</a>)*'
- '(?:.*?<h5>(?P<g_creator>Sch\S*?pfer|Creators?):</h5>.*?>(?P<creator>.*?)</a>)*'
+ '(?:.*?<h5>(?P<g_director>Regisseur|Directors?):</h5>.*?<a href=\".*?\">(?P<director>.*?)</a>)*'
+ '(?:.*?<h5>(?P<g_creator>Sch\S*?pfer|Creators?):</h5>.*?<a href=\".*?\">(?P<creator>.*?)</a>)*'
'(?:.*?<h5>(?P<g_seasons>Seasons):</h5>(?:.*?)<a href=\".*?\">(?P<seasons>\d+?)</a>\s+?(?:<a class|\|\s+?<a href="episodes#season-unknown))*'
- '(?:.*?<h5>(?P<g_writer>Drehbuch|Writer).*?</h5>.*?>(?P<writer>.*?)</a>)*'
- '(?:.*?<h5>(?P<g_premiere>Premiere|Release Date).*?</h5>\s.*?\n?(?P<premiere>.*?)\n\s.*?<)*'
- '(?:.*?<h5>(?P<g_alternativ>Alternativ|Also Known As):</h5>(?P<alternativ>.*?)<br>\s{0,8}<a.*?>(?:mehr|more))*'
- '(?:.*?<h5>(?P<g_country>Produktionsland|Country):</h5>.*?<a.*?>(?P<country>.*?)</a>(?:.*?mehr|\n</div>))*'
+ '(?:.*?<h5>(?P<g_writer>Drehbuch|Writer).*?</h5>.*?<a href=\".*?\">(?P<writer>.*?)</a>)*'
+ '(?:.*?<h5>(?P<g_premiere>Premiere|Release Date).*?</h5>\s+<div.*?>\s?(?P<premiere>.*?)\n\s.*?<)*'
+ '(?:.*?<h5>(?P<g_alternativ>Auch bekannt als|Also Known As):</h5><div.*?>\s*(?P<alternativ>.*?)<br>)*'#\s{0,8}<a.*?>(?:Mehr|See more))*'
+ '(?:.*?<h5>(?P<g_country>Land|Country):</h5>\s+<div.*?>(?P<country>.*?)</div>(?:.*?Mehr|\s+?</div>))*'
, re.DOTALL)
self.extrainfomask = re.compile(
'(?:.*?<h5>(?P<g_tagline>Werbezeile|Tagline?):</h5>\n(?P<tagline>.+?)<)*'
'(?:.*?<h5>(?P<g_outline>Kurzbeschreibung|Plot Outline):</h5>(?P<outline>.+?)<)*'
'(?:.*?<h5>(?P<g_synopsis>Plot Synopsis):</h5>(?:.*?)(?:<a href=\".*?\">)*?(?P<synopsis>.+?)(?:</a>|</div>))*'
- '(?:.*?<h5>(?P<g_keywords>Plot Keywords):</h5>(?P<keywords>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_awards>Filmpreise|Awards):</h5>(?P<awards>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_runtime>L\S*?nge|Runtime):</h5>(?P<runtime>.+?)<)*'
+ '(?:.*?<h5>(?P<g_keywords>Plot Keywords):</h5>(?P<keywords>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_awards>Filmpreise|Awards):</h5>(?P<awards>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_runtime>L\S*?nge|Runtime):</h5>(?P<runtime>.+?)</div>)*'
'(?:.*?<h5>(?P<g_language>Sprache|Language):</h5>(?P<language>.+?)</div>)*'
'(?:.*?<h5>(?P<g_color>Farbe|Color):</h5>(?P<color>.+?)</div>)*'
- '(?:.*?<h5>(?P<g_aspect>Seitenverh\S*?ltnis|Aspect Ratio):</h5>(?P<aspect>.+?)(?:mehr|more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_aspect>Seitenverh\S*?ltnis|Aspect Ratio):</h5>(?P<aspect>.+?)(?:Mehr|See more</a>|</div>))*'
'(?:.*?<h5>(?P<g_sound>Tonverfahren|Sound Mix):</h5>(?P<sound>.+?)</div>)*'
'(?:.*?<h5>(?P<g_cert>Altersfreigabe|Certification):</h5>(?P<cert>.+?)</div>)*'
- '(?:.*?<h5>(?P<g_locations>Drehorte|Filming Locations):</h5>(?P<locations>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_company>Firma|Company):</h5>(?P<company>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_trivia>Dies und das|Trivia):</h5>(?P<trivia>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_goofs>Pannen|Goofs):</h5>(?P<goofs>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_quotes>Dialogzitate|Quotes):</h5>(?P<quotes>.+?)(?:mehr|more</a>|</div>))*'
- '(?:.*?<h5>(?P<g_connections>Bez\S*?ge zu anderen Titeln|Movie Connections):</h5>(?P<connections>.+?)(?:mehr|more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_locations>Drehorte|Filming Locations):</h5>(?P<locations>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_company>Firma|Company):</h5>(?P<company>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_trivia>Dies und das|Trivia):</h5>(?P<trivia>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_goofs>Pannen|Goofs):</h5>(?P<goofs>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_quotes>Dialogzitate|Quotes):</h5>(?P<quotes>.+?)(?:Mehr|See more</a>|</div>))*'
+ '(?:.*?<h5>(?P<g_connections>Bez\S*?ge zu anderen Titeln|Movie Connections):</h5>(?P<connections>.+?)(?:Mehr|See more</a>|</div>))*'
'(?:.*?<h3>(?P<g_comments>Nutzerkommentare|User Comments)</h3>.*?<a href="/user/ur\d{7,7}/comments">(?P<commenter>.+?)\n</div>.*?<p>(?P<comment>.+?)</p>)*'
, re.DOTALL)
- def _(self, in_string):
- out_string = in_string
- if ((self.IMDBlanguage).find("german")) != -1:
- out_string = self.dict.get(in_string, in_string)
- return out_string
-
def resetLabels(self):
self["detailslabel"].setText("")
self["ratinglabel"].setText("")
self["castlabel"].hide()
self["poster"].hide()
self["extralabel"].hide()
- self["titellabel"].setText(self._("Ambiguous results"))
- self["detailslabel"].setText(self._("Please select the matching entry"))
+ self["titellabel"].setText(_("Ambiguous results"))
+ self["detailslabel"].setText(_("Please select the matching entry"))
self["detailslabel"].show()
self["key_blue"].setText("")
- self["key_green"].setText(self._("Title Menu"))
- self["key_yellow"].setText(self._("Details"))
+ self["key_green"].setText(_("Title Menu"))
+ self["key_yellow"].setText(_("Details"))
self.Page = 0
def showDetails(self):
if self.resultlist and self.Page == 0:
link = self["menu"].getCurrent()[1]
title = self["menu"].getCurrent()[0]
- self["statusbar"].setText("Re-Query IMDb: "+title+"...")
+ self["statusbar"].setText(_("Re-Query IMDb: %s...") % (title))
localfile = "/tmp/imdbquery2.html"
fetchurl = "http://" + self.IMDBlanguage + "imdb.com/title/" + link
print "[IMDB] downloading query " + fetchurl + " to " + localfile
self["ratinglabel"].hide()
self.Page = 2
+ def openChannelSelection(self):
+ self.session.openWithCallback(
+ self.channelSelectionClosed,
+ IMDBChannelSelection
+ )
+
+ def channelSelectionClosed(self, ret = None):
+ if ret:
+ self.eventName = ret
+ self.Page = 0
+ self.resultlist = []
+ self["menu"].hide()
+ self["ratinglabel"].show()
+ self["castlabel"].show()
+ self["detailslabel"].show()
+ self["poster"].hide()
+ self["stars"].hide()
+ self["starsbg"].hide()
+ self.getIMDB()
+
def getIMDB(self):
self.resetLabels()
if self.eventName is "":
if event:
self.eventName = event.getEventName()
if self.eventName is not "":
- self["statusbar"].setText("Query IMDb: " + self.eventName + "...")
+ self["statusbar"].setText(_("Query IMDb: %s...") % (self.eventName))
event_quoted = urllib.quote(self.eventName.decode('utf8').encode('latin-1','ignore'))
localfile = "/tmp/imdbquery.html"
fetchurl = "http://" + self.IMDBlanguage + "imdb.com/find?q=" + event_quoted + "&s=tt&site=aka"
print "[IMDB] Downloading Query " + fetchurl + " to " + localfile
downloadPage(fetchurl,localfile).addCallback(self.IMDBquery).addErrback(self.fetchFailed)
else:
- self["statusbar"].setText("Could't get Eventname -_-")
+ self["statusbar"].setText(_("Could't get Eventname"))
def fetchFailed(self,string):
- print "[IMDB] fetch failed " + string
- self["statusbar"].setText("IMDb Download failed -_-")
+ print "[IMDB] fetch failed", string
+ self["statusbar"].setText(_("IMDb Download failed"))
def html2utf8(self,in_html):
htmlentitynumbermask = re.compile('(&#(\d{1,5}?);)')
- htmlentitynamemask = re.compile('(&(\D{1,5}?);)')
-
- entities = htmlentitynamemask.finditer(in_html)
+ htmlentityhexmask = re.compile('(&#x([0-9A-Fa-f]{2,2}?);)')
+ htmlentitynamemask = re.compile('(&([^#]\D{1,5}?);)')
entitydict = {}
+ entityhexdict = {}
+ entities = htmlentitynamemask.finditer(in_html)
for x in entities:
entitydict[x.group(1)] = x.group(2)
-
for key, name in entitydict.items():
entitydict[key] = htmlentitydefs.name2codepoint[name]
+ entities = htmlentityhexmask.finditer(in_html)
- entities = htmlentitynumbermask.finditer(in_html)
+ for x in entities:
+ entityhexdict[x.group(1)] = x.group(2)
+ for key, name in entityhexdict.items():
+ entitydict[key] = "%d" % int(key[3:5], 16)
+ print "key:", key, "before:", name, "after:", entitydict[key]
+
+ entities = htmlentitynumbermask.finditer(in_html)
for x in entities:
entitydict[x.group(1)] = x.group(2)
-
for key, codepoint in entitydict.items():
in_html = in_html.replace(key, (unichr(int(codepoint)).encode('latin-1')))
-
self.inhtml = in_html.decode('latin-1').encode('utf8')
def IMDBquery(self,string):
print "[IMDBquery]"
- self["statusbar"].setText("IMDb Download completed")
+ self["statusbar"].setText(_("IMDb Download completed"))
self.html2utf8(open("/tmp/imdbquery.html", "r").read())
self.IMDBparse()
else:
if re.search("<title>(?:IMDb.{0,9}Search|IMDb Titelsuche)</title>", self.inhtml):
- searchresultmask = re.compile("href=\".*?/title/(tt\d{7,7})/\">(.*?)</td>", re.DOTALL)
+ searchresultmask = re.compile("<tr> <td.*?img src.*?>.*?<a href=\".*?/title/(tt\d{7,7})/\".*?>(.*?)</td>", re.DOTALL)
searchresults = searchresultmask.finditer(self.inhtml)
- self.resultlist = []
- if searchresults:
- for x in searchresults:
- self.resultlist.append((self.htmltags.sub('',x.group(2)), x.group(1)))
- self["menu"].l.setList(self.resultlist)
+ self.resultlist = [(self.htmltags.sub('',x.group(2)), x.group(1)) for x in searchresults]
+ self["menu"].l.setList(self.resultlist)
if len(self.resultlist) > 1:
self.Page = 1
self.showMenu()
else:
- self["detailslabel"].setText(self._("No IMDb match."))
- self["statusbar"].setText("No IMDb match")
+ self["detailslabel"].setText(_("No IMDb match."))
+ self["statusbar"].setText(_("No IMDb match."))
else:
splitpos = self.eventName.find('(')
if splitpos > 0 and self.eventName.endswith(')'):
self.eventName = self.eventName[splitpos+1:-1]
- self["statusbar"].setText("Re-Query IMDb: " + self.eventName + "...")
+ self["statusbar"].setText(_("Re-Query IMDb: %s...") % (self.eventName))
event_quoted = urllib.quote(self.eventName.decode('utf8').encode('latin-1','ignore'))
localfile = "/tmp/imdbquery.html"
fetchurl = "http://" + self.IMDBlanguage + "imdb.com/find?q=" + event_quoted + "&s=tt&site=aka"
print "[IMDB] Downloading Query " + fetchurl + " to " + localfile
downloadPage(fetchurl,localfile).addCallback(self.IMDBquery).addErrback(self.fetchFailed)
else:
- self["detailslabel"].setText(self._("IMDb query failed!"))
+ self["detailslabel"].setText(_("IMDb query failed!"))
def IMDBquery2(self,string):
- self["statusbar"].setText("IMDb Re-Download completed")
+ self["statusbar"].setText(_("IMDb Re-Download completed"))
self.html2utf8(open("/tmp/imdbquery2.html", "r").read())
self.generalinfos = self.generalinfomask.search(self.inhtml)
self.IMDBparse()
def IMDBparse(self):
print "[IMDBparse]"
self.Page = 1
- Detailstext = self._("No details found.")
+ Detailstext = _("No details found.")
if self.generalinfos:
- self["key_yellow"].setText(self._("Details"))
- self["statusbar"].setText("IMDb Details parsed ^^")
+ self["key_yellow"].setText(_("Details"))
+ self["statusbar"].setText(_("IMDb Details parsed"))
Titeltext = self.generalinfos.group("title")
if len(Titeltext) > 57:
Titeltext = Titeltext[0:54] + "..."
Detailstext = ""
- genreblockmask = re.compile('<h5>Genre:</h5>(.*?)(?:mehr|more|</div>)', re.DOTALL)
+ genreblockmask = re.compile('<h5>Genre:</h5>\s<div class="info-content">\s+?(.*?)\s+?(?:Mehr|See more|</p|<a class|</div>)', re.DOTALL)
genreblock = genreblockmask.findall(self.inhtml)
- genremask = re.compile('\">(.*?)</a')
if genreblock:
- genres = genremask.finditer(genreblock[0])
+ genres = self.htmltags.sub('', genreblock[0])
if genres:
Detailstext += "Genre: "
- for x in genres:
- Detailstext += x.group(1) + " "
- detailscategories = ["director", "creator", "writer", "premiere", "seasons", "country"]
+ Detailstext += genres
+ self.callbackGenre = genres
- for category in detailscategories:
+ for category in ("director", "creator", "writer", "premiere", "seasons"):
if self.generalinfos.group('g_'+category):
Detailstext += "\n" + self.generalinfos.group('g_'+category) + ": " + self.generalinfos.group(category)
+ if self.generalinfos.group("country"):
+ Detailstext += "\n" + self.generalinfos.group("g_country") + ": " + self.htmltags.sub('', self.generalinfos.group("country").replace('\n','').replace("<br>",'\n').replace(" ",' '))
+
if self.generalinfos.group("alternativ"):
- Detailstext += "\n" + self.generalinfos.group("g_alternativ") + ": " + self.htmltags.sub('',(self.generalinfos.group("alternativ").replace('\n','').replace("<br>",'\n').replace(" ",' ')))
+ Detailstext += "\n" + self.generalinfos.group("g_alternativ") + ": " + self.htmltags.sub('', self.generalinfos.group("alternativ").replace('\n','').replace("<br>",'\n').replace(" ",' '))
- ratingmask = re.compile('(?P<g_rating>Nutzer-Bewertung|User Rating):</b>.{0,2}<b>(?P<rating>.*?)/10</b>', re.DOTALL)
+ ratingmask = re.compile('<h5>(?P<g_rating>Nutzer-Bewertung|User Rating):</h5>.*?<b>(?P<rating>.*?)/10</b>', re.DOTALL)
rating = ratingmask.search(self.inhtml)
- Ratingtext = self._("no user rating yet")
+ Ratingtext = _("no user rating yet")
if rating:
Ratingtext = rating.group("g_rating") + ": " + rating.group("rating") + " / 10"
- self.ratingstars = int(10*round(float(rating.group("rating")),1))
+ self.ratingstars = int(10*round(float(rating.group("rating").replace(',','.')),1))
self["stars"].show()
self["stars"].setValue(self.ratingstars)
self["starsbg"].show()
for x in castresult:
Casttext += "\n" + self.htmltags.sub('', x.group(1))
if x.group(2):
- Casttext += self._(" als ") + self.htmltags.sub('', x.group(2).replace('/ ...',''))
+ Casttext += _(" as ") + self.htmltags.sub('', x.group(2).replace('/ ...',''))
if Casttext is not "":
- Casttext = self._("Cast: ") + Casttext
+ Casttext = _("Cast: ") + Casttext
else:
- Casttext = self._("No cast list found in the database.")
+ Casttext = _("No cast list found in the database.")
self["castlabel"].setText(Casttext)
postermask = re.compile('<div class="photo">.*?<img .*? src=\"(http.*?)\" .*?>', re.DOTALL)
posterurl = postermask.search(self.inhtml)
if posterurl and posterurl.group(1).find("jpg") > 0:
posterurl = posterurl.group(1)
- self["statusbar"].setText("Downloading Movie Poster: "+posterurl+"...")
+ self["statusbar"].setText(_("Downloading Movie Poster: %s...") % (posterurl))
localfile = "/tmp/poster.jpg"
print "[IMDB] downloading poster " + posterurl + " to " + localfile
downloadPage(posterurl,localfile).addCallback(self.IMDBPoster).addErrback(self.fetchFailed)
if extrainfos:
Extratext = "Extra Info\n"
- extracategories = ["tagline","outline","synopsis","keywords","awards","runtime","language","color","aspect","sound","cert","locations","company","trivia","goofs","quotes","connections"]
- for category in extracategories:
+ for category in ("tagline","outline","synopsis","keywords","awards","runtime","language","color","aspect","sound","cert","locations","company","trivia","goofs","quotes","connections"):
if extrainfos.group('g_'+category):
Extratext += extrainfos.group('g_'+category) + ": " + self.htmltags.sub('',extrainfos.group(category).replace("\n",'').replace("<br>",'\n')) + "\n"
if extrainfos.group("g_comments"):
- Extratext += extrainfos.group("g_comments") + " [" + self.htmltags.sub('',extrainfos.group("commenter")) + "]: " + self.htmltags.sub('',extrainfos.group("comment").replace("\n",' ')) + "\n"
+ stripmask = re.compile('\s{2,}', re.DOTALL)
+ Extratext += extrainfos.group("g_comments") + " [" + stripmask.sub(' ', self.htmltags.sub('',extrainfos.group("commenter"))) + "]: " + self.htmltags.sub('',extrainfos.group("comment").replace("\n",' ')) + "\n"
self["extralabel"].setText(Extratext)
self["extralabel"].hide()
- self["key_blue"].setText(self._("Extra Info"))
+ self["key_blue"].setText(_("Extra Info"))
self["detailslabel"].setText(Detailstext)
+ self.callbackData = Detailstext
def IMDBPoster(self,string):
- self["statusbar"].setText("IMDb Details parsed ^^")
+ self["statusbar"].setText(_("IMDb Details parsed"))
if not string:
filename = "/tmp/poster.jpg"
else:
def __init__(self, session, parent):
Screen.__init__(self, session)
- self["headline"] = Label("IMDB Plugin")
+ self["headline"] = Label(_("IMDb Plugin"))
+
+def eventinfo(session, servicelist, **kwargs):
+ ref = session.nav.getCurrentlyPlayingServiceReference()
+ session.open(IMDBEPGSelection, ref)
def main(session, eventName="", **kwargs):
session.open(IMDB, eventName)
def Plugins(**kwargs):
try:
- wherelist = [PluginDescriptor.WHERE_EVENTINFO, PluginDescriptor.WHERE_PLUGINMENU]
- return PluginDescriptor(name="IMDb Details",
+ return [PluginDescriptor(name="IMDb Details",
description=_("Query details from the Internet Movie Database"),
icon="imdb.png",
- where = wherelist,
- fnc=main)
+ where = PluginDescriptor.WHERE_PLUGINMENU,
+ fnc = main),
+ PluginDescriptor(name="IMDb Details",
+ description=_("Query details from the Internet Movie Database"),
+ where = PluginDescriptor.WHERE_EVENTINFO,
+ fnc = eventinfo)
+ ]
except AttributeError:
wherelist = [PluginDescriptor.WHERE_EXTENSIONSMENU, PluginDescriptor.WHERE_PLUGINMENU]
return PluginDescriptor(name="IMDb Details",
description=_("Query details from the Internet Movie Database"),
icon="imdb.png",
where = wherelist,
- fnc=main)
\ No newline at end of file
+ fnc=main)