Releases: Sohex/musefs
Releases · Sohex/musefs
v1.1.0
musefs v1.1.0 — a feature and hardening release on top of v1.0.0. No breaking
changes; the read-only, byte-identical-audio invariant is unchanged.
Full detail in the CHANGELOG
and the documentation changelog.
Added
-v/--verboseflag onscanandmount(-vinfo,-vvdebug,-vvv
trace; defaultwarn) so diagnosing a run no longer requires knowingRUST_LOG
(an explicitRUST_LOGstill wins).mount --dry-runvalidates the--templateand configuration and prints a
sample of the paths the mount would expose (with file/dir counts), then exits
without mounting.- Runtime telemetry (
.musefs-metrics) — opt-in--expose-metrics
(envMUSEFS_EXPOSE_METRICS) surfaces a synthetic Prometheus-format metrics
file at the mount root: getattr/read/open activity, read-ahead behavior, and
(with jemalloc) allocator stats. Off by default
(docs, #394). - Scan progress indicator —
scan/scan --revalidaterender a live progress
bar on a terminal, falling back to periodicingested N/M (P%)log lines when
non-interactive; new--quiet/-qsuppresses it (#406). --skip-on-missingtemplate flag (envMUSEFS_SKIP_ON_MISSING) drops a
track from the mount when a top-level template field stays unresolved, instead
of substituting--default-fallback— e.g.--template '$!{beets_path}' --skip-on-missinghides tracks beets left without abeets_path(#408).--read-ahead-prefetchflag — opt-in background prefetch threads layered on
read amplification, default off (amplification alone captures the win; the
threads add ~10% overhead with no measured benefit) (#255).- riscv64 release platform — prebuilt
riscv64gc-unknown-linux-{gnu,musl}
binaries andlinux/riscv64Docker images now ship with each release. statfsreply — the mount reports a synthetic non-zero capacity sodfno
longer shows a 0-byte filesystem and capacity-checking importers (Lidarr et al.)
don't balk (#368).- Per-extension skip breakdown at end of scan (e.g.
skipped 42: jpg=20, cue=10, log=8, <none>=4), logged atwarn(#341). musefs vacuumcommand — compact the SQLite store (VACUUM+ WAL
checkpoint), reclaiming free pages left by prunes, orphan-art GC, and the schema
migration; run while unmounted (#566).
Changed
- Declared MSRV (
rust-version = "1.95") — a too-old toolchain now fails with
a clear cargo message; best-effort, not CI-gated. - Supply-chain license gate — a
deny.toml+cargo denyCI job enforces a
permissive-license allow-list, closing the gap left by advisory-only
cargo audit. - Strict template validation — an unclosed
[ … ]section or unterminated
${/$!{field is rejected at mount time with a message naming the problem,
instead of silently folding the rest of the template into the open construct.
Fixed
- Clearer mount errors — a missing or non-directory mountpoint is reported
with an actionable message before FUSE setup (previously a bareos error 2, or
a misleading "Permission denied" for a regular-file path); I/O errors no longer
print their OS string twice. - Silent mp4 oversize drops — oversized embedded
covrart and binary
freeform (----) values in.m4a/.m4bare skipped in the format layer and
now emit awarnline each, matching the other formats (#343). - xattr log noise —
getxattr/listxattr/setxattr/removexattrnow reply
ENOTSUPexplicitly instead of logging a[Not Implemented]warn on every
xattr probe (ls -l, indexers, backup tools); caller-visible result unchanged
(#364).
Prebuilt binaries for v1.1.0. Verify with: sha256sum -c <file>.sha256
v1.0.0
Prebuilt binaries for v1.0.0. Verify with: sha256sum -c .sha256
musefs v0.2.0
First public release.
Added
- Formats: synthesis for M4A/M4B (MP4), Ogg (Opus, Vorbis, FLAC-in-Ogg), and
WAV, alongside the existing FLAC and MP3 — metadata generated on the fly from
the SQLite store and spliced in front of byte-identical backing audio. - Arbitrary tag support: a single canonical tag vocabulary maps common fields
to each format's native slot (ID3 frame / MP4 atom / Vorbis field); any other
tag round-trips through the format's extension slot (ID3TXXX, MP4----
freeform, raw Vorbis field). User-defined key casing is preserved. - beets plugin (
contrib/beets/): syncs beets' canonical tags and cover art
into the store keyed by each file's real path, with no remount and no audio
rewrite. - Performance, concurrency & caching pass: worker-pool offload of blocking
reads, lock-free virtual-tree swap, per-handle I/O, a bounded LRU header-layout
cache, debounced single-flighted refresh with stable inodes, kernel/mount
tuning flags, bounded-memory MP4 resolves, and opt-in--keep-cachewith
auto-invalidation.
Notes
- Read-only mount; tag edits happen out-of-band against the SQLite store and are
picked up automatically (PRAGMA data_versionpolling). See the README "Tag
handling" section for round-trip limitations.