Skip to content

[iptv-checker]: Bump to 1.26.2171636 and switch to external source - #216

Merged
dispatcharr-plugins-bot[bot] merged 3 commits into
Dispatcharr:mainfrom
PiratesIRC:iptv-checker-v1.26.2171636
Aug 6, 2026
Merged

[iptv-checker]: Bump to 1.26.2171636 and switch to external source#216
dispatcharr-plugins-bot[bot] merged 3 commits into
Dispatcharr:mainfrom
PiratesIRC:iptv-checker-v1.26.2171636

Conversation

@PiratesIRC

@PiratesIRC PiratesIRC commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

[iptv-checker]: Bump to 1.26.2171636 and switch to external source

Updates the listing from 1.26.1741204 to 1.26.2171636 and converts it from a
standard (full source) plugin to an external one.

WHY EXTERNAL. The plugin now ships five Python modules rather than one, so a
standard listing means copying and re-syncing all of them on every release. It
also vendors a notification client that is hash-pinned in its own repository,
and a copied version here would be a second copy with nothing gating it against
drift. External mode reuses the release archive that is already built, checksummed
and audited upstream, which is also what CONTRIBUTING recommends.

source_url contains {version} twice, because this project's tags carry a v
prefix and the asset name embeds the version. Verified before submitting: the
resolved URL returns HTTP 200, and six external plugins already listed here use
the same two-placeholder shape.

WHAT CHANGED IN THE PLUGIN SINCE 1.26.1741204

  • A channel is now judged by ALL of its streams. Results are recorded per
    stream while rename, move and delete act per channel, and the previous
    selection matched if any single stream failed. A channel whose primary timed
    out but whose backup played was therefore eligible for renaming, moving and
    permanent deletion. On the install this was measured against, that affected
    21 of the 22 channels the old rule called dead.
  • Group selection replaced by one list plus a mode, matching how other plugins
    present it. Old values are read automatically until the new setting is saved.
  • Three new opt-in detectors: frozen video, silent audio, and placeholder files,
    the last of which costs no extra probe time.
  • An HTML report written to /config/iptv_checker/, grouped by what the operator
    should do about each finding, optionally emailed through Newsflasharr.
  • The webhook feature is removed, replaced by that report delivery.
  • Validate Settings now reports how many groups will be checked and fits inside
    the toast, which previously clipped its own contents.
  • The README is now a short overview with the detail moved to a user guide.

Fields and actions are no longer duplicated in this manifest; they come from the
plugin's own manifest inside the archive.

NOTE ON THE LEFTOVER SOURCE FILES. plugin.py and init.py are left in place
rather than deleted. External mode ignores them, so they are inert, and this
keeps the change minimal. Happy to remove them here or in a follow-up, whichever
you prefer.

ON THE CODEQL RESULT. It fails on this pull request, and I do not believe it is
caused by this change. This pull request touches no Python at all, only
plugin.json and README.md, while the codeql-analyze job runs
find plugins -name '*.py' and analyses the whole plugins tree rather than the
changed folder. PR #207, a different plugin from a different author, is failing
the same check right now. Every plugin-specific check here passed: validate-title,
validate-plugin, clamav-scan and close-unauthorized.

I first assumed the failure came from deleting the .py files in the original
version of this pull request, restored them, and the check failed again, so that
explanation was wrong and is not the cause.

@dispatcharr-plugins-bot dispatcharr-plugins-bot Bot added the Plugin Update A plugin already in the repository is being updated. label Aug 5, 2026
@dispatcharr-plugins-bot

This comment has been minimized.

Updates the listing from 1.26.1741204 to 1.26.2171636 and converts it from a
standard (full source) plugin to an external one.

WHY EXTERNAL. The plugin now ships five Python modules rather than one, so a
standard listing means copying and re-syncing all of them on every release. It
also vendors a notification client that is hash-pinned in its own repository,
and a copied version here would be a second copy with nothing gating it against
drift. External mode reuses the release archive that is already built, checksummed
and audited upstream, which is also what CONTRIBUTING recommends.

source_url contains {version} twice, because this project's tags carry a v
prefix and the asset name embeds the version. Verified before submitting: the
resolved URL returns HTTP 200, and six external plugins already listed here use
the same two-placeholder shape.

