• version-0.4.15 1bc13d6bfe

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

    eric released this 2026-09-10 21:23:20 +02:00 | 129 commits to main since this release

    • Implement progressive media serving with HTTP Range header support (206)

    • Add conditional serving based on item state and download failure handling

    • Integrate progressive flux sharing

    • Enable conditional compilation for media routing and content type resolution

    • Refactor playlist loading to use batch resolution and a persistence layer for metadata

    • Implement batch metadata retrieval and playlist listing with slicing logic to reduce API calls for favorite containers

    • Introduce sliding Time-To-Live (TTL) refresh logic for cache entries

    • Optimize data fetching routines for improved error tolerance and asynchronous efficiency

    • Enhance transaction handling with offloading mechanisms and timing measurements

    • Add test coverage for progressive streaming behavior

    • Update cache configuration settings

    Downloads
  • version-0.4.14 6044c1b389

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

    eric released this 2026-09-10 16:47:02 +02:00 | 135 commits to main since this release

    • Migrated all cache primary keys to permanent_id across data models, APIs, and database schemas (asset, playlist_track, permanent_id_map).

    • Introduced centralized CacheRegistry for thread-safe global cache management, replacing instance-specific singletons.

    • Implemented lazy loading, prefetching, and deferred write/flush mechanisms with configurable cadence and guaranteed shutdown flushing.

    • Added ExternalResolver trait and Qobuz integration for permanent ID resolution, including alias handling, fallback logic, and dual metadata separation.

    • Optimized playlist persistence with atomic batch operations (push_set), optional TTL support, and elimination of N+1 read queries.

    • Enhanced ingestion lifecycle with IngestHandle/IngestState, collection deletion logic, auto-identity invariants, and robust cache failure handling.

    • Migrated audio streaming functionality to the new pmostreaming crate, including dependency pruning and updated tracing targets.

    • Implemented architecture-specific SIMD DSP for gain application across 16/24/32-bit formats, ensuring robust saturation and clamping.

    • Added multiroom sink support with pipeline offsets and audio chunk manipulation utilities.

    • Refactored ResamplingNode for dynamic channel sizing and added network proxy logic for URL handling.

    • Enforced deadlock prevention, proper EOF signaling, and graceful async failure handling across file sources and the pipeline.

    • Implemented CRC-8 frame header validation and refined playlist source metadata retrieval/track boundary emission.

    • Unified media serving under a single /media/ catch-all route with token-based routing for image format/size variants.

    • Extended HTTP server with file routing, REST API endpoints, and native file serving capabilities.

    • Introduced foundational event system with explicit SubscriptionGuard lifecycle management and structured error prefixes.

    • Standardized error handling across audio pipeline, cache operations, and server components using typed error types (pmocache::Result).

    • Restructured crate dependencies, moving tests/internal modules to local scope and applying pub(crate) visibility restrictions.

    • Updated pmoaudio-ext with feature gating, deprecated mechanism removal, and core runtime dependency cleanup.

    • Added comprehensive benchmarking suite for cache access patterns and expanded unit/integration test coverage.

    • Automated Dockerfile crate synchronization and bumped version to 0.4.13.

    Downloads
  • version-0.4.13 0d89acf061

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

    eric released this 2026-09-05 07:35:55 +02:00 | 175 commits to main since this release

    • Added script to auto-generate Dockerfile COPY statements from Cargo.toml workspace members
    • Updated release tooling to execute the automation script during builds
    • Synchronized version across version.txt and PMOMusic/Cargo.toml
    Downloads
  • 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
  • version-0.4.11 261500a41f

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

    eric released this 2026-09-03 01:11:20 +02:00 | 207 commits to main since this release

    • Implement batch operations for metadata and playlist retrieval using single transactions and IN-clause queries.
    • Add batch retrieval and update operations (retrieve_batch) for albums, tracks, and artists.
    • Replace per-item database and cache lookups with batch processing to reduce SQL round-trips.
    • Improve performance on network filesystems.
    Downloads
  • version-0.4.8 059cf5f883

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

    eric released this 2026-09-01 22:49:44 +02:00 | 220 commits to main since this release

    Qobuz Caching & Persistence

    • Migrated QobuzCache to a persistent SQLite backend storing JSON payloads with configurable, per-collection TTLs and automatic expiration purging (every 6 hours).
    • Implemented dual expiration regime: sliding expiration for media metadata, fixed expiration for playlists, searches, and stream URLs.
    • Introduced CacheEntry wrapper with payload data and metadata, supporting optional bundle version parameters for proactive invalidation during bundle rotations.
    • Added thread-safe bundle version tracking to enforce strict agent interaction rules, propagate response timestamps, and prevent redundant network requests via enriched entity persistence.

    Favorites System

    • Replaced legacy cache module with an async FavoriteStore backed by SQLite for persistent ID storage.
    • Extended FavoriteKind enum with a Playlist variant; added client methods to fetch, filter by owner ID, and cache playlist favorites.
    • Unified favorite verification via centralized is_favorite(kind, id) method.
    • Added background synchronization (120s TTL) to maintain local indexes without blocking reads.

    API & Client Improvements

    • Implemented generic pagination with a reusable paginate method and PaginatedResponse<T> structure, automatically iterating until exhaustion or incomplete retrieval.

    • Updated API struct to use RwLock<AudioFormat> for thread-safe access; refactored client state sharing via Arc.

    • Wired cache through mandatory client configuration with dedicated storage directory settings.

    • Added CLI example for exporting favorite albums.

    • Bumped project version from 0.4.6 to 0.4.8 across metadata files and workflow scripts.

    • Enhanced Makefile release loop and improved JSON parsing robustness to prevent downstream failures during tag processing.

    • Added internal documentation outlining cache architecture, development workflow, collection definitions, API behavior, and test requirements.

    • Updated .gitignore to preserve new source directories; removed obsolete prompt file and applied minor formatting adjustments.

    Downloads
  • version-0.4.7 e01c52e68c

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

    eric released this 2026-09-01 06:43:42 +02:00 | 231 commits to main since this release

    • Enhanced Makefile release loop to query remote Git tags for automatic patch number resolution

    • Added validation that terminates the build if version conflicts persist

    • Introduced RELEASE=x.y.z environment variable to override automatic versioning

    • Improved JSON parsing reliability with optional chaining and null-safe fallbacks

    • Added explicit validation for empty tag references to prevent script failures

    • Updated project metadata to v0.4.7 (previously v0.4.6)

    Downloads
  • version-0.3.5 cdd0e79be8

    eric released this 2026-01-16 21:16:03 +01:00 | 521 commits to main since this release

    Cette modification refactorise l'architecture pour que chaque MusicRenderer gère son propre thread de surveillance (watcher), au lieu de déléguer le polling au ControlPoint centralisé.

    • Ajout d'un module watcher.rs avec WatchStrategy, WatchedState et fonctions helper
    • Implémentation de start_watching() et stop_watching() dans MusicRenderer
    • Centralisation de la gestion du watcher dans le constructeur et les méthodes has_been_seen_now()/mark_as_offline()
    • Suppression du polling central (~140 lignes) dans control_point.rs
    • Simplification du registry.rs avec suppression des appels manuels start/stop_watching()
    • Correction du bug dans refresh_device_presence() pour le traitement offline→online
    • Préparation pour le support futur des notifications push (OpenHome, Chromecast)
    Downloads
  • version-0.20 f5d055be6f

    eric released this 2026-01-04 00:10:22 +01:00 | 569 commits to main since this release

    Il s'agit d'un refactoring complet de PMO Control afin d'avoir une couche générique parfaite au-dessus des différentes implémentations des backends:

    • UPNP
    • OpenHome
    • Arylic
    • LinkPlay
    • Chromecast
    Downloads
  • version-0.1 000d378789

    eric released this 2026-01-04 00:06:46 +01:00 | 575 commits to main since this release

    Downloads