Live Vorschaubilder für Twitch – erstellt in der Cloud

Twitch bietet für alle seine Streams Vorschaubilder, wie oben gezeigt. Diese sind leider nicht immer ganz aktuell.

Meine Idee ist es, die Vorschaubilder aktueller zu bekommen, sowie automatisch alle 3 Sekunden zu aktualisieren. So kann man in der Übersicht bleiben, bis auf einem Stream etwas interessantes passiert.

Diese Idee habe ich in einem Proof-Of-Concept umgesetzt.

Architektur des Proof-Of-Concepts

Die aktuellen Vorschaubilder werden in der Cloud Amazon Web Services erzeugt. Das Ziel dabei war es, selbst eine große Anzahl an Streams gleichzeitg zu verarbeiten, um für diese Vorschaubilder zu erstellen.

Das Ergebnis zeigt das untere Video. Die Bilder sind Live (haben keinerlei Verzögerung zum Livebild des Streams), und aktualisieren sich automatisch alle 3 Sekunden.

Die genutzte Architektur wie folgt aus:

The steps performed are:

  1. Ein GreaseMonkey Skript sucht alle Stream Namen und ihre Thumbnails im aktuellen Viwerport des Browsers. Für jeden gefundenen Stream wird eine Anfrage an API Gateway gestellt, um ein aktuelleres Vorschaubild anzufragen.
  2. API Gateway erhält die Anfrage und leitet diese weiter an Amazon Lambda. Nachdem Lambda diese beantwortet hat, antwortet API Gateway zurück anden Nutzer mit einem Base64 enkodierten Vorschaubild.
  3. Amazon Lambda liest den erhaltenen Streamnamen sowie die gewünschte Qualität. Anschließend nutzt es die LiveStreamer API, um die Stream URL von Twitch auszulesen. Dieser Prozess ist relativ langsam, weshalb die Stream URL in Dynamo DB für spätere Anfragen gespeichert wird. Mit der Stream URL lässt sich dann die erste Videodatei herunterladen und mit FFMPEG ein Vorschaubild erstellen. Dieses wird Base64 enkodiert und an API Gateway als Antwort gesendet.

Sobald Amazon Lambda einmal warmgelaufen ist, ist dieser Prozess ziemlich schnell. Ein frisches Vorschaubild ist in ca. 200ms erstellt.

Fallstricke

Geschwindigkeit: Am Anfang war es nicht möglich, Vorschaubilder in einer annehmbaren Zeit zu erstellen. Hier konnte ich zwei Gründe ausmachen. Erstens benötigt die LiveStreamer API ziemlich lange um überhaupt geladen zu werden. Zweitens dauerte es ziemlich lange die Stream URL von Twitch zu holen. Durch den Caching Mechanismus wurden beide Vorgänge nur noch jeweils auf die erste Anfrage beschränkt.

Vorschaubild an den Browser ausliefern: Zum Zeitpunkt dieses Beitrages hat API Gateway keine Unterstützung für binäre Daten, also unter anderem auch keine Unterstützung um direkt Bilder zurückzuliefern. Dieses Problem kann umgangen werden, indem ein Base64 enkodiertes Bild zurückgegeben wird, dass dann direkt in das img-Tag im Browser geschrieben wird.

Fazit

Mein PoC hat gezeigt, dass es für einen 3rd Party Dienst möglich ist, aktuelle Vorschaubilder zu generieren die sich automatisch aktualisieren. Im Gegensatz zum Standarddelay der Vorschaubilder von ca. 5 Minuten ist dies ein deutlicher Vorteil.

Um diesen Dienst öffentlichanbieten zu können, müssen allerdings noch ein paar Punkte erledigt werden. Der gesamte Vorgang sollte geprüft werden, und Fehler besser abgefangen werden. Die wahrscheinlich größte Hürde werden aber wahrscheinlich die Terms of Service von Twitch sein. Es müsste geklärt werden, ob ein solcher Service im Einklang mit diesen ist. Eine Anfrage meinerseits konnte leider nicht eindeutig beantwortet werden. Laut meinem Verständnis ist allerdings das automatische Anfragen von Streams laut den ToS nicht erlaubt.