github cenodude/CrossWatch v0.3.9
Version 0.3.9

8 hours ago

CrossWatch – v0.3.9

Analyzer has been improved and rewritten to be more helpful in finding issues. It now focuses on items that have not been synced and surfaces best-effort reasons why. It still can’t magically restore missing items for every setup, but Analyzer should at least point you in the right direction and give you concrete ideas on what to fix. I’m happy to help users with CrossWatch bugs (crashes, failed runs, weird planner output), but I just can’t support to hunt down every missing item in everyone’s libraries. That’s exactly why Analyzer exists: it gives you a focused list of unsynced items plus likely root causes so you can fix IDs and metadata in Plex/Jellyfin/Emby/Trakt/Simkl/mdblist yourself.

What’s new

  • Analyzer backend rewritten.

    • Fresh /api/analyzer/* stack focused on unsynced items instead of generic counts.
    • Problems now classify:
      • missing_peer — item exists at source but not at any active target pair.
      • missing_ids / key_missing_ids / key_ids_mismatch / invalid_id_format.
    • Pairs, features and enabled modes are taken into account, so “issues” are pair-aware.
  • Pair-aware Analyzer UI.

    • New pair strip at the top: PLEX ⇄ JELLYFIN, PLEX → SIMKL, PLEX → MDBLIST, PLEX → TRAKT, etc.
    • Clicking a chip limits the grid and issues to only that pair’s scope.
    • Scope toggle:
      • Scope: issues → only items with missing_peer for active pairs.
      • Scope: all → all items in state.json within the selected pairs.
  • Better issue detail panel.

    • For each issue, Analyzer shows:
      • Provider, feature, title/year/type.
      • A best-effort explanation of what’s likely wrong and where to fix it (Plex/Jellyfin/Emby vs Trakt/Simkl/mdblist).
      • Suggestions pulled from:
        • Peers (same title/year/type).
        • TMDB external IDs and search.
        • Trakt search (de-emphasised when only Trakt data is available).
    • Extra hints for language / alt-title mismatches on media servers (e.g. Dutch vs English episode titles) when IDs look fine but peers still fail.
  • Manual ID editing inside Analyzer.

    • New “Manual IDs” block per item with inline fields for:
      • imdb, tmdb, tvdb, trakt, plex, simkl, emby, mdblist.
    • Save IDs:
      • Normalises values (e.g. tt1234567, numeric TMDB/TVDB/etc).
      • Optionally rekeys the item based on IDs.
      • Re-evaluates pair presence so the item can drop out of the issues list after a fix.
    • Reset restores the original IDs from state.json for that item.
  • Cleaner grid and footer.

    • Pair-filtered item list: if you select PLEX → MDBLIST, the grid shows only items relevant for that pair.
    • Compact footer with a quick overview per provider, e.g.:
      PLEX 1.4k | JF 1.3k | SIMKL 2 | MDB 2 | TRAKT 2.
    • Split-pane between list and issue detail is resizable again and remembered per browser.

Fixes

  • False positives reduced.

    • Missing-peer detection now respects:
      • Enabled pairs only.
      • Direction and feature (history/watchlist/ratings).
    • Items with peers on some targets but not others are scoped correctly instead of being flagged everywhere.
  • Stale suggestion mismatches reduced.

    • Suggestions are deduplicated on ID signature, so TMDB/Trakt/peer candidates that resolve to the same IDs are collapsed into a single line.
    • Trakt-only hits no longer dominate results when better TMDB/peer IDs are available.
  • Ignore flag respected.

    • Items with _ignore_missing_peer set in state are excluded from missing_peer problems and from Analyzer’s issues view.

If Analyzer still shows a lot of “missing peer” items after this release, you probably have real ID gaps now instead of Analyzer mismatches.


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.