Profesie: Dezvoltator Web & Mobile
E un experiment: site-ul așa cum ar fi arătat în anii '90. Ca să-l vezi pe cel adevărat, apasă butonul de la sfârșitul paginii.
Rol: Concepție și dezvoltare. An: 2022.
Site: tvit.leicaflorianrobert.dev
Un proiect personal născut dintr-o nevoie a mea: o listă IPTV cu canalele TV italiene gratuite, citite din sursele televiziunilor, și ghidul TV. De urmărit cu orice player sau direct în browser.
Vezi acest studiu de caz cu motorul Legacy. Pentru a-l vedea așa cum a fost proiectat, activează randarea nativă mai jos.
Totul a început în sufragerie. Mă uitam la televizor cu un Nvidia Shield TV, un box Android, și cu o aplicație IPTV: îmi trebuia doar o listă de canale italiene care să funcționeze. Cele pe care le găseam nu mai mergeau după câteva zile sau nu mergeau deloc.
Negăsind una de încredere, am decis s-o scriu eu.
Niciun conținut privat: doar canalele pe care televiziunile le transmit deja public pe site-urile lor.
Prima versiune, în 2019, se numea hometv și era scrisă în TypeScript. Își făcea treaba, dar cu timpul cazurile speciale se înmulțeau: canale care își schimbau adresa, surse care răspundeau diferit, verificări de repetat în fiecare noapte.
În 2022 am rescris-o de la zero în Laravel: mai rapidă și cu cozi, planificarea sarcinilor, client HTTP și teste deja pregătite, exact ce îmi trebuia ca să tratez bine fiecare excepție. Așa s-a născut TvIt.
La început nu știam nimic despre cum funcționează streamingul unei transmisii TV în direct. Ca să înțeleg, am făcut puțin reverse engineering: am deschis site-urile televiziunilor cu instrumentele pentru dezvoltatori ale browserului și am urmărit, una câte una, cererile playerelor lor.
Am descoperit că adresa video-ului nu se află în pagină. Playerul întreabă mai întâi un serviciu al televiziunii unde se află transmisia și primește o adresă temporară, cu un token care expiră repede, către CDN-ul care distribuie video-ul. Video-ul în sine nu este un singur fișier, ci un playlist .m3u8 de segmente mici, de câteva secunde, pe care playerul le descarcă unul după altul (HLS).
După ce am înțeles mecanismul, l-am replicat. În listă fiecare canal trimite la TvIt; când un player îl deschide, TvIt face aceeași cerere pe care ar face-o playerul televiziunii și îl redirecționează la adresa tocmai obținută. Video-ul vine direct din CDN-ul televiziunii, fără să treacă prin serverul meu.
Mai e un avantaj: pentru că lista trimite la TvIt și nu la televiziuni, când o televiziune schimbă ceva e suficient să corectez TvIt, iar lista salvată în playere continuă să funcționeze.
Ideea inițială era doar lista. Apoi am vrut un site ca să urmăresc canalele din browser, cu ghidul TV alături, și abia atunci au apărut problemele adevărate.
Le-am rezolvat pe rând, cu pasiune și răbdare, și m-am distrat făcând asta.
Ghidul programelor (EPG) nu vine dintr-un API: se citește din paginile cu grila de programe, canal cu canal, în fiecare noapte la ora 3. Scraperul l-am scris de mână, fără AI, studiind codul paginilor și decizând ce să iau: ore, titlu, categorie, descriere și imagine.
Paginile cu grila de programe își schimbă structura din când în când. De aceea, dacă scraperul nu mai găsește niciun program, se oprește și semnalează asta, în loc să lase ghidul gol fără ca nimeni să observe.
TvIt este un side project și a fost mereu. Și totuși mi-a adus mari satisfacții: cel mai mare rezultat nu sunt stelele, ci faptul că m-am distrat construindu-l, am descoperit cum funcționează cu adevărat streamingul și am trecut, unul după altul, peste obstacole despre care la început nici nu știam că le am în față.
Optimizat pentru Netscape Navigator 4.0 — 800×600