github cenodude/CrossWatch v0.3.8
Version 0.3.8

latest releases: v0.6.4, v0.6.3, v0.6.2...
2 months ago

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/movie types; 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/start or /pause from 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

  1. Open Settings → Scrobble → Watcher.
  2. Toggle Enable and choose Provider (Plex or Emby).
  3. Set Sink to SIMKL, Trakt, or SIMKL+Trakt.
  4. (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.

Don't miss a new CrossWatch release

NewReleases is sending notifications on new releases.