Auf der Dreambox bzw. Enigma2 basierenden Geräte gibt es viele Erweiterungen um Zugriff auf YouTube Videos zukommen. Keine davon genügt allerdings meinen Ansprüchen. So fehlten für mich eine richtige Suchhistory (mit Speicherung, Filterung), Authenfikation mit einem Account und hier und da eine paar Kleinigkeiten. Ich habe mir also die offzielle MyTube Erweiterung genommen und die nötige Änderungen vorgekommen, so dass ich komplett alles neu entwickeln musste. Einige Patches sind auch bereits wieder zurückgeflossen.
GUI Anpassungen
Entwicklung
Alle Verbesserungen werden bei Gelegenheit in den Enigma2 Plugin Fork einbinden. Diese Änderungen sind dann soweit Reif, dass sie in die offiziellen Engima2 Plugins eingebunden werden könnten. Darüber hinaus habe ich ein abgeleitetes Plugin zum Entwickeln von neuen Features erstellt, hier finden sich dann zum Teil auch noch unfertige Änderungen.
Neue Features
Momentan bietet meine Erweiterung die auf gelisteten Zusatzfunktionen. Was aus meiner Sicht noch fehlt ist eine Speicherung von Suchen wie in Internetstreams für Movieplayer - Dbox2. Die reine Lese-Funktion der "alten CSV" ist bereits fertig. Es wird dann später aber auf XML-Datei basieren und editierbar sein. (siehe MyTubeExt)
- Benutzer Feeds: Abonnements, Favoriten
- Abonnieren von User
- Video zu Favoriten hinzufügen
- Leiste mit aktueller Seite und gesamten Ereignissen, sowie Login-Status
Enigma2 ohne https
Leider bietet Enigma2 und die Dreambox innerhalb von Python kein https Support. Das dies bereits bei der Komplierung von Python passieren mussen, kann man auch durch diverse Erweiterung keinen https Support bekommen. Somit können wir den gesamten https Authentifikationprozess der gdata-python-client - Google Data APIs Python Client Library nicht nutzen. Also musste ich diesen Teil etwas auslagern, um neue Features integrieren zu können. Ledlich die Auth URL muss über https aufrufen werden, andere lassen sich momentan auch ohne https und einfach über normales http erreichen.
Authentifikationen durchführen
Da die Erweiterung MyTube den gdata-python-client nutzt, kann man bereits wunderbar auf die Youtube API zugreifen und einen Login durchführen. Hierbei wird das OAuth Verfahren mit den Auth Tokens genutzt. Dieser Aufruf muss zwingend über https erfolgen. Bei erfolgreichen Anmeldung wird eine Key zurückgegeben, der dann einfach bei jedem späteren Request über den HTTP Header X-GData-Key mitgesendet wird.
yt_service.email = username yt_service.password = password yt_service.ProgrammaticLogin()
Authenfikationen auslagern
Da uns leider unter Enigma2 keinen https Support zur Verfügung steht, müssen wir uns einen Auth-Token "extern" besorgen. Zum Glück bietet der Standard Linux Befehl curl https Support. Was ich auch schon exemplarisch mit der Facebook Erweiterung gemacht habe, kann ich also hier wieder verwenden. Ich habe es aber dann zum Parsen des Rückgabe etwas optimiert. Durch folgenden Zeile bekomme ich also den Auth-Token und setze ihn dann wieder an den yt_service, so dass bei jedem Request der Token mitgeschickt wird.
def getFormattedTokenRequest(self, email, pw): return dict(parse_qsl(self.getLoginTokenOnCurl(email, pw).strip().replace('\n', '&'))) def getLoginTokenOnCurl(self, email, pw): opts = { 'service':'youtube', 'accountType': 'HOSTED_OR_GOOGLE', 'Email': email, 'Passwd': pw, 'source': self.yt_service.client_id, } print "[MyTube] MyTubePlayerService - Starting auth request" result = os.popen('curl -s -k -X POST "%s" -d "%s"' % (gdata.youtube.service.YOUTUBE_CLIENTLOGIN_AUTHENTICATION_URL , urlencode(opts))).read() return result #[...] cached_auth_request = self.getFormattedTokenRequest(username, password) yt_service.SetClientLoginToken(cached_auth_request.get('Auth'))
Überschreiben der Feed URLs
Sollte man bereits fertige Aufrufe aus der gdata-python-client nutzen wollen, so kann man einfach https durch http ersetzen. Ich musste z.B. YOUTUBE_USER_FEED_URI anpassen, da ziemlich viele Aufrufe auf diese Konstante zugegriffen haben.
gdata.youtube.service.YOUTUBE_USER_FEED_URI = 'http://gdata.youtube.com/feeds/api/users'
Python ohne SSL Socket
Wer testen will ob seine Box https Unterstützt, sollte keine der Fehlermeldungen bekommen.
import urllib2 response = urllib2.urlopen('https://example.com') --------- urllib2.URLError: <urlopen error unknown url type: https>
import httplib c = httplib.HTTPSConnection("https://example.com") ------ AttributeError: 'module' object has no attribute 'HTTPSConnection'





