• v0.4.0 6aaa80ff92

    JellyTau v0.4.0
    🏗️ Build and Test JellyTau / Run Tests (push) Successful in 17m21s
    Publish Documentation / Build & publish docs to gitea-pages (push) Successful in 5m46s
    Traceability Validation / Check Requirement Traces (push) Successful in 16s
    Build & Release / Run Tests (push) Successful in 5m38s
    🏗️ Build and Test JellyTau / Android Compile Check (push) Successful in 8m54s
    Build & Release / Build Linux (push) Successful in 19m22s
    Build & Release / Build Windows (push) Successful in 13m55s
    Build & Release / Build Android (push) Successful in 30m12s
    Build & Release / Create Release (push) Successful in 15s
    Stable

    dtourolle released this 2026-08-04 18:22:01 +00:00 | 182 commits to master since this release

    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)

    Downloads

    Platform File
    Android jellytau-release.apk — sideload or adb install
    Windows (portable) jellytau.exe
    Linux (Debian/Ubuntu) jellytau_0.4.0_amd64.debsudo dpkg -i
    Windows jellytau_0.4.0_x64-setup.exe (NSIS installer)

    Report a problem: https://gitea.tourolle.paris/dtourolle/jellytau/issues

    Downloads