Commit Graph

1852 Commits (8b7392dde68b95e895a3a698b480ccad91607498)
 

Author SHA1 Message Date
ChannelCheckerBot 8b7392dde6 Channel check (fast) - 2026-09-06T12:18:15Z 2026-09-06 12:18:15 +00:00
KAMI ae00f25964
Merge pull request #1173 from KAMI911/fix-croatia-czech-links
Fix dead HRT 1/2/3 and Praha TV links (Croatia, Czech Republic)
2026-09-06 09:24:54 +02:00
Kálmán „KAMI” Szalai e0efb27c2e Mark HRT 1/2/3 as geo-blocked (Ⓖ), matching existing HRT 4
Same nexttv.ht.hr CDN as the already-marked HRT 4: reachable and serving
real DASH content from an EU/Croatian vantage point, but geo-restricted
for other regions (confirmed by the CI runner's own check run on this PR
reporting all four HRT channels, including the unchanged HRT 4, as dead).
Adds the existing Ⓖ convention to the three new URLs for consistency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
2026-09-06 09:24:40 +02:00
Kálmán „KAMI” Szalai c0f7e788f7 Fix dead HRT 1/2/3 and Praha TV links in Croatia and Czech lists
Croatia:
- HRT 1, HRT 2, HRT 3: the bhtelecom.ba mirror (webtvstream.bhtelecom.ba)
  no longer serves these streams. Switched to HRT's own official CDN
  (bpcdnmanprod.nexttv.ht.hr/bpk-tv/<channel>/default/index.mpd), the same
  origin already used successfully for the existing HRT 4 entry. Verified
  alive via check_channels.py (3/3 ok) before committing.
- Diadora: researched, confirmed genuinely dead at its own stream origin;
  no working alternative found, left unchanged.

Czech Republic:
- Praha TV: stream.polar.cz/prahatv no longer resolves/serves; found the
  station's current stream on Praha TV's own site, backed by CDN77
  (1977134029.rsc.cdn77.org). Verified alive via check_channels.py.
- CNN Prima News, Prima MAX, CS Film, Šlágr Muzika: researched, confirmed
  DRM-gated or dead at source with no viable public alternative; left
  unchanged.

Regenerated playlist.m3u8 and per-country playlists via make_playlist.py.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
2026-09-06 08:30:29 +02:00
ChannelCheckerBot 9f3d7cc9ef Channel check (fast) - 2026-09-06T06:18:44Z 2026-09-06 06:18:44 +00:00
ChannelCheckerBot 7892bb2b3c Channel check (fast) - 2026-09-06T00:26:49Z 2026-09-06 00:26:49 +00:00
KAMI 8e8f38ecb3
Merge pull request #1172 from KAMI911/fix-sweden-svt-links
Update SVT to current (still geo-blocked) URLs, mark 2 Öppna Kanalen dead
2026-09-05 23:34:18 +02:00
KAMI f21c1234c3
Merge pull request #1171 from KAMI911/fix-russia-links
Fix 5 dead Russian channel links, VGTRK/Smotrim redesign
2026-09-05 23:34:15 +02:00
KAMI 84f25db594
Merge pull request #1170 from KAMI911/fix-ireland-radio-links
Fix 7 dead Irish radio stream URLs
2026-09-05 23:34:11 +02:00
KAMI 6a964b1e5b
Merge pull request #1169 from KAMI911/fix-checker-raw-audio-streams
Recognize raw audio/video streams, not just playlists, as alive
2026-09-05 23:34:08 +02:00
Kálmán „KAMI” Szalai 38e06bcebf Update SVT to current (still geo-blocked) URLs, mark 2 Öppna Kanalen dead
SVT 1/2/24/Kunskapskanalen: the old ed2.cdn.svt.se host is fully retired
(plain 404, not a geo-block response). SVT's own site now serves live
channels via api.svt.se/videoplayer-api/video/ch-<id>, which points at
svt-live-channel.akamaized.net - confirmed current by fetching that API
live. The new URLs are still geo-blocked to Sweden (Akamai 403, not a
404), so the Ⓖ marker stays; this is a URL update, not a fix for the
geo-restriction itself. No unrestricted third-party mirror exists for
SVT (checked; other IPTV list maintainers hit the same block).

