chore(release): v0.12.2
🏗️ Build and Test JellyTau / Run Tests (push) Skipped
🏗️ Build and Test JellyTau / Android Compile Check (push) Skipped
🏗️ Build and Test JellyTau / Supply Chain (push) Successful in 27s
📱 Test APK / Build test APK (push) Successful in 32m30s
Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m56s
Build & Release / Create Release (push) Blocked by required conditions
Traceability Validation / Check Requirement Traces (push) Successful in 13s
Build & Release / Run Tests (push) Successful in 16m28s
Build & Release / Build Android (push) Waiting to run
Build & Release / Build Linux (push) Successful in 21m48s
Build & Release / Build Windows (push) In progress

Two download fixes since v0.12.1: transfers longer than five minutes were
being cut off by a total request deadline and restarted from zero, and the
progress bar read "0%" for the whole of a transcode download.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-21 11:19:32 +02:00
co-authored by Claude Opus 5
parent b3228cb4f4
commit ff21c4cd44
7 changed files with 6225 additions and 4048 deletions
+33
View File
@@ -9,6 +9,39 @@ 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 For how long each fixed defect had been shipping before it was found, see
[docs/defect-windows.md](docs/defect-windows.md). [docs/defect-windows.md](docs/defect-windows.md).
## v0.12.2
Two download fixes, found together on a tablet whose films all needed their
audio re-encoded. Downloads that took longer than five minutes were being cut
off and restarted, and the progress bar sat on "0%" for the whole of a
transcode.
### 🐛 Fixes
- **Downloads longer than five minutes no longer fail.** The download worker's
HTTP client carried a *total* request deadline of five minutes — from
connect until the last byte — so every transfer longer than that was cut off
mid-body and retried. A transcode cannot be resumed (the server ignores
`Range` and starts over), so each retry threw away what had been fetched, hit
the same deadline, and after three attempts the download failed. No feature
film at transcode speed could complete; a large direct copy limped through in
five-minute slices with a backoff between each. The deadline is now a
30-second connect timeout plus a 60-second *stall* timeout that resets on
every chunk: a dead connection is still caught, a healthy transfer can run as
long as it needs. Present since the first release. (DR-289)
### ✨ Improvements
- **The progress bar moves during a transcode download.** A transcode is
produced as it is sent, with no `Content-Length`, and the bar had nothing to
measure against — it read "0%" until the file completed. The backend now
predicts the size when it resolves the download: the source's size for
`original` (the picture is copied byte-for-byte; only the audio changes), or
bitrate × runtime for a quality preset. The bar shows the estimate as
"~42%" and caps at 99% until the last byte lands; the server's own figure is
used whenever it gives one; and when there is no prediction at all the bar
is a moving band with the bytes so far, rather than a false "0%". (DR-290)
## v0.12.1 ## v0.12.1
One change: the TLS library every connection to the server goes through has a One change: the TLS library every connection to the server goes through has a
+10 -2
View File
@@ -17,8 +17,8 @@ row can be re-checked or disputed:
## Present since the first release ## Present since the first release
Sixteen defects date to the initial proof of concept (v0.0.1, 2026-06-23) and Eighteen defects date to the initial proof of concept (v0.0.1, 2026-06-23) and
shipped for between two weeks and two months before anyone hit them. shipped for between two weeks and three months before anyone hit them.
That is the dominant pattern here: not regressions, but original assumptions that That is the dominant pattern here: not regressions, but original assumptions that
went unexercised until a later feature leaned on them. went unexercised until a later feature leaned on them.
@@ -47,6 +47,14 @@ for ~2.
| Audio-track change asked the player to select a track the transcode never carried (DR-258) | v0.0.1 | **v0.11.1** | ~2 months | pickaxe | | Audio-track change asked the player to select a track the transcode never carried (DR-258) | v0.0.1 | **v0.11.1** | ~2 months | pickaxe |
| Subtitle URL missing its `Stream.` route segment, so every fetch 404ed (DR-259) | v0.0.1 | **v0.11.1** | ~2 months | pickaxe | | Subtitle URL missing its `Stream.` route segment, so every fetch 404ed (DR-259) | v0.0.1 | **v0.11.1** | ~2 months | pickaxe |
| `timeupdate` gated on `!isPlaying`, so a paused activity froze the position (DR-265) | v0.0.1 | **v0.11.5** | ~9 weeks | pickaxe | | `timeupdate` gated on `!isPlaying`, so a paused activity froze the position (DR-265) | v0.0.1 | **v0.11.5** | ~9 weeks | pickaxe |
| Download client used a 5-minute *total* request deadline, so any transfer longer than that was cut off and retried (DR-289) | v0.0.1 | **v0.12.2** | ~13 weeks | pickaxe |
| Progress reported 0.0 for any response without `Content-Length` — every transcode download (DR-290) | v0.0.1 | **v0.12.2** | ~13 weeks | absence |
The two v0.12.2 rows are the same latent shape as the `Range` header above:
the deadline was inert while every download was a short direct copy, and
became fatal only once DR-171 (v0.5.3) started re-encoding audio for offline
playback — a transcode is both slow enough to exceed five minutes and
impossible to resume. Defective for ~13 weeks, hittable for ~5.
### Why they took so long to surface ### Why they took so long to surface
+6178 -4042
View File
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jellytau", "name": "jellytau",
"version": "0.12.1", "version": "0.12.2",
"description": "A cross-platform Jellyfin client built with Tauri, SvelteKit and Rust.", "description": "A cross-platform Jellyfin client built with Tauri, SvelteKit and Rust.",
"author": "Duncan Tourolle <duncan@tourolle.paris>", "author": "Duncan Tourolle <duncan@tourolle.paris>",
"license": "MIT", "license": "MIT",
+1 -1
View File
@@ -2275,7 +2275,7 @@ dependencies = [
[[package]] [[package]]
name = "jellytau" name = "jellytau"
version = "0.12.1" version = "0.12.2"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"argon2", "argon2",
+1 -1
View File
@@ -4,7 +4,7 @@ name = "jellytau"
# `player-conformance`, and a second binary makes a bare `cargo run` — # `player-conformance`, and a second binary makes a bare `cargo run` —
# which `tauri dev` issues — ambiguous. # which `tauri dev` issues — ambiguous.
default-run = "jellytau" default-run = "jellytau"
version = "0.12.1" version = "0.12.2"
description = "A cross-platform Jellyfin client" description = "A cross-platform Jellyfin client"
authors = ["Duncan Tourolle <duncan@tourolle.paris>"] authors = ["Duncan Tourolle <duncan@tourolle.paris>"]
license = "MIT" license = "MIT"
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "JellyTau", "productName": "JellyTau",
"version": "0.12.1", "version": "0.12.2",
"identifier": "com.dtourolle.jellytau", "identifier": "com.dtourolle.jellytau",
"build": { "build": {
"beforeDevCommand": "bun run dev", "beforeDevCommand": "bun run dev",