Entwicklerfrage zu Amazon MPD Wiedergabe mit Kodi inputstream.adaptive

  • mpd lokal liegen geht halt nicht, das liegt nicht am addon, sondern kodi.

    Wenn du hier schnell weiterkommen willst, packe einen service zu deinem addon, der einen lokalen webserver bereitstellt, und das manifest ausliefert.

    Alternativ (Änderungen im inputstream.adaptive notwendig) ist dass du als listItem path dein plugin angibst (plugin://[deine plugin id]/?action=getManifest).
    Dann würde ich dein addon noch einmal aufrufen, und du lieferst dann das Manifest zurück.

    Ich finde die Variante über den sevice / webserver am saubersten.

  • Schade, dennoch Danke.
    Letzte Frage...ich habe Python Beispiele für einen simplen WebServer gefunden, jedoch nichts wie man einen Service einem Addon zuweist bzw. diesen ins Addon integriert. Gibt es dazu evtl. Code-Beispiele?

    Den Kodi-eigenen Webserver hatte ich auch versucht zu verwenden, aber die URL wird auf den "normalen" Addon-Aufruf konsolidiert und damit funktionierts wieder nicht...wäre ja auch zu schön gewesen.

    Code
    'http://localhost:8080/#browser/music/plugin%3A%2F%2Fplugin.audio.amazonmedia%2F%3Fmode%3Dexternal%26asin%3D{}%26objectId%3D{}'.format(asin,objectId)
  • Ja, ein (leider recht umfangreiches) Beispiel ist Netflix.

    https://github.com/asciidisco/plu…r/addon.xml#L13

    Es ist einfach ein weiteres python script, welches kodi beim start aufruft, du musst dafür Sorge tragen, dass das laufen bleibt (was ein socket listener tut)

    Du musst nun in eine servive.py Datei "einfach" einen HTTP (oder TCP) Server starten, und den ausgehandelten Port in die settings schreiben.

    Als ListItem übergibst du dann http://localhost:[port]/?mpd_json_url=[Die URL zum Manifest]

    Wenn inputstream.adaptive nun das manifest holen will, ist dein dervice.py ein proxy, inputstream.adaptive ruft dich auf mit der o.g. URL, du holst dann das JSON, in dem das manifest steht, holst das manifet raus und schickst es alle Ergebnis zu "meiner" Anfrage.

    Wir können auch alternativ den Weg über Datei nochmal diskutieren, aber erst, wenn du mir sagst, wie du mit Dateinamen umgehen willst.
    Theoretisch kann dein addon auch mehrfach parallel aufgerufen werden ( mehrere Instanzen), also musst du temporäre dateinamen erzeugen.
    Frage ist: wann willst du die löschen? Hast du da schon ein Konzept?

  • Hi ihr beiden,

    weil ich das für mein Addon auch brauche, bzw. das MPD modifizieren muss kann ich vielleicht auch was beitragen bzw. fragen

    mpd lokal liegen geht halt nicht, das liegt nicht am addon, sondern kodi.

    Bin nicht sicher, ob man wirklich einen Proxy brauch - ich will das folgendermaßen machen

    Szenario:

    MPD-URL: https://mpd-host/mpd_path/1.mpd?parameter=paramaterwert
    MPD-Inhalt:

    ... ist etwas gekürzt

    Jetzt folgendes Vorgehen:
    1. Nimm die MPD-URL bis zum letzten Pfad, d.h. ohne "Dateinamen" und Parameter - hier also https://mpd-host/mpd_path/
    2. Setze bzw. ersetzte die erste BaseURL damit
    2.1 es gibt noch keine BaseURL direkt unter dem MPD-Tag: dann einfach einen neuen Knoten mit der BaseURL erzeugen - wäre dann hier

    XML
    <BaseURL>https://mpd-host/mpd_path/</BaseURL>


    2.2 es gibt schon eine BaseURL (wie in dem obigen Beispiel) - dann diese BaseURL nehmen und an die erzeugte anhängen - wäre dann in dem Beispiel also

    XML
    <BaseURL>https://mpd-host/mpd_path/dash/</BaseURL>


    2.3 es gibt schon eine BaseURL die mit http:// bzw. https:// beginnt- dann muss man gar nichts machen

    Danach kann man das erzeugte XML lokal speichern und kann mit listitem.setPath([PFAD]) setzen

    Das funktioniert nicht bei Live-Streams bzw. wenn es einen <Location>-Tag gibt, dann braucht man tatsächlich einen Proxy. Das geht auch nicht in STRM-Files ... dort braucht man auf jeden Fall eine Remote-Adresse und lokale Dateien funktionieren nicht.

    @peak3d: Korrigier' mich gerne - vielleicht funktioniert es bei mir nur "zufällig" ... Proxy finde ich halt etwas overkill

  • @knaerzche Ich stimme dir zu, dass der Proxy ziemlich viel Overhead für eine "einfache" Sache ist, aber hier fehlen einfach ein paar Kommunikationswege.
    Aber gut zu wissen, dass du es dateibasiert hinbekommen hast, ich dachte, dass es nicht geht, weil ich ziemlich eindeutig Curl als Tool zum ziehen der Daten nutze.

    @spacy Wenn du also VOD, und keine live streams hast, kannst du den Weg oben ja mal veruchen, ich denke mir für die Zukunft etwas aus, damit es einfacher wird.

    Einmal editiert, zuletzt von peak3d (17. Dezember 2019 um 11:04)

  • Naja, es sind alles live streams...mein Addon "lebt" von der live-connection mit Amazon ;)
    Den Ansatz finde ich dennoch interessant und funktioniert vermutlich nur wenn das mpd file direkt ausgeliefert wird. Oder?!? In meinem Fall erhalte ich ein JSON response und in diesem ist das mpd "File" enthalten.

    PS:
    @peak3d...wenn du mich direkt ansprechen möchtest 'spacy' bitte ohne "e" verwenden.

  • @peak3d: Ja, wäre super, wenn es da in Zukunft eine andere Variante gibt - was du mit der "plugin://" -URLvorgeschlagen hast - wäre echt genial :)
    edit: Ja - curl scheint clever genug zu sein, zu erkennen, dass es eine lokale Datei ist - im [definition='1','0']log[/definition] sieht das so aus:

    @spacy: Eigentlich alle Streams die mit mit MPDs oder sonstigen "adaptive"-Manifests ausgeliefert werden, benötigen eine Verbindung zum Server um die Strreams abzurufen - das Manifest definiert sozusagen (meistens) nur, für welche Codecs/Bandbreiten die Streams wie bzw unter welcher URL abgerufen werden sollen (und daneben noch andere Sachen, wie z.B. Verschlüsselung etc) - manchmal sind die Daten auch direkt in der MPD.
    Es gibt aber einen Unterschied: Wenn im MPD-Tag das Attribute type 'dynamic' ist, ist in diesem Manifest nicht die komplette Länge des Streams drin - da wird nachdem alle in diesem Manfest enthaltenen Streams abgerufen/abgespielt sind die Manifest-URL erneut abgerufen (deswegen funkioniert das auch mit lokalen Dateien nicht, weil der Inhalt der Datei immer der gleiche ist)
    Wenn aber das Attribut type im MPD-Tag aber den Wert "static" hat, sind in diesem Manifest alle für das komplette Abspielen des Streams benötigten Informationen enthalten und der Inhalt kann auch als lokale Datei (o.g. Vorgehen vorausgesetzt) abgelegt werden.
    Wenn ich dich richtig verstanden habe, sind bei dir die MPD-Daten in einer JSON-Response enthalten - die kannst Du ja einfach nehmen (also nur diesen Teil) und in einer Datei speichern. Kannst du mal ein Beispiel mit eine kompletten Response geben, dann kann ich dir (evtl ;)) sagen, ob es geht ...

  • Also der "plugin://..." Aufruf wäre DIE Lösung. :thumbup:
    @knaerzche, in diesem Post ist die Struktur der JSON-Response zu finden. Das MPD File sieht ungefähr so aus:

    Wenn ich dieses File lokal mit z.B. VLC öffne, funktioniert es sofort und fehlerfrei. Und jetzt geht es eigentlich "nur darum" Kodi das lokale MPD-File schmackhaft zu machen, der eigentliche Content liegt ja weiterhin in der Cloud. Wenn ich mal etwas Zeit habe, werde ich mir die Webserver Geschichte näher ansehen, aber schöner (und effizienter) wäre vermutlich die Erweiterung auf "plugin://..."

  • Wenn ich dieses File lokal mit z.B. VLC öffne, funktioniert es sofort und fehlerfrei. Und jetzt geht es eigentlich "nur darum" Kodi das lokale MPD-File schmackhaft zu machen, der eigentliche Content liegt ja weiterhin in der Cloud. Wenn ich mal etwas Zeit habe, werde ich mir die Webserver Geschichte näher ansehen, aber schöner (und effizienter) wäre vermutlich die Erweiterung auf "plugin://..."

    Dies ist kein Live event, daher kannst du zur von @knaerzche vorgeschlagenen dateibasierten Lösung greifen.

    Webserver / plugin:// wird dann relevant, wenn ein manifest kontinuierlich nachgeladen werden muss.
    Dies ist hier nicht der Fall.

  • Dies ist kein Live event, daher kannst du zur von @knaerzche vorgeschlagenen dateibasierten Lösung greifen.
    Webserver / plugin:// wird dann relevant, wenn ein manifest kontinuierlich nachgeladen werden muss.
    Dies ist hier nicht der Fall.

    Genau - du musst an dem Inhalt auch gar nix ändern - bei dir sind sogar die Segment-URLs absolut definiert - du kannst den Inhalt einfach so nehmen wie er ist als Datei speichern und im Addon mit listitem.setpath den (absoulten!) Pfad übergeben

Jetzt mitmachen!

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