04.8.2019, 17:30
(Tento příspěvek byl naposledy změněn: 29.8.2019, 12:41 uživatelem Client.
Důvod úpravy: Oprava a doplnění.
)
Po několika pokusech a testech jsme připravil jednoduché řešení, které dostane Live 24/7 vysílání z Youtube do Tvheadend. Vyšel jsme z mého obecného řešení, které je popsané zde a připravil sadu scriptů, které těm, kdo mají alespoň základní znalosti v jejich používání a také samozřejmě rozumí problematice příjmu IPTV/OTT v Tvheadend, pomohou. Neočekávejte řešení "out of box", ale pro průměrně zkušeného laika, který umí pracovat s Tvheadend, by neměl být problém si po pár minutách, či desítkách minut, vysílání z Youtube pustit na jakémkoliv funkčním klientovi Tvheadend. Tedy i v Kodi, v části Live TV & PVR.
Toto řešení je s ohledem na obecné řešení (viz odkaz výše) typu onthefly, doplněné použitím cache.
Východiska a stručný popis řešení
Řešení je postavené na použití aplikace youtube-dl, která nedělá nic jiného, než že pro zadanou Youtube adresu v obvyklém tvaru, např. pro populární NASA Live: Official Stream of NASA TV je to adresa https://www.youtube.com/watch?v=21X5lGlDOfg, vytvoří standardní adresu streamu, kterou je možné použít například v libovolném přehrávači jako je VLC, a tím pádem tedy i v Tvheadend. Nejde přitom o žádnou pirátskou aplikaci. Gooogle toto řešení podporuje, ovšem pouze při splnění jistých podmínek. Jednou z nich, a pro toto řešení klíčovou, že vytvořená adresa streamu má omezenou časovou platnost (konkrétně jsou to nyní 4 hodiny). Vidět je to na příkladu takto vytvořené adresy streamu po výše uvené vysílání NASA TV.
Kód:
https://manifest.googlevideo.com/api/manifest/hls_playlist/expire/1565455688/ei/56BOXbeVO9PV7gOG1Z_YDg/ip/xx.xx.xx.xx/id/21X5lGlDOfg.1/itag/300/source/yt_live_broadcast/requiressl/yes/ratebypass/yes/live/1/goi/160/sgoap/gir%3Dyes%3Bitag%3D140/sgovp/gir%3Dyes%3Bitag%3D298/hls_chunk_host/r5---sn-2gb7sn7r.googlevideo.com/playlist_type/DVR/initcwndbps/11940/mm/44/mn/sn-2gb7sn7r/ms/lva/mv/m/mvi/4/pl/20/dover/11/keepalive/yes/mt/1565433975/disable_polymer/true/sparams/expire,ei,ip,id,itag,source,requiressl,ratebypass,live,goi,sgoap,sgovp,playlist_type/sig/ALgxI2wwRQIgSK136jHuGlJwMVnde4o8GfIxmZ-EaMtigwvzbPgjxcsCIQDLXhms3D0Pv-TpTUwa3iIGogYl0_Jltf946KbJpcAmMw%3D%3D/lsparams/hls_chunk_host,initcwndbps,mm,mn,ms,mv,mvi,pl/lsig/AHylml4wRAIgAK5tK3FGKBrB6b-KGDNGvs_9IGznJiFFeU8rmZrx6f8CIB48RIQdDJWmlHkfx32znEhBoApkYiriSwohKJBexY6O/playlist/index.m3u8
Jak je vidět už obsahu, je adresa streamu adresou manifestu HLS. V adrese můžeme vidět část .../expire/1565455688/..., která obsahuje časový údaj udávající čas, do kterého je tato adresa platná, a tedy i stream na který odkazuje dostupný.
Aplikace youtube-dl
Ne všechny Linux systémy mají aplikace youtube-dl instalovanou defaultně (spíš ne, než ano). A některé systémy, na kterých běží Kodi (LibreELEC, OpenELEC, ...) ani tuto aplikace instalovat nemohou. Ale není v tom žádný problém, stačí se řídit pokyny v https://ytdl-org.github.io/youtube-dl/download.html. V případě, nebudete-li aplikaci instalovat ale stahovat, musíte si vybrat adresář, do kterého ji umístíte a absolutní cestu k tomuto adresáři si poznamenat. Budete ji ještě potřebovat.
Playlist
Řešení je opřené o existenci playlistu, ve kterém jsou definované kanály a související parametry (název služby, název kanálu, atd.) tak, jak je chceme vidět v Tvheadend, a také o to, že playlist obsahuje relaci definovaných kanálů k Live TV vysílání v Youtube. Takový řádek playlistu může vypadat například takto:
Kód:
#EXTINF:-1,NASA TV
pipe:///storage/.kodi/media/playlist/youtube.live/streamer.sh nasatv 21X5lGlDOfg
Jde o klasickou formu playlistu pro Tvheadend, ve kterém je použita metoda pipe:// tedy volání aplikace/scriptu, který pak do Tvheadend vrací vlastní data streamu. Playlist se v tomto případě vytváří samozřejmě ručně a každý si do něj může vložit to, co ho z nabídky Live TV Youtube zajímá, stejně jako si každý může řádky uvozené #EXTINF doplnit dalšími parametry podle toho, jakým způsobem Tvheadend využívá a provozuje. Co je s ohledem na popisované řešení nejdůležitější, to je obsah řádků uvozených pipe://, které obsahují (vysvětluji pro jeden kanál v playlistu, tedy NASA TV):
- pipe:// - identifikace, že Tvheadend má spustit aplikaci/script
- /storage/.kodi/media/playlist/youtube.live/streamer.sh - aplikace/script, v toto případě tedy sh script, streamer.sh, který je umístěný v adresáři /storage/.kodi/media/playlist/youtube.live/ *)
- nasatv - 1. parametr scriptu, název služby, pod kterou bude příjem tohoto streamu v Tvheadend identifikován/registrován. protože je název služby zároveň využit jako jméno souboru v cachce, je třeba, aby pro název služby byly využity (ideálně) znaky [a..z] a [0..9]
- 21X5lGlDOfg - 2. parametr scriptu, identifikátor Youtube, je to poslední část adresy v Youtube, pro NASA TV tedy poslední část adresy https://www.youtube.com/watch?v=21X5lGlDOfg
*) Uvedl jsem zde adresář, který používám já. Může tu být samozřejmě uveden jakýkoliv adresář, který si pro umístění dat a scriptů tohoto řešení vyberete (bude se o tom psát později). Jen musíte pamatovat na to, že cesta k adresáři musí být v playlistu zadaná vždy jako absolutní!
Je bezpodmínečně nutné zachovat standardní tvar playlistu! To znamená, 1. řádek #EXTM3U a pak každý sudý řádek #EXTINF... a každý lichý řádek pipe://... Možná, že si Tvheadend poradí i s méně standardním zápisem playlistu, ale script refresh.sh, který playlist čte, ne.
Streamer
Streamer ve finále obsahuje volání ffmpeg, kterému předá adresu streamu. Tu získává dvěma způsoby:
- načtením uložené adresy streamu z cache
- převodem Youtube adresy na adresu streamu pomocí aplikace youtube-dl
Při první způsobu se z názvu služby sestaví adresa cache souboru který, existuje-li, obsahuje odloženou adresu streamu. Pokud neexistuje nebo pokud odložená adresa streamu již není platná, pokračuje se druhým způsobem a při něm sestaví youtube adresu a převede ji na adresu streamu. Současně adresu streamu uloží do cache.
Jistou komplikací je to, že převod youtube adresa na adresu streamu trvá poměrně dlouho (řádově několik vteřin). Dojde-li k přepnutí kanálu po ukončení platnosti jeho adresy streamu, bude prodleva přepnutí o dobu převodu prodloužena. Proto je řešení ještě doplněno o funkci refresh, která asynchronně, v předepsané periodě (4 hodiny, což je právě doba platnosti adresy streamu), obnoví v cache všechny adresy streamu.
Refresh
Script, který provádí jednorázovou obnovu adres streamů. Čte playlist a podle něj aktualizuje obsah souborů cache. Předpokládá se, že tento script bude spouštěn při každém startu systému a pak každé 4 hodiny. Tímto způsobem bude zajištěno, že adresa streamu bude vždy platná a nebude tedy třeba, aby byla její obnova prováděna ve scriptu streamer.sh. Spouštění refresh.sh scriptu si musí každý zařídit sám a využít k tomu funkce svého systému (cron, systemd, ...).
Známé chyby a problémy aneb co ještě není 100% a ToDo
- trochu ještě tápu v nastavení kvality streamů. Zatím používám všude kvalitu best, ale nejsem si 100% jistý, zda to bude fungovat vždy a za všech okolností. Případná zjištění uvedu v tomto tématu a případně vytvořím nové verze scriptu. Ve hře je i varianta, že by parametr kvality byl jako třetí parametr streamer.sh a mohl se individuálně zadávat pro jednotlivé kanály, na to tohle řešení je ale ještě čas...
- v některých případech, například po vytvoření/scanování kanálu v Tvheadend, se při prvním spuštění v Kodi nezobrazí video. Stačí v té chvíli v Kodi vypnout a znova zapnout přehrávání a vše se spraví. To je známý problém, ale mně se ho zatím nikde nepodařilo úplně eliminovat. [NEW] Ukázalo se, že toto chování je důsledkem bugu v Tvheadend, píši o tom zde.
- script streamer.sh provádí kontrolu platnosti adresy streamu. Je k tomu použita analýza pomocí regulárních výrazů. při realizaci jsem narazil na dva způsoby toho, tak je platnost adresy uvedena. Je však možné, že existují ještě nějaké další (když existují dva, proč by nemohly být tři nebo dokonce více...). V takovém případě nebude obnova platnosti kterou provádí streamer fungovat. Jsem samozřejmě připravený, pokud se něco takového stane, tam další způsoby analýzy doplnit. Jinou variantou bude pak možnost pro jednotlivé streamy tuto kontrolu potlačit. To ale budu řešit až když to bude aktuální.
- EPG jsem neřešil. Celkem z pochopitelných důvodů. V drtivé většině případů ani Live TV v Youtube žádné EPG nemá a ani ho nikdo nevytváří. Já osobně mám nástroj, kterému říkám fakeepg, kterým dokáže vytvářet týdenní EPG na základě statického, ručně vytvořeného popisu. Tak se snad někdy odhodlám k tomu ho nějak využít i pro tento případ...
Postup instalace:
Celé řešení jsou vlastně pouze dva soubory, streamer.sh a referesh.sh, které si můžete stáhnout níže jako zip soubor. Třetí soubor, playlist.m3u8, si musíte ručně vytvořit sami, případně můžete použít (po jeho editaci) vzor z následujícího postu.
- vytvoření adresáře - poznamenejte si jeho absolutní cestu v systému - budete ji potřebovat
- vytvoření playlistu - nezapomeňte, že ve volání streamer.sh (pipe:///.../streamer.sh) musíte uvést absolutní cestu k adresáři (viz předchozí bod)
- rozbalení zip souboru s instalací do vašeho adresáře
- editace parametrů ve scriptech streamer.sh a refresh.sh - opět se zde využije poznamenaná absolutní cesta adresáře, ale také adresářů ve kterých lze najít aplikaci youtube-dl nebo ffmpeg (pokud nejsou standardně instalovány)
- nastavení příznaku spustitelných souborů pro streamer.sh a refresh.sh
- Ruční spuštění refresh.sh, při kterém se do cache uloží adresy streamů a scanování bude probíhat rychleji a s menšími porblémy (viz dále)
- nastavení a související kroky v Tvheadend, doporučuji nastavit parametr sítě Maximální počet vstupních streamů: na nějakou rozumnou hodnotu, např. 4. Zaručí to scanování s minimem problémů.
- nastavení periodického spouštění refresh.sh (cron, systemd, ...)
Aktuální verze ke stažení:
[attachment=5497]