Files
jellytau/CHANGELOG.md
T
dtourolle 36ef231e2f
🏗️ Build and Test JellyTau / Run Tests (push) Successful in 11m0s
Publish Documentation / Build & publish docs to gitea-pages (push) Has been cancelled
Traceability Validation / Check Requirement Traces (push) Has been cancelled
Build & Release / Run Tests (push) Successful in 11m20s
🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m20s
Build & Release / Build Linux (push) Failing after 16m33s
Build & Release / Build Windows (push) Successful in 13m46s
Build & Release / Build Android (push) Successful in 29m50s
Build & Release / Create Release (push) Has been skipped
chore(release): bump to 0.2.0
Minor bump rather than patch: Android gains working equalizer, volume
normalization and gapless playback, which are new user-facing capabilities.

CHANGELOG entry written by hand rather than from `bun run release:notes`. The
generated draft lists "Crossfade between audio tracks (UR-031)" as a feature of
this release, which is false — the trace graph cannot distinguish code that
plumbs a setting (settings.rs clamping, the backend.rs trait method, both
legitimately tagged DR-034) from code that implements it, and crossfade is
implemented nowhere. The release-notes tool documents its output as a reviewed
draft; this is a concrete case of why.

v0.1.3-v0.1.5 have no CHANGELOG entries; noted in the file rather than
backfilled.
2026-07-28 23:08:05 +02:00

105 lines
5.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog
All notable changes to JellyTau are documented here.
Entries are grouped by the capability they change, not by commit. Requirement
IDs in parentheses point at [docs/requirements.md](docs/requirements.md); the
generated trace matrix lives in [docs/traceability.md](docs/traceability.md).
## v0.2.0
### ✨ Features
- **Audio settings now work on Android.** The equalizer, volume normalization
and gapless playback controls in Settings Audio previously rendered on
Android and did nothing — `ExoPlayerBackend` was the only backend that never
implemented `set_audio_settings`, and the trait's default silently reported
success while applying nothing. All three now take effect:
- **Equalizer** — the canonical 10-band ISO curve is resampled onto whatever
bands the device's equalizer actually exposes (commonly 5), by nearest
centre frequency.
- **Volume normalization** — via `LoudnessEnhancer`. Note this is a gain
stage, not a true EBU R128 normalizer like the Linux `dynaudnorm` path, so
it approximates rather than matches Linux behaviour.
- **Gapless playback** — honours the setting via `pauseAtEndOfMediaItems`
(ExoPlayer is gapless by default, so this disables it when you turn it off).
The effects re-attach automatically when ExoPlayer rebuilds its audio sink on
a format change, so the equalizer no longer stops applying part-way through a
queue. (UR-027, UR-032, UR-033 → DR-030, DR-035, DR-036, IR-004)
⚠️ **Not yet verified on a physical device.** `AudioEffect` availability and
band layouts vary by device and OEM ROM; where an effect is unavailable it is
logged and skipped rather than crashing playback.
### 📋 Documentation
- **Playback backend unification investigation.** Six new specs in
[docs/specs/](docs/specs/) record why the playback backends cannot be unified
onto a single engine: every candidate (mpv, GStreamer, libVLC) fails the same
webview-compositing constraint, because WebKitGTK/WebView2/Android WebView each
own their compositor surface and native video cannot interleave with HTML.
Audio *can* unify; video cannot. Also specifies the Android native-video spike,
a Windows native audio backend, and the `libmpv2` migration.
### 🐛 Corrected requirement statuses
These were documented as working and were not. No behaviour changed — the docs
were wrong.
- **Crossfade (UR-031, DR-034) was marked "Done (Linux only)". It is implemented
nowhere**, and is architecturally blocked on mpv: its audio chain is
single-stream, and FFmpeg's `acrossfade` requires two inputs. Real crossfade
would need two libmpv instances.
- The platform parity matrix listed crossfade as a Linux/Android gap (it is
neither) and omitted the equalizer (which was a genuine gap, now closed).
- `nativeAdapter.ts` cited tauri#10152 as blocking native Android video. That
issue is a stale feature request; the capability shipped in September 2024.
What remains unproven is SurfaceView-behind-WebView compositing, now tracked
by a spec rather than asserted as an upstream blocker.
<!--
Note: v0.1.3v0.1.5 have no entries here. Their changes are in the git log
and docs/traceability.md.
-->
## v0.1.2
### ✨ Features
- **Search results are ordered by how well they match.** A name that *starts*
with the query now 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, so a series lands above its own episodes.
Ranking is applied to the instant cached results and to the merged
cache+server list alike, so the list no longer reshuffles when server results
arrive. (UR-060, DR-090)
- **Separate Shows, Episodes and People result groups.** The combined "TV Shows"
group splits into Shows and Episodes so a show never competes with its own
episodes for a slot, and a new People group means searching an actor's name
reaches their bio page. Default order is Shows → Episodes → Movies → Songs →
Albums → Artists → People; a group order saved before the split keeps the
position it was dragged to. (UR-060, DR-091)
### 🐛 Bug Fixes
- **The library header search bar works on every library page.** It previously
searched in place and depended on `/library` rendering results inline, so on
any other `/library/**` route the results were fetched and never shown.
`/search` is now the single surface that renders results, and the header bar
hands its query and scope over via the URL. (UR-049, DR-063)
- **Video smaller than the window is scaled up to fit.** Sizing only ever shrank
oversized media, so a 480p source on a 1080p display played as a small picture
in the middle of a black frame. The picture now fits whichever axis constrains
it, in both directions, preserving aspect ratio. (UR-005)
### 📋 Requirements
**Linux:** 64-bit, GLIBC 2.29+
**Android:** 8.0+
## v0.1.1 and earlier
Released before this file existed — see the git history and the release notes on
each tag.