rols1 / Kodi-Addon-ARDundZDF

Kodi Addon für die Mediatheken von ARD + ZDF, Live-TV, Live-Radio, Radio-Podcasts / ARD-Audiothek, Downloads. Forum kodinerds: https://www.kodinerds.net/index.php/Thread/64244-RELEASE-Kodi-Addon-ARDundZDF/
MIT License
43 stars 7 forks source link

inputstream.adaptive: Einblendung der Stream-Uhrzeit für die Position im Zeitpuffer #30

Closed fenjen closed 1 year ago

fenjen commented 1 year ago

Halle

Wenn ich den Livestream von ZDF einschalte und zurückspule, bekomme ich eine etwas ungewöhnliche Zeitanzeige dargestellt: Es sieht so aus, als wenn der Ankerpunkt "03:00:00" ist, wenn ich 10 Minuten zurückspule, steht dort "02:50:00 / 03:00:00". Vermutlich liegt es daran, dass der Live-Stream immer 3h zurückreicht, aber das macht das Spulen an eine bestimmte Stelle sehr schwierig. Ein normaler Anwendungsfall ist wohl, dass man auf exakt 19:00 Uhr oder 20:15 Uhr spulen möchte - mit der Darstellung muss man dann rechnen. Ein zweiter Anwendungsfall ist, dass man zu einer bestimmten Stelle zurückgehen möchte. Das ist ohne Ausprobieren gar nicht möglich.

Vielen Dank für das Add-On!

rols1 commented 1 year ago

ja, das missfällt mir auch und richtig: das ZDF hat einen 3-Stunden-Zeitpuffer beim Livestream - den größten der Sender von ARD und ZDF. Leider ist es addonseitig nur eingeschränkt möglich, den Scrollmechanismus der Pufferanzeige zu beeinflussen. Das Addon übergibt in der Funktion PlayVideo() im Modul util die Kontrolle an das inputstream.adaptive-Modul. Die xbmc-Schnittstelle erlaubt lediglich eine beschränkte Anzahl von zeitbezogenen Funktionen wie z.B. Player.getTime() und Player.seekTime(). Das Koppeln des Zeitpuffers an die lokale Zeit, einschließlich der korrekten Korrektur der Zeitanzeige beim Spulen ist für Addon-Entwickler (Kodi-Stand z.Z.) nicht möglich. Tut mir leid, aber hier kann ich nicht helfen.

fenjen commented 1 year ago

Das heißt, man hat keinen Einfluss auf das Seeking-Verhalten, weil das alles die XBMC-Funktionen selbst machen? (Sonst könnte man ja hin und her übersetzen.) Hm, Ist es vielleicht möglich, eine Art Toast-Notification einzublenden?

rols1 commented 1 year ago

Doch, ich kann den Puffer sekundenweise vor - und zurücksetzen. Das mache ich auch in der addoninternen Playlist, um an einer abgebrochenen Stelle fortzusetzen. Damit erschöpft sich aber auch schon das seeking. Ich kann dagegen nicht einen Layer über die Pufferanzeige legen und zwischen dem Layer und inputstream.adaptive übersetzen. Zwar wäre theoretisch die Anzeige mit einem zusätzlichen Skin-Element machbar. Eine Hintergrundroutine müsste dann ständig die Seek-Position auslesen und in eine Zeitanzeige im Layer übersetzen. Vielleicht ist es machbar, aber das würde ich gerne jemandem überlassen, der hierzu besonders motiviert ist (und mehr Zeit hat als ich).

Frage: was ist mit Toast-Notification gemeint?

fenjen commented 1 year ago

Ja, an eine weitere Anzeige über der Standardanzeige hab ich auch schon gedacht, aber ich ging auch davon aus, dass das etwas komplizierter ist. Das Übersetzen meinte ich in etwa so:

player.setStartTime(now - 3h)
player.setEndTime(now)
player.onSeek(value -> stream.seek(current + value))

Aber ich kenne weder den XBMC-Code noch den Addon-Code :) Und darüber hast Du sicher auch schon nachgedacht.

Eine Toast-Notification ist eine Art Popup-Element, das nach kurzer Zeit wieder verschwindet. In so einem Popup könnte man beim Seeken die aktuelle Stream-Realzeit (zusätzlich) darstellen.

