[gelöst] Wie Taste aus ActionMap eines anderen Plugins "entführen" bzw. "verbiegen" ?

  • Hallo


    Ich nutze GP3 und habe mir dort im GP-Quickbutton auf die gelbe Taste das pzyMail-Plugin gelegt.
    Im normalen TV-Betrieb funktioniert das perfekt.
    Wenn ich aber im EMC eine Aufnahme abspiele, wird ungünstigerweise bei "gelb" ein leeres SingleEPG aufgerufen.


    Ich habe inzwischen herausgefunden, dass dabei die ActionMap aus dem InfoBarEPG der InfoBarGenerics.py greift.


    Nun habe ich mir das DMM-Quickbutton installiert und um eine Option für die gelbe Taste erweitert (original nur gelb_lang).
    Dabei habe ich dann aus InfoBarGenerics.InfoBarEPG die Funktion openSingleServiceEPG erfolgreich ins DMM-Quickbutton umgebogen.
    Da werden dann dummerweise aber auch Aufrufe dieser openSingleServiceEPG-Funktion von anderen Plugins umgebogen.


    Ich habe dann in der InfoBarGenerics.InfoBarEPG den Eintrag für die gelbe Taste in der ActionMap auf eine neue Zwischenfunktion (yellow) gelegt.
    Diese Zwischenfunktion habe ich nun erfolgreich auf das DMM-Quickbutton umgebogen, so dass nun alles wunschgemäß funktioniert :winking_face:


    Nun ist die Frage, ob man anstatt eine neue Zwischenfunktion zu erzeugen und die zu verbiegen, nicht auch gleich die gelbe Taste ("showEventList" aus "InfobarEPGActions") aus der InfoBarGenerics.InfoBarEPG zum DMM-Quickbutton umbiegen könnte ?
    Dann müsste ich die InfoBarGenerics.py nicht verändern.


    Aktuell nutze ich: InfoBarEPG.yellow = InfoBarPlugins.yellow zum Umbiegen.
    Ginge da sowas auch, um nur die Taste umzubiegen ?: InfoBarEPG["EPGActions"]["showEventList"] = InfoBarPlugins.yellow


    Hab die bisherigen Änderungen mal als diffs beigefügt.

  • Danke.


    Wenn ich es richtig verstanden habe, hat er die jeweiligen __init__ umgebogen, dort im Original ausgeführt
    und dann noch die Record-Taste als zusätzliche Taste hinzugefügt.


    Das dort eine bereits zugewiesene Taste umgebogen bzw. verändert wurde, hab ich da nicht finden können.


    Ok, zur Not könnte ich ja die __rcUsedChanged umbiegen und dann die EPGActions-ActionMap im DMM-Quickbutton anpassen.


    Wenn ich dann die Tasten für das InfoBarEPG im DMM-Quickbutton zuweise, dann kann ich ja bei den Originalfunktionen das bestimmt nicht so lassen "showEventInfo": (self.openEventView, _("show EPG...")),
    Da muss ich dann aus dem self.openEventView bestimmt ein InfoBarEPG.openEventView machen, oder ?


    Oder kann man eine Taste durch erneutes Zuweisen neu belegen?

    Gruß Sven (aka Dreamy)


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

  • du kannst auch das ganze __init__ überschreiben und dort dann die Wunschactionmap eintragen.

  • Ok, im __init__ wird ja gar kein ActionMap geschrieben.
    Deshalb hatte ich ja schon angemerkt, dass ich die __rcUsedChanged überschreiben könnte, um dort dann die EPGActions-ActionMap anzupassen.


    Kann man denn nicht nachträglich eine Taste eines ActionMap ändern?


    So nach dem Motto: InfoBarEPG["EPGActions"]["showEventList"] = InfoBarPlugins.yellow


    Oder geht das nur mit .update ?
    Wobei dabei vermutlich auch immer alle anderen Tasten wieder angegeben werden müssen.

    Python
    self["EPGActions"].update(self, "InfobarEPGActions",     
    {"showEventInfo": (self.openEventView, _("show EPG...")),     
    "showEventInfoPlugin": (self.showEventInfoPlugins, _("list of EPG views...")),     
     " ": self.showEventInfoWhenNotVisible,     
     "showEventList": InfoBarPlugins.yellow    
    })

    Da muss ich doch dann bestimmt das self. durch InfoBarEPG. ersetzen, oder ?
    Weil ja nur die eine Funktion überschrieben wird und dann die Class mit den anderen Funktionen ja nicht mitkommt, oder?


    Python
    self["EPGActions"].update(self, "InfobarEPGActions",     
    {"showEventInfo": (InfoBarEPG.openEventView, _("show EPG...")),     
    "showEventInfoPlugin": (InfoBarEPG.showEventInfoPlugins, _("list of EPG views...")),     
     " ": InfoBarEPG.showEventInfoWhenNotVisible,     
     "showEventList": InfoBarPlugins.yellow    
    })

    Im komme im Moment nicht an die Box zum Testen :winking_face:
    Deshalb ist das hier alles noch so theoretisch.

    Gruß Sven (aka Dreamy)


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

    3 Mal editiert, zuletzt von Sven H ()

  • Das mit der __rcUsedChanged umschreiben klappt leider nicht, da es ja eine notifier-Funktion für config.misc.rcused.value ist.
    Da sich der Wert ja nicht mehr ändert, wird die umgeschriebene Funktion nicht mehr aufgerufen.


    Dann müsste ich wohl doch die __init__ nehmen und darin das config.misc.rcused.addNotifier auf eine eigene Funktion umbiegen, aber das scheint mir erstmal zu kompliziert.
    Ich lass da lieber die obige Lösung, auch wenn ich dann nach einem Update jedesmal die InfoBarGenerics.py anpassen muss. :winking_face:

    Gruß Sven (aka Dreamy)


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

  • In TimerEdit.py findest du ein Beispiel, wie eine Action aus der ActionMap gelöscht wird.


    Aber warum installierst du dir nicht einfach MovieQuickButton?

    Gruss
    Dre


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

  • Danke, das schaue ich mir mal an.
    Ich würde meinen, dass ich schon diverse Varianten erfolglos probiert hatte und da auch das MovieQuickbutton dabei war.
    Ich probier das aber nochmal. :winking_face:

    Gruß Sven (aka Dreamy)


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

  • @dre
    So, hab das mal versucht mit removeAction.


    Das klingt ganz zuversichtlich.
    Komisch ist nur, dass trotz nachweislichem Entfernen der Action (hab die bestehenden Actions vorher und nachher ausgeben lassen), das SingleEPG trotzdem geöffnet wird. :loudly_crying_face:


    MovieQuickbutton habe ich nicht gefunden, nur das MovieSelectionQuickbutton.
    Das scheint wohl aber nur für die MovieSelection zu sein. Zumindest hat es keine Auswirkung auf "gelb" beim Abspielen einer Aufnahme.

    Gruß Sven (aka Dreamy)


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

  • Du suscht wohl an der falschen Stelle. Ich habe mal bei mir Gelb gedrückt während der Filmwiedergabe. Da geht kein EPG auf. Ich verwende aber auch kein EMC

    Gruss
    Dre


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

  • Du suscht wohl an der falschen Stelle.

    Das wird es wohl sein :winking_face:
    Womit spielst du deine Aufnahmen ab ?


    Zumindest wird dabei definitiv die Funktion openSingleServiceEPG() aus der InfoBarGenerics.py aufgerufen.
    Hast du PTS installiert?
    In den Actions für self["EPGActions"] steht jedenfalls für showEventList (gelbe Taste) das drin:

    Code
    'showEventList': <bound method InfoBar.yellow of <class 'Plugins.Extensions.PermanentTimeshift.plugin.InfoBar'>

    Nach dem actionRemove ist der Eintrag war weg, aber das SingleEPG kommt dann trotzdem noch.


    Ich glaub, ich gebe auf :winking_face:
    Da die obige Variante aus #1 funktioniert, bleibe ich erstmal dabei, auch wenn ich nach einem Update wohl immer einige Dateien anpassen muss.

    Gruß Sven (aka Dreamy)


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

  • Ich verwende die ganz normale Movielist resp. für die Verwaltung hab ich natürlich noch VideoDB drauf. Aber das überschreibt die Movielist nicht.


    PTS hab ich nicht.

    Gruss
    Dre


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

  • Das mit der __rcUsedChanged umschreiben klappt leider nicht, da es ja eine notifier-Funktion für config.misc.rcused.value ist.
    Da sich der Wert ja nicht mehr ändert, wird die umgeschriebene Funktion nicht mehr aufgerufen.

    Entweder das, oder Du überschreibst Die Methode gar nicht :winking_face:


    Methoden, die mit __ beginnen, werden bei Aufruf dynamisch umbenannt.


    Schau Dir mal mein streamtimeshiftfix an, da habe ich eine solche Methode überschrieben. Glaube es war InfoBarGenerics.__evEOF(): reached EOF, but we are in stream mode. delaying 1 second.

  • Ich hatte die Funktion __rcUsedChanged so wie du in deinem Link in das DMM-Quickbutton umgebogen.


    Das Problem ist nur, dass die o.g. zu "entführende" Funktion nur 1 x mal original mit Start der Infobar ausgeführt wird.
    Wenn mein Plugin kurz danach die Funktion umbiegt, klappt das zwar, aber da die o.g. Funktion wegen dem config-Notifier nicht erneut aufgerufen wird, komme ich im Plugin gar nicht dazu den Code für die Funktion anzupassen.
    Die Funktion würde sich nur wieder aktivieren, wenn man config.misc.rcused.value ändert.
    Aber dass passiert ja normalerweise nicht.


    Edit: vielleicht müsste ich die Funktion nach dem Umbiegen ja nur einmal manuell aufrufen ?!?

    Gruß Sven (aka Dreamy)


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

    Einmal editiert, zuletzt von Sven H ()

  • Nach ewiger Suche und zig Versuchen habe ich endlich die Lösung gefunden :smiling_face:
    Nachdem ich schon alle InfoBar..._inits einiger Plugins gekapert hatte, ist mir aufgefallen, dass EMC ja auch nochmal alle InfoBar-Geschichten (u.a. die InfoBarEPG) in der InfoBarSupport holt.
    Da hätte ich aber auch früher drauf kommen können :winking_face:


    Nun musste ich also nur noch die InfoBarSupport__init__ aus der InfoBarSupport.py (EMC) in das DMM-QuickButton-Plugin umleiten, dort die InfoBarSupport__init__ im Original ausführen und im Anschluss wie schon oben von 'dre' erwähnt, mit folgendem Code den Befehl für die gelbe Taste (ursprünglich aus der InfoBarEPG) aus der ActionMap löschen:

    Code
    actions = self["EPGActions"].actions
    	# delete yellow-key-action from EMC_InfoBarSupport (InfoBarEPG)
    	del actions['showEventList']


    Dadurch wird jetzt im EMC-MoviePlayer die im Quickbutton zugewiesene Aktion für die gelbe Taste aufgerufen und nicht mehr der leere SingleEPG :winking_face:


    Das funktioniert jetzt auch mit der originalen InfoBarGenerics.py, so dass ich da nichts mehr anpassen muss (also auch nicht mehr nach einem DMM-Update).

    Gruß Sven (aka Dreamy)


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

    2 Mal editiert, zuletzt von Sven H ()