release v2026.05.13.2: artist covers + load-then-swap player transitions #45

Merged
bvandeusen merged 262 commits from dev into main 2026-05-14 12:31:44 -04:00
bvandeusen commented 2026-05-14 12:31:24 -04:00 (Migrated from git.fabledsword.com)

Patch batch on top of v2026.05.13.1.

Fixes

  • Artist tiles rendered the music-notes placeholder everywhere
    except the artist detail screen.
    Root cause: CachedArtistAdapter.
    toRef() dropped coverUrl entirely — the cache doesn't store the
    representative album id the server derives at query time. Detail
    screen worked because it bypasses ArtistRef.coverUrl entirely and
    builds its header cover from artist.albums[0].id directly. Fix
    joins cached_albums ordered by sort_title in the queries used by
    artistTileProvider, libraryArtistsProvider, and artistProvider;
    toRef now accepts a coverAlbumId and reconstructs
    /api/albums/<id>/cover from it. Fixes home Rediscover Artists,
    Library Artists tab, and Liked Artists carousel. (8cb9a8b)

  • Mini player cover flickered on track change. Earlier
    AnimatedSwitcher attempt smeared the transition without
    addressing the underlying race (audio_handler broadcasts
    MediaItem twice — bare then with artUri). Drop AnimatedSwitcher;
    PlayerBar is now stateful and holds the most-recent non-null
    artUri. When the bare-MediaItem rebroadcast arrives, the bar
    keeps showing the previous cover via media.copyWith(artUri:
    _lastArtUri). The new cover snaps in the moment its artUri
    arrives. (86d67f6)

  • Full player track-change still snapped the album art + gradient
    in after the fade completed.
    Earlier fix layered precacheImage

    • held _lastDominant but the AnimatedSwitcher fade still raced
      the FileImage decode. Rewrite the decision process around "load
      first, then swap": introduce _displayedMedia + _displayedDominant
      state; ref.listen on mediaItemProvider schedules a preload that
      awaits precacheImage AND awaits albumColorProvider's future; only
      then does setState atomically commit both fields so cover, title,
      and gradient advance in one frame. Backdrop AnimatedContainer
      still tweens between successive committed colors so the gradient
      transition stays smooth. Rapid skips drop stale completions via
      _pendingPreloadId. (86d67f6)

Operator notes

  • No schema changes in this batch.
  • In-app updater should upgrade cleanly (versionCode 2 → 3).
Patch batch on top of v2026.05.13.1. ## Fixes - **Artist tiles rendered the music-notes placeholder everywhere except the artist detail screen.** Root cause: CachedArtistAdapter. toRef() dropped coverUrl entirely — the cache doesn't store the representative album id the server derives at query time. Detail screen worked because it bypasses ArtistRef.coverUrl entirely and builds its header cover from artist.albums[0].id directly. Fix joins cached_albums ordered by sort_title in the queries used by artistTileProvider, libraryArtistsProvider, and artistProvider; toRef now accepts a coverAlbumId and reconstructs `/api/albums/<id>/cover` from it. Fixes home Rediscover Artists, Library Artists tab, and Liked Artists carousel. (`8cb9a8b`) - **Mini player cover flickered on track change.** Earlier AnimatedSwitcher attempt smeared the transition without addressing the underlying race (audio_handler broadcasts MediaItem twice — bare then with artUri). Drop AnimatedSwitcher; PlayerBar is now stateful and holds the most-recent non-null artUri. When the bare-MediaItem rebroadcast arrives, the bar keeps showing the previous cover via media.copyWith(artUri: _lastArtUri). The new cover snaps in the moment its artUri arrives. (`86d67f6`) - **Full player track-change still snapped the album art + gradient in after the fade completed.** Earlier fix layered precacheImage + held _lastDominant but the AnimatedSwitcher fade still raced the FileImage decode. Rewrite the decision process around "load first, then swap": introduce _displayedMedia + _displayedDominant state; ref.listen on mediaItemProvider schedules a preload that awaits precacheImage AND awaits albumColorProvider's future; only then does setState atomically commit both fields so cover, title, and gradient advance in one frame. Backdrop AnimatedContainer still tweens between successive committed colors so the gradient transition stays smooth. Rapid skips drop stale completions via _pendingPreloadId. (`86d67f6`) ## Operator notes - No schema changes in this batch. - In-app updater should upgrade cleanly (versionCode 2 → 3).
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/minstrel#45