Releases: jstevenscl/epgeditarr
Release list
v0.2.10
What's changed
New aliases
Added 56 verified channel-name aliases for matching real SXM lineup renames (each confirmed still current against the live dataset before adding, not added speculatively from a stale issue):
- 37
X Play-by-Play NNN→X NNNsuffix strips (ACC, Big 12, Big Ten, SEC, Sports) - 2 trademark-symbol drops (
MLB/NHL Network Radio™→ without the ™) - A few dataset typos/abbreviations (
Classic Rewind Just Music,Ozzy's Boneyard Deep Cuts,Sebastian Maniscalco's Comedy Radio) The Weather Channel→FOX Weather(a real rebrand)
Bug fixes
- Wrong hardcoded alias direction —
pro wrestling nation24/7pointed to the wrong (no-longer-current) official name; the dataset dropped the space, the alias still assumed the spaced form was official. Fixed.
Deliberately did not alias the three Limited Edition N renames flagged in an earlier lineup-change issue — those are SXM's rotating guest-content slots, not stable channel identities, and two of the three target names have already rotated away again since being flagged.
Checksums
MD5: c0f9cd0cf1785e4d6d03b3bdb68e07d8
SHA256: 1998aaa02f42101d663c6fc9bb22301be406a3294d0ef2ae2a9496bb2235ac0b
v0.2.09
What's changed
Bug fixes
- Absolute mode placing unmatched channels ahead of real matches — unmatched and duplicate-match-loser channels were filling free slots from the bottom of the reserved block instead of after the highest real match. Since SXM's own numbering starts at station 2, those low slots are never claimed by a real station — this bug backfilled them with unrelated content instead of the end where it belongs. Found via a real user report and confirmed fixed by reproducing the exact scenario before shipping.
- Wrong hardcoded channel alias — removed
"smokey's holidaysoultown" -> "smokey's soul town". Its own comment claimed the holiday channel had been renamed to the regular one; a real user confirmed via their own provider these are genuinely distinct channels, and the forced alias caused a real duplicate-collision once the user corrected their channel's name to be distinct.
New logos
- Added official logos for Little Miss Twain Radio and The Beach Boys Channel (both previously missing with no fallback source available)
Checksums
MD5: d4028646cf86f80863a149bb66f56bcc
SHA256: 2d13d2345d47e8a85c70c86ab657407cd224078f165e4624c537959b0a40b65b
v0.2.08
What's changed
Bug fixes
- SiriusXM EPG source never auto-refreshing —
refresh_intervalwas left at 0 (disabled) on creation, so Dispatcharr's Celery Beat task was never enabled. Now set to 24 hours on create, with a one-time backfill for existing installs. - Prefixed channel names failed to re-match on subsequent runs — a channel already renamed to "036 Alt Nation" by a previous Sort no longer matched "Alt Nation" in the SXM dataset, causing it to drift to the unmatched tail every time Sort, Rename Channels, or Assign Logos ran again. Matching now strips any existing prefix first, across every affected action.
- Duplicate station matches silently collided — two channels matching the same real station number used to receive the identical channel number with no warning. Duplicate matches are now detected, the second is placed in the fill pool instead of colliding, and both are named in the result message.
New features
- Force Category (Series Mode) and Synthesize Episode Numbers From Air Date on EPG Transform — writes categories/season/episode into program data so Dispatcharr's own XMLTV output includes
<category>and<episode-num>tags, letting Plex treat same-titled programs as distinct recordable episodes instead of one movie (#17) - Absolute SXM channel numbering on Sort — channel number = Sort Start Number + real SXM station number, preserving lineup gaps instead of packing channels sequentially. Only offsets confirmed API-matched channels — sport-block and name-guessed matches are never treated as real station numbers. Requires an explicit Numbering Block Size (no silent default) — verified against a real 431-channel provider lineup (99.8% of channels ≤ 999)
- Station-number name prefix (zero-padded or plain), applied whenever Sort runs
CI / Infrastructure
- High-confidence SiriusXM lineup renames (same station number, name changed) now auto-write to
channel_aliases.jsoninstead of sitting unactioned in weekly issues - Orphaned logo cleanup is now targeted at exactly the channels a run's diff confirms were removed, never a blanket sweep
- The weekly lineup-change issue now reports real post-cache logo status instead of static boilerplate
Checksums
MD5: 8e91a62d81a8de235457108aee48a224
SHA256: 0f278e13551fdc86ffa2e4b362dbed991bf2830b6de7272933bdad6b80e037ad
v0.2.07
What's changed
Bug fixes
- Fix SiriusXM Fill EPG always failing with "unclosed token" — The XML sanity check was truncating the XMLTV file to 512 bytes, which always produced an "unclosed token" parse error for valid files. This incorrectly triggered a retry that also failed. The check now correctly allows "unclosed token" (expected from truncation) and only retries on errors that indicate a genuinely corrupt or non-XML response (e.g. HTML 404 page). The retry path itself also applies the same guard so a successful retry on valid XML no longer falsely reports failure.
Improvements
- 504 Gateway Timeout warning — Fill SiriusXM EPG downloads ~200 MB of data and can take 60–90+ seconds. If your reverse proxy has a short timeout, the browser may show a 504 before the response arrives — the backend continues running and the fill completes. The action description in Dispatcharr now explains this, and the README FAQ has a new entry on the topic.
CI / Infrastructure
scripts/cache_logos.pynow gracefully handles missing_workshop/sxm_logos_raw.jsonin CI environments (already shipped in the previous commit)
Checksums
MD5: 6f76fe364fd974cdbb4a27edff645a1c
SHA256: 65a4ea198ec514d430db85b56629dc8a58fd7f4d4f8eeece63aa92b1918e694e
v0.2.06
What changed
- Channel cache: switched from SiriusXM edge-gateway API (broken by passkey enrollment) to rebrowser/siriusxm-dataset public CSV — no credentials required, updates daily
- Alias normalization:
channel_aliases.jsonexpanded with ~25 Rebrowser name variants → canonical names; curly-quote (U+2019) cleanup; dedup by channel number - Unmatched channel log: channel names that fail SiriusXM matching are now persisted in plugin settings and shown in the Status action — copy and share to grow the alias list over time
- Change detection:
detect_channel_changes.pyadds number-based rename matching so renumbered channels aren't reported as new+removed - Code cleanup: stale
_CHANNEL_ALIASESentries removed (all pointed to old API keys), XML control-character regex moved to module level,_append_unmatched_logwrapped in try/except
v0.2.05
What's new
Bug fixes
- Fresh install XMLTV source type bug — EPGeditARR: SiriusXM source was created as
standardtype instead ofxmltv, causing Dispatcharr to fail parsing it with no error message. Required manual API intervention to fix. This release creates it correctly asxmltvand auto-migrates any existing wrong-type sources. - Utah Hockey Club team name corrected in sport sort order (was incorrectly 'Utah Mammoth', their AHL affiliate)
Improvements
- XMLTV character sanitization — strips XML 1.0-invalid control characters from the downloaded XMLTV before parsing, and from the generated XMLTV at write time. Retry on parse failure handles CDN mid-write race conditions.
- Sport team sort order —
_SPORT_TEAM_SORTnow uses real SiriusXM app-stream channel numbers (NFL 800–831, MLB 840–869, NBA 880–909, NHL 920–951), so sort order mirrors the official SiriusXM app lineup - Phase 1 iterparse memory fix — programme elements are now cleared immediately during the channel-only pass, preventing ~246k elements from accumulating in memory
v0.2.04
What's fixed
Two root causes of Docker OOM crashes and uWSGI memory pressure:
1. Signal handler running Fill EPG N times per refresh cycle
The EPG refresh signal fired _action_sxm_fill_epg once per EPG source. With 4+ sources refreshing simultaneously, this spawned N parallel fill runs — each allocating 200–300 MB — causing OOM and Docker daemon crashes. Fixed with a 4-hour cooldown (SXM_FILL_COOLDOWN_SECS) so the fill runs at most once per cooldown window regardless of how many sources trigger the signal.
2. ET.fromstring building full 246k-programme XML DOM in memory
ET.fromstring(xml_bytes) allocated the entire XML DOM (~200 MB) in one shot. In uWSGI without max-requests, Python's allocator holds that heap permanently in the worker process — it never returns to the OS. Replaced with ET.iterparse + elem.clear() streaming — peak XML memory is now ~5 MB and is released when the function exits.
Also fixed: removed prefetch_related("programs") from _do_transform_source — switched to .iterator(chunk_size=) queries to avoid loading all ProgramData into a Python list at once.
Stress test results
4 consecutive Fill & Sort runs on a live instance after a clean Docker restart — uWSGI memory stayed flat throughout. 733 channels, 246,205 programs each run.
Upgrade
Replace your existing plugin zip with epgeditarr-v0.2.04.zip via Plugins → Import Plugin → overwrite.
v0.2.03
v0.2.03 — SiriusXM Fill is now fully self-contained
What changed
SiriusXM Fill EPG now does everything in a single button press:
- Creates the
EPGeditARR: SiriusXMStandard EPG source in Dispatcharr (if it doesn't already exist) - Downloads
siriusxm_epg.xmlfrom GitHub Pages directly - Populates EPGData + ProgramData records into Dispatcharr itself
- Fuzzy-matches your SiriusXM channels to that data and assigns EPG
No separate EPG refresh step in Dispatcharr required.
Channel name cleanup
Channel names in the XMLTV no longer contain Wikipedia artifacts like (formerly 40s on 4). The SiriusXM API migration (v0.2.02) provided clean official names and the XMLTV pipeline was rebuilt automatically.
Other fixes
- Scan no longer counts SiriusXM-assigned channels as 'no EPG'
- Status shows SiriusXM EPG source entry counts and channel assignment count
- Channels already on the SiriusXM source are re-assignable on subsequent Fill runs
- Migrates channels from legacy EPGeditARR: Sports and EPGeditARR: Fill sources automatically on fill run
v0.2.01
What's New
SiriusXM Fill EPG now includes sports intelligence with automatic failover.
Previously, the Fill and Sports EPG buttons were separate. They are now merged into a single SiriusXM Fill button that does everything:
- Fetches the live sports schedule (NFL, NBA, MLB, NHL, Soccer, NASCAR, PGA Tour, IndyCar, Formula 1)
- Sports channels get smart blocks: Upcoming → LIVE → Post-game
- All other channels get repeating fill with real SiriusXM descriptions
- If the sports schedule is unavailable, automatically falls back to repeating fill for all channels — no error, no empty guide
Other Changes
- Expanded logo coverage: XMLTV icon tags now cover ~460 channels (up from 270), including team and college logos matched automatically from the
logos/directory - Community XMLTV feed renamed:
siriusxm_epg.xml(wassiriusxm_sports_epg.xml) — update any bookmarks - Migration: channels previously assigned to the old "EPGeditARR: Sports" source are automatically reset on the next Fill run
Upgrade Notes
If you had the separate Sports EPG button installed (from a pre-release build), that action has been removed. Use the standard SiriusXM Fill button going forward.
v0.2.00
README rewrite, updated screenshots, plugin logo. Self-hosted SiriusXM logo cache (270/270). Rename Channels, Assign Logos, Fill Sort & Logos actions. Switches to zero-padded patch versioning (0.2.00, 0.2.01…) to fix Dispatcharr update detection.