poniedziałek, 17 czerwca 2013

Twitch.tv bez Adobe Flash

Czyli jak oglądać stream w ulubionym odtwarzaczu wideo.

Aktualne problemy z flash'em pod Linuxem:

  • nowe wersje pluginu Adobe mają wsparcie tylko dla Chrome Pepper - więc dla pozostałych przeglądarek zostają tylko starsze wersje plugina
  • zamknięte źródło ™
  • czasami nie można wyjść z trybu fullscreen
  • czasami wiesza się zajmując 100% czasu procesora
  • czasami po prostu się wywala

Istnieje jakaś alternatywa - shumway ale aktualnie nie wspiera takich rzeczy jak YouTube więc zapewne też Twitch. Dodatkowo SWFObject stwierdza że flash nie jest w ogóle obsługiwany więc zazwyczaj zobaczymy tylko "zainstaluj Adobe Flash".

Pobieranie

Listowanie plików flv dla zadanego linka z archiwum, archive.py:

#!/usr/bin/python3

from urllib.request import urlopen
import json, sys, re

decoder = json.decoder.JSONDecoder()

for arg in sys.argv[1:]:
 m = re.match(r"^.*/([^/]+)/b/([0-9]+)$", arg)
 video_id = int(m.group(2))
 with urlopen("http://api.justin.tv/api/broadcast/by_archive/%d.json" % video_id) as f:
  resp = decoder.decode(f.read().decode())
  for i in resp:
   print(i["video_file_url"])

Przykład użycia:

$ ./archive.py http://www.twitch.tv/some_channel/b/4173086
http://store30.media30.justin.tv/archives/2013-6-15/live_user_some_channel_13713088.flv
http://store38.media38.justin.tv/archives/2013-6-15/live_user_some_channel_13713106.flv
http://store6.media6.justin.tv/archives/2013-6-15/live_user_some_channel_13713124.flv

Pozostaje jeszcze tylko pobrać wypisane pliki.

Oglądanie

Potrzebne nam są livestreamer i rtmpdump. Żeby nie zaśmiecać systemu użyłem python'owego virtualenv. Poniższe kroki zakładają że rtmpdump nie jest zainstalowany w systemie.

Więc:

cd /path/to/project
git clone git://git.ffmpeg.org/rtmpdump
virtualenv env
make -C rtmpdump/
source env/bin/activate
pip install livestreamer

Następnie warto złożyć wszystko w jeden skrypt:

#!/bin/bash

d="$(dirname $0)"

source "${d}"/l/bin/activate
LD_LIBRARY_PATH="${d}"/rtmpdump/librtmp/ livestreamer -p /path/to/player -r "${d}"/rtmpdump/rtmpdump "${@}"

... i zaczynamy oglądać:

./run.sh http://www.twitch.tv/dreamhacksc2 720p

możemy także zapisywać stream do pliku:

./run.sh http://www.twitch.tv/dreamhacksc2 720p -o file.flv