What's New in v1.26.1081615
This release carries a significant feature expansion and the switch to date-based (calver) versioning. The next section lists everything that changed since the previous release (v0.7.0, 2026-04-05).
✨ New Features
Rule engine
[UndatedAge:N]hide rule — tracks per-channel first-seen dates in/data/event_channel_managarr_undated_first_seen.jsonand hides channels whose names carry no parseable date once they've been present for more thanNdays. Catches stale placeholder channels that date-based rules can't evaluate. Timezone-aware; tracker resets when a channel's name changes.
Managed Dummy EPG (opt-in)
- New toggle 🗓️ Manage Dummy EPG. When on, visible channels with no EPG get bound to a plugin-managed
EPGSource(source_type='dummy', name='ECM Managed Dummy')via a per-channelEPGDatarow keyed bychannel.uuid. - Dispatcharr's guide then renders:
- During the event window: the extracted event title.
- Before the window:
Upcoming at <start-time>: <title>. - After the window:
Ended at <end-time>: <title>. - Channels with no parseable time: a 24-hour program showing the channel name.
- Event duration, and the source-timezone encoded in channel names (default
US/Eastern), are both configurable. - Regex patterns match
PPV EVENT NN: …,LIVE EVENT NN Hpm …,PPVNN | …, and the leading5pm/9am/1:35pmtime forms typical of event-channel feeds. - Toggling the feature off cleanly detaches every channel on the next scan.
Notification polish
- Dry Run / Run Now now run synchronously — the action button's built-in loading spinner covers the busy state and a single concise completion notification fires on return. Example:
Run Now: 103 channels | 47 hide / 0 show | EPG +1/-0 | CSV: <file>. - 🩺 Check Scheduler Status rewritten for honest per-worker reporting — shows the current worker's PID, configured times, next run, container-wide last-run history, and whether a scan is holding the cross-process lock, all in 4 compact lines.
Dispatcharr v0.20+ UX
- Settings form reorganised into six sections: Scope, Hide Rules, Duplicates, EPG Management, Scheduling & Export, Advanced (via
type: infodividers). - Text-heavy fields switched to
type: text, numeric fields totype: number. - Action buttons got
button_variant/button_color/button_labelstyling and confirmation dialogs on destructive operations (Remove EPG, Clear CSV, Cleanup Orphaned Tasks, Run Now). help_urlfield inplugin.jsonsurfaces as a clickable help link in the Plugins page.- Plugin ships a
logo.png(300×300 RGBA), auto-discovered by Dispatcharr.
Performance / reliability knobs
- 🐢 Rate Limiting select (none / low / medium / high) — adds 0 / 0.05 / 0.2 / 0.5 seconds between per-channel ORM writes. Useful for very large profiles or constrained databases; no measurable overhead at the default.
- Cross-worker scan lock —
SCAN_LOCK_FILEflock now wraps the entire scan entry point, so scheduled and manual runs alike are serialised across every uwsgi worker.
CSV export — now self-describing
- Settings snapshot block in every CSV header: dumps every user-facing setting value so a two-week-old CSV can still answer "which regex was active when this ran?"
- Managed EPG Attached / Detached counts and Rate Limiting level in the header summary.
- Per-channel
managed_epg_assigned/managed_epg_detachedboolean columns on every row.
Tooling
bump_version.pymaintainer helper — generates calver1.YY.{DDD}{HHMM}from UTC timestamp and updates bothplugin.pyandplugin.jsonin lockstep.
🐛 Bug Fixes
- Time-colon false positives in
[ShortDescription]/[EmptyPlaceholder]/[ShortChannelName]. Channel names likePPV03 | Hepi vs. Wisniewski Apr 18 7:00AMwere being hidden because the colon inside7:00AMwas treated as a separator. Rules now require the colon to be followed by whitespace to count as a separator; time-colons are skipped. - Bare-hour AM/PM times in the managed dummy EPG —
5pm,7am,8pmnow parse correctly, raising event-window coverage on the author's PPV/Live channel feed from roughly half to nearly all. The extracted title no longer carries the leading time as a prefix. - Midnight-crossing in
[UndatedAge:N]—today_stris now captured once per scan so the record-tracker and rule-evaluator agree on "today" even when a scan straddles local midnight. - Ignored / force-visible channels preserve undated-tracker entries — previously, adding a regex to ignore or force-visible a channel reset its
first_seendate. - Report-row sync for detached channels — when an ignore-regex causes the plugin to detach a channel from managed EPG, the CSV row now correctly reports
managed_epg_detached: Trueinstead ofFalse. - Uniform rate-limiter pacing across all per-channel branches (ignore-regex, force-visible, and normal).
- Transaction boundary in
_attach_managed_epg—get_or_create EPGDataand the finalbulk_updateare now in onetransaction.atomic()so a bulk_update failure can't leave orphan EPGData rows. - Stuck busy-notification on Dry Run / Run Now — replaced by a synchronous-with-spinner pattern that auto-resolves on completion.
[UndatedAge:2:4h]typo crash —_check_hide_rulenow accepts tuple-formrule_paramdefensively; bad rule input logs a warning instead of aborting the scan._save_undated_trackererror reporting — now returnsbool; summary log accurately reports "saved" vs "save FAILED".- Dry-run purity preserved for managed dummy EPG — dry runs never create the
EPGSourcerow and never attach/detach bindings.
🔧 Internal
- Switched from
0.X.Ysemver to calver1.26.{DDD}{HHMM}to match the Lineuparr / Channel-Mapparr / EPG-Janitor cohort.bump_version.pyautomates the bump. plugin.jsonschema aligned with Dispatcharr v0.20+ conventions.Plugin.actionsclass attribute kept in sync withplugin.json.- Internal
docs/superpowers/planning and design tree moved out of the shipped git tree (still maintained locally for development).
📦 Install
Download Event-Channel-Managarr.zip (attached below), then in Dispatcharr → Plugins → Import Plugin → upload the zip.
Requires Dispatcharr v0.20.0 or newer (declared via min_dispatcharr_version).
See the repository README for the full feature list, rule semantics, settings reference, and CSV format.