# 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. ## 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.