rols1 commented 1 year ago

Ah ja, dann meint Toast-Notification die bekannte Funktion xbmcgui.Dialog().notification() - danke. Im Prinzip würde das Übersetzen so klappen. Das Problem ist der Aufwand für den Skin - selbst allein für den Default-Skin Estuary. Im Addon habe ich in wochenlanger Arbeit eine Slideshow mit skin-Elementen realisiert - was für ein Aufwand. Zusätzliche skin-Elemente gehen m.E. weit über ein normales Mediathek-Addon hinaus. Wie gesagt, ev. findet sich im Kodi- oder Kodiners-Forum ein motivierter Nutzer, der das Addon forkt und sein Glück versucht..

fenjen commented 1 year ago

Das heißt, man könnte theoretisch xbmcgui.Dialog().notification() nutzen, um bei einem Aufruf von den Callback functions from Kodi to Add-On, also beim Seeken XBMCAddon::xbmc::Player::onPlayBackSeek (int time, int seekOffset) die korrekte Zeit einblenden. Schön wäre es vermutlich nicht. Aber bräuchte man denn die Hintergrund-Routine, wenn man das Callback hat? Müsste ja nur bei Bedarf angezeigt werden.

OK, aber mehr Ideen hab ich auch nicht :) Danke jedenfalls!

rols1 commented 1 year ago

xbmcgui.Dialog().notification() ist auf den verschiedenen Systemen zu unsicher. Eine durchgehende Anzeige ist nicht garantiert. Tatsächlich braucht es den Background-Task grundsätzlich nicht , stimmt. Andere benötige Tasks, wie z.B. Downloads oder Serienüberwachung können weiterlaufen, wenn die Übersetzungsschleife regelmäßig xbmc.sleep() verwendet und damit ein Blockieren verhindert.
Deine Idee ist finde ich interessant, aber wie schon erwähnt, mir fehlt die Zeit. Morgen früh steht das nächste Update an und täglich sind die Watchdog-scripts zu checken und auf Änderungen der Sender zu reagieren.

fenjen commented 1 year ago

Ich dachte, einfach bei Seek ausgeben:


import time, datetime as dt
HOURS = 60 * 60

def XBMCAddon_xbmc_Player_onPlayBackSeekonPlayBackSeek(position, seekOffset):
    now = dt.datetime.now()
    position = now - dt.timedelta(0, 3 * HOURS) + dt.timedelta(0, position)
    position = position.strftime("%H:%M:%S")
    endTime = now.strftime("%H:%M:%S") 
    # player.setStartTime(position)
    # player.setEndTime(endTime)
    print(position + " / " + endTime)

XBMCAddon_xbmc_Player_onPlayBackSeekonPlayBackSeek(2 * HOURS, 0) # 20:23:06 / 21:23:06
rols1 commented 1 year ago

Leider habe ich z.Z. Probleme mit den Code-Tags in meinem Browser..

rols1 commented 1 year ago

ich habe auf die Schnelle eine kurze Testroutine erstellt, welche die seek-Position anzeigt. Damit kannst du erstmal das Antwortverhalten beim Verschieben testen. Für die spätere Übersetzung in eine Zeitangabe bitte die unterschiedlichen Zeitpuffer der Sender beachten - 3 Std. ist die Ausnahme. Funktion ShowSeekPos() im Modul util: code1.txt

Aufruf in Funktion PlayVideo im Modul util, hinter dem Aufruf für Untertitel: code2.txt

rols1 commented 1 year ago

das Gewitter gestern abend schaffte etwas Freiraum für dein Vorhaben. Du kannst das Ergebnis ausprobieren, indem du das Modul util.py mit der ausgepackten beigefügten Datei ersetzt. Funktionsname und Aufruf entsprechen dem Code in meinem letzten Post. Die Uhrzeit wird per notification eingeblendet, wenn die Pufferposition sich um mehr als 10 sec ändert (Begründung s. Quelltext). Es haben sich bei der Umsetzung noch eine Reihe von Problemen ergeben - siehe Kommentierung im Quelltext. Anscheinend konnten sie aber gelöst werden, wobei noch Tests in anderen Systemumgebungen fehlen. Falls es beim positiven Eindruck bleibt, übernehme ich die Erweiterung in die nächste Addon-Version. util.py.zip

