Vorabinfos zu EPG Share für Skinner

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Vorabinfos zu EPG Share für Skinner

      Mit dem nächsten Update landen die Extradaten von EPG Share nicht mit mehr in der epg.dat sondern werden in eine Datenbank ausgelagert.
      Das hat den Vorteil das der User auch noch Extradaten hat, wenn die epg.dat mal korrupt oder leer ist.

      Um das Ganze in einen Renderer/Converter einzubauen hier mal ein einfaches Beispiel anhand eines Infobarwidgets:

      Skin:
      <widget backgroundColor="#00232227" font="Regular;30" foregroundColor="foreground" halign="left" noWrap="1" position="378,980" render="Label" size="920,40" source="session.extEvent_Now" transparent="1" valign="center" zPosition="4">
      <convert type="FluidNextExtEventName"/>
      <convert type="FluidNextExtraEventData">SERIESINFO SUBTITLE GENRE YEAR COUNTRY</convert>
      </widget>

      Source ist session.extEvent_Now
      session.extEvent_Now und session.extEvent_Next kriegt man mit folgendem Paket:

      enigma2-plugin-systemplugins-exteventinfohandler

      das muss also in die depends Eurer IPK...

      Converter ist FluidNextExtEventName - einem erweiterten EventName Converter - als Argument wird EventExtraData übergeben - der Converter spuckt in dem Fall die Extradaten aus.

      Diese werden jetzt übergeben an FluidNextExtraEventData... ab da ist alles wie gehabt....


      Die Änderungen müssen jetzt im FluidNextExtEventName gemacht werden:

      Früher wurden die Extradaten aus dem EPGCache geholt.

      Neu:
      EPG Share stellt eine DB Schnittstelle zur Verfügung - diese kriegt man über folgende Funktion:

      Quellcode

      1. from Plugins.Extensions.EpgShare.main import getEPGDB
      2. def get_Extradata(service, eventid, beginTime=None, EventName= None):
      3. try:
      4. data = None
      5. if "::" in str(service):
      6. service = service.split("::")[0] + ":"
      7. if "http" in str(service):
      8. service = service.split("http")[0]
      9. if not "1:0:0:0:0:0:0:0:0:0:" in service and not "4097:0:0:0:0:0:0:0:0:0:" in service:
      10. if beginTime and EventName:
      11. data = getEPGDB().selectSQL("SELECT * FROM epg_extradata WHERE ref = ? AND (eventid = ? or (LOWER(title) = ? and airtime BETWEEN ? AND ?))", [str(service), str(eventid),str(EventName.lower()).decode("utf-8"), str(int(beginTime) -120), str(int(beginTime) + 120) ])
      12. else:
      13. data = getEPGDB().selectSQL("SELECT * FROM epg_extradata WHERE ref = ? AND eventid = ?", [str(service), str(eventid)])
      14. if data and len(data) > 0:
      15. return data[0]
      16. else:
      17. return None
      18. else:
      19. return None
      20. except Exception, ex:
      21. print "DB Error: %s" % str(ex)
      22. return None
      Alles anzeigen
      Tut mir einen Gefallen und fangt an irgendwelche Insertstatements auf die DB zu schicken. Das geht nur in die Hose.

      Was braucht man bzw. kann man nutzen um die Daten zu kriegen?
      1. ServiceRef
      2. EventID

      schaut euch im Fluid Converter an wie man die kriegt - in verschiedenen Screens haben wir noch extra Sourcen eingebaut, damit man beides hat.

      Quellcode

      1. Bsp:
      2. try:
      3. starttime = self.source.event.getBeginTime()
      4. title = self.source.event.getEventName()
      5. return json.dumps(get_Extradata(str(self.source.service), str(self.source.event.getEventId()), starttime, title))
      6. except Exception, ex:
      7. return ""



      Optional:
      3. Startzeit als Unixtimestamp
      4. Sendungsname

      mit den beiden optionalen Parametern kann man auch Extradaten bekommen, wenn sich die EventID geändert hat (Pro7/Sat1 z.B.) und auch wenn sich die Sendung um ein paar Minuten verschoben hat...

      Die Extradaten kommen als DICT zurück - mit einem einfachen print könnt ihr sehen was alles vorhanden ist.



      Zusammenfassung: Es ändert sich NUR der Part WIE man an die Extradaten kommt. Nicht bei der Darstellung.
      Den Converter Code kann ich Euch gerne geben, wenn es soweit ist - die Renderer nicht - die sind in die .so gewandert.
      VMC
      EPG Share
      VU Alexa Skill
      Fluid Next
      Global Search

      Spenden sind immer herzlich willkommen... einfach hier klicken und das ganze an sbeatz76@googlemail.com schicken
    • Habe gesehen das jetzt eine Vorabversion draußen ist.

      Hat sich jetzt etwas geändert?

      Zitat @hmmmdada: :Den Converter Code kann ich Euch gerne geben, wenn es soweit ist - die Renderer nicht - die sind in die .so gewandert.
      Wenn die Version dann passt, könntest du mir bitte den Converter zukommen lassen?
      Für was wird dann der Renderer benötigt? Was müsste ich da selber machen.

      Ich weis noch nicht ganz den Unterschied zwischer Converter und Renderer. Renderer ist für mich immer das Anzeigeelement oder so.
      Skin: MetrixFHD Mod by Koloss - Picons: MetrixFHD Pro XHDPicons
      Wem meine Sachen gefallen der kann mich gerne Unterstützen: SPENDEN

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Koloss ()

    • Beim Renderer werden vorhandene Daten verwendet um was zu "zeichnen".
      Bei nem Converter werden Daten aus dem System zu anderen Daten(sätzen) umgewandelt um sie verfügbar zu machen und gewisse Funktionen anzuzeigen.
      So mein laienhaftes Verständnis. :P
      - - - Beitrag wurde mit Deppentalk erstellt. - - -
    • hier die nötigen Converter:

      Einzige Regel:
      Benennt die Converter um! Sehe ich einen Skin der eine FluidNext-irgendwas.py enthält brennt die Luft.


      Achtung wegen folgendem Import:
      from Plugins.Extensions.FluidNextSetup.fluidnext import get_Extradata

      das geht so bei Euch nicht - dafür müsst ihr die get_Extradata aus dem 1. Post in euren Converter einbauen

      Python-Quellcode: FluidNextExtEventName.py

      1. from Components.Converter.Converter import Converter
      2. from Components.Element import cached
      3. from Components.Sources.Event import Event
      4. from Components.Sources.ExtEvent import ExtEvent
      5. from Components.Sources.extEventInfo import extEventInfo
      6. from Components.Sources.ServiceEvent import ServiceEvent
      7. from Tools.MovieInfoParser import getExtendedMovieDescription
      8. from Plugins.Extensions.FluidNextSetup.fluidnext import get_Extradata
      9. from ServiceReference import ServiceReference
      10. import json
      11. class FluidNextExtEventName(Converter, object):
      12. EVENT_EXTRADATA = 0
      13. def __init__(self, type):
      14. Converter.__init__(self, type)
      15. @cached
      16. def getText(self):
      17. if self.source.event:
      18. if type(self.source) == ExtEvent:
      19. try:
      20. starttime = self.source.event.getBeginTime()
      21. title = self.source.event.getEventName()
      22. return json.dumps(get_Extradata(str(self.source.service), str(self.source.event.getEventId()), starttime, title))
      23. except Exception, ex:
      24. print "Error1: %s" % str(ex)
      25. return ""
      26. elif str(type(self.source)) == "<class 'Components.Sources.extEventInfo.extEventInfo'>":
      27. try:
      28. return json.dumps(get_Extradata(str(self.source.service), str(self.source.eventid)))
      29. except Exception, ex:
      30. #print "Error2: %s" % str(ex)
      31. return ""
      32. elif hasattr(self.source, 'service'):
      33. try:
      34. service = self.source.getCurrentService()
      35. servicereference = ServiceReference(service)
      36. return json.dumps(get_Extradata(str(servicereference), str(self.source.event.getEventId())))
      37. except Exception, ex:
      38. #print "Error3: %s" % str(ex)
      39. return ""
      40. elif type(self.source) == Event:
      41. return self.source.event.getExtraEventData()
      42. return ""
      43. text = property(getText)
      Alles anzeigen




      Python-Quellcode: FluidNextExtraEventData.py

      1. # License: this is closed source!
      2. # you are not allowed to use this Converter or parts of it on any other image than VTI
      3. # you are not allowed to use this Converter or parts of it on NON VU Hardware
      4. # Copyright: hmmmmdada 2018
      5. from Components.Converter.Converter import Converter
      6. from Components.Element import cached
      7. import json
      8. import HTMLParser
      9. class FluidNextExtraEventData(Converter, object):
      10. def __init__(self, type):
      11. Converter.__init__(self, type)
      12. self.type = str(type).split()
      13. @cached
      14. def getText(self):
      15. h = HTMLParser.HTMLParser()
      16. if self.type != '':
      17. rets = []
      18. ret = ""
      19. gotevent = False
      20. try:
      21. if str(self.source.text) != '':
      22. values = json.loads(str(self.source.text))
      23. #print values
      24. gotevent = True
      25. except Exception, ex1:
      26. #print "FluidNextExtraEventData ex1: %s" % str(ex1)
      27. try:
      28. if str(self.source) != '':
      29. values = json.loads(self.source)
      30. #print values
      31. gotevent = True
      32. except Exception, ex2:
      33. #print "FluidNextExtraEventData ex2: %s" % str(ex2)
      34. pass
      35. if gotevent and values:
      36. for field in self.type:
      37. if field == "IMAGE":
      38. if len(str(values['id']).strip()) > 0:
      39. return str(values['id']).strip()
      40. elif field == "TITLE":
      41. if len(str(values['title']).strip()) > 0:
      42. rets.append(str(values['title']).strip())
      43. elif field == "SUBTITLE":
      44. if len(str(values['subtitle']).strip()) > 0:
      45. rets.append(str(values['subtitle']).strip())
      46. elif field == "SERIESINFO":
      47. if 'season' in values and 'episode' in values:
      48. if len(str(values['season']).strip()) > 0 and len(str(values['episode']).strip()) > 0:
      49. rets.append("S%sE%s" % (str(values['season']).zfill(2), str(values['episode']).zfill(2)))
      50. elif field == "CATEGORY":
      51. if 'categoryName' in values:
      52. if len(str(values['categoryName']).strip()) > 0:
      53. rets.append(str(values['categoryName']).strip())
      54. elif field == "GENRE":
      55. if 'genre' in values:
      56. if len(str(values['genre']).strip()) > 0:
      57. rets.append(str(values['genre']).strip())
      58. elif field == "AGE":
      59. if 'ageRating' in values:
      60. if len(str(values['ageRating']).strip()) > 0:
      61. rets.append(str(values['ageRating']).strip())
      62. elif field == "YEAR":
      63. if 'year' in values:
      64. if len(str(values['year']).strip()) > 0:
      65. rets.append(str(values['year']).strip())
      66. elif field == "COUNTRY":
      67. if 'country' in values:
      68. if len(str(values['country']).strip()) > 0:
      69. rets.append(str(values['country']).strip())
      70. sep = " %s " % str(h.unescape('·'))
      71. ret = sep.join(rets)
      72. return ret
      73. text = property(getText)
      Alles anzeigen
      VMC
      EPG Share
      VU Alexa Skill
      Fluid Next
      Global Search

      Spenden sind immer herzlich willkommen... einfach hier klicken und das ganze an sbeatz76@googlemail.com schicken
    • So wie ich das jetzt verstanden habe, kann jetzt jedes Skin von den Extra Daten profitieren?
      1. Box: Vu+ Duo 4k SE - 4 TB HDD - UM02 Karte.
      2. Box: Vu+ Duo² - 3TB HDD. (defekt, wird aber repariert) :(
      3. Box: Coolstream Neo c - Yocto image (Tuxbox Neutrino)

      Zwangsverkabelt mit Vodafone NRW - Rest in Peace Unitymedia

      Meine Komentare und Posts können unteranderen Spuren von Ironie & Sarkasmus enthalten.


      WAR IS NOT A GAME
    • Wie lange bleiben die Zusatzdaten ib der Datenbank vorhanden?
      So wie ich das verstanden habe könnte man die Extradaten in jeden Skin aufnehmen, aber macht es für Movielist/EMC Sinn oder sind die Daten dann weg?
    • Klar, du nutzt ja Beschreibungen und Bewertungen im VMC.

      Die Zusatzdaten bringen meiner Meinung nach schon einen deutlichen Mehrwert, da die Daten im EPG ja oft fehlen. Alleine die Filmbewertungen direkt bei der Beschreibung in der Movielist oder im EMC wären schon super.
    • hmmmdada schrieb:

      hier die nötigen Converter:

      Einzige Regel:
      Benennt die Converter um! Sehe ich einen Skin der eine FluidNext-irgendwas.py enthält brennt die Luft.
      Mein Vorschlag wäre, FluidNextExtEventName.py in VTIExtEventName.py (die andere natürlich auch) umzubennen und beide Dateien entweder im VTI Image oder in der Datei enigma2-plugin-systemplugins-exteventinfohandler zu integrieren.
      1. Box: Vu+ Duo 4k SE - 4 TB HDD - UM02 Karte.
      2. Box: Vu+ Duo² - 3TB HDD. (defekt, wird aber repariert) :(
      3. Box: Coolstream Neo c - Yocto image (Tuxbox Neutrino)

      Zwangsverkabelt mit Vodafone NRW - Rest in Peace Unitymedia

      Meine Komentare und Posts können unteranderen Spuren von Ironie & Sarkasmus enthalten.


      WAR IS NOT A GAME
    • hmmmdada schrieb:

      @oneofnine: sorry aber ein bisschen was könnt ihr schon noch selbst machen
      Klar, 2 Dateien umzubenennen, konnte ich schon auf dem C64 :) Allerdings muss ich für das erstellen einer ipk noch einwenig studieren ;)
      1. Box: Vu+ Duo 4k SE - 4 TB HDD - UM02 Karte.
      2. Box: Vu+ Duo² - 3TB HDD. (defekt, wird aber repariert) :(
      3. Box: Coolstream Neo c - Yocto image (Tuxbox Neutrino)

      Zwangsverkabelt mit Vodafone NRW - Rest in Peace Unitymedia

      Meine Komentare und Posts können unteranderen Spuren von Ironie & Sarkasmus enthalten.


      WAR IS NOT A GAME
    • So wie ich es verstanden habe knall ich die funktion:

      Quellcode

      1. def get_Extradata(service, eventid, beginTime=None, EventName= None):
      2. ...
      3. ...
      ganz oben rein in die "FluidNextExtEventName.py" Datei.
      An welcher Position? Vor dem def _init oder vor dem @cached?
      Was bedeutet dieses @cached eigentlich?

      Die "FluidNextExtraEventData.py" belasse ich so wie Sie ist?

      P.S.: Natürlich ändere ich die Namen mit Fluid... dann um
      Skin: MetrixFHD Mod by Koloss - Picons: MetrixFHD Pro XHDPicons
      Wem meine Sachen gefallen der kann mich gerne Unterstützen: SPENDEN

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von Koloss ()

    • @hmmmdada
      Danke für die Freigabe dieser Converter, funktioniert Top.
      Musste allerdings die FluidNextExtraEventData.py ein bischen ändern
      mit der aus Post 5 ging es nicht.
      Dateien
      „In Deutschland ist die höchste Form der Anerkennung der Neid.“
      Arthur Schopenhauer

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Eisman ()

    • @Bueb
      ich kenne dein Skript nicht aber wenn deine Source "session.extEvent_Now" nicht gefunden wird, dann fehlt dir das "exteventinfohandler" Paket.
      Dieses kannst manuell über den Feed über Systemerweiterungen installieren.

      Wenn du später ne IPK ertstellen willst, muss "enigma2-plugin-systemplugins-exteventinfohandler" in die depends. Dann wird dieses Paket gleich mit installiert. Machst du das nicht, crashed es ;)
      Dateien
      MySkinparts:
      iFlatFHD: [ MainMenu-InfoBox ] -[ ChannelSelection ] - [ SecondInfoBar ] - [ Infobar ]
      CoolTV: [ FullChannelScreen ]
      TuneIn Internet Radio: [ FHD Skin Mod ]