Jellyfin 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 a Jellyfin user.
Movies: ✅
Episodes: ✅
Reads: Jellyfin resumable items.
Writes:
add upserts resume position.
add
remove clears resume position (sets it to 0) when enabled.
remove
0
features.progress.enable
features.progress.add
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.
Only an explicit progress_ms = 0 can trigger a clear.
progress_ms = 0
Near-complete items (>= max_percent) are skipped.
max_percent
Jellyfin indexes resumable items via the user Items endpoint.
PlaybackPositionTicks → progress_ms (ticks / 10,000)
PlaybackPositionTicks
progress_ms
ticks / 10,000
RunTimeTicks → duration_ms
RunTimeTicks
duration_ms
LastPlayedDate → progress_at
LastPlayedDate
progress_at
Writes use the UserData endpoint:
Upsert: set PlaybackPositionTicks to the desired ticks.
Clear: set PlaybackPositionTicks to 0.
Thresholds live in diff_progress:
diff_progress
ignore progress < min_seconds
min_seconds
only write when delta >= delta_seconds
delta_seconds
ignore progress >= max_percent of duration
providers/sync/jellyfin/_progress.py
cw_platform/orchestrator/_planner.py::diff_progress
Resolution uses the provider item ID when possible.
If the destination item can’t be resolved, CrossWatch will mark it unresolved.
Last updated 16 days ago
Was this helpful?