- Bidirectional progress sync: server's `lastUpdate` now parsed correctly; pull
timer (60s) + scenePhase hook reconcile against local state. Server-newer
while paused/playing stashes a `pendingServerProgress` and surfaces a prompt
on next Play; server-older triggers an immediate push.
- History: lockscreen/Control-Center skip & scrub now route through AppState
via `onRemoteSkip`/`onRemoteSeek` callbacks (previously bypassed history).
`AppState.skip(by:)` itself now records the pre-skip position.
- Chapter detection moved to the AVPlayer periodic time observer — fires
reliably while the app is backgrounded or the device is locked, where the
5s runloop Timer can be throttled.
- Always fetch item detail when online (even for downloaded items) so
`item.chapters` is populated and history entries get chapter titles.
- DownloadManager: per-track byte-fraction progress, so single-track 1+GB
audiobooks' ring grows smoothly instead of staying at 0% until done.
- PlayerBar: extracted ScrubberView into its own struct so per-second time
updates no longer re-render the parent (fixes iOS history-popup flicker).
- App icon: re-embedded sRGB profile in marketing icon; bumped version 2.0
to 2.1.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- Chapter navigation with auto-scroll to current chapter and end-of-chapter sleep timer
- Opt-in listening history (local-only) with XML export and per-item quick menu
- Bookmarks with server sync via Audiobookshelf API
- Live MB counter during downloads via URLSessionDownloadTask delegate
- In-progress downloads shown in "Heruntergeladen" with dimmed cover + ring overlay
- Cover image cache (50 MB memory / 500 MB disk URLCache)
- German/English localization (de.lproj, en.lproj)
- Loading spinner now triggers immediately on view switch instead of waiting for the network
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>