Kodi Datenbank wird nicht richtig bereinigt

  • Ich habe mir die NFOs aus dem Zip oben mal angeschaut. Das Problem bei den Dreifach- und Doppelfolgen ist die Tatsache, dass das Wurzelelement <episodedetails> ... </episodedetails> heisst und damit eben dreifach bzw. doppelt auftaucht. Damit ist die XML natürlich nicht mehr valide, da ein Wurzel-Element (egal wie es heißt) nur einmal auftauchen darf. Das funktioniert dann auch problemlos (bzw. fällt nicht auf) bei einer einzelnen Episode - und das erklärt dann auch den "Junk"-Fehler weiter oben. Selbst das Wiki ist an der Stelle zumindest für Multiepisode-Files falsch, da hier eine ungültige XML-Struktur vorhanden ist bzw. aufgebaut wird.

    Aber auch damit funktioniert das Addon nicht richtig. Es trägt dann

    ...

    </episodedetails>
    <watched>true</watched>
    <lastplayed>2025-01-12 19:46:14</lastplayed>
    <playcount>1</playcount>
    </root>

    Bei Mehrfachepisoden ist das doch korrekt (mehrere Episoden in einer Datei)? Ich meine, es wird doch der Playcount und/oder der watched State einer Datei bewertet und taucht deshalb auch nur 1x auf. Aber da können wir wahrscheinlich endlos diskutieren, wenn die Wurzel des Übels im wahrsten Sinne an multiplen Wurzeltags liegt. Das ist schlicht nicht xml-konform.

    https://www.data2type.de/xml-xslt-xslfo…nd-zeichendaten ::

    Zitat

    Jedes XML-Dokument besitzt ein Element, das kein Elternelement hat. Dies ist das erste Element im Dokument und das Element, das alle anderen Elemente enthält. Im ersten und zweiten Beispiel spielt das Element person diese Rolle. Es erhält den Namen Wurzelelement (Englisch: root element) des Dokuments. Manchmal wird es auch als Dokumentelement bezeichnet. Jedes wohlgeformte XML-Dokument enthält genau ein Wurzelelement.

    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

  • bei Mehrfachepisoden ist das doch korrekt (mehrere Episoden in einer Datei)?

    Nein, ist es leider nicht, da dann die von "Watchedstate NFO Updater" erzeugten Einträge nicht mehr innerhalb der "<episodedetails>" liegen sondern nach dem letzten "</episodedetails>" und vor dem abschließenden Wurzeltag (wie auch immer der benannt wurde) und deswegen von Kodi nicht eingelesen werden. Kodi liest nur das ein, was zwischen <episodedetails> und </episodedetails> liegt. Es reicht aber wohl aus, wenn der Playcount nur bei einer der Episoden eingefügt wird, egal bei welcher. Das habe ich zwar noch nicht 100% durchgetestet, es macht aber bisher diesen Eindruck.

    wenn die Wurzel des Übels im wahrsten Sinne an multiplen Wurzeltags liegt. Das ist schlicht nicht xml-konform.

    Ja, ich weiß. Das ist nur leider genau so im Wiki beschrieben und es funktioniert auch genau so in Kodi, ist aber kein XML mehr. Es wird ja auch nie behauptet, das die Kodi .nfo "echte" XML Dateien sind. Das ist ein Kodi- eigenes Format, das sich quasi zum Standard für solche Metadaten- Dateien entwickelt hat und von anderen HTPC Programmen übernommen wurde. Selbst die Dateiendung ist ungeschickt gewählt, da .nfo eigentlich Systeminformationsdateien sind, zumindest in der Windows Welt. Aber wir müssen halt alle mit dem leben, was uns da von Kodi vorgesetzt wurde.

    Ich muss noch mal ausprobieren, wie Kodi inzwischen selber die .nfo solcher Mehrfachfolgen exportiert. Wie gesagt, als wir das vor vielen Jahren so implementiert hatten, ging es nicht anders. Aber das war noch zu XBMC Zeiten, wenn ich mich recht erinnere und wurde nie geändert, da es ja, von deinem Addon abgesehen, bisher einwandfrei funktioniert hat. Damals funktionierte das mit dem zusätzlichen Wurzelelement, um die Datei XML Konform zu machen, eben noch nicht. Aber seit damals hat sich auch an Kodi so einiges geändert.

    -------------------------------------
    Danke fürs lesen, Claus

  • Mein Addon benutzt zum Parsen ElementTree aus der xml.etree Bibliothek/Modul, und dieses verlangt wohlgeformtes XML. Da haben wir dann das Problem, dass man:

    • entweder einen Parser selbst baut (urgs)
    • temporär ein Wurzelelement herumbaut, mit ElementTree die jetzt gültige temporäre XML bearbeitet und beim rausschreiben das temp. Wurzelelement wieder entfernt
    • oder zum Parsen was ganz anderes benutzt, BeautifulSoup soll z.B. gehen.

    Zeit für solche Spielereien habe ich erst im Februar, wenn hier in der letzten Januarwoche die Semester-Prüfungen gelaufen sind.

    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

  • entweder einen Parser selbst baut (urgs)

    Das hab ich in Media-Buddy gemacht da die für AutoIt verfügbaren XML Parser nicht anständig funktionierten (vielleicht ja genau wegen dem fehlerhaften "Kodi-XML", weiß nicht mehr, ist zu lange her). Für andere Sachen, wo ich das verwendete Format selbst in der Hand habe, nutze ich dann .json. Da funktioniert der Parser wenigstens einwandfrei. Doch hier muss es eben das Kodi- .nfo Format sein.

    Wenn man die XML (den Inhalt generell) von der Struktur her kennt, geht das ziemlich leicht mit String Operationen (StringBetween, StringReplace, usw.) Nur bei "fremden" XML deren Struktur man nicht kennt, wird es sehr viel schwieriger. Damit haben wir hier aber nichts zu tun, da die .nfo immer gleich aufgebaut sind.

    Ich würde das in etwa so lösen. Den Inhalt der .nfo als einen großen String einlesen. Dabei ist es völlig egal, ob die Datei "echtes" XML ist oder nicht, so lange sie als String gelesen werden kann. Dann die Bereiche zwischen <watched> und </watched>, <lastplayed> und </lastplayed> sowie <playcount> und </playcount> einfach per StringReplace durch die aktuellen Werte austauschen. Gibt es diese Bereiche nicht, würde ich

    "</episodedetails>"

    durch folgendes ersetzen:

    " <watched>true</watched>
    <lastplayed>2025-01-12 15:49:20</lastplayed>
    <playcount>1</playcount>
    </episodedetails>"

    und dann das Ganze als String wieder zurück in die .nfo Datei schreiben. Ganz so, wie man es beim manuellen Editieren per Text Editor ja auch machen würde. Ist vermutlich einfacher, als die ganze .nfo als XML auszuwerten, da man sich nur um die winzigen Bereiche kümmern muss, die man anpassen will. Und so funktioniert das auch mit den "falschen" Kodi- XML Dateien. Wobei ich nicht weiß, ob es (etwas adäquates zu) StringReplace und StringBetween in Python gibt und ob das da auch so funktioniert. Ist leider keine Sprache, die ich beherrsche.

    -------------------------------------
    Danke fürs lesen, Claus

  • Eine neue Version vom "NFO watched State Updater" ist raus und diese kann Multi-Episodes nach folgendem Weg:

    temporär ein Wurzelelement herumbaut, mit ElementTree die jetzt gültige temporäre XML bearbeitet und beim rausschreiben das temp. Wurzelelement wieder entfernt

    Aus irgendwelchen Gründen gibt mein JSON keinen Playcount bei manchen Episoden raus, obwohl eine Folge/Episode komplett abgespielt wurde. Der Updater macht dann natürlich nichts. Ist im Debug Log als Parserfehler zu sehen.

    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 (17. Januar 2025 um 17:33)

  • Das trifft sich gut. Heute Abend wollte ich mir ohnehin die letzten 5 (von 234) Episoden von Friends ansehen, die noch vom letzten Mal "krank sein" übrig sind. Friends ist eine stets gut wirkende Medizin, wenn es mir mal nicht gut geht und ich das Bett hüten muss. Die beiden letzte Folgen sind eine Doppelfolge. Da kann ich das Ganze gleich mal unter Realbedingungen testen. Danke.

    -------------------------------------
    Danke fürs lesen, Claus

  • Ich würde das in etwa so lösen. Den Inhalt der .nfo als einen großen String einlesen. Dabei ist es völlig egal, ob die Datei "echtes" XML ist oder nicht, so lange sie als String gelesen werden kann. Dann die Bereiche zwischen <watched> und </watched>, <lastplayed> und </lastplayed> sowie <playcount> und </playcount> einfach per StringReplace durch die aktuellen Werte austauschen. Gibt es diese Bereiche nicht, würde ich

    "</episodedetails>"

    durch folgendes ersetzen:

    " <watched>true</watched>
    <lastplayed>2025-01-12 15:49:20</lastplayed>
    <playcount>1</playcount>
    </episodedetails>"

    und dann das Ganze als String wieder zurück in die .nfo Datei schreiben

    Hatte ich auch überlegt, geht aber nicht, weil <playcount> (wenn der Tag exisiert) an allen möglichen Stellen im XML-Baum stehen kann und auch leer sein darf: <playcount/>. Das gleiche trifft auch auf den watched-Tag zu. Der kann mit einem Wert belegt sein <watched>true</watched>, leer <watched/> oder erst garnicht da sein oder auch irgendwo in der NFO stehen. Mit der xml.etree.Elementtree wird der XML-Baum vollkommen variabel an den passenden Stellen bearbeitet.

    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!