@sveni_lee
Darf man erfahren, wofür du die Infos von tvdb brauchst ?
Episoden Infos von The TVDB abfragen
-
sveni_lee -
18. März 2016 um 09:45 -
Erledigt
-
-
@BJ1:
Ich schau mir grad deinen geänderten Code von TVHighLights genauer an
Bsp.:
wie könnte ich in dieser Zeile jedem Watchtyp eine Zahl zuzuordnen also
spielfilm = 1, Serie = 2 usw?
-
-
Dann arbeitest Du mit einem Dictionary (Wörterbuch) und nicht mit einer Liste, z.B:
Der Unterschied zwischen einer Liste[...] und einem Dict {...} ist der, das du auf die Elemente einer Liste nur über einen numerischen Index (0...) zugreifen kannst, bei einem Dict funktioniert der Zugriff auf ein Listenelement dagegen über den Namen. In anderen Programmiersprachen nennt man das auch assoziatives Array.
-
und wieder was gelernt... vielen dank!
sag mal, würde das auch funktionieren
Pythondetails = get_detail_thetvdb(data.imdbnumber, data.staffel, data.episode) if not details: writeLog("SerienPlaner: TVShow %s is not in TheTVDB" % (data.tvshowname), level=xbmc.LOGDEBUG) details = WLScraper() details.scrapeDetailPage(getUnicodePage(detailurl), 'div class="text"')
falls auf der TheTVDB nicht gefunden wird soll er auf der detailURL danach suchen...die def sehen so aus...
Python
Alles anzeigendef scrapeDetailPage(self, content, contentID): if contentID in content: container = content.split(contentID) container.pop(0) content = container[0] # Erstaustrahlung try: self.orig_erst = re.compile('Deutsche Erstausstrahlung: (.+?) <em>', re.DOTALL).findall(content)[0] except IndexError: pass # Episode description try: _plot = findings2 = re.compile('class="wertung">(.+?)<span', re.DOTALL).findall(content) plot = _plot[0] self.plot = plot.replace('<p class="clear mb4"></p>','').strip() except IndexError: pass # Ratings try: self.rating = re.compile('class="wertung">(.+?)<span', re.DOTALL).findall(content)[0] except IndexError: pass # picture path try: self.pic_path = re.compile('class="big"><a href="(.+?)" rel="', re.DOTALL).findall(content)[0] except IndexError: pass def get_detail_thetvdb(self, imdbnumber, staffel, episode): url_str="http://thetvdb.com/api/DECE3B6B5464C552/series/"+imdbnumber+"/all/de.xml" xml_str = urllib.urlopen(url_str).read() xmldoc = minidom.parseString(xml_str) episodes_detail = xmldoc.getElementsByTagName("Episode") for Episode in episodes_detail: try: if Episode.getElementsByTagName('SeasonNumber')[0].firstChild.nodeValue == staffel and Episode.getElementsByTagName('EpisodeNumber')[0].firstChild.nodeValue == episode: self.epiid = Episode.getElementsByTagName("id")[0].firstChild.nodeValue self.plot = Episode.getElementsByTagName("Overview")[0].firstChild.nodeValue self.rating = Episode.getElementsByTagName("Rating")[0].firstChild.nodeValue self.firstaired = Episode.getElementsByTagName("FirstAired")[0].firstChild.nodeValue self.pic_path = "http://www.thetvdb.com/banners/episodes/"+imdbnumber+"/"+self.epiid+".jpg" except: IndexError pass
-
-
Du haust in Deinen defs Klassenmethoden und allgemeine Funktionen durcheinander. Das wird krachen
In der 'get_detail_thetvdb' verwendest Du z.B. self.epiid = ... Das 'self.' bezieht sich aber immer auf eine Eigenschaft eines Objektes, die Du zuvor in einer Klasse definieren musst. Du hast aber kein Objekt bzw. eine Klasse, auf das sich das 'self' beziehen kann (oder es ist aus dem Kontext des Quelltextes nicht ersichtlich).
Mit dem WLScraper nutzt Du dagegen den objektorientierten Ansatz
Python
Alles anzeigen# Hier wird aus der Klasse 'WLScraper' ein Objekt 'details' erstellt, welches sowohl Eigenschaften # (Variablen, die mit 'self' beginnen)als auch Methoden (sprich Funktionen) besitzt, deren # Methoden in den 'def' als erstes Argument ein 'self' besitzen und natürlich innerhalb der # Klassendefinition deklariert sein müssen. details = WLScraper() # führe die Methode 'scrapeDetailPape' aus, die in WLScraper() definiert wurde. # dabei werden auch Eigenschaften (Variablen) des Ojektes 'details' befüllt und stehen # dann 'einfach so' zur Verfügung... details.scrapeDetailPage(...) # z.B. Ausgabe der Eigenschaft Rating des Objektes 'details' aus der Eigenschaft 'self.rating' # der Klasse 'WLScraper()' print details.rating
Aus einer Klasse kann man beliebig viele Objekte bauen. Man ist also nicht nur auf eine Ableitung (Instanzierung) beschränkt. Wir definieren mal ein Auto in einer Klasse und bauen anhand dieser Klasse 2 vollkommen unterschiedliche Auto-Objekte:
Python
Alles anzeigenclass Auto: def __init__(self): # Festlegen der grundsätzlichen Eigenschaften eines Autos self.tankinhalt = 0 self.farbe = None self.reifen = None self.ps = None self.verbrauch = None self.kmstand = 0 # Festlegen von Methoden eines Autos def tanken(self, menge): self.tankinhalt = self.tankinhalt + menge def fahren(self, km) self.kmstand = self.kmstand + km self.tankinhalt = self.tankinhalt - self.verbrauch/100 * km if self.tankinhalt < 0: print 'Sprit reicht nicht' # Wir bauen 2 Autos mit unterschiedlichen Eigenschaften aus der selben Klasse: ente = Auto() ente.tankinhalt = 20 Liter ente.farbe = gelb ente.reifen = 14 Zoll ente.ps = 30 PS ente.verbrauch = 5 ente.kmstand = 200.000 km # Gebrauchtwagen ente.fahren(50) print ente.kmstand --> 200.050 print ente.tankinhalt --> 17.5 porsche = Auto() porsche.tankinhalt = 5 Liter porsche.farbe = rot porsche.reifen = 20 Zoll porsche.ps = 300 PS porsche.verbrauch = 20 porsche.kmstand = 10 # Neuwagen porsche.fahren(50) --> 'Sprit reicht nicht' porsche.tanken(20) porsche.fahren(50) print porsche.kmstand --> 60 print porsche.tankinhalt --> 15 print 'Farbe des Autos: %s' % (porsche.farbe) --> Farbe des Autos: rot print 'Farbe des Autos: %s' % (ente.farbe) --> Farbe des Autos: gelb
-
sorry... richtig den Teil hatte ich nicht kopiert
Python
Alles anzeigenclass WLScraper(): def __init__(self): # Items of wunschlistenmain pages self.channel = '' self.tvshowname ='' self.tvshowstarttime = '' self.tvshowendtime = '' self.episode = '' self.staffel = '' self.title = '' self.detailURL = '' self.runtime = '' self.neueepisode = '' # Items of Detail pages self.rating = '' self.plot = '' self.orig_erst = '' self.pic_path = ''
danke für die ausführliche Erklährung... Ich versuch mal mein Glück...
-
-
hmmm ich bekomme jetzt eine Fehlermeldung:
CodeSyntaxError: ("Non-ASCII character '\\xc3' in file G:\\KODI-Krypton\\portable_data\\addons\\plugin.program.serienplaner\\resources\\lib\\serienplaner.py on line 35, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details", ('G:\\KODI-Krypton\\portable_data\\addons\\plugin.program.serienplaner\\resources\\lib\\serienplaner.py', 35, 0, None))
zeile 35 sieht so aus... -
Du versuchst mit unicode zu arbeiten, hast aber das Encoding nicht festgelegt bzw. für Zeichenketten/Strings nicht definiert. Schreibe mal in die ersten beiden Zeilen ganz oben rein (solltest Du bei JEDER Python-Datei machen):
Damit bist Du auch bei künftigen Python-Versionen auf der sicheren Seite, steht übrigens auch im Link zur Fehlermeldung:
see http://python.org/dev/peps/pep-0263/ for details
-
-
stimmt....
mach graf den ersten durchlauf... und versuche die Fehler auszumerzen....
-
und schon tauchen die ersten Fehler auf...
CodeError Type: <type 'exceptions.NameError'> Error Contents: name 'pvrid' is not defined Traceback (most recent call last): File "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py", line 461, in <module> writeLog("pvrid from external script: %s" % (pvrid), level=xbmc.LOGDEBUG) NameError: name 'pvrid' is not defined
ich habe folgenden code an dem ich vermute das es liegen könnte in der default.py
Python
Alles anzeigendef getUnicodePage(url, container=None): try: headers = { 'User-Agent' : 'Mozilla/5.0' } req = urllib2.urlopen(url.encode('utf-8')) except UnicodeDecodeError: req = urllib2.urlopen(url) encoding = 'utf-8' if "content-type" in req.headers and "charset=" in req.headers['content-type']: encoding=req.headers['content-type'].split('<li id="e_')[-1] content = unicode(req.read(), encoding).replace("\\", "") if container is None: return content return content.split(container)
-
-
Der Fehler hat mit den Codeschnipseln nichts zu tun. Das Skript kennt die Variable 'pvrid' nicht, d.h. sie wird in Zeile 461 verwendet, wurde aber vorher weder deklariert noch gesetzt...
Du kannst auch gern eine Konversation hier aufmachen, dann ist die halt nicht öffentlich einsehbar, wenn Dir das genehm ist
-
wird sie nicht hier definiert?
Python
Alles anzeigenblob = { 'id': unicode('SP.%s.%s' % (i, category)), 'tvshow': unicode(data.tvshowname), 'staffel': unicode(data.staffel), 'episode': unicode(data.episode), 'title': unicode(data.title), 'starttime': unicode(data.tvshowstarttime), 'neueepisode': unicode(data.neueepisode), 'channel': unicode(data.channel), 'pvrchannel': unicode(channel), 'logo': unicode(logoURL), 'pvrid': unicode(pvrchannelID), 'description': unicode(details.plot), 'rating': unicode(details.rating), 'thumb': unicode(details.pic_path), 'firstaired': unicode(details.firstaired), 'category': unicode(category), }
-
-
Nein. blob['pvrid'] ist was anderes als pvrid. Ersteres ist ein Element des Dicts 'blob', das zweite ist eine Variable namens 'pvrid'. Zwei verschiedene Dinge...
Der blob aus deinem Post Episoden Infos von The TVDB abfragen ist genau so ein Dictionary wie SPWatchtypes aus Episoden Infos von The TVDB abfragen , nur halt übersichtlicher formatiert...
-
-
-
Die kommt über einen Parameteraufruf des Scriptes rein:
Pythonif len(sys.argv)>1: params = parameters_string_to_dict(sys.argv[1]) methode = urllib.unquote_plus(params.get('methode', '')) detailurl = urllib.unquote_plus(params.get('detailurl', '')) pvrid = urllib.unquote_plus(params.get('pvrid', ''))
Zeile 5. z.B.: xbmc.RunScript(plugin.program.tvhighlights, '?methode=switch_channel&pvrid=1234')
Du hast mich allerdings noch auf einen Bug gebracht. In Zeile nach 438 muss noch ein pvrid = None rein. Ansonsten führt das zu genau deinem Fehler: Wenn keine Parameter übergeben werden (if len(sys.argv)... bleibt pvrid undefiniert.
-
das sieht also so aus ob bi mir keine Daten gescraped werden...
Ich habe nur folgendes in [definition='1','0']log[/definition] zu stehen...
Code
Alles anzeigen37 T:5400 INFO: CPythonInvoker(50, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): script successfully run 19:54:41 T:3800 DEBUG: CPythonInvoker(51, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): start processing 19:54:41 T:3800 DEBUG: CPythonInvoker(51, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): the source file to load is "G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py" 19:54:41 T:3800 DEBUG: CPythonInvoker(51, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): setting the Python path to G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner;G:\KODI-Krypton\system\python\DLLs;G:\KODI-Krypton\system\python\Lib;G:\KODI-Krypton\python27.zip;G:\KODI-Krypton\system\python\lib\plat-win;G:\KODI-Krypton\system\python\lib\lib-tk;G:\KODI-Krypton;G:\KODI-Krypton\system\python;G:\KODI-Krypton\system\python\lib\site-packages 19:54:41 T:3800 DEBUG: CPythonInvoker(51, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): entering source directory G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner 19:54:41 T:3800 DEBUG: CPythonInvoker(51, G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\default.py): instantiating addon using automatically obtained id of "plugin.program.serienplaner" dependent on version 2.1.0 of the xbmc.python api 19:54:41 T:3800 ERROR: POParser: unable to read PO file header from file: G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\resources\language\German\strings.po 19:54:41 T:3800 DEBUG: LocalizeStrings: no strings.po file exist at G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\resources\language\German, fallback to strings.xml 19:54:41 T:3800 DEBUG: LocalizeStrings: no translation available in currently set gui language, at path G:\KODI-Krypton\portable_data\addons\plugin.program.serienplaner\resources\language\English 19:54:41 T:3800 DEBUG: [plugin.program.serienplaner 0.0.1]: Methode from external script: None 19:54:41 T:3800 DEBUG: [plugin.program.serienplaner 0.0.1]: Detailurl from external script: None 19:54:41 T:3800 DEBUG: [plugin.program.serienplaner 0.0.1]: pvrid from external script: None
-
-
Bei TVHighlights funktioniert das so:
Die default.py wird von außen gesteuert. Einmal über die starter.py und dann über diverse Buttons in diversen Fenstern. Die starter.py ist quasi der Timer, welche die default.py zyklisch aufruft. Der Aufruf erfolgt jedesmal über spezielle Methoden, z.B.
xbmc.executebuiltin('XBMC.RunScript(plugin.program.tvhighlights,"?methode=scrape_highlights")'). In diesem Aufruf hat die Variable 'methode' den Wert 'scrape_highlights'. Eine anderer Aufruf wäre xbmc.executebuiltin('XBMC.RunScript(plugin.program.tvhighlights,"?methode=switch_channel&pvrid=123")'). Jetzt haben wir den Parameter 'methode' mit dem Wert 'switch_channel' und den Parameter 'pvrid' mit dem Wert '123'...
In der default.py wird dann die 'methode' (und andere Parameter) ab Zeile 440 ausgewertet und entsprechend verzweigt. Was in den TVHighlights der Service und was das Skript ist, steht wiederum in der addon.xml unter den 'extension point'.
Ich weiss, der Schädel brummt jetzt
-
wenn ich auf Programme gehe und mein Scrpt aufrufe und auf ausführen gehe, wird dann nicht das scrapen ausgeführt?
Ich weiss, der Schädel brummt jetzt
schon aber ich möchte es ja auch ganz gern zum laufen bringen...
-
-
wenn ich auf Programme gehe und mein Scrpt aufrufe und auf ausführen gehe, wird dann nicht das scrapen ausgeführt?
Nur, wenn Du deinem Programm in der __main__ auch gesagt hast, dass es scrapen soll. Da aber beim Weg über Programme -> Ausführen keine Parameter mitgegeben werden, wird dein Skript wohl nichts machen. Schmeisse alles unterhalb von
weg und ersetze es durch:
-
ich hab mir jetzt einfach einen Button angelegt mit dem ich das script richtig starten kann...
jetzt bekomme ich einen Error den ich schon mal ganz am Anfang hatte...
die seite möchte nicht von einer Maschiene Angesprochen werden...
darum hatte ich ursprünglich folgendes drin:
Pythondef getUnicodePage(url): headers = { 'User-Agent' : 'Mozilla/5.0' } req = urllib2.Request(url, None, headers) return unicode(urllib2.urlopen(req).read(), "utf-8")
aber dass müsste ja auf dein script angepasst werden...
-
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!