- Update Cargo.toml and version.txt to v0.3.27
- Rename Step 3 to Step 4 in control_point.rs for clarity
- Add UI notification on renderer state transition (PlaybackState::Transitioning)
- In track_metadata.rs: cache real_pk at construction time to avoid repeated DB queries per metadata field access.
- In openhome_client.rs: change IdList delimiter from comma to space per OpenHome spec.
Move `tx.commit()?` after counting metadata rows under the old lazy_pk to ensure accurate count before commit. This fixes a potential race or inconsistency where metadata might be updated after commit, leading to incorrect logging of remaining rows under lazy_pk.
Remove the backdrop element in mobile portrait mode since the drawer now covers 100vw, making the overlay unnecessary. Applied to both RendererDrawer and ServerDrawer components.
- In `track_metadata.rs`, implement fallback logic for lazy PKs: first try real_pk, then fallback to lazy_pk for metadata keys seeded before download.
- In `db.rs`, add debug logging after migration to track remaining metadata under lazy_pk.
- In `source.rs` (Qobuz):
- Detect and repair playlists with missing cache entries by forcing refresh when `items.len() < total`.
- Preserve original track order after parallel processing by attaching and sorting on original index.
- Handle missing performer/cover gracefully with warnings and provider fallback.
- In `metadata_cache.rs` (Radio France), simplify logging and improve test coverage for expiration logic.
- In `cache.rs`, add debug/warning logs when metadata or cover seeding fails during lazy caching.
Replace single-page browse with paginated loop to handle playlists exceeding BROWSE_PAGE_SIZE (64 items). Each page is fetched with retry logic, and entries are accumulated until fewer than BROWSE_PAGE_SIZE items are returned, ensuring complete playlist refresh.
Replace the old `cache_covers` approach with a new `register_tracks_lazy` method that handles track registration for lazy playback in playlists. The new implementation avoids expensive `get_stream_url` calls by deferring audio URL resolution to `QobuzLazyProvider`, caches covers in parallel with concurrency limited via semaphore (16), and stores full metadata including cover PKs. This significantly improves performance for large playlists while preserving all necessary track metadata.
- Add qobuz_debug to .gitignore
- Bump PMOMusic version to 0.3.26
- Add .cargo/ copy in Dockerfile for registry config
- Implement infinite scroll in ServerDrawer.vue with IntersectionObserver and sentinel element
- Add source/source_version fields to playlists for cache invalidation
- Update pmocache and pmoplaylist DB schemas with versioning (SCHEMA_VERSION)
- Add Qobuz API metadata fetching and pagination for playlist tracks
- Implement album/playlist cache invalidation based on released_at/updated_at timestamps
- Refactor adapt_playlist_items_to_qobuz → adapt_items_to_qobuz with cleaner logic
- Add debug mode to save Qobuz API responses when QOBUZ_DEBUG_DIR is set