diff --git a/CHANGELOG.md b/CHANGELOG.md index a80c7f13b..e9c6b68ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,18 @@ generated trace matrix lives in [docs/traceability.md](docs/traceability.md). For how long each fixed defect had been shipping before it was found, see [docs/defect-windows.md](docs/defect-windows.md). +## v0.13.3 + +### 🐛 Fixes + +- **Coming back to the app no longer replaces the page with "Failed to load + item".** After a few minutes in the background, resuming the app on a series + page could swap the whole page for that error, and it stayed until you + navigated away. The page refreshes itself on resume; a refresh that fails now + leaves what you were looking at on screen, and the error clears as soon as a + load succeeds. When a page genuinely cannot open, it now says why instead of + the generic message. (DR-297) + ## v0.13.2 A series opens with its episodes in under a second. v0.13.1 fixed the season diff --git a/docs/traceability.md b/docs/traceability.md index cf72d6b5f..09d522700 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -1,15 +1,15 @@ # Code Traceability Matrix -**Generated:** 9/24/2026, 4:46:58 AM +**Generated:** 9/24/2026, 7:40:34 AM ## Summary -- **Total Files Scanned:** 444 -- **Total TRACES Found:** 1458 +- **Total Files Scanned:** 446 +- **Total TRACES Found:** 1460 - **Requirements Covered:** - User Requirements (UR): 84 - Integration Requirements (IR): 27 - - Development Requirements (DR): 252 + - Development Requirements (DR): 253 - Jellyfin API Requirements (JA): 35 ## Requirements by Type @@ -26,7 +26,7 @@ IR-003, IR-004, IR-006, IR-008, IR-009, IR-010, IR-011, IR-012, IR-013, IR-014, ### 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-042, 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, DR-092, DR-093, DR-095, DR-096, DR-097, DR-098, DR-099, DR-100, DR-101, DR-102, DR-103, DR-104, DR-105, DR-106, DR-107, DR-108, DR-109, DR-110, DR-111, DR-112, DR-113, DR-114, DR-115, DR-116, DR-117, DR-118, DR-119, DR-120, DR-121, DR-123, DR-126, DR-127, DR-128, DR-129, DR-130, DR-131, DR-132, DR-133, DR-134, DR-135, DR-136, DR-137, DR-140, DR-141, DR-142, DR-143, DR-147, DR-148, DR-149, DR-150, DR-151, DR-152, DR-153, DR-154, DR-155, DR-156, DR-157, DR-158, DR-159, DR-160, DR-162, DR-167, DR-168, DR-169, DR-170, DR-171, DR-173, DR-174, DR-175, DR-176, DR-177, DR-178, DR-179, DR-180, DR-181, DR-182, DR-183, DR-185, DR-186, DR-188, DR-189, DR-193, DR-195, DR-196, DR-197, DR-198, DR-201, DR-203, DR-204, DR-205, DR-206, DR-207, DR-209, DR-210, DR-211, DR-212, DR-213, DR-215, DR-216, DR-217, DR-218, DR-219, DR-220, DR-221, DR-223, DR-224, DR-225, DR-226, DR-227, DR-228, DR-230, DR-231, DR-232, DR-233, DR-234, DR-235, DR-238, DR-239, DR-240, DR-241, DR-242, DR-243, DR-244, DR-245, DR-246, DR-250, DR-251, DR-252, DR-253, DR-254, DR-255, DR-256, DR-257, DR-258, DR-259, DR-262, DR-263, DR-264, DR-265, DR-266, DR-267, DR-268, DR-269, DR-270, DR-271, DR-272, DR-274, DR-276, DR-277, DR-278, DR-279, DR-280, DR-281, DR-282, DR-283, DR-284, DR-285, DR-286, DR-287, DR-288, DR-289, DR-290, DR-291, DR-292, DR-293, DR-294, DR-295, DR-296 +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-042, 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, DR-092, DR-093, DR-095, DR-096, DR-097, DR-098, DR-099, DR-100, DR-101, DR-102, DR-103, DR-104, DR-105, DR-106, DR-107, DR-108, DR-109, DR-110, DR-111, DR-112, DR-113, DR-114, DR-115, DR-116, DR-117, DR-118, DR-119, DR-120, DR-121, DR-123, DR-126, DR-127, DR-128, DR-129, DR-130, DR-131, DR-132, DR-133, DR-134, DR-135, DR-136, DR-137, DR-140, DR-141, DR-142, DR-143, DR-147, DR-148, DR-149, DR-150, DR-151, DR-152, DR-153, DR-154, DR-155, DR-156, DR-157, DR-158, DR-159, DR-160, DR-162, DR-167, DR-168, DR-169, DR-170, DR-171, DR-173, DR-174, DR-175, DR-176, DR-177, DR-178, DR-179, DR-180, DR-181, DR-182, DR-183, DR-185, DR-186, DR-188, DR-189, DR-193, DR-195, DR-196, DR-197, DR-198, DR-201, DR-203, DR-204, DR-205, DR-206, DR-207, DR-209, DR-210, DR-211, DR-212, DR-213, DR-215, DR-216, DR-217, DR-218, DR-219, DR-220, DR-221, DR-223, DR-224, DR-225, DR-226, DR-227, DR-228, DR-230, DR-231, DR-232, DR-233, DR-234, DR-235, DR-238, DR-239, DR-240, DR-241, DR-242, DR-243, DR-244, DR-245, DR-246, DR-250, DR-251, DR-252, DR-253, DR-254, DR-255, DR-256, DR-257, DR-258, DR-259, DR-262, DR-263, DR-264, DR-265, DR-266, DR-267, DR-268, DR-269, DR-270, DR-271, DR-272, DR-274, DR-276, DR-277, DR-278, DR-279, DR-280, DR-281, DR-282, DR-283, DR-284, DR-285, DR-286, DR-287, DR-288, DR-289, DR-290, DR-291, DR-292, DR-293, DR-294, DR-295, DR-296, DR-297 ``` ### Jellyfin API Requirements (JA) @@ -2717,8 +2717,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 17 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L219) - - **Line:** 219 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L220) + - **Line:** 220 - **Context:** `Unknown` - **File:** [`src/lib/api/repository-client.ts`](../src/lib/api/repository-client.ts#L157) - **Line:** 157 @@ -2776,11 +2776,11 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) - **Line:** 1 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L219) - - **Line:** 219 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L220) + - **Line:** 220 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L324) - - **Line:** 324 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L329) + - **Line:** 329 - **Context:** `async function handlePlayAll() {` - **File:** [`src/lib/components/library/EpisodeRow.svelte`](../src/lib/components/library/EpisodeRow.svelte#L17) - **Line:** 17 @@ -2802,8 +2802,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) - **Line:** 1 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L135) - - **Line:** 135 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L136) + - **Line:** 136 - **Context:** `Unknown` - **File:** [`src/routes/library/tv/+page.svelte`](../src/routes/library/tv/+page.svelte#L8) - **Line:** 8 @@ -3191,8 +3191,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 15 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L617) - - **Line:** 617 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L622) + - **Line:** 622 - **Context:** `Unknown` - **File:** [`src/lib/components/library/ArtistDetailView.svelte`](../src/lib/components/library/ArtistDetailView.svelte#L138) - **Line:** 138 @@ -3695,14 +3695,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) - **Line:** 1 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L150) - - **Line:** 150 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L151) + - **Line:** 151 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L242) - - **Line:** 242 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L243) + - **Line:** 243 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L465) - - **Line:** 465 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L470) + - **Line:** 470 - **Context:** `Unknown` - **File:** [`src/routes/search/+page.svelte`](../src/routes/search/+page.svelte#L97) - **Line:** 97 @@ -3730,8 +3730,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 11 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L111) - - **Line:** 111 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L112) + - **Line:** 112 - **Context:** `Unknown` - **File:** [`src/routes/library/music/+page.svelte`](../src/routes/library/music/+page.svelte#L71) - **Line:** 71 @@ -5971,8 +5971,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 11 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L186) - - **Line:** 186 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L187) + - **Line:** 187 - **Context:** `Unknown` - **File:** [`src/lib/api/bindings.ts`](../src/lib/api/bindings.ts#L2477) - **Line:** 2477 @@ -6990,6 +6990,20 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **Line:** 947 - **Context:** `Unknown` +### DR-297 + +**Locations:** 3 file(s) + +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) + - **Line:** 1 + - **Context:** `Unknown` +- **File:** [`src/lib/components/library/detailLoadError.test.ts`](../src/lib/components/library/detailLoadError.test.ts#L5) + - **Line:** 5 + - **Context:** `Unknown` +- **File:** [`src/lib/components/library/detailLoadError.ts`](../src/lib/components/library/detailLoadError.ts#L27) + - **Line:** 27 + - **Context:** `Unknown` + ### JA-001 **Locations:** 1 file(s) @@ -8608,8 +8622,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 54 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L186) - - **Line:** 186 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L187) + - **Line:** 187 - **Context:** `Unknown` - **File:** [`src/routes/library/music/+page.svelte`](../src/routes/library/music/+page.svelte#L1) - **Line:** 1 @@ -10556,8 +10570,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 30 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L111) - - **Line:** 111 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L112) + - **Line:** 112 - **Context:** `Unknown` - **File:** [`src/routes/library/music/+page.svelte`](../src/routes/library/music/+page.svelte#L71) - **Line:** 71 @@ -10950,14 +10964,14 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) - **Line:** 1 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L150) - - **Line:** 150 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L151) + - **Line:** 151 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L242) - - **Line:** 242 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L243) + - **Line:** 243 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L465) - - **Line:** 465 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L470) + - **Line:** 470 - **Context:** `Unknown` - **File:** [`src/routes/search/+page.svelte`](../src/routes/search/+page.svelte#L97) - **Line:** 97 @@ -10983,19 +10997,19 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, ### UR-062 -**Locations:** 40 file(s) +**Locations:** 42 file(s) - **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L1) - **Line:** 1 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L135) - - **Line:** 135 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L136) + - **Line:** 136 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L219) - - **Line:** 219 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L220) + - **Line:** 220 - **Context:** `Unknown` -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L324) - - **Line:** 324 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L329) + - **Line:** 329 - **Context:** `async function handlePlayAll() {` - **File:** [`src/lib/api/repository-client.ts`](../src/lib/api/repository-client.ts#L157) - **Line:** 157 @@ -11036,6 +11050,12 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **File:** [`src/lib/components/library/seriesNavigation.ts`](../src/lib/components/library/seriesNavigation.ts#L13) - **Line:** 13 - **Context:** `Unknown` +- **File:** [`src/lib/components/library/detailLoadError.test.ts`](../src/lib/components/library/detailLoadError.test.ts#L5) + - **Line:** 5 + - **Context:** `Unknown` +- **File:** [`src/lib/components/library/detailLoadError.ts`](../src/lib/components/library/detailLoadError.ts#L27) + - **Line:** 27 + - **Context:** `Unknown` - **File:** [`src/lib/utils/coalescedLoader.ts`](../src/lib/utils/coalescedLoader.ts#L15) - **Line:** 15 - **Context:** `Unknown` @@ -11364,8 +11384,8 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, **Locations:** 14 file(s) -- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L617) - - **Line:** 617 +- **File:** [`src/routes/library/[id]/+page.svelte`](../src/routes/library/[id]/+page.svelte#L622) + - **Line:** 622 - **Context:** `Unknown` - **File:** [`src/lib/components/library/ArtistDetailView.svelte`](../src/lib/components/library/ArtistDetailView.svelte#L138) - **Line:** 138 @@ -15052,6 +15072,17 @@ JA-001, JA-002, JA-003, JA-004, JA-005, JA-006, JA-007, JA-008, JA-009, JA-010, - **Line:** 7 - **Context:** `Unknown` +### UT-267 + +**Locations:** 2 file(s) + +- **File:** [`src/lib/components/library/detailLoadError.test.ts`](../src/lib/components/library/detailLoadError.test.ts#L5) + - **Line:** 5 + - **Context:** `Unknown` +- **File:** [`src/lib/components/library/detailLoadError.ts`](../src/lib/components/library/detailLoadError.ts#L27) + - **Line:** 27 + - **Context:** `Unknown` + ### UR-054 **Locations:** 7 file(s) diff --git a/package.json b/package.json index 402473dfc..1c3fcd428 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jellytau", - "version": "0.13.2", + "version": "0.13.3", "description": "A cross-platform Jellyfin client built with Tauri, SvelteKit and Rust.", "author": "Duncan Tourolle ", "license": "MIT", diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index df3c3178e..748763b4a 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2275,7 +2275,7 @@ dependencies = [ [[package]] name = "jellytau" -version = "0.13.2" +version = "0.13.3" dependencies = [ "aes-gcm", "argon2", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 68612fc1e..3c1570d6b 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -4,7 +4,7 @@ name = "jellytau" # `player-conformance`, and a second binary makes a bare `cargo run` — # which `tauri dev` issues — ambiguous. default-run = "jellytau" -version = "0.13.2" +version = "0.13.3" description = "A cross-platform Jellyfin client" authors = ["Duncan Tourolle "] license = "MIT" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 8d29e92a9..b7522b816 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "https://schema.tauri.app/config/2", "productName": "JellyTau", - "version": "0.13.2", + "version": "0.13.3", "identifier": "com.dtourolle.jellytau", "build": { "beforeDevCommand": "bun run dev",