fix(player): advance background audio-only episodes in the backend (UR-040)
Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m33s
Traceability Validation / Check Requirement Traces (push) Successful in 25s
🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m25s
Build & Release / Run Tests (push) Successful in 6m7s
🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m38s
Build & Release / Build Linux (push) Successful in 19m23s
Build & Release / Build Windows (push) Successful in 13m43s
Build & Release / Build Android (push) Successful in 29m47s
Build & Release / Create Release (push) Successful in 19s

An episode played audio-only while the app was backgrounded stalled at the
episode boundary instead of advancing, and ExoPlayer parked in STATE_ENDED —
where any later play intent (lockscreen, headset, Bluetooth reconnect) replays
the ended item, surfacing as the episode randomly restarting.

End-of-playback is dispatched from two places and they disagreed. The Android
JNI callback carried the background-audio branch but can never reach it:
load_and_play sets EndReason::NewTrackLoaded at every load and nothing clears
it, so the first real end consumes it and the decision is always Stop. The call
that actually decides is the frontend's echo of the resulting PlaybackEnded into
player_on_playback_ended — and that path had no background-audio case at all, so
it started a countdown whose advance is a webview goto() that cannot start audio
while backgrounded.

Both dispatchers now share PlayerController::auto_advance_to_next_episode, so
they cannot drift apart again.

The handoff base offset moves from the BackgroundAudioOffset Tauri state onto
the controller, and the advance clears it: the next episode's stream is built
without StartTimeTicks, so its timeline is already absolute and a stale base
made player_exit_background_audio return old_base + position_in_new_episode.
Unreachable until the advance actually worked.

Tests (red before the fix):
- test_auto_advance_background_audio_episode_advances_in_backend
- test_auto_advance_foreground_video_episode_uses_countdown
- test_advance_to_next_episode_audio_only_clears_handoff_base

