fix(player): render subtitle tracks on the Linux HTML5 path (UR-020)

Selecting a subtitle on Linux did nothing. VideoPlayer rendered no <track>
children at all — the block was commented out as "temporarily disabled to
debug playback issues" (it has been that way since the POC) — so
Html5PlayerAdapter.selectSubtitle() walked an empty textTracks list and the
menu, which is built from media.mediaStreams, was purely decorative.

The reason it had to be disabled is still visible in the dead markup:
getSubtitleUrl() is async, so src={getSubtitleUrl(track.index)} bound a
Promise to the attribute and every track pointed at "[object Promise]" — an
unloadable resource hanging off the media element.

Subtitle URLs are now resolved off the render path into component state
(subtitleTracks.ts), and only streams whose URL actually resolved are
rendered; a per-track failure drops that track instead of emitting a dead
src. data-stream-index is kept, since that is what the adapter matches on.

Subtitles stay OFF unless the user asks for them: the server's isDefault flag
is shown in the menu but is never promoted to a selection, and the `default`
attribute is deliberately not emitted. A <track default> auto-shows, so the
menu would open on "Off" while subtitles were burned over the picture, and
every user who never wanted subtitles would suddenly get them. That matches
the existing initial state (selectedSubtitleIndex = null).

Selection and rendered tracks are reconciled whenever the list changes: a
selection that no longer resolves collapses to "Off", and a surviving one is
re-applied after the new <track> elements exist. "Off" disables every text
track, as before.

Cross-origin text-track fetches use the media element's CORS setting, so the
element opts in with crossorigin="anonymous" — but only for an http(s)
stream, never for a local/offline file:/asset: source, where forcing CORS
onto the video fetch could break playback. It is keyed on the subtitle stream
count, known at first render, so the attribute cannot flip under an in-flight
media load.

Android/native is untouched: the ExoPlayer branch still goes through
player_set_subtitle_track.

Tests (UT-143, UT-144) were written first and failed against the old markup:
the commented-out block, the Promise bound to src, and the default attribute.

