Commit Graph
76 Commits
Author SHA1 Message Date
ChannelCheckerBot 329f69cdf2 Channel check (fast) - 2026-09-14T12:19:16Z 2026-09-14 12:19:16 +00:00
ChannelCheckerBot 03c1c9d1ab Channel check (fast) - 2026-09-14T06:22:45Z 2026-09-14 06:22:45 +00:00
ChannelCheckerBot 5cc1a6eaa5 Channel check (fast) - 2026-09-14T00:26:25Z 2026-09-14 00:26:26 +00:00
ChannelCheckerBot 91ab190beb Channel check (fast) - 2026-09-13T18:16:50Z 2026-09-13 18:16:50 +00:00
ChannelCheckerBot 83ac7636fd Channel check (fast) - 2026-09-13T12:17:43Z 2026-09-13 12:17:43 +00:00
ChannelCheckerBot d199f38684 Channel check (deep) - 2026-09-13T06:44:34Z 2026-09-13 06:44:34 +00:00
ChannelCheckerBot 8fe625f499 Channel check (fast) - 2026-09-13T06:23:06Z 2026-09-13 06:23:06 +00:00
ChannelCheckerBot 976d094cd8 Channel check (fast) - 2026-09-13T00:26:26Z 2026-09-13 00:26:26 +00:00
ChannelCheckerBot 6e52964ae2 Channel check (fast) - 2026-09-12T18:16:47Z 2026-09-12 18:16:47 +00:00
ChannelCheckerBot 1920203b84 Channel check (fast) - 2026-09-12T12:18:22Z 2026-09-12 12:18:22 +00:00
ChannelCheckerBot 8adf9e824f Channel check (fast) - 2026-09-12T06:18:47Z 2026-09-12 06:18:47 +00:00
ChannelCheckerBot d5c5e6564e Channel check (fast) - 2026-09-12T00:24:31Z 2026-09-12 00:24:31 +00:00
ChannelCheckerBot a04ccb6223 Channel check (fast) - 2026-09-11T18:16:50Z 2026-09-11 18:16:50 +00:00
ChannelCheckerBot 62e17f7e2e Channel check (fast) - 2026-09-11T12:18:52Z 2026-09-11 12:18:52 +00:00
ChannelCheckerBot cd3f488e40 Channel check (deep) - 2026-09-11T06:42:47Z 2026-09-11 06:42:47 +00:00
ChannelCheckerBot 8a5ab3cba7 Channel check (fast) - 2026-09-11T06:20:16Z 2026-09-11 06:20:17 +00:00
ChannelCheckerBot 1e650261a1 Channel check (fast) - 2026-09-11T00:25:34Z 2026-09-11 00:25:34 +00:00
ChannelCheckerBot 4522b038d9 Channel check (fast) - 2026-09-10T18:18:15Z 2026-09-10 18:18:15 +00:00
ChannelCheckerBot 42364c20ce Channel check (fast) - 2026-09-10T12:19:21Z 2026-09-10 12:19:21 +00:00
ChannelCheckerBot e9d9bc4b55 Channel check (fast) - 2026-09-10T06:20:45Z 2026-09-10 06:20:45 +00:00
ChannelCheckerBot 04e4f2f881 Channel check (fast) - 2026-09-10T00:24:59Z 2026-09-10 00:24:59 +00:00
ChannelCheckerBot 0a89a69f3b Channel check (fast) - 2026-09-09T18:18:06Z 2026-09-09 18:18:06 +00:00
ChannelCheckerBot 8829525d69 Channel check (fast) - 2026-09-09T12:18:47Z 2026-09-09 12:18:47 +00:00
ChannelCheckerBot faac9941e2 Channel check (deep) - 2026-09-09T06:44:33Z 2026-09-09 06:44:33 +00:00
ChannelCheckerBot efaef2b59a Channel check (fast) - 2026-09-09T06:23:11Z 2026-09-09 06:23:11 +00:00
ChannelCheckerBot 03a4ac1563 Channel check (fast) - 2026-09-08T18:18:10Z 2026-09-08 18:18:10 +00:00
ChannelCheckerBot abfe32e5a9 Channel check (fast) - 2026-09-08T12:19:26Z 2026-09-08 12:19:26 +00:00
ChannelCheckerBot 832ad962e8 Channel check (fast) - 2026-09-08T06:19:48Z 2026-09-08 06:19:48 +00:00
ChannelCheckerBot 7e100328c3 Channel check (fast) - 2026-09-08T00:24:59Z 2026-09-08 00:24:59 +00:00
ChannelCheckerBot e862e957e2 Channel check (fast) - 2026-09-07T18:17:35Z 2026-09-07 18:17:35 +00:00
ChannelCheckerBot 16306fdde8 Channel check (fast) - 2026-09-07T12:19:29Z 2026-09-07 12:19:29 +00:00
ChannelCheckerBot 23ca802ae0 Channel check (deep) - 2026-09-07T06:53:46Z 2026-09-07 06:53:46 +00:00
ChannelCheckerBot 42d0f8e67f Channel check (fast) - 2026-09-07T06:22:45Z 2026-09-07 06:22:45 +00:00
ChannelCheckerBot 325ad0352e Channel check (fast) - 2026-09-07T00:26:16Z 2026-09-07 00:26:16 +00:00
ChannelCheckerBot d9bb826b0b Channel check (fast) - 2026-09-06T18:17:10Z 2026-09-06 18:17:10 +00:00
Kálmán „KAMI” SzalaiandClaude Sonnet 5 e054b0afbb Only fail the PR channel check on channels the PR itself broke
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
2026-09-06 14:24:16 +02:00
ChannelCheckerBot 8b7392dde6 Channel check (fast) - 2026-09-06T12:18:15Z 2026-09-06 12:18:15 +00: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
ChannelCheckerBot f2a1e1f9d4 Channel check (fast) - 2026-09-05T18:16:44Z 2026-09-05 18:16:44 +00:00
ChannelCheckerBot 366b3a9293 Channel check (fast) - 2026-09-05T12:18:01Z 2026-09-05 12:18:01 +00: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
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
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