fenjen commented 1 year ago

Hi! Oh, spannend! Ich weiß ehrlich gesagt gar nicht, wie man Kodi-Plugins schreibt oder einspielt (und Python ist gar nicht so meine Programmiersprache). Ich hatte Dein Addon damals über die integrierte Addon-Suche installiert.

Ich hab mal ein Diff gemacht zwischen der util.py und der aktuellen Version von Github. Wenn ich die 5000 in dem xbmc.Dialog().notification()-Aufruf richtig deute, vermute ich mal, dass die Notification für 5s angezeigt wird. Spontan würde ich annehmen, dass 2s ausreichen würden. Und ich würd wahrscheinlich nur "Uhrzeit" schreiben, weil "Puffer" für normale Menschen zu technisch ist :)

Ich hab mal ganz naiv die util.py auf meinem Raspberry Pi durch die von Dir angehängte ersetzt, aber da sehe ich auch nahc Reboot keine Notification.

rols1 commented 1 year ago

auf dem PC (Linux mit Kodi 19) funktioniert es mit fast allen getesteten Livestreams mit unterschiedlichen Pufferlängen prima. Leider bleibt ein bei Events stark nachgefragter aktueller ARD-Sportschau-Stream bei der player.isPlaying()-Schleife hängen. Ev. ist für wenige Ausnahmen doch ein Background-Task erforderlich. Ich mache morgen einen Test mit meinem Raspi 3b+ (LibreElec 11.0.1, Kodi Nexus 20.1). Wenn das Ergebnis dem PC-Ergebnis entspricht, stelle ich das Modul util.py als Einzelupdate im kodinerds-Forum zur Verfügung - siehe Wicki Einzelupdate (Dateien und Module. Das lässt sich im Addon einfach einspielen.

Stimmt: 5000 entspricht 5 sec. Anzeigedauer - könnte man auch durch ein Setting variabel machen. Zur Meldung "Puffer-Uhrzeit": ich tendiere eher zu "Stream-Uhrzeit". "Uhrzeit" allein kann irritieren. Ein Bezug ist m.E. erforderlich, um sich von der durch Kodi angezeigten Zeit (einschl. "endet um..") abzugrenzen.

Screenshot (Pfeile nachträgl. eingefügt): Pufferzeit

fenjen commented 1 year ago

Das sieht doch super aus! "Stream-Uhrzeit" find ich auch gut!

Hab auf meinem Raspberry Pi die aktuelle OSMC-Version installiert. Reicht es nicht, die util.py auf dem System direkt zu ersetzen (hab eh eine Samba-Freigabe, daher ist das sehr komfortabel)? Wenn es theoretisch ausreichen sollte, würd ich mal das Logging einschalten und prüfen, wo es hakt.

rols1 commented 1 year ago

Ersatz von util.py reicht hier. Ich würde aber mit Logging noch warten, bis ich eigene Erkenntnisse aus den Tests auf meinem Raspi habe. Ev. muss noch nachgebessert werden.

rols1 commented 1 year ago

Mit Setting "Untertitel: falls vorhanden, im Player einschalten" funktioniert die Anzeige auch beim Raspi. Es ist wohl so - wie auch in anderen Fällen - dass bei schwächerer Hardware zusätzl. Zeit benötigt wird. Fortsetzung heute Nachmittag/Abend.

rols1 commented 1 year ago

die aktuelle Funktion kann mit Einzelupdate util.py und settings.xml installiert werden. Im Setting (Kategorie "Modul-Einstellungen") ist die "Stream-Uhrzeit" freizuschalten. Mit schwächeren Systemen funktioniert es nur mit einzelnen Streams. Dto bei Sync-Problemen, die inputstream beim Starten oder Verschieben haben kann. Daher die Voreinstellung AUS beim Setting. Mal schauen, ob sich mit der Funktion als Task eine Verbesserung ergibt.

rols1 commented 1 year ago

issue-Titel geändert - im Addon ist eine Unterscheidung Live-/Videostream z.Z. nicht möglich. Edit: und - wie ich festgestellt habe - auch bei Videos praktisch. Edit2: Einblendung der Stream-Uhrzeit umgesetzt mit heutigem Update V4.7.7