erweiterte Funktionen im PermanentTimeshift-Plugin

  • Edit:
    Die aktuelle Version ist im Post #51 zu finden :winking_face:


    erweiterte Funktionen:
    - Anzeige des Sendungsnamens der aktuellen Timeshiftsendung
    - eigener Display-Skin zur Anzeige der Infos zur aktuellen Timeshiftsendung im Display
    - Anzeige des realen Zeitbalkens inklusive der realen Restlaufzeit während des Timeshiftens der aktuellen Live-TV-Sendung
    - bei aktivem Timeshift wird beim Senderwechsel über die Kanalliste vorher gefragt, ob man wirklich den Sender wechseln möchte


    ==================================================
    Ausgangsfrage:
    Da mein Wunsch den EventName im TimeShiftState-Screen anzuzeigen sich vermutlich nicht allein per Skin lösen lässt, hab ich da mal etwas weiter probiert.
    Im Skin habe ich im Screen "TimeShiftState" und in der PVRState.py ein zusätzliches Label "EventName" angelegt.


    Dieses aktualisiere ich beim Anzeigen des TimeShiftState-Screens über die Timeshift-Function "_mayShow()" mit folgendem Code:

    Code
    service = self.session.nav.getCurrentService()
    info = service and service.info()
    event = info and info.getEvent(0)
    eventname = event.getEventName()
    self.pvrStateDialog["EventName"].setText(eventname)

    Allerdings wird dabei nur der EventName des Live-TV-Events zurückgegeben und nicht der aktuelle EventName aus dem Timeshift.


    Gibt es hier eine Möglichkeit, den EventName der laufenden/zeitversetzten TimeShift-Sendung zu ermitteln?

    Über "self.session.nav.getCurrentlyPlayingServiceReference()" bin ich nicht an einen EventNamen gekommen.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    6 Mal editiert, zuletzt von Sven H ()

  • mit PTS werden ja auch meta-files für jede Timeshift-Sendung angelegt.
    Die kann ich auch auslesen, allerdings bekommt PTS offenbar nicht mit, wenn E2 nach Timeshift-EOF (Ende der Sendung) auf das nächste File wechselt.
    (self.pts_currplaying wird dabei nicht verändert)
    Dadurch bekomme ich dann auch wieder nicht den richtigen EventName des laufenden Timeshiftstreams.


    im E2-log taucht beim Wechsel des Files sowas auf:


    Gibt es eine Möglichkeit an diese Channelinfos (Pfad + Filename) des aktuell abgespielten Timseshiftfiles (Streams) zu kommen?

    Code
    Jul 11 14:36:35 dm920 enigma2[1402]: reached EOF, but we are in stream mode. delaying 1 second.
    Jul 11 14:36:35 dm920 enigma2[1402]: eDVBChannel: End of file!
    Jul 11 14:36:35 dm920 enigma2[1402]: timeshift EOF, switch to next file
    Jul 11 14:36:35 dm920 enigma2[1402]: stopping thread.
    Jul 11 14:36:35 dm920 enigma2[1402]: FILEPUSH THREAD STOP
    ...
    Jul 11 14:36:35 dm920 enigma2[1402]: alloc PVR
    Jul 11 14:36:35 dm920 enigma2[1402]: allocate channel.. 0413:0001:00c00000 (/media/usb//pts_livebuffer.2)
    Jul 11 14:36:35 dm920 enigma2[1402]: available channel.. 0413:0001:00c00000 (/media/usb//timeshift.wjwrL6)
    Jul 11 14:36:35 dm920 enigma2[1402]: allocate pvr demux

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    2 Mal editiert, zuletzt von Sven H ()

  • Genau. :winking_face:


    PTS speichert ja mehrere Sendungen und legt für jede ein eigenes File an.


    Wenn ich jetzt zum Beispiel bei Sendung 1 auf "Pause" drücke und damit Timeshift starte, ist das noch File1.
    Beginnt im Hintergrund bereits die nächste Sendung, wird im Hintergrund File2 aufgezeichnet usw.


    Wenn ich mich nun aber nach der "Pause" weiter im File1 bewege, sollte dort auch der Name der Sendung1 erscheinen und nicht der Name der aktuellen Live-Sendung2 die bereits im Hintergrund läuft bzw. in File2 aufgenommen wird.


    Wenn man nun am Ende von File1 angekommen ist, wechselt E2 automatisch auf das nächste File2.
    Im PTS steht dann immer noch "self.pts_currplaying = 1", weil PTS das nicht mitbekommt.


    Und da würde mich interessieren, in welchem File (Pfad+Name) man sich gerade im Timeshift-Modus bewegt :winking_face:
    Dann könnte ich darüber evtl. aus den meta-files vom PTS an den richtigen Namen kommen.


    Gibt es da vielleicht eine nette Funktion ala getCurrentStreamPath() oder getCurrentTimeShiftFile() ? :winking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    Einmal editiert, zuletzt von Sven H ()

  • Ich hab das ganze jetzt noch weiter getestet im PTS.


    Komischerweise funktionierte es jetzt doch mit dem "ptsTimeshiftFileChanged".
    Keine Ahnung, warum PTS bei den letzten Tests die Function nicht ausgelöst hat. Ich muss das mal beobachten.


    Dadurch kann ich jetzt doch mit dem pts_currplaying über das aktuelle Timeshiftfile den EventNamen abfragen. :winking_face:
    So macht es PTS ja auch, wenn man den PTS-eigenen TimeShiftState-Screen (PTS-Infobar) nutzt.


    Code
    readmetafile = open("%s/pts_livebuffer.%s.meta" % (config.usage.timeshift_path.value,self.pts_currplaying), "r")
    servicerefname = readmetafile.readline()[0:-1]
    eventname = readmetafile.readline()[0:-1]
    readmetafile.close()
    self.pvrStateDialog["EventName"].setText(eventname)


    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Ich hab das ganze jetzt mal versucht zu analysieren.
    Offensichtlich, gab es da tatsächlich noch einen Bug, der dafür sorgte, dass der Timeshiftfile-Wechsel nicht immer richtig verarbeitet wurde.


    Ich hab das mal mit Version 1.5a versucht zu fixen und hab gleich noch einen neuen internen PTS-StandardScreen integriert ("PTSStandardTimeshiftState").
    Dieser arbeitet jetzt im PTS generell mit Eventname und ist unabhängig von der im Setup wählbaren PTS-Infobar.
    So sieht man im TimeshiftState-Screen den EventNamen der laufenden Timeshiftsendung, auch wenn im Live-TV bereits eine andere Sendung läuft.


    Änderungen in Version 1.5b:

    • new: show the eventname from the current timeshiftfile always in a new TimeShiftState-Screen "PTSStandardTimeshiftState"
    • new: on "Stop-Key" show the TimeShiftState-Screen with STOP-State
    • new: show TimeShiftState-Screen after ptsTimeshiftFileChanged
    • new: set the correct timeshift-screen directly after changing the pts-settings
    • fix: "Stop-Key" to switchToLive - this key works most only on second time (so use doSeek twice - this works)
    • fix: set "switchtolive" after SetNextPlaybackFile - the "pts_currplaying" was incorrect after ptsTimeshiftFileChanged


    Es wäre schön, wenn ihr die Version mal testen könntet mit entsprechender Rückmeldung :winking_face:


    Edit: hab noch 2 kleine Fehler gefunden - daher jetzt schon Version 1.5b

  • Ich hab da mal etwas weitergebastelt :winking_face:


    Änderungen in 1.5c:
    - jetzt mit eigenem Display-Skin (Summary-Screen) bei aktivem PTS-Timeshift
    (dabei wird dann im Display zum aktuellen Timeshift der Sender, der Sendungsname, der Sendungsfortschritt, die Uhrzeit und die Restlaufzeit angezeigt)


    Den Default-Fortschrittsbalken habe ich dabei blau gewählt, um den optischen Unterschied zur normalen InfoBarSummary bei Live-TV (gelber Fortschrittsbalken) zu haben.
    Das ganze kann natürlich durch den User komplett umgeskinnt werden.


    Info: Die Files aus der zip gelten dabei als Ergänzung zum bereits installierten PTS 1.5


  • Man könnte noch integrieren, dass die Restlaufzeit (aktueller Zeitversatz im Timeshiftfile) noch mit der Restlaufzeit der aktuellen Live-Sendung aus dem EPG verrechnet wird (sofern beide Events identisch sind).
    Dann hätte man die echte Restlaufzeit und könnte so wie im EMC zwei Progressbars anzeigen.
    Eine blaue für die aktuelle Abspielposition und eine gelbe für die aktuelle Live-TV-Position. :winking_face:


    Dazu müsste man dann allerdings wie im EMC eigene Converter und eine eigene Source bereitstellen.


    Was meint ihr, macht das Sinn, lohnt sich der Aufwand?

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Auch wenn das Thema sonst keinen wirklich zu interessieren scheint, hab ich mich mal versucht :winking_face:


    Änderungen in Version 1.5d:

    • neu: Anzeige der echten Restlaufzeit beim Timeshiften der aktuellen Live-TV-Sendung (kann über Option in Setup deaktiviert werden)
      dabei wird per Progressbar sowohl der aktuelle Timeshiftstatus (blau) als auch der fortgeschrittene Live-TV-Status (gelb) angezeigt
    • gefixt: unter bestimmten Umständen wurde in der 1.5c manchmal der falsche Display-Screen angezeigt

    Info:
    Die Files aus der zip gelten dabei als Ergänzung zum bereits installierten PTS 1.5
    Die neue Source und die beiden neuen Converter aus der zip müssen dabei natürlich auch auf die Box kopiert werden.
    (die neue Ordnerstruktur in der zip ist dabei dann selbsterklärend)

  • Doch, da hab ich sehr großes Interesse dran. Bin aber leider z.Z. sehr eingespannt und komme kaum an die Box, geschweige an den PC. Zur Zeit ist das Telefon mein bester Freund :upside_down_face:

    mfg


    OoZooN


    Support für OoZooN Images gibt es auf forum.oozoon.de , nicht hier!


    Two Beer or not two Beer, thats the Question


    Aktuelle Nachrichten rund um OoZooN-Images gibt es auf Twitter

  • Danke :winking_face:


    Ja, wenn es dann insgesamt passt, könnte ich dann direkt über github einen PullRequest machen.
    Intern arbeite ich schon an Version 1.5e :winking_face:


    Im Moment gibt es noch kleine Probleme mit dem Ein-/Ausblenden der neuen PTS-Infobar (self.pvrStateDialog).
    Diese schaltet durch die Anpassung nicht mehr generell automatisch parallel zur normalen Infobar.


    Ich hab da im Code zwar schon einige Stellen anpassen können, so dass es eigentlich auch so funktioniert. Aber lieber wäre es mir, wenn ich die originale Class InfobarTimeshiftState einfach mit dem neuen Screen verbinden könnte.
    Dann würde die PTS-Infobar vermutlich auch weiterhin automatisch an die normale Infobar gekoppelt sein.
    Dann müsste ich das Ein-/Ausblenden der neuen PTS-Infobar nicht händisch nachkorrigieren.


    Leider habe ich dafür noch keine Lösung gefunden :winking_face:
    (Dachte da an ein zusätzliches InfoBarStateTimeshift.__init(...), wo ich dann den neuen Screen übergebe. Leider hab ich das bisher nicht ohne GS hinbekommen)


    Falls mir da jemand weiterhelfen könnte, wäre ich dankbar.
    Vielleicht liege ich da aber auch völlig falsch mit meiner Vermutung bezüglich der automatischen Kopplung mit der normalen InfoBar.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Danke für dein Interesse an meinem Problem :winking_face:


    Nein, die Class InfoBarTimeshiftState spielt im PTS noch keine Rolle.
    Ich lasse die Class InfoBarTimeshiftState ganz normal von der originalen Infobar verarbeiten, wo auch der self.pvrStateDialog erzeugt wird.


    Im PTS ersetze ich später im bereits erzeugten self.pvrStateDialog nur den neuen Screen (mit instantiateDialog).
    Dabei scheint dann allerdings die Kopplung des Screens mit der normalen Infobar verloren zu gehen, da in manchen Situationen die PTS InfoBar z.B. stehenblieb, obwohl die normale Infobar sich schon ausblendete.


    Ich hab schon einiges versucht, um dies über die Class InfoBarTimeShiftstate (indirekt ja über die InfoBarPVRState) zu lösen, bin aber bisher gescheitert.
    Das Problem ist wohl auch, dass im neuen Screen „TimeshiftState“ noch das „parent“ zu übergeben ist.


    Das ganze ist schon ziemlich komplex.
    Da braucht man wohl auch ne Weile, ehe man sich in den Code eingelesen hat :winking_face:

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    2 Mal editiert, zuletzt von Sven H ()

  • Diese beiden Classes (InfoBarTimeshiftState und InfoBarPVRState) müsste man wohl mit reinnehmen, etwas anpassen (wegen parent) und dann mit dem neuen TimeshiftState-Screen (im aktuellen Code der 1.5c noch PTSStandardTimeshiftState) aufrufen.
    git.opendreambox.org/?p=enigma…86c061fa5abb305a7d6#l1313


    Versuche in der PTS-InfoBar-Class dann ein InfoBarTimeshiftState.__init__(…) auszuführen, endeten immer mit AttributeError: class InfoBarTimeshiftState has no attribute '_InfoBar__init' ???

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

  • Kannst du nicht den Code mal posten? So ist es ziemlich schwierig irgendwas nachzuvollziehen. Du bist im Code drin, wir aber nicht.

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • Ok, ich versuche es mal einfach zu gestalten :winking_face:
    Ich weiß, dass der Code sehr kompliziert ist und auch eine ganze Weile gebraucht habe, um da halbwegs durchzusehen :winking_face:


    Hiermit wird der originale TimeshiftState-Screen in self.pvrStateDialog per instantiateDialog im InfoBarPVRState festgelegt:
    Der Aufruf erfolgt in der InfoBar.py mit InfoBarTimeshiftState.__init__(self)
    http://git.opendreambox.org/?p…3586c061fa5abb305a7d6#l70


    Im PTS ersetzte ich dann den self.pvrStateDialog mit folgender Zeile und übergebe dabei meinen neuen TimeshiftState-Screen:
    self.pvrStateDialog = self.session.instantiateDialog(PTSStandardTimeshiftState, self)


    Screen-Code:


    Das funktioniert soweit, nur dass dabei irgendwie die Kopplung mit der normalen Infobar verloren geht und dabei insbesondere das Ausblenden der PTS-Infobar händisch im PTS-Code nachkorrigiert werden muss.
    Nun dachte ich, man kann diese obigen Classes anpassen und in der PTS-Infobar-Class neu mit __init__ staren und dabei einfach meinen angepassten TimeshiftState-Screen übergeben.

    Python: plugin.py (PTS)
    class InfoBar(InfoBarOrg):
    	def __init__(self, session):
    		print "=== pts InfoBar__init__"
    		InfoBarOrg.__init__(self, session)
    		InfoBarOrg.instance = self
    		InfoBarTimeshiftState.__init__(self, self)

    Die beiden obigen Classes hab ich dann versucht anzupassen, damit das mit dem parent klappt:




    Bei InfoBarTimeshiftState.__init__(self, self) erhalte ich dann immer diesen Fehler "AttributeError: class InfoBarTimeshiftState has no attribute '_InfoBar__init'".
    Der Fehler kommt aber auch, wenn ich die originale InfoBarTimeshiftState-Class mit InfoBarTimeshiftState.__init__(self) aufrufen will.
    Also scheint der (Denk)Fehler nicht nur im angepassten Code zu liegen.

    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP

    3 Mal editiert, zuletzt von Sven H ()

  • also aus meiner Sicht muss hier der Code angepasst werden:

    Python
    class InfoBar(InfoBarOrg, InfoBarTimeshiftState):
    	def __init__(self, session):
    		print "=== pts InfoBar__init__"
    		InfoBarOrg.__init__(self, session)
    		InfoBarOrg.instance = self
    		InfoBarTimeshiftState.__init__(self, self)

    siehe erste Zeile für die Anpassung

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • Ok, ich glaub, jetzt sind wir schon einen Schritt weiter :winking_face:


    Dann kommt aber dieser Fehler:


    Also scheint das instantiateDialog nicht geklappt zu haben:

    Python
    class InfoBarPVRState:
    	def __init__(self, screen=PVRState, force_show = False, parent = None):
    		print "=== InfoBarPVRState_init"
    		self.onPlayStateChanged.append(self.__playStateChanged)
    		self.pvrStateDialog = self.session.instantiateDialog(screen, parent)
    		self.pvrStateDialog.neverAnimate()


    Gruß Sven (aka Dreamy)


    DM920 mit unstable OE2.5 DP
    One mit unstable OE2.6 DP