v0.2.16

Version 0.2.16

  • Tag: v0.2.16

  • Published: 2025-10-25T23:40:33Z

  • GitHub: https://github.com/cenodude/CrossWatch/releases/tag/v0.2.16

CrossWatch – v0.2.16

Webhooks got a big glow-up (Plex, Jellyfin, Emby). Not gonna lie: making webhooks behave is extremely tricky. The Watcher? Way simpler. The catch with webhooks is we only get what your media server sends, and Plex keeps things a bit… ehmmm...minimal. That’s where credits-skip and “auto play next” from Plex like to mess things up.

Note: For Webhooks; my Jellyfin testing is limited, and I can’t test Emby at all (no Emby Premiere). I’m primarily a Plex user. Recommended advanced webhook settings: set Stop→Pause threshold to 85% and Force stop to 95%. All values as described below are configurable and are based on the recommended settings:

✨ What’s new

“Media server knows best”

  • Plex: media.scrobble (threshold/credits) is treated as authoritative so we finish at ≥95% so Trakt marks watched even if offsets look tiny after credits-skip.

  • Jellyfin & Emby: If the payload/UserData indicates Played/Watched (or PlayCount > 0 / “ItemMarkedAsPlayed”), we treat it as authoritative and finish at ≥95%. Manual “Mark as played” now reliably reflects on Trakt.

Plex autoplay quarantine (new)

  • After a STOP at ≥95%, if a new episode autostarts quickly, we quarantine the start.

  • After suppress_autoplay_seconds (default 15s), we probe GET /status/sessions and:

    • If the player is playing the quarantined item → we send a normal start.

    • If not playing → we clear quarantine (no accidental scrobble).

  • New Plex-only config:

    • suppress_autoplay_seconds: default 15. Set this a few seconds above your Plex autoplay countdown. For a 10-second countdown, use 13–15s.

    • probe_session_progress: default true (corrects bogus % via /status/sessions when credits are skipped).

Trakt-first, safer ID strategy

  • Prefer ids.trakt; for episodes, fall back to show.ids + S/E.

  • Adds episode GUID search rescue (/search/{imdb|tvdb|tmdb} type=episode) when Trakt returns 404.

Smarter end-of-item behavior

  • Rewatch-aware regression clamp: prevents % from jumping backwards, but correctly resets on a fresh (re)start/new session.

  • Pause @ ~100% clamp: pauses that report 100% clamp to ≥95% so STOP cleanly completes as watched.

  • Demote suspicious STOPs (e.g., sudden jumps from low % → 98%) to PAUSE unless thresholds met.

  • Debounce rapid STOP/PAUSE spam to avoid noisy or duplicate calls.

🔧 Fixes & Changes

  • Trakt 409 checkin conflicts auto-resolved by clearing /checkin and retrying.

  • Backoff on 429/5xx responses.

  • Cross-provider Watchlist auto-remove triggers on STOP

  • Cleaner logs: clear “intent → response” lines, quarantine probes, and ID resolution.


CrossWatch – v0.2.6

New: Emby provider (early days). Right now it supports watchlists, webhook (code is there, untested), and the Watcher. I don’t have Emby Premiere, so webhook testing cant be done by me. History and Ratings for Emby are planned, just not shipped yet. This is the last new provider for a while as I’m switching focus to polish and speed.

Rule of thumb: Got Plex Pass / Emby Premiere / Jellyfin? → use webhooks. No Pass/Premiere? → use the Watcher.

🔧 Fixes & Changes

Main

  • Sync bar: a few more UI tweaks..

  • Sync output: fewer “freeze-like” moments while streaming logs.

Scrobbler

  • Plex ↔ Emby switch: you can toggle which one scrobbles; only one can be active. Heads-up: filters/libraries apply per provider, so review your scopes when you switch.

Emby

  • Watchlist

    • Supports three modes: favorites (stars), playlist, and collection.

    • Default list name comes from watchlist_playlist_name configure in UI. Dont use Playlist as it only supports movies and episodes (no shows)

  • Webhook (untested): implemented reusing Jellyfin logic; needs Emby Premiere to enable server-side webhooks.

  • Watcher: polling fallback for folks without Premiere. It’s light, reliable, and works out of the box.

