diff --git a/docs/requirements.md b/docs/requirements.md index 258b8272..5eb77ec1 100644 --- a/docs/requirements.md +++ b/docs/requirements.md @@ -70,6 +70,7 @@ For a narrative overview of the system design, see | UR-057 | Settings apply the instant a control is changed — no "Save" button and no save/dirty state — so leaving the page never loses a change; sliders show a live readout while dragging but persist on release (see [ux-flows.md §8.1](ux-flows.md)) | Medium | Done | | UR-058 | On the home screen, a tap on a media card opens the item (movie/episode detail page, or the series Episode Focus View for episodes) rather than starting playback; a long-press starts "play now" after a confirm; an episode detail/focus page links back to its parent series and season (see [ux-flows.md §5B.5](ux-flows.md) and [§5B.1](ux-flows.md)) | Medium | Done | | UR-059 | Skipping to the next episode records the episode left behind as **fully watched** rather than saving a mid-episode resume point — skipping means "done with this one", not "stopped here" — and Continue Watching hides episodes the viewer has already moved past (a partial position behind that series' next-up episode), so the row only ever offers genuinely unfinished media | Medium | Done | +| UR-060 | Search results are ordered by how well they match: a name that *starts* with the query outranks one matching mid-word (typing "parks" finds "Parks and Recreation" before "Sparks of Love"), and at equal match quality a container outranks its contents (a series before its episodes). Results are grouped into distinct categories — TV Shows, Episodes, Movies, Songs, Albums, Artists and People — so a show never competes with its own episodes for the same slot, and searching an actor's name reaches their bio | High | Done | --- @@ -221,7 +222,7 @@ Internal architecture, components, and application logic. | DR-063 | Search scope resolver mapping the originating route to an `includeItemTypes` set (All / Music / Movies / TV), defaulting to All for Home, `/library`, and the search tab | UI | UR-049 | Implemented | | DR-064 | Scope chip row rendered under the search bar on both the search page and the in-library header search: preselected from context, horizontally scrollable, re-runs the search preserving the query on change | UI | UR-049 | Implemented | | DR-065 | Thread `SearchOptions.includeItemTypes` through `library.search()` so the global/header search honours scope (backend online + offline paths already support it) | UI | UR-049 | Implemented | -| DR-066 | Persisted search result group order with a drag-and-drop settings list, keyboard-accessible reordering, a shipped default (Songs → Albums → Artists → Movies → TV Shows), and empty-group omission | Settings | UR-050 | Implemented | +| DR-066 | Persisted search result group order with a drag-and-drop settings list, keyboard-accessible reordering, a shipped default (see DR-091 for the current group set and order), and empty-group omission | Settings | UR-050 | Implemented | | DR-067 | `SearchResults` renders groups in the user-configured order rather than hardcoded markup order, without altering intra-group ranking | UI | UR-050 | Implemented | | DR-068 | Library card shape by media type: 1:1 square for music (circular mask for artists), 2:3 poster for movies/series/seasons, 16:9 for episodes and collection folders | UI | UR-051 | Done | | DR-069 | Responsive library grid (2/3/4/5/6 columns across base→xl) with two-line truncated card text and artwork-overlay progress/watched state | UI | UR-051 | Done | @@ -242,6 +243,8 @@ Internal architecture, components, and application logic. | DR-087 | `MediaCard` gains an `onLongPress` prop with pointer-based long-press detection (~500 ms hold, cancelled on >10 px move so carousel scroll is unaffected, trailing click suppressed); home carousels wire tap→detail/focus routing and long-press→confirm→player; episode taps route to `/library/?episode=`; the bare-episode detail page links to its parent series/season | UI | UR-058 | Done | | DR-088 | Skip-to-next-episode marks the outgoing episode played (`markAsPlayed`) instead of reporting a stop position, and arms a one-shot suppression consumed by the player's stop handler so `VideoPlayer`'s post-navigation unmount stop report cannot overwrite the 100% progress with the partial position | UI | UR-059 | Done | | DR-089 | Continue Watching suppresses resume entries superseded by Next Up: an in-progress episode whose series has a next-up entry strictly later in series order (season, then episode) is dropped from the Home and TV rows; movies, series without a next-up entry, and items with unknown/mixed episode ordering are always kept | UI | UR-059 | Done | +| DR-090 | Relevance ranking in Rust (`domain/search_rank.rs`): results sort by match position (prefix → word-start → mid-word substring → no name match) then by media kind (containers before their contents), stably so the backend's own relevance breaks ties. Applied in `repository_search` to both the instant cache result and the merged cache+server union, so the list does not reshuffle when server results land | Backend | UR-060 | Done | +| DR-091 | Search result groups split TV into separate Shows and Episodes groups and add a People group (default order: Shows → Episodes → Movies → Songs → Albums → Artists → People); a stored `tvShows` order from before the split expands in place to shows+episodes so an upgrading user keeps their arrangement | UI | UR-060 | Done | --- @@ -309,6 +312,7 @@ Internal architecture, components, and application logic. | UR-056 | - | DR-085 | | UR-057 | - | DR-086 | | UR-058 | - | DR-087 | +| UR-060 | - | DR-090, DR-091 | --- diff --git a/docs/traceability.md b/docs/traceability.md index 80e3cfee..916d8611 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -1,22 +1,22 @@ # Code Traceability Matrix -**Generated:** 7/25/2026, 9:21:22 AM +**Generated:** 7/25/2026, 3:13:47 PM ## Summary -- **Total Files Scanned:** 293 -- **Total TRACES Found:** 301 +- **Total Files Scanned:** 296 +- **Total TRACES Found:** 310 - **Requirements Covered:** - - User Requirements (UR): 56 + - User Requirements (UR): 57 - Integration Requirements (IR): 15 - - Development Requirements (DR): 81 + - Development Requirements (DR): 83 - Jellyfin API Requirements (JA): 24 ## Requirements by Type ### User Requirements (UR) ``` -UR-002, UR-003, UR-004, UR-005, UR-007, UR-008, UR-009, UR-010, UR-011, UR-012, UR-013, UR-014, UR-015, UR-016, UR-017, UR-018, UR-019, UR-020, UR-021, UR-022, UR-023, UR-024, UR-025, UR-026, UR-027, UR-028, UR-029, UR-030, UR-031, UR-032, UR-033, UR-034, UR-035, UR-036, UR-038, UR-039, UR-040, UR-041, UR-042, UR-043, UR-044, UR-045, UR-046, UR-047, UR-048, UR-049, UR-050, UR-051, UR-052, UR-053, UR-054, UR-055, UR-056, UR-057, UR-058, UR-059 +UR-002, UR-003, UR-004, UR-005, UR-007, UR-008, UR-009, UR-010, UR-011, UR-012, UR-013, UR-014, UR-015, UR-016, UR-017, UR-018, UR-019, UR-020, UR-021, UR-022, UR-023, UR-024, UR-025, UR-026, UR-027, UR-028, UR-029, UR-030, UR-031, UR-032, UR-033, UR-034, UR-035, UR-036, UR-038, UR-039, UR-040, UR-041, UR-042, UR-043, UR-044, UR-045, UR-046, UR-047, UR-048, UR-049, UR-050, UR-051, UR-052, UR-053, UR-054, UR-055, UR-056, UR-057, UR-058, UR-059, UR-060 ``` ### Integration Requirements (IR) @@ -26,7 +26,7 @@ IR-003, IR-004, IR-009, IR-010, IR-011, IR-012, IR-013, IR-014, IR-015, IR-020, ### Development Requirements (DR) ``` -DR-001, DR-002, DR-003, DR-004, DR-005, DR-006, DR-007, DR-009, DR-010, DR-011, DR-012, DR-013, DR-014, DR-015, DR-016, DR-017, DR-018, DR-020, DR-021, DR-022, DR-023, DR-024, DR-025, DR-026, DR-027, DR-028, DR-029, DR-030, DR-032, DR-033, DR-034, DR-035, DR-036, DR-037, DR-038, DR-039, DR-040, DR-041, DR-043, DR-044, DR-045, DR-047, DR-048, DR-049, DR-050, DR-051, DR-052, DR-053, DR-054, DR-055, DR-056, DR-057, DR-058, DR-059, DR-060, DR-061, DR-062, DR-063, DR-064, DR-065, DR-066, DR-067, DR-068, DR-069, DR-070, DR-074, DR-075, DR-076, DR-077, DR-078, DR-079, DR-080, DR-081, DR-082, DR-083, DR-084, DR-085, DR-086, DR-087, DR-088, DR-089 +DR-001, DR-002, DR-003, DR-004, DR-005, DR-006, DR-007, DR-009, DR-010, DR-011, DR-012, DR-013, DR-014, DR-015, DR-016, DR-017, DR-018, DR-020, DR-021, DR-022, DR-023, DR-024, DR-025, DR-026, DR-027, DR-028, DR-029, DR-030, DR-032, DR-033, DR-034, DR-035, DR-036, DR-037, DR-038, DR-039, DR-040, DR-041, DR-043, DR-044, DR-045, DR-047, DR-048, DR-049, DR-050, DR-051, DR-052, DR-053, DR-054, DR-055, DR-056, DR-057, DR-058, DR-059, DR-060, DR-061, DR-062, DR-063, DR-064, DR-065, DR-066, DR-067, DR-068, DR-069, DR-070, DR-074, DR-075, DR-076, DR-077, DR-078, DR-079, DR-080, DR-081, DR-082, DR-083, DR-084, DR-085, DR-086, DR-087, DR-088, DR-089, DR-090, DR-091 ``` ### Jellyfin API Requirements (JA) @@ -1304,8 +1304,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, ### DR-063 -**Locations:** 3 file(s) +**Locations:** 8 file(s) +- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L60) + - **Line:** 60 + - **Context:** `Unknown` +- **File:** [`src/routes/library/+page.svelte`](src/routes/library/+page.svelte#L17) + - **Line:** 17 + - **Context:** `Unknown` +- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L14) + - **Line:** 14 + - **Context:** `Unknown` - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L9) - **Line:** 9 - **Context:** `Unknown` @@ -1315,16 +1324,22 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L50) - **Line:** 50 - **Context:** `export function scopeItemTypes(scope: SearchScope): string[] | undefin...` +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L73) + - **Line:** 73 + - **Context:** `Unknown` +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L93) + - **Line:** 93 + - **Context:** `Unknown` ### DR-064 **Locations:** 3 file(s) -- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L41) - - **Line:** 41 +- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L45) + - **Line:** 45 - **Context:** `Unknown` -- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L15) - - **Line:** 15 +- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L22) + - **Line:** 22 - **Context:** `Unknown` - **File:** [`src/lib/components/search/SearchScopeChips.svelte`](src/lib/components/search/SearchScopeChips.svelte#L7) - **Line:** 7 @@ -1357,8 +1372,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L9) - **Line:** 9 - **Context:** `Unknown` -- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L117) - - **Line:** 117 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L202) + - **Line:** 202 - **Context:** `Unknown` ### DR-067 @@ -1371,8 +1386,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L9) - **Line:** 9 - **Context:** `Unknown` -- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L161) - - **Line:** 161 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L252) + - **Line:** 252 - **Context:** `Unknown` ### DR-068 @@ -1566,11 +1581,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/services/downloadedCatalog.ts`](src/lib/services/downloadedCatalog.ts#L12) - **Line:** 12 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L203) - - **Line:** 203 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L204) + - **Line:** 204 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L218) - - **Line:** 218 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L219) + - **Line:** 219 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L538) - **Line:** 538 @@ -1640,8 +1655,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/commands/download/mod.rs`](src-tauri/src/commands/download/mod.rs#L1925) - **Line:** 1925 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L218) - - **Line:** 218 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L219) + - **Line:** 219 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L538) - **Line:** 538 @@ -1713,8 +1728,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/services/downloadedCatalog.ts`](src/lib/services/downloadedCatalog.ts#L12) - **Line:** 12 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L235) - - **Line:** 235 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L236) + - **Line:** 236 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/types.rs`](src-tauri/src/repository/types.rs#L259) - **Line:** 259 @@ -1782,6 +1797,25 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **Line:** 3 - **Context:** `Unknown` +### DR-090 + +**Locations:** 1 file(s) + +- **File:** [`src-tauri/src/domain/search_rank.rs`](src-tauri/src/domain/search_rank.rs#L106) + - **Line:** 106 + - **Context:** `Unknown` + +### DR-091 + +**Locations:** 2 file(s) + +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L117) + - **Line:** 117 + - **Context:** `Unknown` +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L183) + - **Line:** 183 + - **Context:** `Unknown` + ### JA-001 **Locations:** 1 file(s) @@ -1813,12 +1847,12 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, **Locations:** 3 file(s) -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4) - - **Line:** 4 - - **Context:** `Unknown` - **File:** [`src-tauri/src/commands/catalog.rs`](src-tauri/src/commands/catalog.rs#L3) - **Line:** 3 - **Context:** `Unknown` +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4) + - **Line:** 4 + - **Context:** `Unknown` - **File:** [`src-tauri/src/jellyfin/client.rs`](src-tauri/src/jellyfin/client.rs#L1) - **Line:** 1 - **Context:** `Unknown` @@ -2057,8 +2091,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#L1319) - **Line:** 1319 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L494) - - **Line:** 494 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L505) + - **Line:** 505 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L127) - **Line:** 127 @@ -2246,7 +2280,7 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, ### UR-005 -**Locations:** 58 file(s) +**Locations:** 59 file(s) - **File:** [`src/lib/api/bindings.ts`](src/lib/api/bindings.ts#L2251) - **Line:** 2251 @@ -2266,6 +2300,9 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/components/player/MiniPlayer.svelte`](src/lib/components/player/MiniPlayer.svelte#L1) - **Line:** 1 - **Context:** `Unknown` +- **File:** [`src/lib/components/player/videoFit.ts`](src/lib/components/player/videoFit.ts#L7) + - **Line:** 7 + - **Context:** `Unknown` - **File:** [`src/lib/components/player/VideoPlayer.svelte`](src/lib/components/player/VideoPlayer.svelte#L1) - **Line:** 1 - **Context:** `Unknown` @@ -2463,12 +2500,12 @@ 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/storage/thumbnails.rs`](src-tauri/src/commands/storage/thumbnails.rs#L3) - **Line:** 3 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4) - - **Line:** 4 - - **Context:** `Unknown` - **File:** [`src-tauri/src/commands/catalog.rs`](src-tauri/src/commands/catalog.rs#L3) - **Line:** 3 - **Context:** `Unknown` +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L4) + - **Line:** 4 + - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/online.rs`](src-tauri/src/repository/online.rs#L1) - **Line:** 1 - **Context:** `Unknown` @@ -3250,8 +3287,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/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675) - **Line:** 675 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L494) - - **Line:** 494 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L505) + - **Line:** 505 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/mod.rs`](src-tauri/src/repository/mod.rs#L127) - **Line:** 127 @@ -3304,13 +3341,22 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, ### UR-049 -**Locations:** 8 file(s) +**Locations:** 13 file(s) -- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L41) - - **Line:** 41 +- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L45) + - **Line:** 45 - **Context:** `Unknown` -- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L15) - - **Line:** 15 +- **File:** [`src/routes/library/+layout.svelte`](src/routes/library/+layout.svelte#L60) + - **Line:** 60 + - **Context:** `Unknown` +- **File:** [`src/routes/library/+page.svelte`](src/routes/library/+page.svelte#L17) + - **Line:** 17 + - **Context:** `Unknown` +- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L14) + - **Line:** 14 + - **Context:** `Unknown` +- **File:** [`src/routes/search/+page.svelte`](src/routes/search/+page.svelte#L22) + - **Line:** 22 - **Context:** `Unknown` - **File:** [`src/lib/components/search/SearchScopeChips.svelte`](src/lib/components/search/SearchScopeChips.svelte#L7) - **Line:** 7 @@ -3330,6 +3376,12 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L50) - **Line:** 50 - **Context:** `export function scopeItemTypes(scope: SearchScope): string[] | undefin...` +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L73) + - **Line:** 73 + - **Context:** `Unknown` +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L93) + - **Line:** 93 + - **Context:** `Unknown` ### UR-050 @@ -3350,11 +3402,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L9) - **Line:** 9 - **Context:** `Unknown` -- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L117) - - **Line:** 117 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L202) + - **Line:** 202 - **Context:** `Unknown` -- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L161) - - **Line:** 161 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L252) + - **Line:** 252 - **Context:** `Unknown` ### UR-051 @@ -3516,11 +3568,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/commands/download/mod.rs`](src-tauri/src/commands/download/mod.rs#L1925) - **Line:** 1925 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L203) - - **Line:** 203 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L204) + - **Line:** 204 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L218) - - **Line:** 218 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L219) + - **Line:** 219 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/offline.rs`](src-tauri/src/repository/offline.rs#L538) - **Line:** 538 @@ -3599,8 +3651,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **File:** [`src/lib/services/downloadedCatalog.ts`](src/lib/services/downloadedCatalog.ts#L95) - **Line:** 95 - **Context:** `function sizeOf(itemId: string): number {` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L235) - - **Line:** 235 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L236) + - **Line:** 236 - **Context:** `Unknown` - **File:** [`src-tauri/src/repository/types.rs`](src-tauri/src/repository/types.rs#L259) - **Line:** 259 @@ -3768,14 +3820,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-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L245) - - **Line:** 245 - - **Context:** `Unknown` - -### UT-032 - -**Locations:** 1 file(s) - - **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L245) - **Line:** 245 - **Context:** `Unknown` @@ -3835,8 +3879,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/commands/player/mod.rs`](src-tauri/src/commands/player/mod.rs#L675) - **Line:** 675 - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L494) - - **Line:** 494 +- **File:** [`src-tauri/src/commands/repository.rs`](src-tauri/src/commands/repository.rs#L505) + - **Line:** 505 - **Context:** `Unknown` ### UR-059 @@ -3897,41 +3941,18 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **Line:** 251 - **Context:** `Unknown` -### UR-032 +### UR-060 -**Locations:** 2 file(s) +**Locations:** 3 file(s) -- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3) - - **Line:** 3 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L117) + - **Line:** 117 - **Context:** `Unknown` -- **File:** [`src-tauri/src/settings.rs`](src-tauri/src/settings.rs#L1) - - **Line:** 1 +- **File:** [`src/lib/utils/searchScope.ts`](src/lib/utils/searchScope.ts#L183) + - **Line:** 183 - **Context:** `Unknown` - -### UR-033 - -**Locations:** 7 file(s) - -- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L584) - - **Line:** 584 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L638) - - **Line:** 638 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L704) - - **Line:** 704 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L714) - - **Line:** 714 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L759) - - **Line:** 759 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3) - - **Line:** 3 - - **Context:** `Unknown` -- **File:** [`src-tauri/src/settings.rs`](src-tauri/src/settings.rs#L1) - - **Line:** 1 +- **File:** [`src-tauri/src/domain/search_rank.rs`](src-tauri/src/domain/search_rank.rs#L106) + - **Line:** 106 - **Context:** `Unknown` ### IT-016 @@ -4071,6 +4092,48 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **Line:** 157 - **Context:** `pub fn file_size(&self) -> Option {` +### UT-032 + +**Locations:** 1 file(s) + +- **File:** [`src-tauri/src/player/backend.rs`](src-tauri/src/player/backend.rs#L245) + - **Line:** 245 + - **Context:** `Unknown` + +### UR-033 + +**Locations:** 7 file(s) + +- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L584) + - **Line:** 584 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L638) + - **Line:** 638 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L704) + - **Line:** 704 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L714) + - **Line:** 714 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/player/mpv_backend.rs`](src-tauri/src/player/mpv_backend.rs#L759) + - **Line:** 759 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3) + - **Line:** 3 + - **Context:** `Unknown` +- **File:** [`src-tauri/src/settings.rs`](src-tauri/src/settings.rs#L1) + - **Line:** 1 + - **Context:** `Unknown` + +### UT-043 + +**Locations:** 1 file(s) + +- **File:** [`src-tauri/src/commands/download/mod.rs`](src-tauri/src/commands/download/mod.rs#L2027) + - **Line:** 2027 + - **Context:** `Unknown` + ### UT-051 **Locations:** 1 file(s) @@ -4248,13 +4311,16 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **Line:** 1 - **Context:** `Unknown` -### UR-042 +### UR-032 -**Locations:** 1 file(s) +**Locations:** 2 file(s) -- **File:** [`src-tauri/src/commands/auth.rs`](src-tauri/src/commands/auth.rs#L3) +- **File:** [`src-tauri/src/commands/player/settings.rs`](src-tauri/src/commands/player/settings.rs#L3) - **Line:** 3 - **Context:** `Unknown` +- **File:** [`src-tauri/src/settings.rs`](src-tauri/src/settings.rs#L1) + - **Line:** 1 + - **Context:** `Unknown` ### UR-044 @@ -4284,14 +4350,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-tauri/src/commands/download/mod.rs`](src-tauri/src/commands/download/mod.rs#L2027) - - **Line:** 2027 - - **Context:** `Unknown` - -### UT-043 - -**Locations:** 1 file(s) - - **File:** [`src-tauri/src/commands/download/mod.rs`](src-tauri/src/commands/download/mod.rs#L2027) - **Line:** 2027 - **Context:** `Unknown` @@ -4312,4 +4370,12 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-007, JA-010, JA-011, JA-012, JA-016, - **Line:** 136 - **Context:** `Unknown` +### UR-042 + +**Locations:** 1 file(s) + +- **File:** [`src-tauri/src/commands/auth.rs`](src-tauri/src/commands/auth.rs#L3) + - **Line:** 3 + - **Context:** `Unknown` +