Went through the open issue backlog and verified each claim against
the live streams with check_channels.py / curl before touching
anything, rather than acting on the reports alone.
Moved to Invalid (2 attempts, both `gone`, re-verified by hand):
- Greece: Start, Thraki Net TV
- Slovakia: Doma, Dajto, Krimi, Markíza TN Live, Jojko (joining the
JOJ-family channels already Invalid - same upstream host, same
missing-channel pattern)
- Bosnia and Herzegovina: Sevdah
- Spain: Nova, La 7 CYLTV, Canal TE24
- USA: NASA TV Public
- USA + zz_news_en: CNN / CNN International - both point at
turnerlive.warnermediacdn.com/.../cnn_slate/..., which returns a
permanently frozen manifest (#EXT-X-PUBLISHED-TIME and
MEDIA-SEQUENCE identical across two fetches 8s apart, dated several
months in the past) - a live-looking HTTP 200 that check_channels.py
currently has no way to catch, since it never compares a URL against
its own earlier response. Also moved the alternate CNN entry in
zz_news_en.md (a raw.githubusercontent.com link that 404s outright).
- Not moved: N1 Bosna i Hercegovina (`disputed` - ffprobe found a real
stream behind the dead-looking HTTP response, needs a human) and
everything reported merely `unreachable`/`blocked` across these
lists - neither is strong enough evidence on its own, see
check_channels.py's own docstring.
Japan: added the Ⓖ marker to the 6 terrestrial channels on mov3.co
(NHK総合, 日本テレビ, テレビ朝日, TBSテレビ, テレビ東京, フジテレビ) -
confirmed HTTP 403 from here on all six, consistent with the
geo-restriction every other Ⓖ-marked channel in this repo already
documents. They were working `[>]` entries with no Ⓖ, which reads as
"this should work from anywhere" when it does not.
Left alone after checking (false alarms / already resolved, not a
list-file problem):
- Croatia HRT 1-4: already Ⓖ-marked and alive.
- Mongolia TenGer TV/TV5/TV9: all 40 Mongolia channels alive.
- Japan Willfonk/naori-test links: already Invalid on master.
- Several `unreachable` entries (Greece ART TV/Epirus TV 1, Croatia's
RTL family, half of Spain, Bosnia's BHT/Glas Drine/etc.) -
`unreachable` means "every attempt timed out or failed to connect
from here", not "confirmed gone" - too weak to act on without a
second opinion, and these didn't get one in this pass.
ran: python3 make_playlist.py (clean regen) + check_channels.py on
every touched list afterward to confirm nothing newly broke and the
moved channels no longer show up as working.
42 channels across 14 lists have an EPG column in their markdown table row
but the column is blank. The condition in Channel.to_m3u_line() only checked
for None (no EPG column at all) but not for an empty string, so these
channels got a tvg-id="" attribute in the generated playlist. An empty
tvg-id tells IPTV players "this channel has an EPG ID and it is the empty
string", which prevents EPG matching rather than falling back to name-based
matching the way a missing attribute would.
Changing `if self.epg is not None` to `if self.epg` makes both None and
empty string omit the attribute, matching the existing pattern used by
the chno and country_code attributes on the lines just above.
Add ISO 3166-1 alpha-2 country codes via tvg-country attribute
to all #EXTINF lines, enabling IPTV players to filter and display
channels by country.
Co-authored-by: Kálmán „KAMI” Szalai <kami911gmail.com>