• version-0.4.12 4069467253

    version-0.4.12
    All checks were successful
    Release / create-release (push) Successful in 10s
    Stable

    eric released this 2026-09-05 00:11:09 +02:00 | 177 commits to main since this release

    • Migrate all database access to async pmodb backend, replacing synchronous rusqlite across pmocache, pmoaudiocache, pmocovers, pmosource, pmoplaylist, and pmoqobuz.

    • Introduce unified PmoDb abstraction with connection pooling, serialized writes, read-only pools, closure-based transactions, and optional non-blocking logging.

    • Migrate logging from dedicated threads/environment variables to tracing-based non-blocking access logging.

    • Implement delta-based persistence via content hashing, enabling targeted DB operations (track add/remove, metadata-only upsert, PK swap) and skipping reconciliation when track content is unchanged.

    • Introduce pmoevent crate: thread-safe, hierarchical pub/sub event bus with broadcast subscriptions.

    • Replace flat subscription map with trie-based topic matching supporting * and ** wildcards for efficient pattern matching and removal.

    • Add structured lifecycle events (new, download, eviction, serving) with LRU/TTL eviction support and local in-memory revision tracking for playlist mutations.

    • Implement per-playlist TTL with background eviction and dual SQLite connections with WAL persistence.

    • Add targeted cache invalidation methods (invalidate_album, invalidate_track, invalidate_album_tracks, invalidate_playlist) and clarify TTL semantics (sliding vs. fixed).

    • Introduce PlaylistHandle as a unified wrapper for albums/playlists, replacing direct data usage with lightweight handles to avoid unnecessary track materialization.

    • Enable deferred/lazy track loading: separate metadata-only and track-loading paths, returning L:<hash> PKs fetched only on first HTTP access.

    • Add PlaylistMetadata API for lightweight metadata retrieval without track iteration; expose ReadHandle::new() for direct Arc<Playlist> cursor creation without ID re-lookup.

    • Implement batched playlist head creation (create_light_playlists_batch) reducing SQLite writes to a single transaction.

    • Unify album/playlist materialization via single materialize_object algorithm: one Qobuz API call returns handle immediately, filling remaining tracks in background with duplicate prevention.

    • Short-circuit materialization when playlist already cached with matching/newer version; refresh TTLs on cache hits for sliding expiration.

    • Unify artist/album caching into single artist_catalog entry via /artist/get?extra=albums.

    • Centralize cache manager access in QobuzClient via cm() helper (OnceCell-backed); migrate source to client-layer cache management, removing dead code and direct cache access.

    • Remove redundant album, album_tracks, and playlist cache collections; optimize batch cache access with bulk SQL operations.

    • Separate head writing from index updates: unconditionally write playlist/album heads and object_meta on resync; update index only when content changes.

    • Fix regression where only manually opened favorites appeared and resolve playlist loss for large playlists via improved versioning/existence checks.

    • Replace live Qobuz API calls with cached handles/display-only heads (zero tracks, sliding TTL) for /favorites/playlists and grid/search endpoints.

    • Return PlaylistHandles from get_favorite_albums; fetch metadata asynchronously on demand; distinguish album/playlist handles via is_album().

    • Update webapp dependencies (vite, vite-plugin-pwa, vue-tsc); add allowScripts config for esbuild/fsevents.

    • Add Syncthing .stignore rules to exclude node_modules, dist, .git, .jj, and target/ to prevent I/O contention during npm install.

    Downloads