← Späť na blog

Ako dostať platený TV balík tam, kam ho výrobca nikdy nezamýšľal: Magio GO v Jellyfine

23. júla 2026 · 4 min čítania

self-hostedhomelab

Nie príbeh o písaní kódu od nuly — príbeh o tom, čo všetko treba doriešiť, keď "niekto to už raz vyriešil" je len začiatok, nie koniec.

Prečo vôbec riešiť most, ktorý neexistuje

Cieľ bol jednoduchý na papieri: mať televízne kanály z vlastného plateného Magio GO predplatného (Slovak Telekom) pokope so zvyškom domácej mediatéky v Jellyfine — jedna appka na filmy, seriály aj naživo bežiacu TV, žiadne prepínanie medzi appkami. Realita: Jellyfin nemá k Magio GO žiadnu oficiálnu ani zabudovanú podporu. Medzi nimi jednoducho žiadny most neexistuje — treba si ho postaviť.

Prvý krok nebol písať vlastné riešenie od nuly. Bol to obyčajný prieskum — a ten ukázal, že problém "ako dostať Magio GO stream do formátu, ktorému rozumejú bežné IPTV kliency" už niekto na GitHube riešil (cvb941/magiogo-iptv-server). Nasadenie cudzieho, existujúceho projektu namiesto vlastného od základov bolo vedomé rozhodnutie — netreba znova objavovať, ako sa Magio GO API autentifikuje a ako sa z neho vyťahuje playlist a EPG, keď to už niekto vyriešil a zdieľal.

Kde to reálne prestalo byť "len nasadiť a hotovo"

Nasadenie cez Docker prebehlo rýchlo — kontajner beží, generuje M3U playlist aj XMLTV EPG, Jellyfin ho vie načítať ako Live TV tuner. Skutočná práca sa začala až potom, keď sa ukázalo, že samotné prehrávanie nie je spoľahlivé. Mesiace iteratívneho ladenia (od marca do júla) postupne riešili sériu na seba nadväzujúcich problémov — caching správania, spôsobu, akým appka drží spojenie s Magio serverom, výberu kvality a jazykovej stopy, opakovania zlyhaných požiadaviek.

Najzaujímavejší, technicky najhlbší z nich stojí za samostatné vysvetlenie: Magio CDN autorizuje jednotlivé video/audio fragmenty cez session cookie nastavenú na odpovedi manifestu — samotná URL manifestu má síce podpísaný query reťazec, ale relatívne cesty segmentov vnútri manifestu (DASH SegmentTemplate) už nie, tie sa spoliehajú len na tú cookie. Problém: ffmpeg-ov DASH demuxer (na ktorom Jellyfin aj mnohé iné prehrávače stoja) vyhodnocuje tieto relatívne cesty voči pôvodne požadovanej URL, nie voči tej, na ktorú ho presmerovalo presmerovanie (HTTP 303) na skutočný CDN manifest. Výsledok: obyčajné presmerovanie na reálny CDN manifest rozbilo sťahovanie fragmentov s chybou "Invalid data found when processing input" — prehrávanie zamrzlo alebo vôbec nezačalo.

Riešenie nebolo v ladení ffmpeg parametrov (to správanie demuxera nie je niečo, čo sa dá jednoducho vypnúť) — bolo to postaviť si vlastnú proxy vrstvu: appka si sama stiahne skutočný manifest, prepíše v ňom BaseURL tak, aby ukazovala späť na seba, a každú požiadavku na fragment preposiela ďalej na skutočný CDN s tou istou zachytenou cookie. Tým sa obišli oba problémy naraz — aj to, že demuxer nevidí presmerovanie, aj to, že segmentom chýba vlastná autorizácia.

O pár mesiacov neskôr: ticho miznúce zariadenia

V polovici júla prišiel iný, na prvý pohľad nesúvisiaci problém: appka prestala fungovať s chybou o prekročenom limite pripojených zariadení na účte. Magio účet povoľuje len obmedzený počet súčasne prihlásených zariadení naraz.

Skutočná príčina bola nasadenie samotné, nie appka: Docker kontajner nemal pripojený žiadny trvalý zväzok (volume) pre svoj priečinok so session dátami. Appka síce ukladala prihlasovaciu session na disk vnútri kontajnera, ale bez volume mountu táto session zomrela s každým prebudovaním/reštartom kontajnera — a pri každom takom reštarte sa appka jednoducho prihlásila znova, čím sa na účte zaregistrovalo nové zariadenie. Za pár mesiacov drobných úprav a reštartov sa takto ticho vyčerpal celý dostupný limit zariadení, kým jedno z obsadených miest nebolo ani len z tejto appky, ale zo skutočného mobilného zariadenia v domácnosti, na ktoré sa nesmelo sahať.

Oprava bola dvojkroková: cez appkinu vlastnú internú funkciu na odhlásenie zariadenia sa uvoľnilo miesto presne po tom starom, osirotenom zázname (nie po tom mobilnom), a do docker-compose.yml pribudol trvalý volume mount pre priečinok so session dátami — aby ďalší reštart kontajnera znova nezačínal odznova s novou registráciou.

Čo si z toho odniesť

  • "Niekto to už raz vyriešil" je dobrý štart, nie hotové riešenie. Základná appka fungovala, ale spoľahlivé prehrávanie si vyžiadalo mesiace doťahovania detailov, ktoré sa prejavia až pri reálnom používaní.
  • Chyba prehrávača nemusí byť chyba streamu. To, že ffmpeg/Jellyfin nevedeli prehrať fragmenty, nebolo o poškodenom videu — bolo to o nesúlade medzi tým, ako CDN autorizuje požiadavky, a tým, ako demuxer interpretuje presmerovania.
  • Chýbajúci persistentný stav v kontajneri sa niekedy prejaví až o mesiace neskôr, a inde, než by si čakal. Stratená session pri každom reštarte vyzerala bezvýznamne, kým sa nenahromadila do vyčerpaného limitu zariadení na účte.
  • Pri riešení "prečo to prestalo fungovať" najprv over, čo presne sa zmenilo v infraštruktúre okolo appky — nie len v appke samotnej. Príčina bola v spôsobe nasadenia (chýbajúci volume), nie v logike appky.

Dnes bežia slovenské a české TV kanály v Jellyfine bez prepínania appiek — presne ten pôvodný cieľ, len s poriadne viac vrstvami pod povrchom, než by sa na prvý pohľad zdalo.