TRACES: UR-020 | DR-023 | UT-143, UT-144
This commit is contained in:
2026-08-11 19:25:39 +02:00
parent 2c3955914e
commit 211792947d
5 changed files with 755 additions and 307 deletions
+328 -276
View File
@@ -1,11 +1,11 @@
# Code Traceability Matrix
**Generated:** 8/11/2026, 7:10:18 PM
**Generated:** 8/11/2026, 7:25:20 PM
## Summary
- **Total Files Scanned:** 339
- **Total TRACES Found:** 579
- **Total Files Scanned:** 341
- **Total TRACES Found:** 583
- **Requirements Covered:**
- User Requirements (UR): 67
- Integration Requirements (IR): 17
@@ -700,11 +700,23 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### DR-023
**Locations:** 3 file(s)
**Locations:** 7 file(s)
- **File:** [`src/lib/components/player/subtitleTracks.ts`](src/lib/components/player/subtitleTracks.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/subtitleTracks.test.ts`](src/lib/components/player/subtitleTracks.test.ts#L16)
- **Line:** 16
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L291)
- **Line:** 291
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1729)
- **Line:** 1729
- **Context:** `function toggleSubtitleMenu() {`
- **File:** [`src/lib/player/adapters/types.ts`](src/lib/player/adapters/types.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
@@ -2234,8 +2246,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L235)
- **Line:** 235
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1873)
- **Line:** 1873
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1874)
- **Line:** 1874
- **Context:** `Unknown`
### DR-107
@@ -2374,11 +2386,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L808)
- **Line:** 808
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2691)
- **Line:** 2691
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2692)
- **Line:** 2692
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2722)
- **Line:** 2722
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2723)
- **Line:** 2723
- **Context:** `Unknown`
### DR-114
@@ -2432,17 +2444,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L683)
- **Line:** 683
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1813)
- **Line:** 1813
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1814)
- **Line:** 1814
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2601)
- **Line:** 2601
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2602)
- **Line:** 2602
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2623)
- **Line:** 2623
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2624)
- **Line:** 2624
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2632)
- **Line:** 2632
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2633)
- **Line:** 2633
- **Context:** `Unknown`
### DR-116
@@ -2479,8 +2491,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L661)
- **Line:** 661
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2654)
- **Line:** 2654
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2655)
- **Line:** 2655
- **Context:** `Unknown`
### DR-117
@@ -2816,8 +2828,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L243)
- **Line:** 243
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1914)
- **Line:** 1914
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1915)
- **Line:** 1915
- **Context:** `Unknown`
- **File:** [`src-tauri/src/lib.rs`](src-tauri/src/lib.rs#L1346)
- **Line:** 1346
@@ -3386,11 +3398,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L452)
- **Line:** 452
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2374)
- **Line:** 2374
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2375)
- **Line:** 2375
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2415)
- **Line:** 2415
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2416)
- **Line:** 2416
- **Context:** `Unknown`
### JA-033
@@ -3409,14 +3421,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/repository/online.rs`](src-tauri/src/repository/online.rs#L683)
- **Line:** 683
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1813)
- **Line:** 1813
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1814)
- **Line:** 1814
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1873)
- **Line:** 1873
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1874)
- **Line:** 1874
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2601)
- **Line:** 2601
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2602)
- **Line:** 2602
- **Context:** `Unknown`
### JA-034
@@ -3429,8 +3441,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L808)
- **Line:** 808
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2691)
- **Line:** 2691
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2692)
- **Line:** 2692
- **Context:** `Unknown`
### JA-035
@@ -3440,8 +3452,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L243)
- **Line:** 243
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1914)
- **Line:** 1914
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1915)
- **Line:** 1915
- **Context:** `Unknown`
### UR-007
@@ -3698,8 +3710,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L243)
- **Line:** 243
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1914)
- **Line:** 1914
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1915)
- **Line:** 1915
- **Context:** `Unknown`
- **File:** [`src-tauri/src/lib.rs`](src-tauri/src/lib.rs#L1346)
- **Line:** 1346
@@ -4048,11 +4060,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L452)
- **Line:** 452
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2374)
- **Line:** 2374
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2375)
- **Line:** 2375
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2415)
- **Line:** 2415
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2416)
- **Line:** 2416
- **Context:** `Unknown`
### UR-048
@@ -4608,20 +4620,20 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L683)
- **Line:** 683
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1813)
- **Line:** 1813
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1814)
- **Line:** 1814
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2601)
- **Line:** 2601
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2602)
- **Line:** 2602
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2623)
- **Line:** 2623
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2624)
- **Line:** 2624
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2632)
- **Line:** 2632
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2633)
- **Line:** 2633
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2654)
- **Line:** 2654
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2655)
- **Line:** 2655
- **Context:** `Unknown`
### UR-068
@@ -4919,22 +4931,6 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/safeArea.test.ts`](src/lib/utils/safeArea.test.ts#L17)
- **Line:** 17
- **Context:** `Unknown`
### UT-096
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/safeArea.test.ts`](src/lib/utils/safeArea.test.ts#L17)
- **Line:** 17
- **Context:** `Unknown`
### UT-097
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/safeArea.test.ts`](src/lib/utils/safeArea.test.ts#L17)
- **Line:** 17
- **Context:** `Unknown`
@@ -5062,11 +5058,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L808)
- **Line:** 808
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2691)
- **Line:** 2691
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2692)
- **Line:** 2692
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2722)
- **Line:** 2722
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2723)
- **Line:** 2723
- **Context:** `Unknown`
- **File:** [`src-tauri/src/lib.rs`](src-tauri/src/lib.rs#L1339)
- **Line:** 1339
@@ -5938,11 +5934,23 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
### UR-020
**Locations:** 4 file(s)
**Locations:** 8 file(s)
- **File:** [`src/lib/components/player/subtitleTracks.ts`](src/lib/components/player/subtitleTracks.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/subtitleTracks.test.ts`](src/lib/components/player/subtitleTracks.test.ts#L16)
- **Line:** 16
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L291)
- **Line:** 291
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1729)
- **Line:** 1729
- **Context:** `function toggleSubtitleMenu() {`
- **File:** [`src/lib/player/adapters/types.ts`](src/lib/player/adapters/types.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
@@ -6111,8 +6119,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L235)
- **Line:** 235
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1873)
- **Line:** 1873
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1874)
- **Line:** 1874
- **Context:** `Unknown`
### UT-085
@@ -6203,33 +6211,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L661)
- **Line:** 661
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2654)
- **Line:** 2654
- **Context:** `Unknown`
### UR-036
**Locations:** 3 file(s)
- **File:** [`src/lib/components/library/PersonDetailView.svelte`](src/lib/components/library/PersonDetailView.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/storage/people.rs`](src-tauri/src/commands/storage/people.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-051
**Locations:** 2 file(s)
- **File:** [`src/lib/components/library/LibraryGrid.svelte`](src/lib/components/library/LibraryGrid.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/MediaCard.svelte`](src/lib/components/library/MediaCard.svelte#L1)
- **Line:** 1
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2655)
- **Line:** 2655
- **Context:** `Unknown`
### UT-118
@@ -6329,6 +6312,66 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 1
- **Context:** `Unknown`
### UT-137
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-138
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-139
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-140
**Locations:** 1 file(s)
- **File:** [`src/lib/composables/useOfflineFilterReload.test.ts`](src/lib/composables/useOfflineFilterReload.test.ts#L1)
- **Line:** 1
- **Context:** `Unknown`
### UT-143
**Locations:** 3 file(s)
- **File:** [`src/lib/components/player/subtitleTracks.ts`](src/lib/components/player/subtitleTracks.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/subtitleTracks.test.ts`](src/lib/components/player/subtitleTracks.test.ts#L16)
- **Line:** 16
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L291)
- **Line:** 291
- **Context:** `Unknown`
### UT-144
**Locations:** 3 file(s)
- **File:** [`src/lib/components/player/subtitleTracks.ts`](src/lib/components/player/subtitleTracks.ts#L15)
- **Line:** 15
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/subtitleTracks.test.ts`](src/lib/components/player/subtitleTracks.test.ts#L16)
- **Line:** 16
- **Context:** `Unknown`
- **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L291)
- **Line:** 291
- **Context:** `Unknown`
### UR-010
**Locations:** 15 file(s)
@@ -6422,6 +6465,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 2
- **Context:** `Unknown`
### UR-014
**Locations:** 1 file(s)
- **File:** [`src-tauri/src/commands/playlist.rs`](src-tauri/src/commands/playlist.rs#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-015
**Locations:** 13 file(s)
@@ -6466,6 +6517,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 3
- **Context:** `Unknown`
### UR-016
**Locations:** 2 file(s)
- **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L62)
- **Line:** 62
- **Context:** `Unknown`
- **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L251)
- **Line:** 251
- **Context:** `Unknown`
### UR-018
**Locations:** 3 file(s)
@@ -6480,6 +6542,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 2040
- **Context:** `Unknown`
### UR-022
**Locations:** 1 file(s)
- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
### UR-024
**Locations:** 2 file(s)
@@ -6502,164 +6572,6 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 2
- **Context:** `Unknown`
### UR-039
**Locations:** 1 file(s)
- **File:** [`src/lib/components/BottomNav.svelte`](src/lib/components/BottomNav.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
### UR-041
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/pictureInPicture.ts`](src/lib/utils/pictureInPicture.ts#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-043
**Locations:** 2 file(s)
- **File:** [`src/lib/stores/connectivity.ts`](src/lib/stores/connectivity.ts#L10)
- **Line:** 10
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/connectivity.rs`](src-tauri/src/commands/connectivity.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
### UR-054
**Locations:** 6 file(s)
- **File:** [`src/lib/components/search/HeaderSearch.svelte`](src/lib/components/search/HeaderSearch.svelte#L12)
- **Line:** 12
- **Context:** `Unknown`
- **File:** [`src/lib/components/search/HeaderSearch.test.ts`](src/lib/components/search/HeaderSearch.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
- **File:** [`src/lib/components/account/AccountMenu.svelte`](src/lib/components/account/AccountMenu.svelte#L7)
- **Line:** 7
- **Context:** `Unknown`
- **File:** [`src/lib/components/AppHeader.svelte`](src/lib/components/AppHeader.svelte#L10)
- **Line:** 10
- **Context:** `Unknown`
- **File:** [`src/lib/utils/layoutShell.ts`](src/lib/utils/layoutShell.ts#L82)
- **Line:** 82
- **Context:** `Unknown`
- **File:** [`src/lib/utils/layoutShell.ts`](src/lib/utils/layoutShell.ts#L104)
- **Line:** 104
- **Context:** `Unknown`
### UR-059
**Locations:** 6 file(s)
- **File:** [`src/lib/stores/continueWatchingFilter.ts`](src/lib/stores/continueWatchingFilter.ts#L12)
- **Line:** 12
- **Context:** `Unknown`
- **File:** [`src/lib/stores/continueWatchingFilter.test.ts`](src/lib/stores/continueWatchingFilter.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
- **File:** [`src/lib/stores/tv.ts`](src/lib/stores/tv.ts#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src/lib/stores/home.ts`](src/lib/stores/home.ts#L2)
- **Line:** 2
- **Context:** `Unknown`
- **File:** [`src/lib/services/skipReporting.ts`](src/lib/services/skipReporting.ts#L14)
- **Line:** 14
- **Context:** `Unknown`
- **File:** [`src/lib/services/skipReporting.test.ts`](src/lib/services/skipReporting.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
### UR-060
**Locations:** 7 file(s)
- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L155)
- **Line:** 155
- **Context:** `Unknown`
- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L221)
- **Line:** 221
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/catalog.rs`](src-tauri/src/commands/catalog.rs#L96)
- **Line:** 96
- **Context:** `Unknown`
- **File:** [`src-tauri/src/storage/schema.rs`](src-tauri/src/storage/schema.rs#L769)
- **Line:** 769
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L333)
- **Line:** 333
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L3017)
- **Line:** 3017
- **Context:** `Unknown`
- **File:** [`src-tauri/src/domain/search_rank.rs`](src-tauri/src/domain/search_rank.rs#L106)
- **Line:** 106
- **Context:** `Unknown`
### UT-137
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-138
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-139
**Locations:** 1 file(s)
- **File:** [`src/lib/services/offlineCatalog.reload.test.ts`](src/lib/services/offlineCatalog.reload.test.ts#L11)
- **Line:** 11
- **Context:** `Unknown`
### UT-140
**Locations:** 1 file(s)
- **File:** [`src/lib/composables/useOfflineFilterReload.test.ts`](src/lib/composables/useOfflineFilterReload.test.ts#L1)
- **Line:** 1
- **Context:** `Unknown`
### UR-014
**Locations:** 1 file(s)
- **File:** [`src-tauri/src/commands/playlist.rs`](src-tauri/src/commands/playlist.rs#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-016
**Locations:** 2 file(s)
- **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L62)
- **Line:** 62
- **Context:** `Unknown`
- **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L251)
- **Line:** 251
- **Context:** `Unknown`
### UR-022
**Locations:** 1 file(s)
- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
### UR-031
**Locations:** 2 file(s)
@@ -6738,6 +6650,36 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 234
- **Context:** `Unknown`
### UR-036
**Locations:** 3 file(s)
- **File:** [`src/lib/components/library/PersonDetailView.svelte`](src/lib/components/library/PersonDetailView.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/storage/people.rs`](src-tauri/src/commands/storage/people.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-039
**Locations:** 1 file(s)
- **File:** [`src/lib/components/BottomNav.svelte`](src/lib/components/BottomNav.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
### UR-041
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/pictureInPicture.ts`](src/lib/utils/pictureInPicture.ts#L4)
- **Line:** 4
- **Context:** `Unknown`
### UR-042
**Locations:** 1 file(s)
@@ -6746,6 +6688,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 3
- **Context:** `Unknown`
### UR-043
**Locations:** 2 file(s)
- **File:** [`src/lib/stores/connectivity.ts`](src/lib/stores/connectivity.ts#L10)
- **Line:** 10
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/connectivity.rs`](src-tauri/src/commands/connectivity.rs#L3)
- **Line:** 3
- **Context:** `Unknown`
### UR-044
**Locations:** 1 file(s)
@@ -6778,6 +6731,105 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **Line:** 3
- **Context:** `Unknown`
### UR-051
**Locations:** 2 file(s)
- **File:** [`src/lib/components/library/LibraryGrid.svelte`](src/lib/components/library/LibraryGrid.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
- **File:** [`src/lib/components/library/MediaCard.svelte`](src/lib/components/library/MediaCard.svelte#L1)
- **Line:** 1
- **Context:** `Unknown`
### UR-054
**Locations:** 6 file(s)
- **File:** [`src/lib/components/search/HeaderSearch.svelte`](src/lib/components/search/HeaderSearch.svelte#L12)
- **Line:** 12
- **Context:** `Unknown`
- **File:** [`src/lib/components/search/HeaderSearch.test.ts`](src/lib/components/search/HeaderSearch.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
- **File:** [`src/lib/components/account/AccountMenu.svelte`](src/lib/components/account/AccountMenu.svelte#L7)
- **Line:** 7
- **Context:** `Unknown`
- **File:** [`src/lib/components/AppHeader.svelte`](src/lib/components/AppHeader.svelte#L10)
- **Line:** 10
- **Context:** `Unknown`
- **File:** [`src/lib/utils/layoutShell.ts`](src/lib/utils/layoutShell.ts#L82)
- **Line:** 82
- **Context:** `Unknown`
- **File:** [`src/lib/utils/layoutShell.ts`](src/lib/utils/layoutShell.ts#L104)
- **Line:** 104
- **Context:** `Unknown`
### UR-059
**Locations:** 6 file(s)
- **File:** [`src/lib/stores/continueWatchingFilter.ts`](src/lib/stores/continueWatchingFilter.ts#L12)
- **Line:** 12
- **Context:** `Unknown`
- **File:** [`src/lib/stores/continueWatchingFilter.test.ts`](src/lib/stores/continueWatchingFilter.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
- **File:** [`src/lib/stores/tv.ts`](src/lib/stores/tv.ts#L3)
- **Line:** 3
- **Context:** `Unknown`
- **File:** [`src/lib/stores/home.ts`](src/lib/stores/home.ts#L2)
- **Line:** 2
- **Context:** `Unknown`
- **File:** [`src/lib/services/skipReporting.ts`](src/lib/services/skipReporting.ts#L14)
- **Line:** 14
- **Context:** `Unknown`
- **File:** [`src/lib/services/skipReporting.test.ts`](src/lib/services/skipReporting.test.ts#L9)
- **Line:** 9
- **Context:** `Unknown`
### UT-096
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/safeArea.test.ts`](src/lib/utils/safeArea.test.ts#L17)
- **Line:** 17
- **Context:** `Unknown`
### UT-097
**Locations:** 1 file(s)
- **File:** [`src/lib/utils/safeArea.test.ts`](src/lib/utils/safeArea.test.ts#L17)
- **Line:** 17
- **Context:** `Unknown`
### UR-060
**Locations:** 7 file(s)
- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L155)
- **Line:** 155
- **Context:** `Unknown`
- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L221)
- **Line:** 221
- **Context:** `Unknown`
- **File:** [`src-tauri/src/commands/catalog.rs`](src-tauri/src/commands/catalog.rs#L96)
- **Line:** 96
- **Context:** `Unknown`
- **File:** [`src-tauri/src/storage/schema.rs`](src-tauri/src/storage/schema.rs#L769)
- **Line:** 769
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L333)
- **Line:** 333
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L3017)
- **Line:** 3017
- **Context:** `Unknown`
- **File:** [`src-tauri/src/domain/search_rank.rs`](src-tauri/src/domain/search_rank.rs#L106)
- **Line:** 106
- **Context:** `Unknown`
### UR-065
**Locations:** 22 file(s)
@@ -7009,11 +7061,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L452)
- **Line:** 452
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2374)
- **Line:** 2374
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2375)
- **Line:** 2375
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2415)
- **Line:** 2415
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2416)
- **Line:** 2416
- **Context:** `Unknown`
### UT-067
@@ -7119,11 +7171,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L592)
- **Line:** 592
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2691)
- **Line:** 2691
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2692)
- **Line:** 2692
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2722)
- **Line:** 2722
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2723)
- **Line:** 2723
- **Context:** `Unknown`
### UT-100
@@ -7136,17 +7188,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016,
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L683)
- **Line:** 683
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1813)
- **Line:** 1813
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1814)
- **Line:** 1814
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2601)
- **Line:** 2601
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2602)
- **Line:** 2602
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2623)
- **Line:** 2623
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2624)
- **Line:** 2624
- **Context:** `Unknown`
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2632)
- **Line:** 2632
- **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L2633)
- **Line:** 2633
- **Context:** `Unknown`
### UT-101