Leica Florian Robert

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.


<< Înapoi la proiecte

TvIt — studiu de caz

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.

O listă care nu exista

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.

De la hometv la TvIt

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.

Cum fac televiziunile

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.

De la listă la site

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.

  • CORS. Unele servicii ale televiziunilor nu permit browserului să le citească răspunsurile de pe alt site. TvIt face cererea în locul browserului și îi transmite doar adresa finală din CDN, pe care browserul o poate deschide.
  • Serverul este în afara Italiei. Unele televiziuni blochează cererile din străinătate, iar serverul meu nu este în Italia. De aceea TvIt aproape niciodată nu descarcă video-ul, ci trimite playerul înapoi la televiziune, care îl servește celui care se uită; canalele disponibile doar în Italia sunt marcate pe site cu un steguleț.
  • Adrese care expiră. Pentru unele canale adresa durează câteva minute: TvIt o cere din nou la fiecare pornire, în loc s-o scrie o dată pentru totdeauna.
  • Televiziuni care se schimbă. CDN-uri, adrese și pagini se schimbă fără avertisment. De fiecare dată te întorci la instrumentele pentru dezvoltatori, găsești din nou cererea potrivită și actualizezi TvIt.

Ghidul, scris de mână

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.

Folosită și de alții

  • 65 de stele și 4 fork-uri pe GitHub: repository-ul meu cel mai urmărit, semn că lista o folosesc mulți.
  • Mai stabilă decât alte liste: când un canal nu mai merge, se corectează într-un singur loc, iar toate playerele îl pot urmări din nou.
  • Playerul web, comod când ești pe drum și nu ai playerul tău la îndemână.
  • Lista și ghidul se actualizează singure, fără intervenții manuale.

Ce mi-a lăsat

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

Politica de confidențialitate