methodDict - VideoLibrary.OnUpdate funktioniert seit Update auf Kodi 19 nicht mehr

  • Hi Leute,

    Ich bin noch viel zu grün hinter den Ohren um einen Ansatz für eine Lösung zu finden.
    Ich habe ein Script, welches mir bei einer bestimmten Aktion etwas ausführen soll.
    in der extrem gekürzten Minimalversion hier Zwecks Hilfestellung:

    Solange ich noch Kodi in der Version 18 betrieben habe, hat das "VideoLibrary.OnUpdate" funktioniert und es wurde die entsprechende Funktion (hier ist es die NowWork) aufgerufen und der Code abgearbeitet.
    Ich hab jetzt vor ein paar Tagen auf die Version 19 upgedatet und nun funktioniert scheinbar die "VideoLibrary.OnUpdate" nicht mehr.
    Es gibt aber auch im Log keinen Fehler - er geht mir nicht in diese Funktion NowWork hinein.

    Vielleicht könnt Ihr mir helfen - falls zu wenig Infos, dann bitte sagen und ich schreibe [ab]
    In den Kodieinstellungen wurde nicht verändert - jsonrpc Port ist nach wie vor 9090 und es dürfen andere Programme was verändern

    Besten Dank an Euch
    lg. Werner

  • Ja, Papa vom Dienst ist schon da ;)

    Der Aufruf von Funktionen aus einem Dictionary heraus war schon immer etwas tricky und dient eigentlich als Ersatz für switch/case-Geschichten, die es unter Python (leider) nicht gibt.

    Ab Matrix wird Python 3 verwendet. Dieser Code funktioniert:



    Ich habe in Deinem Beispiel oben, den eigentlichen Funktionsaufruf übers dict vermisst (hier Zeile 14), denn in der Klasse oben wird es ja lediglich initialisiert, aber nicht ausgeführt. Den Aufruf der Funktion per dict() kann man auch ganz klassisch per MY.methodDict['VideoLibrary.onUpdate'](jsonmsg) erledigen.

    Ausgabe:


    Code
    C:\Python38\python.exe "C:/UsersPvD/AppData/Roaming/JetBrains/PyCharm2020.3/scratches/scratch_3.py"
    now updating: my JSON msg
    
    
    Process finished with exit code 0

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

    Einmal editiert, zuletzt von PvD (8. März 2021 um 11:06)

  • @don - Das Script soll eine Aktion ausführen, wenn bei einem Film, oder einer Episode manuell oder automatisch durch Kodi der watched-status geändert wird.
    Es gab hier mal schon vor längerer Zeit ein tolles Script dazu, welches Kodi bis heute nicht als Boardmittel beinhaltet.
    Dann wurde der Support vom Entwickler aufgegeben und ich hab mich hingesetzt und das Script unter Kodi 19 wieder zum Laufen gebracht.
    Jetzt war ich mutig und hab meinen Raspi eine nightly Version von Libreelec 10 aufgespielt - Funktioniert super und leggt überhaupt nicht - Nur dieses Script war/ist jetzt tot. Viel zu schade drum, ganz ehrlich.


    @PvD

    Ich habe in Deinem Beispiel oben, den eigentlichen Funktionsaufruf übers dict vermisst

    Nun, bisher hat das immer so funktioniert - Nur ab Python 3 und Libreelec 10 wars dann jetzt ganz aus.
    Wie gesagt, ich bin noch recht grün hinter den Ohren was die Programmierung in Python betrifft.

    Du schreibts dass bei meinem Beispiel in der Klasse nur initialisiert wird aber nicht ausgeführt.
    Naja, das Ausführen der Funktion ab Zeile 7 sollte ja erst erfolgen, wenn sich wie in meinem eigentlichen Script der watched-status ändert (manuell oder automatisch) - Also ich den Film oder die Episode fertig geschaut habe oder manuell auf den Status "gesehen" setze.

    Muss ich mal probieren, ob ich mit der Zeile 14 das hinbekomme, oder obs mir wegen dem (jsonmsg) einen Fehler auswirft.

  • Es gab hier mal schon vor längerer Zeit ein tolles Script dazu, welches Kodi bis heute nicht als Boardmittel beinhaltet.
    Dann wurde der Support vom Entwickler aufgegeben und ich hab mich hingesetzt und das Script unter Kodi 19 wieder zum Laufen gebracht.


    Dann stelle doch bitte mal einen Link zum Skript hier rein, dann kann ich im Detail rüberschauen. Im Grunde kann es ja nur der Notification Service des Monitors sein, der da läuft. Um das festzustellen, brauche ich schon das komplette Skript - oder einen Link dazu.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • So, ich habe jetzt mal Zeit gefunden, um über den Code zu schauen. Es ist also tatsächlich so, dass das Script ähnlich einem Service (evtl. ist es in der addon.xml sogar als Service deklariert?) in einer Schleife (Funktion KODIlisten(self)) den JSON-RPC-Port eines Hosts (wahrscheinlich localhost in den Settings) Zeichen für Zeichen abhört und aus diesen anhand der "{" und "}" einen JSON-String generiert. Ist der String komplett, wird dieser an die Funktion self.ThisHandlMSG(thisstrg) delegiert, die seinerseits testet, ob die verwendete Methode im JSON-RPC im Funktions-Dict self.methodDict (Zeile 16) definiert ist. Da hier z.Zt. nur "VideoLibrary.OnUpdate" hinterlegt ist, wird auch nur diese Methode ausgewertet. Soweit ist theoretisch also alles ok.

    Bitte die folgenden Anmerkungen nicht als Kritik, sondern Anregung verstehen.

    Das Abhören und zeichenweise Analysieren des Datenverkehrs am JSON-Port eines Hosts ist eine Krücke, ausserdem wird der Port durch das Blocking für andere Anwendungen gesperrt. Ein xbmc.Monitor() mit onNotification() liefert Sender, Empfänger, Methode und JSON frei Haus, und zwar zu allen Events (u.a. auch VideoLibrary, siehe Pkt. 7.8: https://kodi.wiki/view/JSON-RPC_API/v12#Notifications_2

    Damit ist es einfach, ein methodDict mit den gewünschten Events aufzubauen und mit try/except auf nicht notierte Events einzugehen (in diesem Beispiel hier nicht nötig, da .get() eine Alternative anbietet).

    Die xbmc.executeJSONRPC('{"bla"}’) lassen sich vorteilhaft in eine Funktion packen, für deren Aufruf einfach nur die Methode + Parameter angegeben werden. Das macht die Sache übersichtlicher, ausserdem fällt hier das Wurzelarray ['result'] weg:

    Python
    def jsonrpc(query):
        querystring = {"jsonrpc": "2.0", "id": 1}
        querystring.update(query)
        try:
            response = json.loads(xbmc.executeJSONRPC(json.dumps(querystring)))
            if 'result' in response: return response['result']
        except TypeError as e:
            writeLog('Error executing JSON RPC: {}'.format(e.args), xbmc.LOGFATAL)
        return None

    Damit wird aus thisstrg = xbmc.executeJSONRPC('{"jsonrpc":"2.0","method":"VideoLibrary.GetMovieDetails","params":{"movieid":%d,"properties":["file"]},"id":1}' %(itemid) ) einfach nur thisstrg = jsonrpc('{"method": VideoLibrary.GetMovieDetails", "params": {"movieid": %s, "properties":["file"]}' % itemid)


    Der Ersatz für das Abhören des Ports würde so aussehen. Zunächst sollte die Klasse NFOUpdaterNew() um die Klasse xbmc.Monitor erweitert werden:



    Das ist schon alles, hier würde es dann mit Zeile 59 (def VideoLibraryOnUpdate()) weitergehen.
    PS: Anstatt zu loggen, welche Zeile gerade ausgeführt wird, würde ich wichtige Parameter usw. loggen, das ist bei der Lösung von Problemen viel interessanter. :)

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

    2 Mal editiert, zuletzt von PvD (10. März 2021 um 20:01)

  • Bitte die folgenden Anmerkungen nicht als Kritik, sondern Anregung verstehen.

    Na bumm... Das ist jetzt mal eine Antwort gewesen, die ich noch einmal in Ruhe lesen muss. Kritik?? Nein, um Gottes Willen.
    Es handelt sich wie gesagt um ein Script, welches hier auch angeboten wurde vor ewiger Zeit - NFO Watchedstate Updater - wird nur lange schon nicht mehr weiter entwickelt und ich wollte dieses Script unbedingt weiterhin nutzen.

    Ich bin gespannt ob ich das hinbekomme.
    Vielen Dank für diesen "kleinen" Input [ab]

  • @PvD Ich hätt noch eine Frage. Die Funktion KODIlisten() sollte doch alle 10 Sekunden durchlaufen werden, oder?
    Momentan schaut es im Script so aus:

    Irgendwie wird KODIlisten() nicht alle 10 Sekunden durchlaufen - Also zumindest wird nicht alle 10 Sekunden im [definition='1','0']log[/definition] der Eintrag "Line 40: KODIlisten()" gemacht.
    Ansonsten habe ich alles so umgesetzt wie beschrieben und es gab nur einmal einen Fehler, da in Deinem Beispiel bei Zeile 11 einmal Klammer zu am Ende fehlte.

    Ein manuelles "Als gesehen" markieren bewirkt jetzt erstmal genau nichts - irgendwas muss ich übersehen haben.


    PS: Anstatt zu loggen, welche Zeile gerade ausgeführt wird, würde ich wichtige Parameter usw. loggen, das ist bei der Lösung von Problemen viel interessanter.

    Ich weiß - aber für mich als Anfänger war es mal wichtig zu sehen, wie das Script arbeitet und wann was geschieht.

  • Irgendwie wird KODIlisten() nicht alle 10 Sekunden durchlaufen - Also zumindest wird nicht alle 10 Sekunden im [definition='1','0']log[/definition] der Eintrag "Line 40: KODIlisten()" gemacht.

    Du hast als Loglevel '1' eingestellt, d.h. xbmc.LOGDEBUG (ist auch Standard). Dazu musst Du natürlich in Kodi Debugging einschalten, sonst taucht das im normalen Log nicht auf. Wenn das als LOGINFO ausgegeben werden soll, ist der Aufruf self.[definition='1','0']log[/definition]("Line 40: KODIlisten()", 0) - denke ich. Anstelle der 0 würde ich gleich das richtige Symbol nehmen: xbmc.LOGINFO

    Da ja schon ein Monitor vorhanden ist, kann man auch diesen in KODIlisten() verwenden:


    Code
    def KODIlisten(self):
        while not self.abortRequested():
            self.[definition='1','0']log[/definition]("I'm alive")
            xbmc.sleep(10000)

    In Zeile 36 oben ist noch ein Fehler (C&P): aus writeLog() --> self.[definition='1','0']log[/definition](), ausserdem muss aus def jsonrpc(query) ein def jsonrpc(self, query) werden, da in Deiner Konstellation jsonrpc() eine Methode der Klasse NFOUpdaterNew() ist.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Ja danke. Ich nehme generell die Symbole, daher war ich mir bei der numerischen Zuordnung unsicher ;)

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Du hast als Loglevel '1' eingestellt, d.h. xbmc.LOGDEBUG (ist auch Standard). Dazu musst Du natürlich in Kodi Debugging einschalten, sonst taucht das im normalen Log nicht auf.

    Das Script hat ein eigenes Debuglogging und die levels für dieses Script stehen in der utils.py
    Das mylog() kommt aus
    from utils import addon_name, addon_icon, addon_getSetting, [definition='1','0']log[/definition] as mylog
    [definition=12,8]Logging[/definition] hab ich generell aktiviert in Kodi - aber hier gibt es ein zusätzlich definiertes. Das würd schon mal passen so und wird wenn das Script funktioniert wieder stark reduziert und nur in der updateMyNFO() bleiben.

    Aber dennoch tut sich jetzt schon mal was in der [definition=9,2]kodi.[definition='1','0']log[/definition][/definition]
    Ich werde heute nicht mehr viel schaffen und noch ein bisschen was probieren - Mein Dank ist aber jetzt schon mal sehr groß

  • Nun ja. Ich komme zumindest bis in die Funktion VideoLibraryOnUpdate(self, jsonmsg).
    Diese If Abfrage dürfte scheitern:
    if (("id" in jsonmsg["params"]["data"]["item"]) and ("type" in jsonmsg["params"]["data"]["item"]) and ("playcount" in jsonmsg["params"]["data"])):

    Wir haben jetzt die Funktion ThisHandlMSG geändert auf

    Python
    def ThisHandlMSG(self, method, data):
            self.methodDict.get(method, self.err)(data)

    Ich glaub mir fehlt der Inhalt für jsonmsg
    Probiert hätte ich (weil für mich das einfachste) in der Funktion ThisHandlMSG(self, method, data) folgendes, leider mit null Erfolg:

    Python
    def ThisHandlMSG(self, method, data):
            jsonmsg = self.methodDict.get(method, self.err)(data)

    Es tut mir echt leid und ich will euch echt nicht über Gebühr strapazieren - PHP und MySQL ist für mich wie 1x1 - Python ein Buch mit nur noch 6 Siegel

  • Hier hast Du mal eine (teilweise) funktionierende Version. Es fehlt nur noch das Schreiben der NFO:


    Ich habe hier [definition='1','0']log[/definition]() und jsonrpc() aus der Klasse rausgenommen, da das keine klassenspezifischen/-typischen Funktionen sind, sondern eher allgemeiner Natur.
    Der große Block zwischen


    Code
    '''
    
    
    code...
    
    
    '''

    ist das schreiben der NFO. Das ist morgen fertig. Für heute reicht es.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Im Anhang das funktionierende Script bereits als Addon gepackt.

    Dateien

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • Da offenbar Bedarf besteht und aus dem "alten" Addon von @alberto ein kompletter Rewrite entstanden ist, habe ich dieses mal ins Nerdsrepo gestellt.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

  • @PvD

    Super - das wollte ich auch vorschlagen - ich kann sowas noch nicht, wollts aber zuerst noch testen.
    Der Bedarf ist auf alle Fälle da - ist immer wieder zu lesen und schade, dass es kein Boardmittel ist.
    Ich kann zumindest das positive Feedback geben, dass es funktioniert.

    An dieser Stelle will ich wirklich ein ganz großes Danke und einen Lob aussprechen - Ich hatte es schon mal hier versucht, aber das wurde nichts.
    DU? Du hast nicht nur versucht mich auf den Weg zu bringen sondern gleich komplett umgeschrieben (funktionsfähig)

    Dennoch werde ich mir den Code ansehen und vergleichen und daraus lernen.
    Hab 1000 Dank!!
    Super Leistung von Dir

    lg. aus dem Wiener Bereich
    und bleibt Alle gesund!!

  • Dennoch werde ich mir den Code ansehen und vergleichen und daraus lernen.

    Aller Anfang ist schwer. Wenn Du Fragen zum Code/Ablauf hast, kannst Du diese gerne stellen. Der Umstieg von PHP nach Python ist zwar etwas gewöhnungsbedürftig (Python bietet hier einfach mehr Möglichkeiten), jedoch hast Du damit schonmal eine ausgezeichnete Basis.

    AZi (DEV): Nexus auf LibreElec | Asrock J4205 | 4 GB RAM | 128 GB Sandisk| Rii mini
    DEV: PC Ubuntu 20.04 | Matrix
    AZi: Tanix TX3 | Android/CoreElec Dualboot (EMMC), Nexus
    WoZi: Nexus auf LibreElec | Asrock J4205 | 4GB RAM | 128 GB Sandisk SSD | Atric IR | URC7960
    NAS: unRaid, 3x6TB, 2x12TB | TV-Server: Futro S550 mit Hauppauge QuadHD DVB-C
    PayPal: paypal.me/pvdbj1

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!