Öppna Kanalen Stockholm and Malmö: marked [x]. Solidtango (their
hosting platform) now requires per-session signed URLs platform-wide -
Stockholm's old unsigned URL returns 402 Payment Required. Malmö's
entire subdomain 404s on every path; their site now points at a
dedicated app plus cable-only distribution, no public web stream at
all.

Öppna Kanalen Skövde and Västmanlands TV were also researched: both
are alive, but only through freshly-signed URLs that expire in ~24h -
not left unchanged deliberately, since committing today's signed link
would just go dead again tomorrow. A durable fix would need scraping
their live pages (okskovde.solidtango.com/live/livetv and
vastmanland.solidtango.com/live/vastmanlands-television--2) for a
fresh link periodically, not a static list entry.
2026-09-05 21:02:21 +02:00
Kálmán „KAMI” Szalai 30b9c0e25e Fix 5 dead Russian channel links, VGTRK/Smotrim redesign
The old player.smotrim.ru/iframe/stream/live_id/N embeds are all dead -
Smotrim's site redesign replaced them with a client-side API
(player-api.smotrim.ru/api/v1/channel/{id}) that returns the current
stream URL. Traced the old numeric id -> new channel id -> stream
mapping from the site's own JS bundle:

- Россия 1 (id 2961 -> channel 1): live.smotrim.ru, no signature, should
  be durable
- Россия-Культура (id 19201 -> channel 4): same, unsigned
- Москва 24 (id 1661 -> channel 76): stream.smotrim.ru, carries a `sign`
  query param
- Вести ФМ (id 52035 -> channel 199): same, signed
- Соловьёв Live (id 63338 -> channel 292): same, signed

The three signed URLs were stable across repeated fetches in testing
(not IP-bound), but could still rotate server-side - if the checker
flags one of these dead again, re-derive it from
player-api.smotrim.ru/api/v1/channel/{id} rather than assuming the
channel itself is gone.

Not fixed (researched, no working replacement found):
- РТР-Планета: removed from Smotrim entirely - VGTRK now describes it
  as satellite-only for the diaspora, no web stream exists
- Катунь 24 / Кубань 24: both stations' own sites just embed the same
  dead OK.ru video; OK.ru's underlying stream URL is IP-locked and
  expires in ~1 hour, unusable as a static list entry
