Ein kleines HowTo auf Grundlage eigener bescheidener Erfahrungen mit euphorischen Momenten, halt schön, wenn so ne eigene Modifikation funktioniert:
1. Plugin modifizieren:
1.1 Motivation: Ein Plugin modifizieren, eine Kleinigkeit verändern wollen, damit es Features bietet, wie man sie selbst haben möchte.
1.2 Eigene Beispiele:
1.2.1 EPGRefreshS - mich störte es, dass ich die Senderverbleibsdauer in Minuten angeben konnte und nicht in Sekunden
1.2.2 LetterBoxV - ich nutzte LetterBoxV und vergrößerte in 4:3 geboxte 16:9 TV-Formate (schwarze Balken links/rechts wie oben/unten), nach Vergrößerung nur noch oben und unten. Eben dieses Feature konnte ich bei einer Aufnahme nicht mehr nutzen. Da LetterBox nur nur über das blaueTasteMenü aufrufbar ist bzw. Quickbutton ebenfalls mit den Farbtasten funktioniert und eben diese sind im Video-Modus reserviert. Also schrieb ich es in den Plugin-Browser rein, den man auch im Video-Modus erreicht (die nötige Idee und Umsetzungsschritte habe ich in anderen Forenbeiträgen gefunden).
1.3 Voraussetzung ist natürlich ein wenig Programmiersprachkenntnis. Als kleine Einstiegshilfe bietet sich vielleicht folgender Link an: http://dream.reichholf.net/pydoc/html/index.html, danke JuSt611. Ein auskommentierter Quellcode wäre auch ganz cool, gibts sowas? Also bei mir war es eher Rumprobiere und Hilfen anderer Foristen.
2. Umbenennung
2.1 Motivation: LetterBox angeglichen und mit einem E2-Softwareupdate wars auch leider wieder damit gewesen. Ohne jetzt genauer zu wissen, woran sich ein Update genau orientiert, kam mir einfach eine Idee, benenn es um, mach es "eigenständig", was auch klappte.
2.2 Ordner umbenennen: Mit einem FTP-Client auf die Box verbinden und in das Verzeichnis /usr/lib/enigma2/python/Plugins/Extensions wechseln. Da liegen die einzelnen Plugins und auch sagen wir mal das von euch veränderte Plugin /A. Da machen wir jetzt ein /As draus und soweit fertig.
2.3 Namen im Plugin selbst verändern: etwas kniffliger und erstmal ansatzweise "richtig". Ich bezieh mich jetzt auf die eigenen oben angesprochenen Mods.
2.3.1 In LetterBoxV war es noch recht "einfach". Ich habe lediglich nach dem Namen "LetterBoxV" gesucht und ihn hinter plname gefunden und halt angeglichen, das passte dann auch soweit. Hier der Quellcode-Auszug:
2.3.2 Bei EPGRefreshS war es im Endeffekt eine Verzweiflungstat mit dem Ziel, EPGRefreshS auch ohne nötige Grundkenntnis von EPGRefresh zu trennen. Ähnlich wie oben habe ich diesmal aber der Konsitenz halber alle EPGRefresh-Zeichensätze abhängig von der Groß- und Kleinschreibung zu EPGRefreshS bzw. epgrefresh umbenannt und das haute hin. Leider tut es aber nach aktuellen Updates nicht mehr, also es aktualisiert nicht, erst nach einer Installation. Also wird da wohl auch was mit umgeschrieben, also verändert.
=> bei LetterBoxV haut meine Idee der Umbennung zum Updateschutz hin, bei EPGRefreshS nicht, also man kann es erstmal so probieren, aber ohne Gewähr
3. Aus eurem Mod eine IPK machen:
3.1 Erstmal saugt ihr euch dieses plugin2ipk.tar.gz von
(Swiss-MAD erwähnte noch eine wie er sagt, flexiblere Variante, ich habe sie selbst aber nicht ausprobiert, hier auf jeden Fall mal der Link dazu [url=http://www.i-have-a-dreambox.com/wbb2/thread.php?postid=522027#post522027,]IPKG script gesucht[/url], danke)
Dieses plugin2ipk.tar.gz über einen FTP-Client ins /tmp der Dreambox bringen und weiter mit telnet auf die Box drauf (wie das geht, habe ich mal versucht, in einem Howto zu beschreiben, hier http://www.i-have-a-dreambox.c…read.php?threadid=159838.).
cd /tmp
gunzip /tmp/plugin2ipk.tar.gz
tar-xvf /tmp/plugin2ipk.tar
Nun ins Plugin2ipkVerzeichnis, das Programm lässt sich halt nur aus "seinem" Verzeichnis aus ausführen:
cd /media/hdd/plugin2ipk
Nun kommt:
./plugin2ipk.sh As 1.0 euername mipsel
(1.0: eure Version, euername: euer pseudonym/name, As: der Pluginname, abhängig vom Verzeichnisnamen, in dem ihr es habt, mipsel: die Archtektur).
Das ist als kleine Übersicht gedacht. Leider etwas bescheiden an nötigen Programmierhilfen, aber als petitpeu.
Mal ein kurzer Einblick zu meinen Mods:
LetterBoxV:
in plugin.py
def Plugins(**kwargs):
plname = "LetterBoxV Zoom" # Plugin-Browser Benennung
return [
PluginDescriptor(name=plname,description="Zoom into letterboxed movies",where=PluginDescriptor.WHERE_PLUGINMENU,fnc=zoom_toggle), # where=PluginDescriptor.WHERE_PlUGINMENU, damit hab ich es ins Plugin-Menü bekommen
PluginDescriptor(where=PluginDescriptor.WHERE_SESSIONSTART,fnc=zoom_init)]
EPGRefreshS:
in EPGRefresh.py
# Recheck later
epgrefreshtimer.add(EPGRefreshTimerEntry(
time() + config.plugins.epgrefresh.delay_standby.value*60, # hier dann die 60 raus und man hat es in Sekunden (60 Faktor für halt aus Sekunden Minuten mach)
self.refresh,
nocheck = True)
)
AutoTimerHauptfenster:
in AutoTimerOverview.py
class AutoTimerOverview(Screen, HelpableScreen):
"""Overview of AutoTimers"""
skin = """<screen name="AutoTimerOverview" position="center,center" size="560,280" title="AutoTimer Overview"> # Malen vom Hauptfenster mit der Größe von 560 Pixeln Breite und 280 Pixeln Höhe
<ePixmap position="0,0" size="140,40" pixmap="skin_default/buttons/red.png" transparent="1" alphatest="on" /> # Malen vom roten Button in der angegebenen Position. oben rechts und halt die Größse nach unten rechts, 140 Breite und eben 40 Länge
<ePixmap position="140,0" size="140,40" pixmap="skin_default/buttons/green.png" transparent="1" alphatest="on" /> # Malen vom grünen Button wie oben
<ePixmap position="280,0" size="140,40" pixmap="skin_default/buttons/yellow.png" transparent="1" alphatest="on" /> # Malen vom gelben Button wie oben
<ePixmap position="420,0" size="140,40" pixmap="skin_default/buttons/blue.png" transparent="1" alphatest="on" /> # Malen vom roten Button wie oben
<widget source="key_red" render="Label" position="0,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" /> # Labeln bedeutet einfach, man bringt halt nen Schriftzug drauf in gegebener Postion auf hier gegebenem Button
<widget source="key_green" render="Label" position="140,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
<widget source="key_yellow" render="Label" position="280,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
<widget source="key_blue" render="Label" position="420,0" zPosition="1" size="140,40" valign="center" halign="center" font="Regular;21" transparent="1" foregroundColor="white" shadowColor="black" shadowOffset="-1,-1" />
<widget name="entries" position="5,45" size="550,225" scrollbarMode="showOnDemand" />
</screen>"""
def __init__(self, session, autotimer):
Screen.__init__(self, session)
HelpableScreen.__init__(self)
# Save autotimer
self.autotimer = autotimer
self.changed = False
# Button Labels # hier stehn die zugehörigen Labels, also Benennungen
self["key_red"] = StaticText(_("Save")) # der rote hat halt mal Save als Benennung, nicht wundern, im locales wird halt übersetzt
self["key_green"] = StaticText(_("Delete")) # Delete, Übersetzung im locale
self["key_yellow"] = StaticText(_("Add")) # Add, Übersetzung im locale
self["key_blue"] = StaticText(_("Einstellungen")) # hier hab ich es mir einfach gemacht, bei der Übersetzung muss man halt auf was achten, die Datei ist nämlich schon kompiliert, andere Kiste
# Create List of Timers
self["entries"] = AutoTimerList(autotimer.getSortedTupleTimerList())
# Summary
self.onChangedEntry = []
self["entries"].onSelectionChanged.append(self.selectionChanged)
# Define Actions
self["OkCancelActions"] = HelpableActionMap(self, "OkCancelActions",
{
"ok": (self.ok, _("Edit selected AutoTimer")),
"cancel": (self.cancel, _("Close and forget changes")),
}
)
self["MenuActions"] = HelpableActionMap(self, "MenuActions",
{
"menu": (self.menu, _("Open Context Menu"))
}
)
self["ColorActions"] = HelpableActionMap(self, "ColorActions",
{
"red": (self.save, _("Close and save changes")), # mittels rotem Button kann man schliessen und speichern, das Setzen ist hier für mich wichtig gewesen, von wegen rot
"green": (self.remove, _("Remove selected AutoTimer")), # für grün
"yellow": (self.add, _("Add new AutoTimer")), # für gelb
"blue": (self.menu, _("Open Context Menu")), # für blau
Alles anzeigen
wie kommt man nun auf sowas, man schaut sich halt erstmal die Codes an und hat halt vorher schon seine Ideen/Anhaltspunkte. Hier halt mal meine PluginMods offengelegt. Vielleicht kommt auch was von Swiss-MAD, würde mich freuen.