Eine Anleitung, wie man ein Plugin für OTR-Verwaltung schreibt
Mit einem Plugin lassen sich die Funktionen von OTR-Verwaltung erweitern. Die Plugins werden in Python geschrieben. Im folgenden wird beschrieben, wie man ein einfaches Plugin selbst programmiert. Das Plugin soll auf Knopfdruck mit Hilfe einer Mirrorsuchmaschine ähnliche Sendungen finden.
OTR-Verwaltung lädt Plugins aus zwei Ordnern, wenn es installiert ist: ~/.otr-verwaltung/plugins und /usr/share/otr-verwaltung/plugins. Letzterer ist für Plugins bestimmt, die von OTR-Verwaltung mitgeliefert werden. Wir erstellen also die Datei ~/.otr-verwaltung/plugins/FindSimilar.py mit folgendem Inhalt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
from pluginsystem import Plugin # 1
class FindSimilar(Plugin): # 2
Name = "Ähnliche Sendungen finden" # 3
Desc = "Sucht bei einer Mirrorsuchmaschine nach ähnlichen Sendungen." # 4
Author = "Ich"
Configurable = False # 5
def enable(self): # 6
pass
def disable(self): # 7
pass
|
Erklärungen zu den mit Nummer bezeichneten Kommentaren:
Wird OTR-Verwaltung nun gestartet, taucht das Plugin Ähnliche Sendungen finden in der Liste auf; es kann aktiviert und deaktiviert werden. Allerdings besitzt es noch keine Funktion!
Wenn das Plugin aktiviert wird, muss ein Knopf zur Leiste hinzugefügt werden. Dieser Knopf soll nur in der Ansicht der nicht dekodierten und ungeschnittenen Sendungen angezeigt werden. Dafür bietet OTR-Verwaltung die Funktion add_toolbutton. Beim Deaktivieren muss der Knopf mit remove_toolbutton wieder entfernt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from constants import Section
import gtk
...
def enable(self):
self.toolbutton = self.gui.main_window.add_toolbutton(gtk.Image(), 'Ähnliche Sendungen', [Section.OTRKEY, Section.VIDEO_UNCUT]) # 1
self.toolbutton.connect('clicked', self.find_similar_clicked) # 2
def disable(self):
self.gui.main_window.remove_toolbutton(self.toolbutton)
def find_similar_clicked(self, widget, data=None): # 3
print "Klick!" # 4
|
Erklärungen zu den mit Nummer bezeichneten Kommentaren:
Wird OTR-Verwaltung nun gestartet, lässt sich Beobachten, wie beim Aktivieren und Deaktivieren des Plugins der Knopf Ähnliche Sendungen auftaucht bzw. verschwindet. Wird der Knopf gedrückt, steht im Terminal “Klick!”.
Die Logik des Plugins befindet sich in der Funktion find_similar_clicked. Diese muss folgendes leisten:
Den aktuell markierten Dateinamen ermitteln. Sind mehrere Dateien oder keine markiert, soll eine Fehlermeldung angezeigt werden.
Den Dateinamen so reduzieren, dass ähnliche Sendungen gefunden werden (aus King_of_Queens_09.05.26_15-30_kabel1_30_TVOON_DE.mpg.avi.otrkey wird King_of_Queens)
Den Webbrowser starten und die korrekte URL übergeben.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import gtk, re, webbrowser, os.path
...
def find_similar_clicked(self, widget, data=None):
filenames = self.gui.main_window.get_selected_filenames() # 1
if len(filenames) != 1:
self.gui.message_error_box("Es muss eine Datei markiert sein.")
return
filename = os.path.basename(filenames[0]) # 2
filename_regex = re.compile('(.*)_([0-9]{2}[\.]){2}') # 3
filename_short = filename_regex.match(filename).groups()[0] # 4
webbrowser.open("http://www.otr-search.com/?q=%s" % filename_short) # 5
|
Erklärungen zu den mit Nummer bezeichneten Kommentaren:
Das Plugin ist nun funktionsfähig. Es soll aber noch eine Option eingebaut werden, mit der die Suchmaschine selbst bestimmt werden kann.
Das Schöne daran ist, dass OTR-Verwaltung fast alles selbst übernimmt. Man braucht sich keine Gedanken machen, wie man Optionen abspeichert und lädt:
1 2 3 4 5 6 7 8 9 10 | Configurable = True # 1
Config = { 'server': 'http://www.otr-search.com/?q=' } # 2
...
def configurate(self, dialog): # 3
# Dialog erstellen
return dialog # 4
|
Erklärungen zu den mit Nummer bezeichneten Kommentaren:
Wird OTR-Verwaltung nun gestartet und wieder geschlossen befinden sich in der Datei ~/.otr-verwaltung/pluginconf die Einträge für unser Plugin:
[FindSimilar]
server = http://www.otr-search.com/?q=
Nun muss der Dialog erstellt werden, der nur ein Textfeld umfasst, das es ermöglicht, die Suchmaschine zu ändern:
1 2 3 4 5 6 7 8 9 10 11 12 | def configurate(self, dialog):
def entry_server_changed(widget, data=None): # 1
self.Config['server'] = widget.get_text() # 2
entry_server = gtk.Entry()
entry_server.set_text(self.Config['server']) # 3
entry_server.connect('changed', entry_server_changed) # 4
dialog.vbox.add(entry_server) # 5
return dialog
|
Erklärungen zu den mit Nummer bezeichneten Kommentaren:
Außerdem muss noch die Zeile:
webbrowser.open("http://www.otr-search.com/?q=%s" % filename_short)
geändert werden in:
webbrowser.open(self.Config['server'] + filename_short)
So wird der Wert schließlich auch beim Suchen genutzt.
Das Plugin ist nun fertig. Hier der komplette Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | #!/usr/bin/env python
# -*- coding: utf-8 -*-
import gtk, re, webbrowser, os.path
from pluginsystem import Plugin
from constants import Section
class FindSimilar(Plugin):
Name = "Ähnliche Sendungen finden"
Desc = "Sucht bei einer Mirrorsuchmaschine nach ähnlichen Sendungen."
Author = "Ich"
Configurable = True
Config = { 'server': 'http://www.otr-search.com/?q=' }
def enable(self):
self.toolbutton = self.gui.main_window.add_toolbutton(gtk.Image(), 'Ähnliche Sendungen', [Section.OTRKEY, Section.VIDEO_UNCUT])
self.toolbutton.connect('clicked', self.find_similar_clicked)
def disable(self):
self.gui.main_window.remove_toolbutton(self.toolbutton)
def configurate(self, dialog):
def entry_server_changed(widget, data=None):
self.Config['server'] = widget.get_text()
entry_server = gtk.Entry()
entry_server.set_text(self.Config['server'])
entry_server.connect('changed', entry_server_changed)
dialog.vbox.add(entry_server)
return dialog
def find_similar_clicked(self, widget, data=None):
filenames = self.gui.main_window.get_selected_filenames()
if len(filenames) != 1:
self.gui.message_error_box("Es muss eine Datei markiert sein.")
return
filename = os.path.basename(filenames[0])
filename_regex = re.compile('(.*)_([0-9]{2}[\.]){2}')
match = filename_regex.match(filename)
filename_short = match.groups()[0]
webbrowser.open(self.Config['server'] + filename_short)
|