stream01.willfonk.com has zero "alive" results across 1000+ checks in
the checker history over the last 8 days, and my own multi-attempt
probe (check_channels.py --confirm-dead) confirms it's consistently
unreachable. Part of #1184.
naori-test.netgenx.site and sktv.mxnticek.eu (also reported in #1184
and #1153) are left untouched: the checker history shows both still
returning "alive"/"flaky" results within the last 3 days, so per
check_channels.py's own guidance they're unreliable/geo-sensitive
rather than confirmed dead, and shouldn't be blanket-marked invalid
on a single failed probe.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01HnjzQpjtzZkVgRJGZipm44
- Restore TSN Tele Sondrio News (LCN 85, Lombardia) to Regional DVB-T with active Akamai 720p stream
- Upgrade Rtp Tv stream protocol to HTTPS (flash2.xdevel.com)
- Add 29 verified regional DVB-T channels and visual radios in alphabetical order:
* Regional DVB-T: AM Terni Television, Tele Golfo RTG, Tele Granducato, Tele Lacco Ameno, Tele Laser, Tele Ritmo, Tele Stabia / Gigli TV, TGS Telegiornale di Sicilia, TRG Media, TRSP Tele Radio San Pietro
* Visual Radios & Local TVs: Bella e Monella TV, Enjoy Television, Radio Arancia TV, Radio Bianconera TV, Radio Delta 1 TV, Radio Digiesse TV, Radio Iglesias Visual Radio, Radio Juke Box TV, Radio Kiss Kiss Italia TV, Radio Kiss Kiss Napoli TV, Radio Napoli Emme, Radio Number One TV, Radio Padova TV, Radio Punto Zero TV, Radio Ritmo 80 TV, Radio Studio TV, Radio Taormina TV, Radio Televisione Sarda, Radio Tivù Azzurra, RTN Napoli
- All streams verified active on official CDNs (1080p/720p) with on-screen logos
- Only lists/italy.md modified
Fixes#1179.
PR #1166 moved Rai 1, Rai 2, Rai 3, Rai Premium, Rai Storia and Rai
Scuola from the official mediapolis.rai.it relinker to a third-party
CloudFront mirror, because the relinker had become Italy-IP-gated and
was failing for everyone else (including the CI checker). That mirror
works for casual viewing, but as #1179 reports, it goes black during
broadcasts where RAI only holds domestic rights (e.g. EuroVolley) -
the official stream keeps working correctly for Italian-IP viewers
through exactly those broadcasts, because it's RAI's own domestic
feed, not a re-mirror of it.
Rather than trade one gap for the other, add the official mediapolis
URL back as a second, Ⓖ-marked entry for each of the six channels -
the same "CDN mirror as the general-access entry, official relinker
as the geo-gated alternative" split this file already uses for every
other Rai channel (Rai 4, Rai 5, Rai Movie, Rai Sport, etc., all still
on mediapolis.rai.it + Ⓖ). Viewers with an Italian IP get the more
correct source; everyone else keeps the mirror that already works for
them.
Also fixes a real gap in check_channels.py found while verifying this:
mediapolis.rai.it's relinker doesn't refuse an out-of-territory request
with an HTTP error - it answers 200 with a real MP4, but the file is
always the same "video_no_available.mp4" decoy regardless of which
channel was asked for. The checker had no way to tell that apart from
a working stream failing its playlist-header check, so every
mediapolis.rai.it entry (the pre-existing Rai 4/5/Movie/Sport ones
included) was scored `dead` instead of `blocked`, right down to the
newly-fixed pr_check.yml workflow that now hard-fails a PR over a
`dead`-scored touched channel. Added a check for this specific decoy
redirect target, classified as `blocked` like any other geo-refusal.
Regenerated playlist.m3u8 and playlists/playlist_italy.m3u8 via
make_playlist.py. pylint check_channels.py: 10.00/10.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
CCTV-15 音乐 had no URL. Found it on the same aggregator IP
(74.91.26.218:82) already used successfully for every other CCTV-1
through CCTV-17 entry in this file - just needed the matching
cctv15hd path. Verified alive via check_channels.py (3/3 ok), real
HLS content with sequential live .ts segments.
Researched but left unchanged (no viable replacement found):
- China: FZTV-2 (sibling IDs on the same host work, this one 404s;
no alternate ID discoverable without brute-forcing); CCTV-5, CCTV-5+,
CETV-1 through 4 (Invalid section) - the same aggregator serves
geo-block placeholders or "no server configured" errors for these,
not real streams.
- Israel: Channel 12, Makan 33 - confirmed geo-blocked to Israel by
the broadcaster's own API response, not fixable from outside.
- Azerbaijan: Topaz 2 - no discoverable public web presence, likely
defunct. CBC Sport, İctimai TV newly found dead, no replacement.
- United Arab Emirates: Fujairah TV has a real official stream, but
it's a signed URL that expires the same day - not usable as a
static entry. MBC 2/Action/Max, Al Aan TV, Baynounah TV, Abu Dhabi
Sports 1/2 newly found dead, no replacement. Notably, Abu Dhabi TV,
National Geographic Abu Dhabi, Dubai TV, Dubai One, Dubai Sports
1-3, Dubai Racing 1-3, Dubai Zaman, Sama Dubai, and Noor Dubai (12
channels) all point to CDN subdomains that no longer resolve at all
(confirmed NXDOMAIN) - both Abu Dhabi Media and Dubai Media Inc.
appear to have discontinued free public live streaming entirely
(Abu Dhabi Media moved behind the paid StarzPlay platform, Dubai
Media Inc's rebuilt site has no live section) - a wholesale
infrastructure change worth flagging to maintainers rather than 12
isolated link rots, but not something a replacement URL can fix.
- Somalia: Codka Bariga Afrika, Dacwa TV, Puntland TV - no
discoverable public stream. Somali Cable TV and SBC Somalia have
official YouTube channels, but neither was live at verification
time.
Regenerated playlist.m3u8 and playlists/playlist_china.m3u8 via
make_playlist.py.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
Malta:
- Smash TV: a3.smashmalta.com no longer resolves. Found the current
stream on the station's own official homepage embed. Verified alive
via check_channels.py (3/3 ok), real HLS media playlist with .ts
segments.
North Korea:
- Ryongnamsan TV: had no URL. Found it on the same reputable
koryofront.org aggregator already used successfully for this file's
existing KCTV entry - it explicitly lists a Ryongnamsan TV stream at
a sibling path. Verified alive via check_channels.py (3/3 ok), real
HLS media playlist with live PROGRAM-DATE-TIME tags.
Researched but left unchanged (no durable fix available):
- Malta: TVM2 and NET TV have real official live streams, but both
require session-bound/time-limited signed tokens (a JWT tied to the
requester's IP with a ~24h expiry, and a 12h start/end token window
respectively) - not usable as a static playlist entry. F Living: no
official web presence found.
- North Korea: Mansudae TV - not offered by the koryofront.org
aggregator or any other source found.
- Taiwan: CTV Classic, CTV Bravo - official site has no live player,
only a program schedule.
- Poland: 4fun Dance - official live player is a third-party embed
with no discoverable static stream URL.
- Latvia: TV24 - official site has no live/tiešraide page, only a
VOD archive.
Regenerated playlist.m3u8 and the per-country playlists via
make_playlist.py.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
- SBS, SBS Viceland, SBS World Movies, SBS Food, NITV: had no URL at
all. Found the correct current channel keys behind the i.mjh.nz
redirector already used successfully by other entries in this file
(Seven, Nine, 7two, etc). The redirector mints a fresh token and
forwards to SBS's real Akamai edge, which explicitly declines
non-Australian requests (X-Error-Reason: geo-blocked) - real,
correctly-functioning access control, not a broken link - so marked
Ⓖ like the file's other geo-blocked entries (9Gem, 9Go!, etc).
- 9Gem, 9Go!, 9Life, 9Rush: the old direct 9now-livestreams.akamaized.net
URLs now 400 (stale signed paths). Replaced with the same i.mjh.nz
redirector mechanism, which mints a fresh token per request instead
of embedding a static one. Verified alive via check_channels.py
(3/3 ok), real HLS master + variant playlists.
- C31 Melbourne: had no URL. The station now operates under the CTV
Plus community-TV platform after a 2016 licensing change; found its
current CloudFront-backed stream via ctvplus.org.au. Verified alive
via check_channels.py (3/3 ok), real HLS content with live segments.
Researched but left unchanged (no viable replacement found):
- Spree TV, M4TV: official domains parked or unresolvable, stations
appear defunct.
- 10 Shake, Racing.com: newly found dead (stale CDN paths), but their
official platforms are JS SPAs with no static stream discoverable.
Regenerated playlist.m3u8 and playlists/playlist_australia.m3u8 via
make_playlist.py.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
zz_news_en:
- LiveNOW from FOX: lnc-fox-live-now.tubi.video no longer resolves.
Replaced with the Amagi-hosted feed already used for the same
channel under lists/usa.md's "FOX Live Now" entry. Verified alive
via check_channels.py (3/3 ok).
Serbia:
- RTS 3: the old udp-multicast-proxy URL (185.81.240.65:15000) is
unreachable. Found the current feed on the same official bhtelecom.ba
CDN already used for RTS 1 and RTS 2 in this file. Verified alive via
check_channels.py (3/3 ok), real HLS master playlist with two
variants.
Researched but left unchanged (no fix available):
- zz_news_en: The Guardian, CBC News Network, Sky News Now (AU), i24
News, CNBC Europe, CNBC Indonesia, Pluto TV News - official
infrastructure down, geo/paywall-gated, or no public stream exists.
CNN (line 36) was not touched - the only replacement found is the
exact same feed already used by the "CNN International" row in this
file, which would just be a duplicate entry, not a distinct fix.
- Moldova: Publika TV group and Balti TV - official domains gone, no
replacement found.
- Serbia: Euronews Serbia has a real working stream, but it requires a
custom Referer header this repo's plain-URL playlist format can't
carry - not usable as a drop-in fix. Red TV - no replacement found.
- Slovakia: every channel points at a domain (sktv.mxnticek.eu) that is
completely down. Found working replacements for 3 channels via
STVR's own JSON endpoint, but those URLs embed a short-lived signed
token that expires - not usable as a static playlist entry (same
reasoning as the Sweden Solidtango tokens rejected earlier). No
durable fix currently available for this file.
- Montenegro: no dead channels found.
- Bosnia and Herzegovina: BHT 1's URL times out, but it's confirmed to
be the exact URL BHRT's own official site uses internally - looks
like a genuine infra/geo outage at the source, not a stale link, so
left unchanged. No fix found for Federalna TV, TV BPK, Kanal 6, TNT
Kids, Sevdah, RTV Glas Drine, TVSA, RTV TK.
Regenerated playlist.m3u8 and the per-country playlists via
make_playlist.py.
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU
check_channels.py's exit code reflects every dead channel across the
whole list file it was pointed at, not just the ones a PR added or
changed. Since pr_check.yml ran the checker directly and let its exit
code decide the job's pass/fail, any PR touching a list that already
had pre-existing dead entries (which is most of them - dozens of
already-known-broken channels exist across these lists) got a red X
for something it never caused, even though the workflow's own summary
step already computed the right "touched vs already broken" split.
Fixes this by:
- letting the check step run to completion regardless of its exit
code (the checker's own verdict on the whole file isn't this job's
call to make)
- moving pass/fail into the summarize step, which already has the
touched/others split: the job now fails only when a channel this PR
itself added or changed comes back `dead`
- deliberately not failing on `blocked`/`unreachable`/`flaky` for
touched channels either - these have real false-positive rates from
the runner's own network (geo-blocks, a datacenter IP some providers
reject, one slow probe), which is exactly why the *Channel check
(deep)* workflow exists to give `dead`-looking channels a second
opinion before anyone acts on them
Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01Enus8N247jHM5r5Som5JuU