WHAT CHANGED IN THE PLUGIN SINCE 1.26.1741204

- A channel is now judged by ALL of its streams. Results are recorded per
  stream while rename, move and delete act per channel, and the previous
  selection matched if any single stream failed. A channel whose primary timed
  out but whose backup played was therefore eligible for renaming, moving and
  permanent deletion. On the install this was measured against, that affected
  21 of the 22 channels the old rule called dead.
- Group selection replaced by one list plus a mode, matching how other plugins
  present it. Old values are read automatically until the new setting is saved.
- Three new opt-in detectors: frozen video, silent audio, and placeholder files,
  the last of which costs no extra probe time.
- An HTML report written to /config/iptv_checker/, grouped by what the operator
  should do about each finding, optionally emailed through Newsflasharr.
- The webhook feature is removed, replaced by that report delivery.
- Validate Settings now reports how many groups will be checked and fits inside
  the toast, which previously clipped its own contents.
- The README is now a short overview with the detail moved to a user guide.

Fields and actions are no longer duplicated in this manifest; they come from the
plugin's own manifest inside the archive.

NOTE ON THE LEFTOVER SOURCE FILES. plugin.py and __init__.py are left in place
rather than deleted in this pull request. External mode ignores them, so they are
inert, and removing them put .py paths in the diff, which made the CodeQL job
select Python and then fail with nothing to extract. Every plugin-specific check
passed in that run: title, manifest validation, antivirus and authorisation.
Happy to remove them in a follow-up, or in this one if you would rather the
CodeQL result be handled a different way.
@PiratesIRC
PiratesIRC force-pushed the iptv-checker-v1.26.2171636 branch from f426299 to f8f25bf Compare August 5, 2026 16:59
@dispatcharr-plugins-bot

This comment has been minimized.

1 similar comment
@dispatcharr-plugins-bot

This comment has been minimized.

@PiratesIRC

Copy link
Copy Markdown
Contributor Author

@sethwv
Hi, could someone take a look at the codeql-analyze check on PR #216 (iptv-checker)? I do not think the failure is caused by the change, and I would rather ask than keep pushing to it.

What the PR does: bumps iptv-checker from 1.26.1741204 to 1.26.2171636 and converts it from a standard listing to an external one. It touches exactly two files, plugins/iptv-checker/plugin.json and plugins/iptv-checker/README.md. It adds and changes no Python at all.

Every plugin-specific check passes: validate-title, validate-plugin (iptv-checker), clamav-scan, detect-changes and report. close-unauthorized is skipped, so authorship is fine. The only failure is codeql-analyze, and Plugin PR Check then fails because it gates on that result.

Why I think it is not this PR:

  1. The PR contains no Python, so there is nothing in it for CodeQL to analyse.
  2. The codeql-analyze job selects languages with find plugins -name '*.py', which matches the whole plugins tree rather than the changed folder, so it analyses every plugin in the repo.
  3. The failing step is "Fail job if CodeQL found high/error/critical issues", and CODEQL_ACTION_ANALYZE_DID_COMPLETE_SUCCESSFULLY is true in that step's environment, so the analysis ran fine and is reporting findings rather than erroring.
  4. PR [ldap-user-sync] Add LDAP user sync plugin #207 (ldap-user-sync), which is a different plugin from a different author, is failing the same check right now.

I cannot see the Security tab on this repo, so I cannot tell which file or rule is producing the findings. If they are in another plugin's existing code, is there anything I should do on my side, or is this something to be cleared centrally?

@PiratesIRC

Copy link
Copy Markdown
Contributor Author

Correcting myself: the CodeQL failure is caused by this pull request, and the two findings are in my own plugin. Sorry for the noise, @sethwv.

The validation comment above names them and I read past it:

Rule Location
py/overly-permissive-file plugins/iptv-checker/iptv_checker/plugin.py:491
py/overly-permissive-file plugins/iptv-checker/iptv_checker/plugin.py:611

