$ cat case-study/erion-tv.md
ERiON TV: a self-healing channel list, run from a chat
How a private Telegram bot keeps 300+ live channels working inside an Android app — testing every stream, repairing the important ones, and refusing to publish a bad list.
Telegram botffprobeCloudflare R2Netlify FunctionsAES-256-GCMCron
An Albanian TV streaming app for Android with 300+ live channels and an EPG guide — live on Google Play.
01 The problem
Live streams come and go: sources change, links expire, channels go dark. Shipping a new app version for every change would be impossible. So I flipped it: the app never changes — the list behind a single, stable link does.
02 One command, the whole pipeline
A private Telegram bot — it answers to me and nobody else — runs everything from a single command:
SourceFind endpoint
Golden listMatch 329
ffprobeTest each
R2Publish
- It finds its own way in. Given a source, the bot tries the provider's servers one by one until it finds the one that answers correctly — no manual digging.
- A golden list as the source of truth. Everything is matched against a curated list of 329 TV channels. Names are normalized — no ë/ç differences, no HD/FHD/4K tags — and radio stations are filtered out automatically.
- Every stream is tested. Each one is probed with ffprobe. For the 14 key channels, if a stream is dead the bot hunts for a working alternative on its own — auto-heal.
- Same link, always. Only live channels are written — in the golden list's order, with its logos and groups — to
kanalet.m3u, channels.json and version.json, uploaded to Cloudflare R2 at the same address every time. The app just reloads.
03 Guardrails
# before anything goes live
new list < 60% of last live channels → held in staging
waiting for /confirm or /cancel
previous list backed up (last 5 kept)
# after every run, a report in Telegram
requested · live · dead · restored · lost
The most dangerous update is the one that quietly makes things worse. A sudden drop in live channels is treated as a warning, not a result — a human has to say yes.
04 Secrets and schedule
- Credentials never sit in plain text. They are stored encrypted in R2 and handed to a small resolver on Netlify with AES-256-GCM — so the monthly credential change doesn't break a single link in the app.
- It runs itself. A weekly cron job calls
/refresh; the full rebuild only needs me once a month.
05 What I took from it
- Decouple the app from the data. A stable URL lets the channel list change every week without a single app update.
- Verify, don't assume. A link in a list proves nothing; a stream that ffprobe can read does.
- Automate the routine, gate the risky. Healthy runs publish on their own; suspicious ones wait for a human.
$ cat case-study/erion-tv.md
ERiON TV: një listë kanalesh që shërohet vetë, e drejtuar nga një chat
Si një bot privat në Telegram mban mbi 300 kanale live në punë brenda një aplikacioni Android — duke testuar çdo stream, duke riparuar ato kryesoret dhe duke refuzuar të publikojë një listë të keqe.
Bot TelegramffprobeCloudflare R2Netlify FunctionsAES-256-GCMCron
Aplikacion streaming për televizionet shqiptare në Android, me mbi 300 kanale live dhe guidë programesh EPG — live në Google Play.
01 Problemi
Stream-et live vijnë e ikin: burimet ndryshojnë, linket skadojnë, kanalet fiken. Të nxjerrësh version të ri të aplikacionit për çdo ndryshim do të ishte e pamundur. Ndaj e ktheva përmbys: aplikacioni nuk ndryshon kurrë — ndryshon lista pas një linku të vetëm e të qëndrueshëm.
02 Një komandë, i gjithë pipeline-i
Një bot privat në Telegram — që i përgjigjet vetëm mua — e drejton gjithçka me një komandë të vetme:
BurimiGjej serverin
Lista e artëPërputh 329
ffprobeTesto secilin
R2Publiko
- E gjen vetë rrugën. Kur i jepet një burim, boti provon serverat e ofruesit një nga një derisa gjen atë që përgjigjet saktë — pa kërkim manual.
- Lista e artë si burim i së vërtetës. Çdo gjë përputhet me një listë të kuruar prej 329 kanalesh TV. Emrat normalizohen — pa dallime ë/ç, pa etiketat HD/FHD/4K — dhe radiot hiqen automatikisht.
- Çdo stream testohet. Secili kontrollohet me ffprobe. Për 14 kanalet kryesore, nëse një stream ka vdekur, boti kërkon vetë një alternativë që punon — auto-heal.
- I njëjti link, gjithmonë. Shkruhen vetëm kanalet live — me rendin, logot dhe grupet e listës së artë — te
kanalet.m3u, channels.json dhe version.json, të ngarkuara në Cloudflare R2 në të njëjtën adresë çdo herë. Aplikacioni thjesht rifreskohet.
03 Mbrojtjet
# para se diçka të dalë live
lista e re < 60% e kanaleve live të fundit → mbahet në staging
pret /konfirmo ose /anulo
lista e mëparshme backup (ruhen 5 të fundit)
# pas çdo ekzekutimi, raport në Telegram
kërkuar · live · të vdekur · të kthyer · të humbur
Përditësimi më i rrezikshëm është ai që i përkeqëson gjërat në heshtje. Një rënie e papritur e kanaleve live trajtohet si paralajmërim, jo si rezultat — duhet një njeri të thotë po.
04 Sekretet dhe orari
- Kredencialet nuk qëndrojnë kurrë si tekst i hapur. Ruhen të enkriptuara në R2 dhe i kalohen një resolver-i të vogël në Netlify me AES-256-GCM — kështu ndërrimi mujor i kredencialeve nuk thyen asnjë link në aplikacion.
- Punon vetë. Një cron javor thërret
/refresh; rindërtimi i plotë më kërkon vetëm një herë në muaj.
05 Çfarë mësova
- Ndaje aplikacionin nga të dhënat. Një URL e qëndrueshme e lejon listën të ndryshojë çdo javë pa asnjë përditësim të aplikacionit.
- Verifiko, mos supozo. Një link në listë nuk provon asgjë; një stream që ffprobe e lexon, po.
- Automatizo rutinën, ruaj rrezikun. Ekzekutimet e shëndetshme publikohen vetë; ato të dyshimtat presin një njeri.
Të duhet një pipeline që kujdeset vetë për shëndetin e tij?
Le të flasim →