🧠 Known Limits (Emby)

  • History / Ratings: not available yet here. Dont ask for it. It will be there when its ready.

  • ID matching: works best when your Emby items have TMDB/IMDB/TVDB IDs.


CrossWatch – v0.2.5

small but solid update: code cleanup, a few fixes, and a new experimental Plex option.


🔧 Fixes & Changes

Main

  • Synchronization bar – minor UI tweaks and a tooltip so you can quickly see which phase the run is in.

  • Insights accuracy – adjusted calculations so the statistics reflect more accurate totals.

Plex

  • Experimental: Fallback GUID – when Plex can’t fully identify a watched or rated item (e.g., it was removed from your PMS or the lookup errors), this tries extra methods to recover IDs so the sync can proceed. ⚠️ Use only if you understand the trade-offs and are having matching issues. Read more: https://github.com/cenodude/CrossWatch/wiki/mod_PLEX


CrossWatch – v0.2.4

Note: This update rearranged some webhook config keys. It should not affect your current config.json. If it does, rebuild your config (delete it and reconfigure).

✨ Focus - Webhook support for Plex and Jellyfin (Plex & Jellyfin → Trakt)

  • Now works + Jellyfin support. Have Plex Pass? Prefer Webhook. No Plex Pass? Use the Watcher. Jellyfin users: use the Webhook.

  • Endpoints:

    • Plex → /webhook/plextrakt

    • Jellyfin (Webhook plugin, Generic) → /webhook/jellyfintrakt

  • Setup guide: see the wiki for step-by-step instructions (Jellyfin users: must-read). https://github.com/cenodude/CrossWatch/wiki/Webhooks

🔧 Fixes & Changes

Plex (History)

  • Whitelist reliability: improved section ID detection for history rows so library whitelisting is consistently applied.

Jellyfin

  • Improved settings: added in Authentication Providers → Jellyfin → Settings. You can now change users and whitelist libraries.

Analyzer

  • Better visibility: added a waiting overlay, especially useful for larger state.json files.


CrossWatch – v0.2.3

Sorry—another update. The coming weeks I’ll push more frequent fixes to squash those small annoying bugs that have been bugging me for way too long 🙂

🔧 Fixes & Changes

Main

  • Sync output honors debug: Beautifier is disabled when runtime.debug or runtime.debug_mods is true.

  • Live log reliability: Added SSE watchdog + auto-reconnect when the stream goes quiet; flushes the remaining buffer on error and preserves slider/stick-to-bottom.

Analyzer

  • Counts match reality: Issues are filtered by enabled pairs from /api/pairs and by enabled features (history/watchlist/ratings).

  • Clear footer totals: Footer now shows Issues: N • H:x • W:y • R:z so feature backlogs can’t hide real deltas.

  • Pair map: Analyzer understands the new pairs schema (source/target, per-feature enable)


CrossWatch – v0.2.2

🧪 Analyzer added (early-access / best effort ... whatever)

  • Helps spot items that are stuck across providers (PLEX, JELLYFIN, TRAKT, SIMKL).

  • Shows Issues: N based on your sync pairs (e.g. missing peers), plus per-item suggestions and where to fix (typically Plex/Jellyfin).

  • Practical UI: search, toggle IDs, resizable columns, and a footer with provider counts.

  • It won’t edit SIMKL/TRAKT for you; it guides you to fix metadata at the source and then re-sync.

  • If it works great—awesome. If not… at least you tried 🙂. (It’s early; feedback welcome)

  • Tip: Add TMDb/Trakt keys to get smarter suggestions.

Docs: Analyzer Wikiarrow-up-right


CrossWatch – v0.2.1

✨ Focus

  • Numbers that match reality in statistics and insight

  • Multi-arch images (AMD64 + ARM64)

🔧 Fixes & Changes

  • No more double counting: We stop stacking the same totals; we keep the highest number instead of adding.

  • Watchlist is fair: Title tweaks/renames are shown as updated (~), not fake added (+).

  • Ratings with meaning: Badges now show + / − / ~ (add, remove, update).

  • Don’t miss events: Ratings/History no longer require a title, so silent providers don’t cause undercounts.

  • Smarter matching: “Dune Part 2” ≈ “Dune: Part Two” (fewer bogus add+remove combos).

  • Improved stability: various fixes


