CrossWatch – v0.3.8
Plex & Jellyfin history got better
What’s new
- Episode-accurate writes to Plex. When syncing from Jellyfin, episode events now resolve to the episode ratingKey, not the show, so only the intended episode is marked watched.
- Presence cache for Jellyfin. A short-lived blackbox presence TTL prevents re-planning items that are already watched on Jellyfin, so follow-up runs don’t try to re-add the same history.
- Cleaner follow-up runs. After a successful write, subsequent runs treat those items as present, reducing noise and making “0 adds” the norm when you’re in sync.
Fixes
- Plex normalization from episodes. Provider→Plex now normalizes TV-Shows from episode context, avoiding accidental show-level scrobbles when only an episode was watched.
- Safer scrobble guard. Plex scrobbling is restricted to
episode/movietypes; show containers are ignored. - Jellyfin snapshot stability. History snapshot merges recent “shadow” writes and TTL-bounded presence hints, eliminating repeat add attempts and planner churn.
- Skip semantics clarified. “Skipped” in apply logs means “already present on the destination.” Subsequent runs won’t keep planning those items.
Configuration
- No breaking changes.
- Optional:
blackbox_presence_ttl_seconds(Jellyfin) defaults to 900s if unset.
No manual reset required. If you want a clean slate for testing, you can clear .cw_state/*history.* shadow/blackbox files.
CrossWatch – v0.3.7
Ratings sync is smarter and safer. SIMKL scopes are now enforced automatically.
What’s new
- Rating Season toggle For some strange reason i did not include the season rating toggle, so you can also sync seasons now.
- Provider-aware ratings scope. When SIMKL is in a pair, Seasons and Episodes are auto-disabled and greyed out in the Ratings panel.
- SIMKL ratings feel instant. We now remember recent SIMKL rating writes for a short window (“shadow”), so the next run sees them immediately.
- Trakt season/episode compatibility. Ratings payloads for Trakt now use only the IDs Trakt accepts per type, so your writes go through cleanly.
Fixes
- False mappings into SIMKL. Prevented by scoping (Seasons/Episodes blocked for SIMKL) and stricter ID handling during writes.
- *Ratings delta “no-op” runs. Updates were missed when caches/watermarks didn’t advance; this is corrected and recent changes are detected.
- Trakt “not accepted” on seasons/episodes. Sanitized IDs per type, avoiding server rejections.
- Ratings UI clarity. Scope toggles reflect provider capability; disabled items are visibly greyed out to avoid confusion.
No configuration changes required.
CrossWatch – v0.3.6
Instant whitelist toggles (Jellyfin & Plex) and MDBList show-ratings are now supported.
What’s new
- MDBList: TV show ratings sync. CrossWatch now writes show-level ratings to MDBList. Season/episode ratings still work as before.
- Immediate feedback in Settings. Clicking a whitelist item in Plex and/or Jellyfin now updates instantly and syncs the hidden fields.
Fixes
- MDBList ‘shows’ were skipped. Upstream API bug is fixed;
- MDBList Rating feature is enabled again.
- Whitelist Selections not visible for Plex/Jellyfin. Matrix repaints after each toggle; .
- Master toggles out of sync. Recomputed after every change (also when filters are applied).
No configuration changes required.
CrossWatch – v0.3.5
Important: MDBList Ratings currently do not sync TV (shows/episodes). Movies work. Until we finish the deeper dive, disable MDBList Ratings and use Watchlist only.
What’s new
- Analyzer: MDBList included for ID resolution.
- Exporter: MDBList added as an output/source.
Changes
- Added MDBList to Analyzer so IDs resolve correctly.
- Added MDBList to Exporter.
CrossWatch – v0.3.4
Whoop,whoop.....new provider is added.
New tracker (Experimental): MDBList to sync your Watchlist and Ratings.
Early access: APIs/behavior may change; expect a few rough edges.
What’s new
- MDBList provider
- Watchlist sync (add/remove) and Ratings sync (1–10), one- or two-way.
- Works alongside Trakt/SIMKL and your media servers (Plex/Jellyfin/Emby).
- TMDb/IMDb first for writes; TVDb supported for reads/normalization.
- UI integration
- New Authentication → MDBList panel (Verify, Save, Disconnect).
- Shows Connected when a valid API key is present.
- Added MDBList badge in the features list.
- Engine & health
- Snapshot indexing with progress ticks, rate-limit aware requests, and health probe.
Heads-up: MDBList does not support episodes for ratings. Only movies and shows.
What is MDBList?
MDBList is a smart list builder for movies & TV. It lets you:
- Create auto-updating lists using flexible rules (genres, years, keywords, runtime, country/network, streaming availability).
- Blend scores from multiple sources (IMDb, TMDb, Rotten Tomatoes, Metacritic, Letterboxd, MyAnimeList) and sort by popularity/trending.
- Sync/publish lists to Trakt, feed them to Radarr/Sonarr/Stremio.
- ....and much more...
CrossWatch – v0.3.3
Plex → Trakt scrobbling now uses the same TMDb/Trakt-first strategy as v0.3.2 (Jellyfin webhook).
No more TVDB-only failures from Plex webhooks.
What’s new
- TMDb/Trakt-first resolution: We now prioritize TMDb and IMDb from Plex GUIDs and only fall back to TVDB if needed.
- Show+S/E fallback: When an episode ID can’t be resolved yet, we build the Trakt body with show ids + season/episode numbers so newly aired items still scrobble.
- 404 rescue: If Trakt returns 404, we auto-retry by searching the episode via TMDb/IMDb/TVDB to fetch the correct Trakt ID, then replay the scrobble.
- Broader Plex GUID parsing: We read IDs from multiple places Plex sends them (
guid,grandparentGuid,parentGuid,Guid[]), improving match rates across agents.
Fixes
- TVDB-only scrobbles from Plex failing: Resolved by translating TVDB to Trakt/TMDb before sending, with a rescue path on 404.
- Episodes missing direct episode IDs: Covered by show+season/episode fallback so scrobble bodies remain valid.
- Inconsistent GUID formats: Handled by expanded parsing across all Plex GUID locations.
No config changes required.
CrossWatch – v0.3.2
Jellyfin → Trakt scrobbling for new episodes is improved.
TMDb/Trakt-first ID strategy (no more TVDB-only failures).
Smarter Jellyfin payload parsing (better S/E + ID extraction).
What’s new
- Show+S/E fallback: If an episode id isn’t resolvable yet, we build the Trakt body with the show ids + season/episode numbers (clean path for newly-aired items).
- Rescue on 404: If Trakt returns 404, we auto-retry by searching the episode via TMDb/IMDb to fetch the right Trakt id, then replay the scrobble.
- Broader Jellyfin field support: We now read IDs and S/E from more places Jellyfin sends them:
Provider_tmdb/imdb/tvdb,SeriesProviderIds,SeriesTmdbId/SeriesImdbId/SeriesTvdbId, plus root-level season/episode.
Fixes
- **“.Starts/pauses/stops from Jellyfin now scrobble even when TVDB lags behind.
- 404 on
/scrobble/startor/pausefrom Jellyfin: Resolved by using TMDb/Trakt-first resolution and the rescue path. - Missing S/E numbers when only on the root payload: We now read season/episode from both the item and the root, so the scrobble body is always valid.
No config changes required. Optional: set Jellyfin’s TV metadata provider to TheMovieDB for the smoothest ID mapping.
CrossWatch – v0.3.1
Watcher now supports SIMKL. SIMKL is my personal preferred tracker.
Dual-sink scrobbling: send playback to SIMKL, Trakt, or both, your call.
What’s new
- SIMKL as a Watcher sink: Real-time scrobbling from Plex or Emby to SIMKL (movies & episodes). Pick SIMKL, Trakt, or SIMKL+Trakt in Settings → Scrobble → Watcher.
- Runs alongside Trakt: If you choose both, CrossWatch sends the same play/pause/stop to SIMKL and Trakt in one go.
- Simple setup: Enable Watcher, pick Plex or Emby, choose your Sink, done. Your choice is saved and used on the next run.
How to use
- Open Settings → Scrobble → Watcher.
- Toggle Enable and choose Provider (Plex or Emby).
- Set Sink to SIMKL, Trakt, or SIMKL+Trakt.
- (Optional) Turn on Autostart on boot.
Make sure your SIMKL account is connected under Authentication first.
More info: https://github.com/cenodude/CrossWatch/wiki/Watcher
CrossWatch – v0.3.0
Watchlist sync: is now consistent both ways across Plex, Trakt, and SIMKL — adds and deletes propagate cleanly in the same run.**
Big internal code cleanup: of the pairing engine to reduce “stuck” items and accidental removals.
SIMKL Sync MOD: updated to version 1.0.0
What’s new
- True two-way flow across multiple pairs: Remove or add on any side (Plex/Trakt/SIMKL) and the change is reflected everywhere, even when you run separate pairs in one run.
- Fresh index after writes: After we add/remove on a destination, we immediately refresh that destination so the next pair in the run “sees” the new state.
- SIMKL snapshot smarts: Automatic full refresh when the cache looks stale; otherwise fast incremental updates. Fixes the “SIMKL still shows an old item count” issue.
- Safer delete rules: An item is only deleted if it previously existed on that destination and was observed as removed at the source. This avoids cross-pair false deletes.
- One-way parity: One-way sync benefits from the same safeguards (fresh-after-write visibility, safer deletes, and unresolved tracking) as two-way.
Fixes
- Observed deletes: provider-aware. If a provider can’t report deletions, we don’t invent them. We log it and keep your lists intact.
- Trakt confirmations edge case: Handles the “HTTP 200 but 0 confirmed” scenario more clearly and tracks unresolved state correctly.
- No blocklists on watchlist adds: Blocklists continue to apply to History/Ratings, not Watchlists.
No config changes required. If strange things happens, reset you state in Maintenance.
The order of your PAIRS are important when using multiple two-way syncs pairs with the same Source or Destination.