chore(release): bump to 0.4.0

This commit is contained in:
2026-08-04 20:22:01 +02:00
parent f7bcfe521d
commit febcfd41df
5 changed files with 67 additions and 4 deletions
+63
View File
@@ -6,6 +6,69 @@ Entries are grouped by the capability they change, not by commit. Requirement
IDs in parentheses point at [docs/requirements.md](docs/requirements.md); the IDs in parentheses point at [docs/requirements.md](docs/requirements.md); the
generated trace matrix lives in [docs/traceability.md](docs/traceability.md). generated trace matrix lives in [docs/traceability.md](docs/traceability.md).
## v0.4.0
### ✨ Features
- **Favourites, across libraries.** A `/library/favorites` page renders
favourites from every library with All / Movies / Shows / Music scope tabs,
reusing the standard grid so card shape still follows the media — a mixed All
tab reads as posters, squares and thumbnails side by side. Home carries
favourite rows below Recently Added, and a row with no items does not render
at all, so a fresh install shows no empty rows. Server favourite state is
mirrored into the local database as results are cached, so offline browsing
sees the same favourites as the server; a toggle made offline is never
overwritten by a stale server value before it has been pushed.
(UR-067, UR-069 → DR-113, DR-114, DR-115, DR-117, DR-118)
- **Search answers from the local index.** The instant leg read only downloaded
items, so with no downloads it returned nothing and every keystroke fell
through to a full `Recursive=true` server query. It now reads the whole synced
catalog through the same availability CTE `get_items` uses, gated on the same
`include_catalog_browse` flag, so search and browse cannot diverge. The index
also gained MusicArtist, Playlist and People — the very groups search sorts
results into. Re-indexing moved from a frontend startup call to a Rust
background task with a 6h TTL, so a long session no longer searches a stale
catalog. (UR-065 → DR-108, DR-110, DR-111)
### 🐛 Fixes
- **Playback no longer restarts an episode at random on a flaky connection.**
Background audio-only playback of a video streams a progressive mp3 transcode
over plain HTTP, which is chunked and so declares no length: when the
connection dropped mid-episode, ExoPlayer saw end-of-input and reported
`STATE_ENDED`, indistinguishable from the real end. The app ran its
end-of-episode logic mid-episode and playback parked in `STATE_ENDED`, where
the next play intent from the lockscreen, notification or a Bluetooth
reconnect seeks an ended player to position 0 — surfacing as "the episode
randomly restarted". The item's runtime is now what decides: an end reported
well short of it re-opens the stream where it stopped. (UR-040 → DR-129)
- **A network hiccup no longer kills playback outright.** Music and video
declare a length, so a cut connection reaches them as an *error* rather than a
phantom end — and every error stopped the player. A recoverable error now gets
one bounded attempt at re-opening the stream where it stopped, with a growing
backoff, leaving the rest of the queue intact. On Linux, MPV additionally
reconnects inside the demuxer so ordinary blips never surface at all, and
`EndFile(ERROR)` — previously a bare log line that left playback halted while
the UI still showed "playing" — is now reported and recovered.
(UR-004, UR-040 → DR-129, DR-130)
- **The player no longer reads 0:00 as a track ends on Linux.** MPV exposes
`time-pos` and `duration` as properties of the *loaded* file, so at EOF it
unloads and both stop resolving — reporting zero at exactly the moment
end-of-file handling asks where playback reached. The last reading seen while
media was loaded is now kept and used as the fallback. (UR-005 → DR-130)
- **Server-side deletions propagate to the local catalog.** `DELETE FROM items`
existed nowhere, so items removed on the server lingered locally forever. A
post-crawl mark-and-sweep now removes them, scoped to crawled types, skipping
downloaded items, and refusing to run after a partial crawl. Separately,
`items_fts` grew a full duplicate index on every catalog pass; it is now a
real upsert, with a migration rebuilding existing indexes. (DR-110)
- **Android system bars and display cutout are handled correctly.** (UR-066)
## v0.2.0 ## v0.2.0
### ✨ Features ### ✨ Features
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "jellytau", "name": "jellytau",
"version": "0.3.0", "version": "0.4.0",
"description": "", "description": "",
"type": "module", "type": "module",
"packageManager": "bun@1.3.5", "packageManager": "bun@1.3.5",
+1 -1
View File
@@ -1994,7 +1994,7 @@ dependencies = [
[[package]] [[package]]
name = "jellytau" name = "jellytau"
version = "0.3.0" version = "0.4.0"
dependencies = [ dependencies = [
"aes-gcm", "aes-gcm",
"async-trait", "async-trait",
+1 -1
View File
@@ -1,6 +1,6 @@
[package] [package]
name = "jellytau" name = "jellytau"
version = "0.3.0" version = "0.4.0"
description = "A Tauri App" description = "A Tauri App"
authors = ["you"] authors = ["you"]
edition = "2021" edition = "2021"
+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.3.0", "version": "0.4.0",
"identifier": "com.dtourolle.jellytau", "identifier": "com.dtourolle.jellytau",
"build": { "build": {
"beforeDevCommand": "bun run dev", "beforeDevCommand": "bun run dev",