CrossWatch v0.2.0 — Big, refactored, and yes… probably many new bugs 🙂

Faster syncs, safer writes, cleaner UI. Two-way flows are steadier, SIMKL + Jellyfin behave better, Trakt refreshes itself, progress bar is sane, scheduler is actually useful. Breakage risk is low but back up /config anyway.


Highlights

  • Big refactor: FastAPI split into lean routers; providers + orchestrator modules cleaned up for speed and reliability.

  • Safer syncs: Mass-delete guard rails, health status and “suspect shrink” protection; additions/updates chunked; smarter delta reuse.

  • Two-way sync that sticks: Less flip-flop from weak IDs; better source-of-truth handling across mixed pairs.

  • Scheduling 2.0: Hourly / every-N-hours / daily time, per-timezone, optional jitter, manual “run now”, resilient loop.

  • Debug levels: Off · On · On + MOD debug · On (full HTTP) best is On + MOD debug

  • Auth mod Plex improvement: in authentication providers there is now a new settings menu for Plex (server settings, user settings and whitelisting of libraries)

  • Sync mod Jellyfin improvement: many fixes, should work better now. Also watchlist can now sync to favorites, Playlist and Collections

  • Watchlist: new GUID normalizations will provide better results


What’s new (user-visible)

UI/UX

  • Progress bar partly fixed: No early jump to 90%. “Apply” phase is shown only after all snapshots complete.

  • Run safety: Start/stop visuals are guarded (no more startRunVisuals is not defined).

  • Troubleshoot panel: One-click Clear cache, Reset stats, Reset state.

  • Auth flows: Plex PIN and SIMKL OAuth are smoother; clearer status + error toasts.

  • Wiki surfaced: Help links right in the app (Getting Started, Config, FAQ).

Providers

  • Plex

    • Server URL is sticky: Suggestions won’t override a value already saved in config.

    • Better library scoping and discovery hints.

  • SIMKL

    • Fresh “present” snapshots when activity changes (bypasses stale ETag/304). Fewer “why didn’t my add propagate?” moments.

  • Trakt

    • Auto token refresh before/after calls; 401/403 retries wired in.

  • Jellyfin

    • Capability reporting cleaned up; fewer re-add loops via smarter ID/shadow handling.

Orchestrator

  • Faster snapshots; smarter enrichment ordering; fewer duplicate passes.

  • Safer writes with chunking + tiny pauses to avoid API spikes.

  • Telemetry (opt-in) trimmed and less noisy.

Scheduling

  • Modes: disabled | hourly | every_n_hours | daily_time.

  • Timezone-aware start; optional jitter_seconds to avoid herd starts.

  • Visible “next run at” + last result in the UI.

Config (still JSON, still simple)

  • New debug trio: runtime.debug, runtime.debug_mods, runtime.debug_http.

  • Stability knobs: snapshot_ttl_sec, apply_chunk_size, apply_chunk_pause_ms, and mass-shrink guards (suspect_min_prev, suspect_shrink_ratio).


Fixed (the greatest hits)

  • Watchlist delete (SIMKL/Trakt): actually removes items and stays removed.

  • Endless re-adds from weak/agent IDs reduced (IMDb/TMDb/TVDb priority).

  • Insight/List noise reduced (hide disconnected providers).

  • UI errors from timing/race conditions hardened.


Breaking/behavior changes

  • Internal API/routers were refactored; external endpoints remain the same for normal use.

  • If you see odd counts after upgrade: use Maintenance → Clear cache and hard-refresh the UI.


Upgrade notes

1

Stop container; back up your /config.

2

Remove your complete /config

3

Pull latest: ghcr.io/cenodude/crosswatch:latest.

4

Start; visit Settings → verify tokens + library scopes.

5

Test one pair first; then enable Scheduling if desired.


Known rough edges (being honest)

  • Stats can be off in edge cases (work in progress).

  • Some UI sections don’t auto-refresh perfectly (do manual refresh).

  • SIMKL & Jellyfin are still maturing; report weirdness with logs.

  • see WIKI for more issues: https://github.com/cenodude/CrossWatch/wiki


Last updated