Wie von Libreelec aus auf Funktionen wie Streamlink im Docker zugreifen?

  • Fucktheduck... Ich hatte damals plugin.video.streamlink von beardypig genutzt, das wird aber schon seit einer Ewigkeit nicht mehr weiterentwickelt.
    Was es macht? LibreElec befindet sich auf einer Read-only-Partition, einer der wenigen Möglichkeiten zur Installation eigener Programme besteht darin, diese in ein Addon zu "verpacken". Außerdem ist die Installation über ein Addon für den normalen Benutzer einfacher als die manuelle Installation.
    In meinem Video-Addon sah der Aufruf wie folgt aus:

    URL des Videos wird im Vorfeld ermittelt und die folgenden Zeilen spielen es ab:
    streams = streamlink.streams(url) <-- die Zeile ist in der Tat die einzige, die auf streamlink zugreift
    stream = str(streams['best'].url)
    play_item = xbmcgui.ListItem(path=stream)
    xbmcplugin.setResolvedUrl(addon_handle, True, listitem=play_item)

  • In meinem Video-Addon sah der Aufruf wie folgt aus:...

    Hier im Thread geht es um das Anlegen eines TVHEADEND-MUX zum abspielen von Youtube-Livestreams (z.B. exemplarisch Euronews):
    pipe://streamlink --stdout --hls-live-edge 6 --ringbuffer-size 32M -4 --default-stream 720p,best --url https://www.youtube.com/watch?v=ntmPIzlkcJk

    Aber auch wenn man das nicht mehr vorhandene repository repository.back-to-5.0.0.zip von woanders her installiert,
    läuft streamlink mit script.module.streamlink.zip immer noch nicht.
    Bei OSMC und im Docker war es ja unter /usr/bin und daher vom Pfad aus aufrufbar und sah so aus:

    Python
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    import re
    import sys
    from streamlink_cli.main import main
    if __name__ == '__main__':
        sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
        sys.exit(main())

    Unter /storage/.kodi/addons/script.module.streamlink/resources/lib/streamlink findet sich aber nichts dergleichen.
    libreelec:/ # streamlink
    -sh: streamlink: not found :(

  • Es ging @raabenaas glaub ich nicht darum, dass du vermeiden solltest Themen in verschiedenen Threads durcheinander zu bringen, sondern darum, dass du vermeiden solltest innerhalb eines Threads verschiedene Lösungswege durcheinander zu bringen.
    Daher sein Rat an dich nicht von der Anleitung abzuweichen.

    Mir ist außerdem nicht so ganz klar, weshalb du nun wieder mit dem Skript herumexperimentien möchtest.
    Wir hatten die Docker-Variante hier in dem Thread jetzt bis zu Ende durchgekaut und es steht sogar eine ausführliche Anleitung bereit.
    So weit ich das deinen Posts entnehmen kann beruht deine Befürchtung es könnte bei der Docker-Variante zu Performance-Problemen kommen nur auf einer Annahme, da du es selbst noch garnicht ausprobiert hast.
    Da du das Docker-Prinzip noch nicht so gut zu kennen scheinst, ist es wohl auch etwas gewagt davon auszugehen dass es dadurch zu Performanceproblemen kommen könnte.
    Im Gegensatz zu z.B. Virtualisierung ist bei Docker der Overhead nahezu bei Null. Sprich die Leistung und der Ressourcenverbrauch der Anwendung sind nahezu identisch mit einem nativen Betrieb.
    Zum Punkt 'Aufwand': Es gibt ja bereits eine vorgefertigte Anleitung. Mit weniger Aufwand wirst du wohl kaum zur einer funktionierenden Lösung kommen.


    Ich denke du tust dir, und uns, einen gefallen, wenn du nicht anfängst herumzubasteln, sondern @SkyBird1980s Anleitung einfach einmal umsetzt und dann testest.
    Ich hab sie bei mir selbst so eingerichtet und kann bestätigen, dass sie funktioniert und performant ist.


    Noch ein weiterer Gedanke den ich nicht außer Acht gelassen wissen möchte:
    Du hast ja selbst bemerkt, dass es bei der Skript-Variante mit Streamlink jede Menge Abhängigkeiten gibt die zu Problemen führen können.
    Selbst wenn diese Abhängigkeiten alle aufgelöst werden können und du am Ende tatsächlich ein funktionierendes System hast, so bleibt dennoch die Frage, wie lange das so bleiben wird.
    Früher oder später ist davon auszugehen, dass eine Aktualisierung notwendig wird und dann Abhängigkeiten wieder nicht passen (so wie es dir ja bereits bei OSMC ergangen war).
    Das ist bei der Docker-Variante in der Form nicht zu erwarten.

  • Hier im Thread geht es um das Anlegen eines TVHEADEND-MUX zum abspielen von Youtube-Livestreams

    Schon klar, ich nutze streamlink unter TVHeadend selbst dazu, allerdings nicht unter LE und/oder Docker.
    Da Du mit der angebotenen Docker-Lösung nicht zufrieden schienst, habe ich ergänzend das Addon ins Spiel gebracht. Als potentielle Lösung, nicht als Fertigrezept. Wenn das Addon nicht ohne weiteres funktioniert, würde ich an deiner Stelle die Docker-Lösung nehmen. Hier weißt du zumindest daß sie funktioniert.

  • Der thread zu streamlink ohne docker ist ja jetzt wieder auf:
    Streamlink auf Libreelec (ohne Docker) unmöglich!?
    Vielleicht meldet sich ja da mal jemand, wenn er es zum Laufen bekommen hat.

    streamlink mit docker werde ich dann erst ab Mitte nächster Woche einmal ausprobieren, da der Fernseher im Moment in ständiger Benutzung durch
    die Oberwelle ist wobei mir noch nicht klar ist,
    - wie ich den docker autogestartet bekomme (mache das im Moment noch händisch mit docker start tvheadend )
    - wie ich meine Kanäle (im Detail!) mit smb(?) in den docker bekomme (cgomesu meint ich solle scp nehmen; ->http://www.ssh.com/academy/ssh/scp)
    - wie ich die Installation von streamlink vor Zerstörung durch Updates des TVHEADEND-Dockers schütze u.v.a.m.
    ...

  • - wie ich den docker autogestartet bekomme (mache das im Moment noch händisch mit docker start tvheadend )
    - wie ich meine Kanäle (im Detail!) mit smb(?) in den docker bekomme (cgomesu meint ich solle scp nehmen; ->http://ssh.com/academy/ssh/scp)
    - wie ich die Installation von streamlink vor Zerstörung durch Updates des TVHEADEND-Dockers schütze u.v.a.m

    1. startet sich automatisch, unless stopped so er erstellt ist
    Hier sind die Varianten: https://kofler.info/docker-container-automatisch-starten/

    wie ich meine Kanäle (im Detail!) mit smb(?) in den docker bekomme (cgomesu meint ich solle scp nehmen; ->http://ssh.com/academy/ssh/scp)

    2. Den Inhalt \\libreelec\recordings\config ersetzen mit deinen Config Ordner deiner laufenden tvheadend installation wenn der docker gestoppt ist. Genau deshalb ist der Ordner ausgelagert.
    3. Das ist die Krux. Geht aber auch indem man den /custom-cont-init.d/ auch noch auslagert. Dann wird er bei jedem docker start gestartet und installiert wenn nötig die Komponenten nach.
    Die Config ist ja schon ausgelagert und damit geschützt.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • Ich weiß nicht ob ich es schon mal gepostet habe oder vielleicht ein anderer. Have hier noch nicht alles gelesen (mache ich aber noch)

    Ich schätze aber mal, dass hier von jedem (insbesondere des Fragestellers) mehr als 2 Stunden 45 Minuten investiert wurden.

    Externer Inhalt youtu.be
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.

    Ist die gleiche Zeit und bringt auf jeden Fall was

    Dann noch diese "Best Practices" lesen, versuchen zu verstehen, nochmal lesen wenn was unklar war und dann vor allem "BEFOLGEN"

    https://dev.to/techworld_with…production-1m39

    Somit würden sich einige Dinge klären wie z. B. "Möchte ich etwas in meinem Container nachinstallieren und wenn ja, wie mache ich das am besten?

    Sich ein wenig unbedarft und ohne Vorwissen in eine solche Konstellation mit mehreren Containern einzuarbeiten kann tricky werden. Daher vielleicht erstmal klein anfangen ;)

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Ich möchte euch um eure Expertenhilfe bitten:

    Ich habe tvheadend im Docker auf einer Synology 918+ laufen und würde gerne Streamlink einbinden. Dazu bin ich nach der in #2 verlinkten Anleitung vorgegangen. Einige von euch, zumindest @SkyBird1980, haben das ja schon erfolgreich nachbauen können. Eins zu eins konnte ich die Anleitung nicht umsetzen, z.B. kennt die Synology die Befehle apt bzw. apt-get nicht. Dennoch denke ich, dass ich die erforderlichen Vorussetzungen wie Installation von Python 3,git und das Erstellen des Ordners custom-cont-init.d samt dem Script geschaffen habe. Es funktioniert jedoch noch nicht. Der Grund liegt vermutlich darin, dass ich Fehler beim Mounten des Verzeichnisses in den Docker-Container mache.

    Ich habe zunächst neben dem config-Verzeichnis von tvheadend das Verzeichnis mit dem Script angelegt:

    Der Mountpfad sah so aus:

    Das Dockerprotokoll zeigte beim Containerstart:


    2023-02-09 11:23:47 stdout [cont-init.d] 99-custom-files: exited 0.
    2023-02-09 11:23:47 stdout [custom-init] no custom files found exiting...
    2023-02-09 11:23:47 stdout [cont-init.d] 99-custom-files: executing...

    Linuxserver findet das Script nicht.

    Ich habe den Entwickler gefragt, der mir folgendes mitteilte:

    ---
    Haben Sie ein Host-Verzeichnis, das das Streamlink-Skript enthält, auf '/custom-cont-init.d' abgebildet? Dies ist erforderlich. Erstellen Sie auf Ihrem Host (Synology) ein Verzeichnis '/opt/tvheadend/custom-cont-init.d/' und laden Sie das Streamlink-Skript wie folgt in dieses Verzeichnis herunter:

    curl -o temp/streamlink_für_tvh_container.sh https://raw.githubusercontent.com/cgomesu/tvhlin…vh_container.sh

    Machen Sie das Skript dann ausführbar:
    chmod +x temp/streamlink_for_tvh_container.sh
    und ordnen Sie in Ihrer Docker-Container-Konfiguration das Host-Verzeichnis '/opt/tvheadend/custom-cont-init.d' dem Container-Verzeichnis '/custom-cont-init.d' zu (dies geschieht über -v in der CLI oder die Registerkarte Volumes in Portainer). (Zur Erhöhung der Sicherheit können Sie diese Zuordnung schreibgeschützt machen, da der Container sie zu keinem Zeitpunkt ändern soll.) Setzen Sie nun den neu konfigurierten Container ein und beobachten Sie die Logs, die anzeigen sollten, dass das Skript ausgeführt wird.
    ---

    Das Verzeichnis '/opt/tvheadend/custom-cont-init.d/' habe ich mit dem File Manager der Synology unter /volume1/Homes/Melden angelegt, wobei 'Melden' der Benutzername ist, mit dem ich mich auf der Synology eingeloggt habe. In das Verzeichnis habe ich das Script hineinkopiert.

    Im Docker-Container sieht der Mount-Pfad jetzt so aus:

    Die Protokollausgabe nach dem Containerneustart ist unverändert. Das Script wird nicht gefunden. Wo liegen meine Fehler?

    Ich brauche sicher nicht zu erwähnen, dass es nicht gut bestellt ist um meine Linux-Kenntnisse. Ich kann's schlecht verbergen.

  • Ist denn das Verzeichnis "custom-cont-init.d" im Wurzelverzeichnis Deines Containers vorhanden? (Es darf oder soll ja nicht mehr im Verzeichnis /config liegen)
    Bekommst Du so raus (ssh):

    Code
    icke1260@ubuntu-nas:~$ docker exec -it tvh /bin/bash
    root@tvh:/# ls
    app                 custom-services.d  etc   libexec  picons      run   tmp
    bin                 defaults           home  media    proc        sbin  usr
    config              dev                init  mnt      recordings  srv   var
    custom-cont-init.d  docker-mods        lib   opt      root        sys
    root@tvh:/#

    Da mein TVHeadend-Container "tvh" heißt, müßtest Du "tvh" durch den Namen Deines TVH-Containers ersetzen. Wenn das Verzeichnis nicht vorhanden ist, kannst Du das ja in Deinem Host-Verzeichnis "docker/TV Headend/config" anlegen, das Script reinpacken und ausführbar machen und dann ins Wurzelverzeichnis des Containers kopieren:

    Code
    root@tvh:/# cd config
    root@tvh:/config# cp -r custom-services.d /custom-services.d
  • Danke für deine Hilfe. Bin aber leider noch nicht weiter gekommen:

  • hehe
    du hast ziel und quelle vertauscht, in Zeile 9 muss es

    cp -r /custom-cont-init.d ./custom-cont-init.d
    sein.

    Also der Befehl ist verkehrt.

    --------------
    Guides nicht mehr verfügbar wegen Youtube unvermögen guten von schlechten Kodi Videos zu unterscheiden.

  • 2. Versuch, Kopieren klappte jetzt, Container neu gestartet, Verzeichnis samt Script wurde jetzt erkannt, irgendwas ist aber immer noch im Argen:

  • streamlink_for_tvh_container.sh: exited 1

    Können wir das Script mal sehen?

    Edit:

    Gefunden:

    Code
    streamlink_apk () {
      if ! apk add --upgrade -U -X "$APK_MAIN" -X "$APK_COMMUNITY" -X "$APK_TESTING" streamlink; then
        end 'APK: Critical error. Unable install required packages. Check previous messages.' 1
      fi
    }

    Diese Funktion schlägt fehl.

    Basiert der Container auf einem Alpine-Image? Wenn nicht, dann funktionier apk nicht.

    Mach mal ein docker exec <name_des_container> sh -c 'cat /etc/os-release'

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

    Einmal editiert, zuletzt von DaVu (11. Februar 2023 um 09:32)

  • Der Entwickler teilte mir gestern folgendes mit.

    Die Scriptänderung brachte aber nichts.

  • Mhh...komisch

    Naja, dann klink dich halt auf den Docker

    docker exec -it <name> bash

    Oder, wenn das nicht geht dann

    docker exec -it <name> sh

    Dann wechselst du in das entsprechende Verzeichnis

    cd /etc/

    Und dann machst du dort ein ls -al und suchst nach einer Datei, die auf das Betriebssystem hinweist. Meistens haben solche Dateien was mit "Release" im Namen

    Diese lässt du dir dann mit

    cat <dateiname>

    anzeigen

    Du kannst auch mal ein

    docker exec <name> sh -c 'uname -a' machen. Ggf sehen wir da schon welches OS es im Docker ist.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

  • Linux linuxserver-tvheadend 4.4.59+ #24922 SMP PREEMPT Mon Aug 19 12:13:37 CST 2019 x86_64 GNU/Linux

    bzw.

  • ok. Jetzt habe ich mal in meinem eigenen TVH Docker auf Unraid nachgeschaut und ja....ich bin da auch etwas erstaunt, dass man so nichts raus findet. Sorry, dass ich ein wenig deiner Zeit verschwendet habe ;)

    Ich habe aber einfach mal apk ausgeführt und das Kommando selbst hat keinen Fehler ausgegeben, sondern mir sozusagen den Hilfetext angezeigt, welche Optionen mit dem Kommando zur Verfügung stehen.

    Du könntest das mit docker exec <name> sh -c 'apk' testen. Wird bei dir wahrscheinlich auch passen ;)

    Hilft dir aber immer noch nicht weiter, wenn das Kommando in der o. g. Funktion nicht korrekt ausgeführt wird.

    Im Script werden einige Variablen gesetzt. Vielleicht schlägt da was fehl.

    Die Funktion sieht ja so aus:

    Code
    streamlink_apk () {
      if ! apk add --upgrade -U -X "$APK_MAIN" -X "$APK_COMMUNITY" -X "$APK_TESTING" streamlink; then
        end 'APK: Critical error. Unable install required packages. Check previous messages.' 1
      fi
    }

    Dort wird "$APK_MAIN", "$APK_COMMUNITY" und "$APK_TESTING" als Variable gesetzt. Diese werden weiter oben in einem Block definiert:

    Code
    # apk variables
    APK_BRANCH='edge'
    APK_MAIN="http://dl-cdn.alpinelinux.org/alpine/${APK_BRANCH:-edge}/main"
    APK_COMMUNITY="http://dl-cdn.alpinelinux.org/alpine/${APK_BRANCH:-edge}/community"
    APK_TESTING="http://dl-cdn.alpinelinux.org/alpine/${APK_BRANCH:-edge}/testing"

    Innerhalb der Variablen wird noch die Variable "$APK_BRANCH" eingebaut.

    Wenn es jetzt meine Umgebung wäre, würde ich mal die Funktion wie folgt umschreiben:


    Code
    streamlink_apk () {
      if ! apk add --allow-untrusted --upgrade -U -X "http://dl-cdn.alpinelinux.org/alpine/edge/main" -X "http://dl-cdn.alpinelinux.org/alpine/edge/community" -X "http://dl-cdn.alpinelinux.org/alpine/edge/testing" streamlink; then
        end 'APK: Critical error. Unable install required packages. Check previous messages.' 1
      fi
    }

    Somit würdest du die Variablen entsprechend direkt in den Befehl einbauen und hättest auch das --untrusted mit drin. Das ist wahrscheinlich dafür da, dass du aus "HTTP"-Quellen beziehen kannst und nicht zwingend "HTTPS" benötigst.

    Ich habe auf jeden Fall mal den Link zusammen gebaut:

    http://dl-cdn.alpinelinux.org/alpine/edge/main/

    Und den kann ich im Browser aufrufen.

    Aus dem Container heraus habe ich es mit:

    docker exec <name> sh -c 'curl http://dl-cdn.alpinelinux.org/alpine/edge/main/' getestet und da bekomme ich dann:

    Das klappt also auch.
    So könntest du das vielleicht auch nochmal testen und dann dem Support mitteilen, was du gemacht hast und ob es geht oder nicht.

    Wertschätzung kostet nichts, aber sie ist von unschätzbarem Wert.

    Einmal editiert, zuletzt von DaVu (11. Februar 2023 um 16:05)

Jetzt mitmachen!

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