Adds a separate "Resume playback position" toggle in Settings >
Playback. Default is OFF — opening qbz the next morning lands on a
clean 0:00 of the saved track, which is the common preference. Users
who do want bookmark-style resume turn the toggle on.
Independent of "Restore session on startup" in the UI (top-level
toggle, not a sub-setting). The seek only applies when both are on:
without persistSession there's no saved track to resume to, so the
flag is inert. Keeping the toggles separate matches the Settings UX
elsewhere and lets users flip persistence on without inheriting the
old #317 behavior we never had.
Backend
-------
- New `PlaybackPreferences::resume_playback_position: bool` (default
false). Migration adds the column to the existing
`playback_preferences.db` and the default row gets 0; existing
installs upgrade transparently.
- Setter `set_resume_playback_position(bool)` on both
`PlaybackPreferencesStore` and the wrapping `State`.
- Tauri command `v2_set_resume_playback_position` registered in
lib.rs invoke handler. Get-side already reads the new field via
the existing `v2_get_playback_preferences`.
Frontend
--------
- `playbackPreferencesStore.ts` — new field on the type and cache,
new `setResumePlaybackPosition()` exported.
- `SettingsView.svelte` — separate toggle row right below
"Restore session on startup" (matches the existing Settings rhythm).
- `playerStore.ts` — `pendingSessionRestore` extended with optional
`positionSecs`. When present, after the restored track loads, the
position is queued through the existing `pendingSeekPosition` /
`flushPendingSeek` path so the seek runs against an already-loaded
stream and respects the in-flight guard. Skip the queue when the
saved position is at or near 0 (the load already starts there).
- `routes/+page.svelte` — at session restore, reads
`getCachedPreferences().resume_playback_position` and forwards
`session.current_position_secs` only when the user opted in. The
field has been persisted in the schema since v1.2.5 — what changes
is whether we read it back.
i18n
----
- New keys in 5 locales: `settings.playback.resumePlaybackPosition` /
`…Desc`.
- `persistSessionDesc` updated everywhere — it used to claim the
feature restored playback position, which was always misleading
(the code restored the track but paused at 0:00). The text now
matches what the toggle does on its own: queue + view, paused at
0:00. Resume-to-position becomes the explicit ask of the new toggle.
Tests
-----
- Backend: 196 tests pass. Frontend: 0 TS errors.
cc