- Саратов 24: dropped its web player entirely, now Telegram-only
2026-09-05 21:00:23 +02:00
Kálmán „KAMI” Szalai 6b1fcf9aba Fix 7 dead Irish radio stream URLs
Root cause: Bauer Media Audio Ireland (Today FM, 98FM, Newstalk, Spin
1038, Classic Hits) migrated their stream infrastructure from
stream.audioxi.com to live-bauerie.sharp-stream.com (same mount names,
new host), found via their goloudplayer.com player pages. Sunshine
106.8 moved off sharp-stream onto streamtheworld.com (shared player
config with Nova and Classic Hits' own sites).

FM104 and Dublin's Q102 URLs are unchanged - they were re-verified
returning real audio and appear to have been a transient outage, not
a dead link (worth noting in case #1169's raw-audio-stream detection
fix was also masking these two as false negatives previously).

Note: these URL changes were verified for real audio content (bytes +
correct Content-Type) directly with curl, since check_channels.py
in this repo's history does not yet recognize raw audio/video streams
as alive (see #1169) - verify against that fix once merged.
2026-09-05 20:57:03 +02:00
Kálmán „KAMI” Szalai b05f8ef87f Recognize raw audio/video streams, not just playlists, as alive
Some radio stations serve the live audio directly at the listed URL
(Content-Type: audio/mpeg, audio/aacp, etc.) rather than an HLS/DASH
manifest that points to one. probe() only checked for #EXTM3U/<MPD in
the response body, so every one of these was misclassified as dead
regardless of whether the station actually worked.

Found while verifying replacement URLs for Irish radio stations: curl
confirmed real audio bytes with correct audio/* Content-Type on all of
them, but check_channels.py reported every single one as dead. Now
checks the response's Content-Type first; a direct audio/video stream
counts as alive without needing playlist syntax. Verified this doesn't
regress playlist detection (existing HLS/DASH channels still classify
correctly).
2026-09-05 20:55:54 +02:00
ChannelCheckerBot f2a1e1f9d4 Channel check (fast) - 2026-09-05T18:16:44Z 2026-09-05 18:16:44 +00:00
KAMI e1f16b8c96
Merge pull request #1168 from KAMI911/fix-italy-local-tv-batch1
Fix 14 dead Italian local TV links
2026-09-05 18:08:17 +02:00
KAMI dcbda8ff83
Merge pull request #1167 from KAMI911/fix-italy-local-tv-batch2
Fix 8 dead Italian local TV links, remove a dead TG Norba 24 duplicate
2026-09-05 18:08:07 +02:00
KAMI bcefcd0ead
Merge pull request #1166 from KAMI911/fix-rai-channels
Fix 6 dead RAI channels via a working third-party mirror
2026-09-05 18:07:57 +02:00
KAMI a5265655a1
Merge pull request #1165 from KAMI911/add-hungarian-lexanetwork-channels
Add ES TV (Esztergom) and Komáromi Televízió
2026-09-05 18:07:46 +02:00
Kálmán „KAMI” Szalai ac044f207d Fix 14 dead Italian local TV links
Found via each station's own official "diretta/streaming" page, following
embedded iframes/JS one level deeper to the real .m3u8. No hosting
infrastructure was brute-forced. Verified 3x each with check_channels.py,
all consistently alive:

- Travel TV, Donna TV, Alma TV, Italia 7, Lazio Tv, Gold Tv: new
  5f11919dca3bd.streamlock.net host (old streaming.softwarecreation.it
  provider dead)
- Calabria Uno Tv: same host, working path (ngrp: prefix dropped)
- Canale 21 / Canale 21 Extra: new encoders.immergo.tv provider (old
  msvdn.net dead)
- Fascino Tv, Motori Tv: new 64b16f23efbee.streamlock.net host
- Ran Friul: azotosolutions.com load-balancer (old streamlock.net host dead)
- Love in Venice: same host, working path (.stream suffix added)
- Mediterranea Tv: new xdevel.com stream (old aswifi.it dead)

Castrovillari Tv and Cittaceleste Tv are still on their original URLs
unchanged - the outage looks to have been transient, both returned
live content again on retest.

Sportitalia SOLOCALCIO: found a candidate at
distribution.sportitalialive.it/sportitalia/sisolocalcio_abr/playlist.m3u8
(hardcoded in the official player page), but it returns 403 from here -
looks like a datacenter/ASN block rather than a bad URL, so left
unchanged rather than swap in something equally unverifiable.

19 other stations were also researched but had no findable working
replacement (parked/dead domain, JS-rendered player with no static URL,
or the official embed itself already dead) - left unchanged.
2026-09-05 15:59:26 +02:00
Kálmán „KAMI” Szalai d229c258e8 Fix 8 dead Italian local TV links, remove a dead TG Norba 24 duplicate
Found via each station's own official "diretta/streaming" page, following
embedded iframes (several use a shared white-label player at
player.streamshow.it/hosted/*.php) one level deeper to the real .m3u8.
No hosting infrastructure was brute-forced. Verified 3x each with
check_channels.py, all consistently alive:

- TVL (TV Libera Pistoia): new mariatvcdn.it host (old one dead)
- Teatro Tv: teatrotv.iostream.it (old m.iostream.it path dead)
- Tele Belluno: new mariatvcdn.it host + path
- Tele Cupole: azotosolutions.com load-balancer (old newradio.it dead)
- Tele Ischia: new streamlock.net host
- Tele Radio Ercolano: same saiuzwebnetwork.it provider, working path
- Teleiblea: same streamlock.net provider, working host
- Vera Tv: streamshow.it CDN (old shared streamshow.it host dead)

TG Norba 24 was listed twice under two different EPG rows with the same
tgv-id (TGNorba24.it) - one already pointed at a working
live-telenorba.cdn.netrw.it URL, the other (router.xdevel.com) was dead.
Removed the dead duplicate rather than adding a third entry.

29 other Italian local stations were also researched but had no
findable working replacement (site down, JS-injected player with no
static URL, or official embed itself already dead) - left unchanged.
2026-09-05 15:51:33 +02:00
Kálmán „KAMI” Szalai 1972c39bf9 Fix 6 dead RAI channels via a working third-party mirror
mediapolis.rai.it's relinker service is now Italy-IP-gated: with
forceUserAgent it 302s to a "video not available" placeholder MP4
(the "raw binary" symptom this repo's checker was seeing), without it
Akamai returns a plain 403. RAI's own official pages (raiplay.it) still
embed the same dead relinker pattern, and no working parameter/domain
variant was found - this isn't a broken link, it's a geo-restriction
that happens to also break for the CI runner's non-Italian IP.

Found a third-party CDN mirror (d3k8wzt41aflvx.cloudfront.net) already
re-serving RAI's linear feeds unrestricted, in the same vein as the
existing Rai4K/UniNettuno akamaized.net mirrors already in this list.
Verified each with curl (multi-quality master playlist, real segment
references) and with check_channels.py (3x each): Rai 2/3/Premium/
Storia/Scuola came back consistently alive, Rai 1 flaky (2/3 ok, real
content each time) - consistent with general CDN flakiness elsewhere
in this list, not a sign the URL is wrong.

Dropped the Ⓖ marker on these 6 since the mirror isn't geo-blocked.

Rai 4, Rai 5, Rai Movie, Rai Gulp, Rai YoYo, Rai Sport, and Rai Radio 2
Visual Radio are not on this mirror and were left unchanged (still
pointing at the geo-gated relinker, since that's genuinely the current
official source and may still work for viewers with an Italian IP).
2026-09-05 15:44:27 +02:00
Kálmán „KAMI” Szalai 6612168fd1 Add ES TV (Esztergom) and Komáromi Televízió
Both use the same lexanetwork.com infrastructure as FehérvárTV (#1163)
and Kapos TV (#1164). Found via each station's own official live page
(estv.hu homepage, komaromtv.hu/online-adas/), which embeds a player
resolving to a working relay URL. Verified 4x each, consistently alive.

Also searched ~45 other Hungarian local TV stations for lexanetwork.com
usage - none of the others use it (mostly WordPress/YouTube embeds, or
the station's own site is dead), so no further additions from this pass.
2026-09-05 15:41:20 +02:00
KAMI eca1d5ff65
Merge pull request #1164 from KAMI911/fix-kapostv-link
Fix Kapos TV - found a working relay via the official player embed
2026-09-05 15:18:34 +02:00
Kálmán „KAMI” Szalai e8cf7121a6 Fix Kapos TV - found a working relay via the official player embed
Was marked [x] (dead relay01/livestream004.sdp on cloudfront63). Found
the current URL the same way as FehérvárTV (#1163): the official site's
"Élő adás" page embeds an iframe at cloudfront63.lexanetwork.com/itplayer/
LIVE016_inc.php, which resolves to a real master playlist (bitrate/
resolution/codec info + segment reference) on a different host/path -
relay01/broadcast004.sdp on cloudfront44. Verified 4x, consistently alive.

Also checked the site's other dead ([x]) lexanetwork.com entries this
same way: AlföldTV's domain now redirects to a news portal with no live
player, Zugló TV's and Bajai TV's sites don't resolve/load at all, and
Lóverseny közvetítés is an event-only feed (found a newer loverseny3.sdp
path via the same method, but it's only live during actual races, so
nothing to verify against right now). None of those looked fixable.
2026-09-05 15:14:40 +02:00
KAMI 2c676be88a
Merge pull request #1163 from KAMI911/fix-fehervartv-link
Fix FehérvárTV - old link served an empty playlist
2026-09-05 15:09:56 +02:00
Kálmán „KAMI” Szalai dd46b77562 Fix FehérvárTV - old link served an empty playlist
The old URL (freerelay/fehervartv.sdp) answered HTTP 200 with a
technically-valid HLS header but nothing else - no #EXT-X-STREAM-INF,
no segment reference, just two lines. That passes a header-only check
(and did - the current checker reports it "alive") while being
unplayable in any real player, since there's nothing to play.

Found the working URL by fetching the official player embed at
https://www.fehervartv.hu/elo_adas (an iframe pointing at the same
lexanetwork.com host, but a different relay path - relay44_1/HDE046.sdp
- that does return a real master playlist with bitrate/resolution/codec
info and a segment reference). Verified 4x, consistently alive.
2026-09-05 15:09:15 +02:00
ChannelCheckerBot 366b3a9293 Channel check (fast) - 2026-09-05T12:18:01Z 2026-09-05 12:18:01 +00:00
KAMI 4264cd01ea
Merge pull request #1162 from KAMI911/add-japan-bs-cids
Add 3 newly-found BS cids without moving existing ones
2026-09-05 12:57:11 +02:00
Kálmán „KAMI” Szalai e7e5ca8a62 Add 3 newly-found BS cids without moving existing ones
Follow-up to #1156. That PR found working cids (01, 08, 12 - the range
was 02-07,10,11 before) for channels previously marked [NO PUBLIC
STREAM], which is valuable, but it also reassigned the cid of every
already-known-working channel (NHK BS, BS日テレ, BS朝日, BS-TBS,
BSテレ東, BSフジ) to its neighbor's old value - a clean cyclic shift
across exactly six channels, which is what a list/list zip misaligned
by one produces, not what channel-by-channel verification produces.
Neither the old nor the new mapping carries any content-level proof
(the streams have no identifying metadata), so there's no way to tell
which is right - only that the shift itself isn't evidence of anything.

This takes only the part that's unambiguous: three cids nobody had
before, given to the three channels that had nothing. bs07 was one of
the "new" ones in #1156, but it's already BS10スターチャンネル's cid,
so WOWOWシネマ gets bs08 instead - the only other free value.

Verified each new cid resists a single flaky read (checked 4x): bs01
and bs12 came back flaky (3/4 ok) but real, bs08 came back alive (4/4).
That's consistent with how naori-test.netgenx.site behaves generally
(see check_channels.py's docstring), not a sign these three are wrong.
2026-09-05 11:05:10 +02:00
PlaylistBot 04cf01884e Update Playlist (GitHub Actions) 2026-09-05 07:34:09 +00:00
KAMI 29d2243eb9
Merge pull request #1159 from frantdse/patch-5
Update streaming links for TV Syd and TV 2/Fyn
2026-09-05 09:34:02 +02:00
KAMI cd71dada8e
Merge pull request #1152 from KAMI911/remove-star-central-greece
Remove Star Central Greece - not a valid stream
2026-09-05 09:30:34 +02:00
KAMI 667e8efb11
Merge pull request #1161 from KAMI911/improve-pr-check
Check the whole touched list at PR time, not just changed lines
2026-09-05 09:27:45 +02:00
ChannelCheckerBot 1b4ca5e480 Channel check (deep) - 2026-09-05T06:39:21Z 2026-09-05 06:39:21 +00:00
ChannelCheckerBot 3f1afe04d4 Channel check (fast) - 2026-09-05T06:18:36Z 2026-09-05 06:18:36 +00:00
Kálmán „KAMI” Szalai 708fd34750 Check the whole touched list at PR time, not just changed lines
Replaces iptv-checker (npm + ffmpeg) with check_channels.py:

- Checks every channel in a list a PR touches, existing and new, not just
  the added/changed rows - a PR editing italy.md now surfaces already-dead
  channels in italy.md too, not only the one line it changed.
- Uses check_channels.py's dead/blocked/unreachable/flaky states instead
  of a binary online/failed, so the summary no longer needs the "some of
  these failures are geo-blocks, use your judgment" disclaimer without
  telling reviewers which failures those are - blocked channels are now
  named as such.
- Summary separates what the PR actually added/changed from what was
  already broken in the same file, so a reviewer isn't left guessing
  whether a failure is theirs to fix.
- No ffprobe pass here (kept fast for a PR gate) - anything this flags as
  dead gets a second opinion from the scheduled Channel check (deep)
  workflow before anyone acts on it.

Verified end to end against a simulated PR diff.
2026-09-05 04:40:49 +02:00
ChannelCheckerBot 43031dc60f Channel check (fast) - 2026-09-05T00:24:35Z 2026-09-05 00:24:35 +00:00
Fransitiu! b06f272b65
Update streaming links for TV Syd and TV 2/Fyn 2026-09-04 15:45:03 -03:00
ChannelCheckerBot 26c21f5780 Channel check (fast) - 2026-09-04T18:17:22Z 2026-09-04 18:17:22 +00:00
ChannelCheckerBot a8b9c18ae9 Channel check (fast) - 2026-09-04T12:19:17Z 2026-09-04 12:19:17 +00:00
ChannelCheckerBot a51b411fec Channel check (fast) - 2026-09-04T10:17:38Z 2026-09-04 10:17:38 +00:00
KAMI 90d124bff6
Merge pull request #1158 from KAMI911/fix-incompleteread-crash
Fix crash on IncompleteRead, which killed the first live run
2026-09-04 12:06:01 +02:00
Kálmán „KAMI” Szalai 017955ad9e Fix crash on IncompleteRead, which killed the first live run
The first scheduled run of #1157's workflows failed outright: a server
started a chunked HTTP response and then hung up mid-chunk, which
urllib surfaces as http.client.IncompleteRead - a subclass of
http.client.HTTPException, not of OSError/URLError/ValueError, so
probe()'s except clause let it propagate and took the whole run down
before it wrote anything to --json, including check_channels_fast.yml's
run.jsonl.

Catch http.client.HTTPException alongside the existing exceptions and
treat it as unreachable, same as any other broken connection. Verified
against the exact exception (mocked) and against the live lists.
2026-09-04 11:49:36 +02:00
KAMI e52f1b34d8
Merge pull request #1157 from KAMI911/add-channel-checker-and-dashboard
Add channel checker, scheduled health checks, and a status dashboard
2026-09-04 10:55:02 +02:00
Kálmán „KAMI” Szalai a86fb23e94 Add channel checker, scheduled health checks, and a status dashboard
Builds on the idea in #1145 (a checker that maps failures back to a channel
and list, and tells a geo-blocked channel from a dead one) with a few
additions:

check_channels.py
- Standard library only, same as #1145's version.
- Adds a `disputed` state: an optional --confirm-dead pass gives ffprobe a
  second opinion on anything that looks dead over HTTP, before it gets
  reported as dead. This is one-directional (can only pull a verdict out
  of `dead`, never push one into it) because ffprobe itself is not
  reliable enough to trust in the other direction - a known-good DASH
  channel needed longer than any sane per-channel budget to open while
  testing this, and a header check alone had already been fooled by an
  isolated media fragment sitting at a URL that looked like a live channel
  (a mistake made and caught while triaging #1149/#1151 - see the
  docstring for the details).
- Restructured to share one worker pool across every list in a run
  instead of a fresh pool per list, which stopped small lists from paying
  the same wall-clock floor as large ones; a full run across all lists
  dropped from not finishing in 15 minutes to about 10.
- --json writes one record per channel per run, for building a history.

generate_dashboard.py
- Turns that history into a single self-contained docs/index.html: current
  state breakdown, an alive-share trend across every run kept, a per-list
  breakdown, and a searchable/filterable table of everything that is not
  currently alive.

Two new scheduled workflows
- check_channels_fast.yml: every 6 hours, HTTP checks only.
- check_channels_deep.yml: every 2 days, with --confirm-dead (needs ffmpeg).
Both append to .github/checker-history/history.jsonl (pruned to 90 days),
then build and deploy the dashboard to GitHub Pages.
2026-09-04 10:21:37 +02:00
PlaylistBot e45cbb8e4b Update Playlist (GitHub Actions) 2026-09-04 04:58:09 +00:00
KAMI f949d167f7
Merge pull request #1155 from frantdse/patch-4
Update France 24 Español streaming URL
2026-09-04 06:58:00 +02:00
Fransitiu! 2a0be35bfd
Update France 24 Español link to new streaming URL 2026-09-03 20:12:25 -03:00
Kálmán „KAMI” Szalai 2ac426ba9c Remove Star Central Greece - not a valid stream
Corrects a mistake in the previous PR (#1151): the URL answers with
HTTP 200 and binary data, but that payload is a raw MP4 fragment
(ftyp/moov boxes), not an HLS or DASH playlist a player can open.
No working replacement was found, so removing it rather than
mis-marking it as fixed.
2026-08-31 20:37:44 +02:00