Skip to content

Releases: jwu-au/FreeBird

v3.6.1

Choose a tag to compare

@github-actions github-actions released this 30 Jun 15:04

Changed

  • fb watch default --poll-interval is now 30s (was 5s). The old 5-second default polled far too aggressively for large libraries where each file (especially .ncm / FLAC with L3 integrity) takes much longer than 5s to decode — every poll just hit the "previous cycle still running" guard. 30s is a saner default; override with --poll-interval as before.

Fixed

  • fb watch no longer spams "Previous cycle still running, skipping this poll". The skip-warning was designed to ramp to silence (one WARN, then debug, then quiet), but the counter reset at every cycle boundary — so a continuously-busy watcher (back-to-back long decodes) re-emitted the WARN on almost every poll. The ramp now persists across a sustained-busy stretch and only resets once the watcher genuinely catches up, so you see the warning once (plus the long-running hint), then quiet.

v3.6.0

Choose a tag to compare

@github-actions github-actions released this 30 Jun 01:14

Added

  • .ncm file support — FreeBird now decodes NetEase's downloaded .ncm files in addition to the existing .uc / .uc! stream-cache files. fb scan and fb watch pick up .ncm files automatically (same commands, no new flags); each input is routed to the right decoder by extension. Unlike cache files, .ncm files carry their own metadata and cover art, so they decode fully offline — no NetEase API call is made for them.
    • Embedded metadata + naming. Title, artist(s), and album are read straight from inside the file; output is named Artist - Title.flac (multi-artist joined with &), falling back to the original filename when the embedded metadata is absent.
    • Embedded cover art. The album cover stored in the .ncm is written into the output — FLAC via metaflac (PCM-MD5 preserved), MP3/M4A via TagLibSharp. --no-write-tags suppresses both tags and cover.
    • Same safety guarantees as the .uc path. Atomic staging writes, integrity checks (off/l1/l3/auto), quarantine-with-sidecar on a corrupt/undecodable file, and resolution markers so fb watch decodes each .ncm exactly once and skips it thereafter. Inputs are never modified.

v3.5.2

Choose a tag to compare

@github-actions github-actions released this 21 Jun 07:00

Fixed

  • Stale <musicId> fallback files are now cleaned up even when the resolved file already exists. When a file was first decoded offline (producing a <musicId>.<ext> fallback) and later re-resolved to its proper <artist> - <title>.<ext> name, the superseded fallback was only removed on the fresh-write path. If the resolved-named file already existed on disk (the common state after a reboot), FreeBird took the collision-skip path and left the stale <musicId> file behind forever. The same best-effort cleanup (with all its safety checks) now also runs on the collision-skip path. (Pre-existing orphans from older versions are not retroactively removed; delete those once by hand.)
  • scan and watch no longer re-request metadata for already-resolved files. Previously every fb scan invocation — and every fb watch/service initial sweep (e.g. on reboot) — re-hit the NetEase API for all cache files, even ones already successfully decoded in a prior run (their <artist> - <title> output and resolution marker already on disk). With no network at boot this produced a burst of API failures, MetadataFetchFailed markers, fallback <musicId> skips, and ~1-minute-later retries; with network it meant N redundant API calls (rate-limit risk). Both paths now consult the resolution marker before any API call and skip already-resolved files immediately. Failed-status markers still honor their retry-after backoff (a file due for retry is still re-processed), and a changed source or naming template still re-processes. scan and watch now follow the exact same skip rule (a single shared ResolvedMarkerGate).

v3.5.1

Choose a tag to compare

@github-actions github-actions released this 19 Jun 07:29

Fixed

  • Windows flac auto-download now works for scan / watch, not just install-flac. Previously the auto-installer was only reachable via fb install-flac; scan/watch defaulted the install URL to null, so on Windows --integrity auto silently fell back to L1 and --integrity l3 failed even though the (SHA-pinned) download path existed. FreeBird now auto-downloads the official flac binaries on Windows when none is found; macOS/Linux are unchanged (a hint to install via brew/apt is shown). --no-auto-download / FREEBIRD_NO_AUTO_DOWNLOAD still disable it.

Changed

  • License is now MIT (LICENSE added).
  • README rewritten for general users (simple-to-deep structure; implementation detail folded into collapsible sections). Contributor/architecture docs moved to CONTRIBUTING.md.

Documentation

  • Added an Information-level Signal handlers ready. log in watch/service mode once OS signal handlers are installed — a useful readiness signal for service operators.