Bump to 0.2.9.
This commit is contained in:
2026-08-02 18:10:18 +02:00
parent 9d099268b9
commit a26a853f01
11 changed files with 401 additions and 211 deletions
+161 -137
View File
@@ -1,11 +1,11 @@
# Code Traceability Matrix
**Generated:** 8/1/2026, 10:40:16 AM
**Generated:** 8/2/2026, 6:10:09 PM
## Summary
- **Total Files Scanned:** 305
- **Total TRACES Found:** 337
- **Total TRACES Found:** 338
- **Requirements Covered:**
- User Requirements (UR): 58
- Integration Requirements (IR): 15
@@ -229,11 +229,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 17 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2256)
- **Line:** 2256
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2258)
- **Line:** 2258
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/stores/player.ts`](src/lib/stores/player.ts#L8)
- **Line:** 8
@@ -285,8 +285,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 2 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2134)
- **Line:** 2134
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2136)
- **Line:** 2136
- **Context:** `export type PlaybackProgress = { itemId: string;`
- **File:** [`src-tauri/src/player/media.rs`](src-tauri/src/player/media.rs#L42)
- **Line:** 42
@@ -296,8 +296,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 2 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2238)
- **Line:** 2238
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2240)
- **Line:** 2240
- **Context:** `Unknown`
- **File:** [`src-tauri/src/player/media.rs`](src-tauri/src/player/media.rs#L124)
- **Line:** 124
@@ -339,8 +339,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 13 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2510)
- **Line:** 2510
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2512)
- **Line:** 2512
- **Context:** `export type RemoteSessionStatus = { position: number; duration: number...`
- **File:** [`src/lib/stores/queue.test.ts`](src/lib/stores/queue.test.ts#L4)
- **Line:** 4
@@ -475,11 +475,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 9 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L531)
- **Line:** 531
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L533)
- **Line:** 533
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L547)
- **Line:** 547
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L549)
- **Line:** 549
- **Context:** `Unknown`
- **File:** [`src/lib/stores/library.ts`](src/lib/stores/library.ts#L2)
- **Line:** 2
@@ -738,8 +738,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 18 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/utils/duration.test.ts`](src/lib/utils/duration.test.ts#L4)
- **Line:** 4
@@ -797,8 +797,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 10 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2570)
- **Line:** 2570
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2572)
- **Line:** 2572
- **Context:** `export type SessionInfo = { id?: string | null; userId?: string | null...`
- **File:** [`src/lib/components/player/SleepTimerModal.svelte`](src/lib/components/player/SleepTimerModal.svelte#L1)
- **Line:** 1
@@ -838,8 +838,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L181)
- **Line:** 181
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1778)
- **Line:** 1778
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1780)
- **Line:** 1780
- **Context:** `export type DownloadsResponse = { downloads: DownloadInfo[]; stats: Do...`
- **File:** [`src-tauri/src/player/android/mod.rs`](src-tauri/src/player/android/mod.rs#L545)
- **Line:** 545
@@ -1137,10 +1137,13 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### DR-047
**Locations:** 13 file(s)
**Locations:** 15 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L241)
- **Line:** 241
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/stores/nextEpisode.ts`](src/lib/stores/nextEpisode.ts#L9)
- **Line:** 9
@@ -1178,6 +1181,9 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L145)
- **Line:** 145
- **Context:** `Unknown`
### DR-048
@@ -1234,7 +1240,7 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### DR-052
**Locations:** 14 file(s)
**Locations:** 15 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L38)
- **Line:** 38
@@ -1242,6 +1248,9 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L51)
- **Line:** 51
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L241)
- **Line:** 241
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/backgroundAudioHandoff.test.ts`](src/lib/components/player/backgroundAudioHandoff.test.ts#L10)
- **Line:** 10
- **Context:** `Unknown`
@@ -1269,14 +1278,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/player/mod.rs`](src-tauri/src/player/mod.rs#L1264)
- **Line:** 1264
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L68)
- **Line:** 68
- **Context:** `pub struct VideoSettingsWrapper(pub Mutex<VideoSettings>);`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L583)
- **Line:** 583
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L571)
- **Line:** 571
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675)
- **Line:** 675
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L663)
- **Line:** 663
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L145)
- **Line:** 145
- **Context:** `Unknown`
### DR-053
@@ -1381,11 +1390,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L14)
- **Line:** 14
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1298)
- **Line:** 1298
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1300)
- **Line:** 1300
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2545)
- **Line:** 2545
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2547)
- **Line:** 2547
- **Context:** `export type SearchResult = { items: MediaItem[]; totalRecordCount: num...`
- **File:** [`src/lib/stores/library.ts`](src/lib/stores/library.ts#L236)
- **Line:** 236
@@ -1502,17 +1511,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 17 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L948)
- **Line:** 948
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L950)
- **Line:** 950
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L959)
- **Line:** 959
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L961)
- **Line:** 961
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1970)
- **Line:** 1970
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1972)
- **Line:** 1972
- **Context:** `export type MergedMediaItem = { id: string; title: string; artist: str...`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1979)
- **Line:** 1979
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1981)
- **Line:** 1981
- **Context:** `export type NetworkStateWrapperArg = { networkType: NetworkType; unmet...`
- **File:** [`src/lib/stores/downloads.ts`](src/lib/stores/downloads.ts#L81)
- **Line:** 81
@@ -1653,11 +1662,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L105)
- **Line:** 105
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1221)
- **Line:** 1221
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1223)
- **Line:** 1223
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1229)
- **Line:** 1229
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1231)
- **Line:** 1231
- **Context:** `Unknown`
- **File:** [`src/lib/components/downloads/DownloadedBrowse.svelte`](src/lib/components/downloads/DownloadedBrowse.svelte#L10)
- **Line:** 10
@@ -1715,11 +1724,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L105)
- **Line:** 105
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L805)
- **Line:** 805
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L807)
- **Line:** 807
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1229)
- **Line:** 1229
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1231)
- **Line:** 1231
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/MediaCard.svelte`](src/lib/components/library/MediaCard.svelte#L24)
- **Line:** 24
@@ -1788,11 +1797,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L113)
- **Line:** 113
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1237)
- **Line:** 1237
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1239)
- **Line:** 1239
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1723)
- **Line:** 1723
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1725)
- **Line:** 1725
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/LibraryGrid.svelte`](src/lib/components/library/LibraryGrid.svelte#L17)
- **Line:** 17
@@ -2267,8 +2276,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L203)
- **Line:** 203
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1324)
- **Line:** 1324
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1326)
- **Line:** 1326
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L520)
- **Line:** 520
@@ -2293,8 +2302,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 16 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2238)
- **Line:** 2238
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2240)
- **Line:** 2240
- **Context:** `Unknown`
- **File:** [`src/lib/stores/connectivity.ts`](src/lib/stores/connectivity.ts#L10)
- **Line:** 10
@@ -2346,11 +2355,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 20 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2134)
- **Line:** 2134
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2136)
- **Line:** 2136
- **Context:** `export type PlaybackProgress = { itemId: string;`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2238)
- **Line:** 2238
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2240)
- **Line:** 2240
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1)
- **Line:** 1
@@ -2411,11 +2420,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 15 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2134)
- **Line:** 2134
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2136)
- **Line:** 2136
- **Context:** `export type PlaybackProgress = { itemId: string;`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2238)
- **Line:** 2238
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2240)
- **Line:** 2240
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/AudioPlayer.svelte`](src/lib/components/player/AudioPlayer.svelte#L1)
- **Line:** 1
@@ -2461,14 +2470,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 66 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2256)
- **Line:** 2256
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2258)
- **Line:** 2258
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2510)
- **Line:** 2510
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2512)
- **Line:** 2512
- **Context:** `export type RemoteSessionStatus = { position: number; duration: number...`
- **File:** [`src/lib/components/player/Controls.svelte`](src/lib/components/player/Controls.svelte#L1)
- **Line:** 1
@@ -2714,11 +2723,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 15 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L531)
- **Line:** 531
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L533)
- **Line:** 533
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L547)
- **Line:** 547
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L549)
- **Line:** 549
- **Context:** `Unknown`
- **File:** [`src/lib/stores/auth.test.ts`](src/lib/stores/auth.test.ts#L4)
- **Line:** 4
@@ -2764,8 +2773,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 11 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2238)
- **Line:** 2238
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2240)
- **Line:** 2240
- **Context:** `Unknown`
- **File:** [`src/lib/stores/downloads.ts`](src/lib/stores/downloads.ts#L2)
- **Line:** 2
@@ -2842,8 +2851,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 12 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/services/playerEvents.test.ts`](src/lib/services/playerEvents.test.ts#L4)
- **Line:** 4
@@ -2881,7 +2890,7 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### UR-023
**Locations:** 22 file(s)
**Locations:** 24 file(s)
- **File:** [`src/routes/library/movies/+page.svelte`](src/routes/library/movies/+page.svelte#L1)
- **Line:** 1
@@ -2892,8 +2901,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/routes/settings/+page.svelte`](src/routes/settings/+page.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L241)
- **Line:** 241
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/stores/nextEpisode.ts`](src/lib/stores/nextEpisode.ts#L9)
- **Line:** 9
@@ -2946,19 +2958,25 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L145)
- **Line:** 145
- **Context:** `Unknown`
- **File:** [`src-tauri/src/settings.rs`](src-tauri/src/settings.rs#L1)
- **Line:** 1
- **Context:** `Unknown`
### UR-026
**Locations:** 17 file(s)
**Locations:** 19 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2313)
- **Line:** 2313
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L241)
- **Line:** 241
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2570)
- **Line:** 2570
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2315)
- **Line:** 2315
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2572)
- **Line:** 2572
- **Context:** `export type SessionInfo = { id?: string | null; userId?: string | null...`
- **File:** [`src/lib/components/player/SleepTimerModal.svelte`](src/lib/components/player/SleepTimerModal.svelte#L1)
- **Line:** 1
@@ -3005,6 +3023,9 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L145)
- **Line:** 145
- **Context:** `Unknown`
### UR-027
@@ -3016,8 +3037,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L181)
- **Line:** 181
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1778)
- **Line:** 1778
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1780)
- **Line:** 1780
- **Context:** `export type DownloadsResponse = { downloads: DownloadInfo[]; stats: Do...`
- **File:** [`src-tauri/src/player/android/mod.rs`](src-tauri/src/player/android/mod.rs#L545)
- **Line:** 545
@@ -3176,7 +3197,7 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### UR-040
**Locations:** 26 file(s)
**Locations:** 27 file(s)
- **File:** [`src/lib/api/repository-client.test.ts`](src/lib/api/repository-client.test.ts#L434)
- **Line:** 434
@@ -3193,8 +3214,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L51)
- **Line:** 51
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1324)
- **Line:** 1324
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L241)
- **Line:** 241
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1326)
- **Line:** 1326
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/backgroundAudioHandoff.test.ts`](src/lib/components/player/backgroundAudioHandoff.test.ts#L10)
- **Line:** 10
@@ -3229,14 +3253,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/player/mod.rs`](src-tauri/src/player/mod.rs#L1264)
- **Line:** 1264
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L68)
- **Line:** 68
- **Context:** `pub struct VideoSettingsWrapper(pub Mutex<VideoSettings>);`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L583)
- **Line:** 583
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L571)
- **Line:** 571
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675)
- **Line:** 675
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L663)
- **Line:** 663
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/timers.rs`](src-tauri/src/commands/player/timers.rs#L145)
- **Line:** 145
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L520)
- **Line:** 520
@@ -3298,11 +3322,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L22)
- **Line:** 22
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1298)
- **Line:** 1298
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1300)
- **Line:** 1300
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2545)
- **Line:** 2545
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2547)
- **Line:** 2547
- **Context:** `export type SearchResult = { items: MediaItem[]; totalRecordCount: num...`
- **File:** [`src/lib/components/search/SearchScopeChips.svelte`](src/lib/components/search/SearchScopeChips.svelte#L7)
- **Line:** 7
@@ -3342,8 +3366,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 9 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1298)
- **Line:** 1298
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1300)
- **Line:** 1300
- **Context:** `Unknown`
- **File:** [`src/lib/components/search/SearchResults.svelte`](src/lib/components/search/SearchResults.svelte#L9)
- **Line:** 9
@@ -3374,17 +3398,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 17 file(s)
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L948)
- **Line:** 948
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L950)
- **Line:** 950
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L959)
- **Line:** 959
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L961)
- **Line:** 961
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1970)
- **Line:** 1970
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1972)
- **Line:** 1972
- **Context:** `export type MergedMediaItem = { id: string; title: string; artist: str...`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1979)
- **Line:** 1979
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1981)
- **Line:** 1981
- **Context:** `export type NetworkStateWrapperArg = { networkType: NetworkType; unmet...`
- **File:** [`src/lib/stores/downloads.ts`](src/lib/stores/downloads.ts#L81)
- **Line:** 81
@@ -3439,14 +3463,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L105)
- **Line:** 105
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L805)
- **Line:** 805
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L807)
- **Line:** 807
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1221)
- **Line:** 1221
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1223)
- **Line:** 1223
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1229)
- **Line:** 1229
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1231)
- **Line:** 1231
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/MediaCard.svelte`](src/lib/components/library/MediaCard.svelte#L24)
- **Line:** 24
@@ -3522,11 +3546,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/repository-client.ts`](src/lib/api/repository-client.ts#L113)
- **Line:** 113
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1237)
- **Line:** 1237
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1239)
- **Line:** 1239
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1723)
- **Line:** 1723
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1725)
- **Line:** 1725
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/LibraryGrid.svelte`](src/lib/components/library/LibraryGrid.svelte#L17)
- **Line:** 17
@@ -3611,11 +3635,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L51)
- **Line:** 51
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L583)
- **Line:** 583
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L571)
- **Line:** 571
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675)
- **Line:** 675
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L663)
- **Line:** 663
- **Context:** `Unknown`
### IT-016
@@ -3903,17 +3927,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L51)
- **Line:** 51
- **Context:** `Unknown`
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1324)
- **Line:** 1324
- **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L1326)
- **Line:** 1326
- **Context:** `Unknown`
- **File:** [`src/lib/player/backgroundAudio.commands.test.ts`](src/lib/player/backgroundAudio.commands.test.ts#L7)
- **Line:** 7
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L583)
- **Line:** 583
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L571)
- **Line:** 571
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675)
- **Line:** 675
- **File:** [`src-tauri/src/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L663)
- **Line:** 663
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L520)
- **Line:** 520