What threw me is that the path carries an iptv_checker/ segment which does not exist in this repository. Reading .github/workflows/validate-plugin.yml settled it: the codeql-analyze job has a step "Populate external plugin source for analysis" that downloads the release ZIP for any plugin with source_type: external and extracts it into plugins/<name>/. So converting this listing to external mode is exactly what put my real source in front of CodeQL for the first time. The check is behaving correctly and my four numbered arguments above are wrong.

Both findings are the same construct in two places, the scheduler election lock and its reclaim guard:

os.open(lock_path, os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o644)

0o644 is world readable. Those files hold only a PID and a container boot token and are read and written solely by Dispatcharr's own processes, so 0o600 is correct and costs nothing.

I will change both, cut a new release and point source_url at it. Happy to keep this pull request open and push the version bump here, or to close it and open a fresh one against the new version, whichever you prefer. I will also remove the leftover plugin.py and __init__.py at the same time unless you would rather they stayed.

The two py/overly-permissive-file results reported on this pull request are in
the plugin's own source, which CodeQL now sees because external mode extracts
the release archive before scanning. Both are fixed upstream: the scheduler
election lock files are created 0o600 instead of world readable. A third
creation site that used the builtin open(), and so took the process umask, was
switched to os.open at the same mode.
@sethwv

sethwv commented Aug 6, 2026

Copy link
Copy Markdown
Collaborator

Very welcome to use this existing PR or a new one. Just let me know, or close this one out if you choose to proceed with a new one.

The two py/overly-permissive-file results reported on this pull request are in
the plugin's own source, which CodeQL sees because external mode extracts the
release archive before scanning. Both are fixed upstream: the scheduler election
lock files are now created 0o600 rather than world readable. A third creation
site that used the builtin open(), and so took the process umask, was switched
to os.open at the same mode.

The previous commit on this branch, b641290, is empty. Its message claims this
bump but the upload sent the file back unchanged.
@dispatcharr-plugins-bot

This comment has been minimized.

@dispatcharr-plugins-bot

Copy link
Copy Markdown

Plugin Validation Results

Modified plugins: 1

Plugin: iptv-checker

Check IPTV stream status and quality with ffprobe, then rename, move, restore or delete channels based on the result. Judges a channel by all of its streams, so a working backup never marks it dead.

Source Repository

Check Status Details
Required fields All required fields present
Release artifact Artifact reachable at resolved URL
Maintainers PiratesIRC
License MIT - MIT License
Permission You have permission to modify this plugin
Version 1.26.2181303
Version bump 1.26.17412041.26.2181303

View release v1.26.2181303 on GitHub


🎉 All validation checks passed!

This PR modifies 1 plugin(s) and all checks have passed.


Other plugins by PiratesIRC in this repository (6)
Plugin Slug Version
Channel Mapparr channel-mapparr 1.26.2170831
EPG Janitor epg-janitor 1.26.1791309
Event Channel Managarr event-channel-managarr 1.26.1711720
Lineuparr lineuparr 1.26.2171315
Newsflasharr newsflasharr 1.26.2171427
Stream-Mapparr stream-mapparr 1.26.2141957

@dispatcharr-plugins-bot
dispatcharr-plugins-bot Bot merged commit b4efca1 into Dispatcharr:main Aug 6, 2026
10 checks passed
@PiratesIRC

Copy link
Copy Markdown
Contributor Author

Fixed and green. All validation checks pass, including codeql-analyze.

Upstream release v1.26.2181303 creates every scheduler election lock file with mode 0o600 instead of world readable, and this branch now points version at it. There were three creation sites, not the two CodeQL reported: the lock, its .reclaim guard, and the replacement lock that is renamed over a stale one. The third used the builtin open() and so took the process umask, which would have left the reclaim path installing a world-readable lock over the restricted one it had just replaced. The files hold only a PID and a container boot token and are read solely by Dispatcharr's own processes.

Two notes for the record:

  • Commit b641290 on this branch is empty. Its message claims the version bump, but the upload sent the file back unchanged; 1d92e4c is the commit that actually makes the change. I left b641290 in place rather than force-pushing over a branch that already has review history.
  • plugin.py and __init__.py are still here from the old standard-mode listing. External mode ignores them and neither produces a CodeQL finding, so I have left them. Say the word if you would rather they went.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Plugin Update A plugin already in the repository is being updated.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants