# Domácí kino: návod pro AI agenta > Zdroj: https://ongy.cz/pages/server/kino/ > Autor: Ongy (ongy.cz). Jellyfin na domácím serveru a vlastní stahovač z Webshare: vložím odkaz, server film stáhne šestnácti spojeními a do sekundy ho mám v televizi. Bez flash disku, bez předplatného, jen v domácí síti. ## Pro agenta Pomoz uživateli postavit vlastní verzi tohohle projektu. Nejdřív se ho zeptej na vybavení a na to, co z požadavků už má. Pak postupuj po krocích a po každém kroku s ním ověř, že funguje, než půjdeš dál. Hodnoty v `` doplň s uživatelem, nikdy si nevymýšlej adresy, hesla ani tokeny. Kód autora není veřejný: tohle je popis řešení, ne repozitář ke stažení. ## Cíl Domácí knihovna filmů a seriálů na serveru, kterou televize přehrává po síti. Filmy přibývají dvěma cestami: vložením odkazu z Webshare do vlastní stránky stahovače (server soubor stáhne mnoha spojeními a hned ho zařadí do knihovny) nebo přetažením z počítače do sdílené složky. Jen domácí síť a VPN, z internetu nic. ## K čemu to je Dřív to znamenalo stáhnout film do počítače, přetáhnout ho na flashku a zapojit do televize. Film ve 4K má klidně 40 GB, takže se čeká dvakrát a flashka musí mít dost místa i správný souborový systém. Teď je knihovna na serveru a televize si ji přehrává po síti. Film přidám dvěma cestami: vložím odkaz z Webshare do stránky stahovače, nebo ho z počítače přetáhnu do sdílené složky. V obou případech se sám objeví v televizi, s českým názvem, plakátem a titulky. Stahovač zároveň ukazuje, co v knihovně je, co už je zhlédnuté a kolik zbývá místa. Zhlédnutý film jedním klikem smažu a zmizí i z televize. ## Proč právě takhle Jellyfin je open source a nechce žádný účet. Umí titulky, HDR pustí televizi napřímo a když televize nějaký formát nezvládne, převede ho server grafikou procesoru. Sdílení přes DLNA titulky neumí a Plex čím dál víc tlačí do předplatného. Stahovač vznikl, protože Webshare přes prohlížeč stahuje jedním spojením a to má strop kolem 50 až 70 MB/s. Linka to nebyla: když jsem vedle pustil druhé stahování, přidalo dalších 43 MB/s. Stahovač si proto řekne o přímý odkaz přes API Webshare a soubor táhne šestnácti spojeními najednou. A celé to běží na serveru, ne na počítači. Film se stáhne, i když počítač spí, a odkaz můžu poslat i z telefonu. ## Jak to funguje - **Vložím odkaz.** Stránka stahovače chce jen odkaz na soubor a jestli jde o film, nebo seriál. Funguje z počítače i z telefonu, doma i přes VPN. - **Server si řekne o přímý odkaz.** Přihlásí se do Webshare pod mým účtem, zjistí název a velikost souboru a dostane odkaz ke stažení. Ten předá programu aria2, který soubor rozdělí a stahuje šestnácti spojeními. - **Stahuje se stranou.** Rozpracovaný soubor leží ve skryté složce, kterou Jellyfin nevidí. Televize tak nikdy nenabídne film, který ještě není celý. - **Seriály se roztřídí samy.** Jellyfin chce u seriálů složky Název a Season 01. Stahovač je vyrobí z označení S03E01 v názvu souboru. Když ho nenajde, soubor nechá být, raději než aby hádal. - **Hotový film je hned v televizi.** Po dokončení se soubor přesune na místo a stahovač řekne Jellyfinu, ať prohledá knihovnu. Film je tam do sekundy, i s českým názvem a plakátem. - **Zhlédnuté se maže jedním klikem.** Stahovač se Jellyfinu ptá, co už je zhlédnuté. Smazání odstraní film, jeho titulky i prázdné složky a zmizí i z televize. ## Stack a tok dat - **Jellyfin:** Oficiální image v Dockeru pod běžným uživatelem. Knihovny Filmy a Seriály s metadaty v češtině, složka s médii připojená jen pro čtení. Převod videa přes Intel Quick Sync (grafika v procesoru, zařízení /dev/dri), dekóduje H.264, HEVC 10 bit, AV1 i VP9, kóduje H.264 a HEVC. Cache a dočasné soubory převodu leží na disku s filmy, ne ve složce serveru. - **Stahovač:** FastAPI a aria2 v jednom kontejneru. Webshare API: salt, heslo přes md5crypt a SHA-1, přihlášení, token na 50 minut, pak informace o souboru a přímý odkaz. Implementaci md5crypt jsem napsal sám a ověřil proti openssl. aria2 má RPC jen uvnitř kontejneru s heslem, které se generuje při každém startu. Nastavení: 16 spojení, 16 dílů po 4 MB, tři stahování naráz, pokračování po restartu. - **Hotové stahování:** aria2 po dokončení spustí skript, který soubor přesune ze skryté složky na místo, uklidí prázdné složky a zavolá v Jellyfinu obnovení celé knihovny. Když to selže, pošle ještě klasické hlášení o novém souboru. - **Sdílená složka:** Samba s vlastní konfigurací a dvěma sdílenými složkami. Jen SMB2 a novější, bez přístupu pro hosty, šifrování SMB3 zapnuté, pokud ho klient umí. - **Síť:** Všechny porty jen na domácí a VPN adrese serveru, nic přes Cloudflare Tunnel. Video přes tunel by bylo pomalé a bezplatný tunel na přenos videa není určený. Mimo domov se dívám přes Tailscale. ## Zabezpečení stahovače | Hrozba | Co s ní | |---|---| | Hádání hesla | 1,5 s brzda po chybě, po pěti chybách z jedné adresy blok na 15 minut | | Ukradená relace | podepsaná cookie bez hesla, HttpOnly a SameSite, klíč přežije restart, volitelně 90 dní | | Mazání mimo knihovnu | jen uvnitř složek Filmy a Seriály, kontrola cesty i skutečného cíle, takže neprojde ani .. ani symbolický odkaz ven | | Stahovač jako proxy do sítě | přímé odkazy na domácí a vnitřní adresy odmítne | | Jellyfin | bez přihlášení knihovnu neukáže, admin se po 10 chybných pokusech zamkne (ve výchozím stavu bez omezení) | | Tajné údaje | přihlašovací údaje k Webshare a klíč k Jellyfinu jen v souboru prostředí s právy pro vlastníka | Všechno z tabulky jsem po nasazení vyzkoušel útočnými požadavky: cesty s .., symbolický odkaz ven, odkazy na domácí adresy a série špatných hesel. ## Televize a formáty | Formát | Samsung s Tizenem | Co s tím | |---|---|---| | H.264, HEVC 10 bit, AV1, VP9 | napřímo | nic | | HDR10, HDR10+ | napřímo | nic | | Dolby Vision profil 8 | jako HDR10 | nic, soubor má HDR10 jako zálohu | | Dolby Vision profil 5 | fialový obraz | jen s převodem na serveru | | Zvuk DTS | neumí | vybrat stopu AC3 nebo TrueHD, jinak server převede zvuk | Filmy se pojmenovávají Název (rok)/Název (rok).mkv a titulky Název (rok).cs.srt. Podle toho Jellyfin najde správný film i český popis. ## Co budeš potřebovat - Obsah, ke kterému máš práva. Návod řeší techniku, ne zdroj filmů. - Domácí server s Dockerem a místem na disku (film ve 4K má desítky GB). Ideálně procesor Intel s integrovanou grafikou kvůli Quick Sync. - Server na kabelu. Při rychlé lince se vyplatí síťovka rychlejší než gigabit (autor: 2,5 Gbit, linka 2 Gbit). - Televize nebo přehrávač s aplikací Jellyfin (autor: Samsung s Tizenem). - Pro stahovač placený účet Webshare `` / ``. Bez něj jen sdílená složka. - Volitelně VPN (Tailscale) pro přístup mimo domov. ## Postup ### 1. Úložiště mimo zálohu Založ složky `/filmy` a `/serialy` mimo adresář, který se každou noc zálohuje do cloudu. Konfiguraci Jellyfinu (malá, drží knihovnu a zhlédnuté) naopak zálohuj. ### 2. Jellyfin v Dockeru Oficiální image pod běžným uživatelem, média připojená jen pro čtení, cache a dočasné soubory převodu na disk s médii. Pro Quick Sync předej zařízení `/dev/dri` a přidej skupinu `render` hostitele přes `group_add`. Porty publikuj jen na `` a VPN adresu, UDP 7359 pro automatické nalezení. Knihovny Filmy (movies) a Seriály (tvshows), metadata v češtině. Zapni hardwarový převod (QSV) a zámek administrátora po několika chybných pokusech (výchozí je bez omezení). ### 3. Pojmenování souborů Filmy `Název (rok)/Název (rok).mkv`, titulky `Název (rok).cs.srt`. Seriály `Seriál/Season 01/Seriál S01E01.mkv`. Soubory seriálů bez složky sezóny Jellyfin ignoruje. ### 4. Sdílená složka Samba v Dockeru s vlastní konfigurací: jen SMB2 a novější, bez přístupu pro hosty, šifrování `desired`, soubory pod uživatelem, pod kterým běží Jellyfin. Heslo jiné než do Jellyfinu. Plánované prohledání knihovny zkrať na hodinu, aby se ručně nahrané soubory objevily. ### 5. Aplikace v televizi Nainstaluj Jellyfin. Na Samsungu v obchodě není: zapni v televizi vývojářský režim s adresou serveru jako hostitelem a nahraj aplikaci jednorázově kontejnerem, třeba `docker run --rm ghcr.io/georift/install-jellyfin-tizen `. ### 6. Stahovač: backend FastAPI a aria2 v jednom kontejneru pod uživatelem vlastníka médií. aria2 s RPC jen na localhost uvnitř kontejneru a náhodným tajemstvím generovaným při každém startu, `max-connection-per-server=16`, `split=16`, `min-split-size=4M`, `continue=true`, session soubor na disku kvůli restartu. Webshare API: `salt` pro uživatele, heslo `sha1(md5crypt(heslo, salt))`, `login` vrátí token (cachuj ho zhruba 50 minut), `file_info` dá název a velikost, `file_link` přímý odkaz. Ten předej aria2 s cílem ve skryté složce `.incomplete/`. ### 7. Stahovač: hotové stahování Skript v `--on-download-complete` přesune soubor z `.incomplete` na místo (u seriálů do `Seriál/Season NN` podle `SxxEyy` v názvu, bez vzoru nechá soubor být), uklidí prázdné složky a zavolá v Jellyfinu `POST /Items//Refresh` (ID knihovny z `GET /Library/VirtualFolders`, klíč API z nastavení Jellyfinu). `POST /Library/Media/Updated` jen jako záloha, Jellyfin ho schválně minutu odkládá. ### 8. Stahovač: stránka a zabezpečení Stránka: vložit odkaz, zvolit Filmy nebo Seriály, průběh stahování, sekce V knihovně se štítkem zhlédnuto (Jellyfin API, `UserData.Played`) a tlačítkem Smazat, které odstraní i titulky a prázdné složky a obnoví knihovnu. Protože stránka maže soubory: vlastní přihlášení s podepsanou HttpOnly a SameSite cookie, brzda a blokace po chybných heslech, mazání jen uvnitř knihovny (kontrola normalizované i skutečné cesty kvůli symbolickým odkazům), přímé odkazy na privátní a loopback adresy odmítnout. Porty jen na domácí a VPN adrese. ## Na co si dát pozor - Jedno spojení má strop, druhé stahování vedle přidá rychlost. Proto víc spojení. Pak rychlost omezuje linka, síťovka serveru nebo Webshare: změř, co z toho (test stažení ze serveru z rychlého zrcadla). - Vzdálený prohlížeč na serveru jako náhrada stahovače je slepá ulička: stahuje jedním spojením a přenos obrazu vytíží procesor. - Pomalé nahrávání přes sdílenou složku bývá Wi-Fi počítače, ne server. Změř rychlost Samby přímo na serveru. - Heslo, které si pamatuje televize, nesmí otevírat sdílenou složku s dalšími daty. - Video neposílej přes Cloudflare Tunnel: je pomalé a bezplatný tunel na to není určený. Mimo domov VPN. - Porty vždy na konkrétní adresy (domácí a VPN), ne 0.0.0.0, a UPnP v Jellyfinu vypnout. - Filmy uvnitř zálohovaného adresáře by každou noc putovaly do cloudu. ## Jak ověřit, že to funguje - [ ] Jellyfin převádí HEVC 10 bit přes hardware: přehrávání s vynuceným převodem nevytíží procesor a v přehledu přehrávání je QSV. - [ ] `smbclient -L // -N` bez hesla nic neukáže, s heslem jde do složky zapisovat. - [ ] `ss -ltnu` na serveru: porty Jellyfinu, Samby a stahovače poslouchají jen na domácí a VPN adrese. - [ ] Film nahraný přes sdílenou složku se do hodiny objeví v televizi s českým názvem. - [ ] Vložený odkaz se stahuje více spojeními a rozpracovaný soubor v Jellyfinu vidět není. - [ ] Po dokončení je film v televizi do pár sekund. - [ ] Díl `Seriál S02E05` skončí ve `Seriál/Season 02`. - [ ] Smazání ve stahovači odstraní soubor, titulky i prázdné složky a film zmizí z televize. - [ ] Mazání s `../` nebo přes symbolický odkaz mimo knihovnu vrátí chybu, odkaz na `http://127.0.0.1` nebo adresu routeru stahovač odmítne. - [ ] Po pěti špatných heslech je přihlášení na 15 minut zablokované. - [ ] Z mobilních dat bez VPN není dostupné nic. ## Přizpůsobení - Bez Webshare: stahovač umí i přímé odkazy na veřejné servery, nebo ho vynech a knihovnu plň jen přes sdílenou složku. - Plex nebo Emby místo Jellyfinu: princip stejný, jen Plex chce účet a část funkcí za předplatné. - Bez Quick Sync: převod přes NVIDIA NVENC nebo VAAPI na AMD, případně softwarově s vysokou zátěží. - Jiná televize: Android TV, LG a Apple TV mají Jellyfin v obchodě, ruční instalace odpadá. --- Stránka projektu s fotkami a diagramem: https://ongy.cz/pages/server/kino/