Plex progress feature implementation (resume position indexing and writes).
Related:
Pair setting: Progress
Technical blueprint: Progressarrow-up-right
This feature syncs resume position ("Continue Watching") for Plex items.
Movies: ✅
Episodes: ✅
Reads: Plex "Continue Watching" / resumable items.
Writes:
add upserts resume position.
add
remove (clear) is blocked on Plex for safety.
remove
features.progress.enable
features.progress.add
features.progress.remove: ignored for Plex clears
features.progress.remove
features.progress.min_seconds (default 60)
features.progress.min_seconds
60
features.progress.delta_seconds (default 30)
features.progress.delta_seconds
30
features.progress.max_percent (default 95)
features.progress.max_percent
95
Progress never clears from absence.
Near-complete items (>= max_percent) are skipped.
max_percent
Clearing progress on Plex is unreliable. CrossWatch blocks it.
Primary index comes from Plex "Continue Watching":
viewOffset → progress_ms
viewOffset
progress_ms
duration → duration_ms
duration
duration_ms
lastViewedAt/viewedAt → progress_at
lastViewedAt
viewedAt
progress_at
Upsert uses PlexAPI updateProgress(ms, state="stopped").
updateProgress(ms, state="stopped")
Fallback uses updateTimeline when needed.
updateTimeline
Clears are intentionally blocked (remove() returns not_supported).
remove()
not_supported
Progress uses conservative thresholds to avoid spam:
ignore progress < min_seconds
min_seconds
only write when delta >= delta_seconds
delta_seconds
ignore progress >= max_percent of duration
providers/sync/plex/_progress.py
cw_platform/orchestrator/_planner.py::diff_progress
Plex writes need a rating key.
Resolution order:
Use ids["plex"] when present.
ids["plex"]
Else resolve by GUID candidates derived from external IDs.
If you see repeated "unresolved" items, your external IDs are missing.
Last updated 16 days ago
Was this helpful?