Follow-up to the previous commit on this branch: that one added
--invalid/--include-invalid to check_channels.py but deliberately left
them unwired, because generate_dashboard.py's "most recent row per
(list, channel)" view assumed every row was a working channel -
turning --include-invalid on in a workflow would have bloated the
"needs attention" table with hundreds of already-known-dead Invalid
rows, while hiding the one thing that's actually interesting: an
Invalid channel that's alive again wouldn't show up there at all,
since that table only lists rows that are *not* alive.
- generate_dashboard.py: every existing count (cards, trend, by-list,
"needs attention") is now built from `>` (working) rows only, via a
`marker_of()` helper that treats history written before this field
existed as `>` too, since only working channels were ever checked
back then - so this is a no-op for every dashboard that hasn't
started using --include-invalid yet.
- New "Flagged Invalid, answering again" section lists `x` rows whose
latest check came back alive/flaky - the dashboard's equivalent of
check_channels.py's own `RECOVERED?` line - with a note that this is
a shortlist for a human, not something to auto-restore.
- check_channels_deep.yml now runs with --include-invalid, and its
step-summary blurb mentions the new section.
Tested: wrote a small synthetic history.jsonl mixing a marker-less
legacy row, `>` rows, and `x` rows (one alive, one dead) and confirmed
the channel count/cards only reflect the `>` rows, the alive `x` row
shows up under "Flagged Invalid, answering again", the dead `x` row
shows up nowhere (expected - it's just confirming the status quo), and
an all-`>` history renders the new section's "none right now" empty
state. Also ran it against this repo's real 77MB
.github/checker-history/history.jsonl (all pre-dates this change, so
no `x` rows in it) - renders in ~1.5s, unchanged output. pylint:
10.00/10 on both files.
Per #1226: once a channel is marked Invalid ([x]), nothing ever probes
it again, so a source that comes back online stays listed as dead
forever, and the scheduled fast/deep runs plus the PR check only ever
look at [>] rows.
- ROW now captures which marker (`>` or `x`) a row carries.
- --invalid probes only the Invalid-flagged rows; anything that now
answers alive/flaky is printed as "RECOVERED?" instead of being
judged dead/unreachable (the expected, uninteresting outcome for a
row that's supposed to be broken).
- --include-invalid runs both passes together in one worker pool.
- The exit code still only reflects dead [>] channels - a dead [x]
channel is the status quo, not a regression - so --invalid alone
always exits 0 and is safe to add to any workflow without risking a
spurious failure.
- --json records now carry the row's marker too.
Deliberately not wired into check_channels_deep.yml yet: the history
file and generate_dashboard.py's "most recent row per (list, channel)"
view assume every row is a working channel. Mixing in hundreds of
Invalid rows per run would bloat the dashboard's "not currently alive"
table with already-known-dead noise, and - worse - an Invalid channel
that comes back alive wouldn't show there either, since that table
only lists rows that are *not* alive. That's a second, separate change
to generate_dashboard.py; flagging it here rather than shipping it
half-done.
Tried --invalid on bulgaria/latvia (channels this account's own PR
moved to Invalid days ago, confirmed dead at the time) - correctly
reported dead/blocked, not recovered. Tried --include-invalid on
hungary and it immediately surfaced 4 real recovery candidates
(AlföldTV, Lóverseny közvetítés, Bajai TV, Tisza TV); re-checked those
4 by hand afterwards with a longer timeout and they went straight back
to unreachable, which is itself a useful data point - exactly the kind
of flaky intermittent case the tool is supposed to hand to a human
rather than silently act on, so none were restored. pylint: 10.00/10.
Same 141.94.193.53 host as the M1/M2/M5/Duna/RTL/TV2/ATV fixes in this
branch, per #1228. Re-tested all three live just now. TV4 is a genuine
free-to-air DVB-T2 channel; Cool and Film+ are RTL Group's
subscription-tier channels in official distribution, included here
since this mirror serves them without auth (same basis other
already-listed subscription channels in this repo are included on).
Re-tested every URL below just now (curl + real HLS manifest body check)
before restoring, per issue #1226's finding that some Invalid rows have
working streams again:
- Italy: K2, Frisbee, Canale 58 — live again (closes#1205)
- Lebanon: ALWifak News TV, Arabica TV — live again
- Hungary: Hír TV — old onlinestream.live link now serves a player error;
replaced with the working videa.hu relay
- Hungary: M1, M2/Petőfi TV, M5, Duna TV, RTL Klub, TV2, ATV — old
88.212.15.19 links are dead; replaced with the 141.94.193.53 mirror
URLs reported working in #1228 (verified live here too), moved back
out of Invalid
Regenerated playlist.m3u8 and the per-country playlists via
make_playlist.py.