Skip to content

Fix dead dshm.tmsimg.com image host, add plugin.json manifest - #5

Closed
kilo-WATT wants to merge 1 commit into
jesmannstl:mainfrom
kilo-WATT:fix/dead-image-host-and-plugin-json
Closed

Fix dead dshm.tmsimg.com image host, add plugin.json manifest#5
kilo-WATT wants to merge 1 commit into
jesmannstl:mainfrom
kilo-WATT:fix/dead-image-host-and-plugin-json

Conversation

@kilo-WATT

Copy link
Copy Markdown

Fixes #3

Summary

zap2xml.py hardcodes the Gracenote image CDN host dshm.tmsimg.com in two places. That host no longer resolves (NXDOMAIN, confirmed against 1.1.1.1), so every <programme> <icon> in the generated XMLTV points at a dead host — downstream media servers (Jellyfin, in my case) can't fetch any program thumbnails and log thousands of failed pre-cache warnings per guide refresh.

This is a recurring problem: the code already migrated once before (zap2it.tmsimg.comdshm.tmsimg.com), and now dshm itself is dead.

Changes

  • zap2xml.py (~line 481, ~line 499): swap the two dshm.tmsimg.com references to demo.tmsimg.com, which resolves and serves the identical /assets/pXXXX_*.jpg paths.
    • dig +short @1.1.1.1 dshm.tmsimg.com → no answer (dead)
    • dig +short @1.1.1.1 demo.tmsimg.com → resolves (CloudFront)
    • curl -I https://demo.tmsimg.com/assets/p410078_b_v13_am.jpg200 OK, same asset path pattern
    • A config field or API-derived host would make the next rotation not require a code change, but that's a bigger change — kept this fix minimal per the issue's suggestion.
  • plugin.json (new file, added to the zip alongside plugin.py): generated from the plugin's own fields/actions. The plugin currently ships with no manifest, so Dispatcharr flags it as a legacy plugin ("Please update or ask the developer to add plugin.json"). This clears that warning.

Test plan

Both changes have been running in production on a live Dispatcharr instance for about a week: demo.tmsimg.com resolves reliably and thumbnails load correctly in Jellyfin's Live TV guide (no more Unable to pre-cache warnings), and plugin.json clears the legacy-plugin warning in Dispatcharr's plugin UI with no other behavior change.

(This repo ships the plugin as zap2xml.zip rather than loose files, so a raw git diff on the zip isn't reviewable in GitHub's UI — the changes are the 3-line host swap plus the one new plugin.json file described above; plugin.py, channels.db, and __init__.py are untouched. Kept independent of #4 so it can be reviewed/merged on its own.)

🤖 Assisted by Claude Code

Fixes jesmannstl#3

Gracenote retired the dshm.tmsimg.com image CDN subdomain (NXDOMAIN,
confirmed against public resolvers), so every <programme> <icon> in
the generated XMLTV points at a dead host — Jellyfin logs thousands
of "Unable to pre-cache" warnings and Live TV guide thumbnails never
load.

- zap2xml.py: swap the two hardcoded dshm.tmsimg.com references
  (~line 481, ~line 499) to demo.tmsimg.com, which resolves and
  serves the identical /assets/pXXXX_*.jpg paths (verified: HTTP 200).
  This is a recurring problem (zap2it.tmsimg.com -> dshm.tmsimg.com
  was an earlier rotation) — a config field or API-derived host would
  avoid the next hardcoded-host rot, but out of scope for this fix.
- Add plugin.json (generated from the plugin's own fields/actions),
  which clears Dispatcharr's "legacy plugin, please add plugin.json"
  warning. The plugin currently ships with no manifest at all.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@kilo-WATT

Copy link
Copy Markdown
Author

Folded into #4 — didn't need to be a separate PR, both fixes were found in the same debugging session. Closing this one.

@kilo-WATT kilo-WATT closed this Aug 5, 2026
@kilo-WATT
kilo-WATT deleted the fix/dead-image-host-and-plugin-json branch August 5, 2026 17:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: Program thumbnails broken: dshm.tmsimg.com image host no longer resolves (+ add plugin.json)

1 participant