CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
## v4.4.3 (2026-09-23)
### Fixes
- `AppVersion` (used by the headless server's `/api/version`/`/api/health`) is now set correctly
by release builds: it was a Go `const`, which `-ldflags -X` cannot override, so every headless
server release reported `4.4.0` regardless of the actual tag.
### Internal
- CI now runs on Go 1.26.5 (previously 1.25).
- Bumped `youflac-core` to `v4.4.3`, `wails` to `v2.13.0`, `vite` to `^8`.
- `SoulseekSetup.tsx`'s displayed sldl path moved from `~/.local/share/flacidal/sldl` to
`~/.local/share/youflac/sldl`, matching youflac-core's `ResolveSldlPath` rename.
---
## v4.4.2 (2026-07-16)
### New features
- **Headless server works in a browser again**: the v4.3.1 "restore Wails desktop app" refactor moved `lib/api.ts`/`lib/websocket.ts` to Wails-only bindings (`window.go.*`), which broke the documented, released headless server (`youflac-server-*` binaries) in an actual browser tab, since `window.go` only exists inside the Wails webview. Restored dual-mode support: every function now checks a cached runtime detector and picks the Wails binding or a `fetch()`/WebSocket call to the Fiber server, reusing the pre-regression HTTP client logic rather than rewriting it.
- Amazon Music URLs are now recognized on the queue-add path and return a clear "fallback-only source" error instead of falling through to generic YouTube URL validation.
- Qobuz provider list now reflects live config (`Config.QobuzProxyProviders`) instead of a hardcoded, long-dead provider list.
- `/api/sources` distinguishes "not initialized" from "no sources" instead of returning a bare empty array either way.
- `go test`/`golangci-lint` (migrated to v2) now run in CI with real coverage collection; `main` is tested on every push, not just other branches.
### Internal
- Core dependency bumped to `v4.4.0`: real 4K/2160p support, real fake-lossless detection, dehardcoded Qobuz proxy providers, `ForceSource` wiring (see [youflac-core's changelog](https://github.com/kushiemoon-dev/youflac-core/blob/main/CHANGELOG.md)).
- Fixed 12 pre-existing findings surfaced by reactivating golangci-lint (errcheck on best-effort calls, unused params, error-string casing).
- Added `useQueue`/`useSettings` hook tests and closed a `SearchHistory` dispatch coverage gap.
- CI's `lint` and `build-check` jobs now generate the Wails JS bindings and a `frontend/dist`
placeholder before running: both jobs referenced `frontend/dist` (`go:embed`) or `wailsjs/`
(TypeScript imports) without ever creating them, unlike `test-frontend` which already did.
---
## v4.3.1 (2026-07-11)
### New features
- Wails desktop app restored as an alternative to the headless server mode, with native Windows/macOS build assets, alongside dedicated `internal/app/*` files split out to match youflac-core's package structure
- Reliable, self-hosted star-history badge (replaces the flaky third-party service)
### Fixes
- Resolved 13 Dependabot alerts (7 critical, 2 high, 4 medium) by bumping the transitive `golang.org/x/crypto` dependency to `v0.52.0`
- `golang.org/x/net` bumped to `v0.55.0` (DoS CVE)
- Fiber bumped and esbuild pinned (2 Dependabot advisories); a bad assumption about 404 responses was reverted after it broke behavior
- Jellyfin scan trigger documented in README
### Internal
- Core dependency bumped to `v4.3.1`: fixes a `channeljobs` test build break and makes the Tidal HiFi mirror base URL configurable via env instead of hardcoded (see [youflac-core's changelog](https://github.com/kushiemoon-dev/youflac-core/blob/main/CHANGELOG.md))
- `handlers.go` (1,200+ lines) split into per-domain files under `internal/api/`, each with new characterization tests
- Dead frontend code removed (per knip's report)
- CI: dedicated PAT for private `youflac-core` module access
---
## v4.3.0 (2026-07-03)
### New features
- **Reorganize/Flatten playlist tools actually work**: both were stubs that always reported "success, 0 moved"; `Reorganize` now moves each track into the regular `NamingTemplate` layout using its embedded tags, `Flatten` collapses the per-track subfolders a playlist download creates.
- **Jellyfin scan trigger**: Settings → Advanced → Media Server adds an enable toggle, server URL, and API key; triggers a debounced library scan a few seconds after a completed download.
### Fixes
- `GetPlaylistFolders` looked for numbered files directly under the playlist folder, but real playlist downloads nest one subfolder per track; it never matched anything, so the Reorganize/Flatten buttons never had a folder to act on.
- Path traversal: `Reorganize`/`Flatten` took `folderPath` straight from the request body with no validation, letting a crafted path escape the output directory. Now rejects anything but a plain, single-segment folder name.
### Internal
- **`youflac-core` is now a real pinned dependency**: `go.mod` requires `github.com/kushiemoon-dev/youflac-core/v4 v4.1.1` (fetched from its own tagged release) instead of a local `replace` to a sibling checkout that CI had to fake by cloning both repos on every build. Every build now uses the exact same Core version, not whatever happened to be on Core's `main` branch at the time. Core dependency covers multi-source endpoint discovery, full metadata tags, `.flac`/ISRC dedup, and the Jellyfin scan trigger, see [youflac-core's changelog](https://github.com/kushiemoon-dev/youflac-core/blob/main/CHANGELOG.md). Local cross-repo dev still works via a gitignored `go.work`.
- Removed dead Wails desktop code (`main.go`, `app.go`, `wails.json`, `build/`) left over from the already-completed migration to a standalone web server
- Frontend version was stuck at 4.0.0 while the backend read 4.2.0; CI's frontend job only ran `tsc`, never the actual test suite; `README.md`'s build-from-source steps previously (and briefly) needed a `youflac-core` sibling clone -- no longer true now that it's a pinned dependency
---
## v4.2.0 (2026-06-18)
### New features
- **Recentered the product on YouTube to MKV plus Soulseek FLAC**, removing the Universal Search surface added one bump earlier in v4.1.0
- Tagline and About page updated to describe the v4 architecture; README rewritten with screenshots and an updated config reference
---
## v4.1.0 (2026-06-18)
### New features
- **v4 rewrite: Soulseek and Qobuz as first-class sources alongside a source-priority UI**, with new backend endpoints for sources, Qobuz, Soulseek, and universal search, and matching frontend components (`SourcePriority`, `SoulseekSetup`, `QobuzProviders`, `UniversalSearch`)
- Orchestrator logging, FLAC verification, and env-driven config wired into the server
- Real Soulseek network probe replaces the placeholder login test
- Animated showcase GIF and a Remotion project added to the docs
- Internally bumped straight from 3.2.0 to 4.0.0 to 4.1.0 in the same session; 4.0.0 was never tagged or released
### Fixes
- Universal search response shape and the add-to-queue payload no longer disagree
- Missing `/system/update-check` route registered
- `vite` and `picomatch` security advisories resolved
### Internal
- Frontend build toolchain migrated from npm to pnpm 11, including three follow-up CI fixes (Node 22 requirement, cache integration, explicit pnpm version) to get the migration green
- `go.sum` synced for the `modernc.org/sqlite` transitive dependency pulled in via the youflac-core replace directive
- Nested `core/` and `mobile/` checkouts ignored; defunct Gitea sync removed; `frontend/dist` placeholder added back for the embed build
---
## v3.2.0 (2026-04-10)
### New features
- Channel download modal with URL classification, channel fetch endpoints, and websocket progress events
- Queue filtering by status/source/date/sort, a debug logs modal with level filtering, and skip/explicit badges on queue items
- Audio resampler page and endpoint, analyzer batch mode with drag-and-drop, and a converter folder mode with websocket progress streaming
- Audio preview endpoint and UI toggle, with an auto-update checker banner backed by a size-capped GitHub API call
- About page enriched with FAQ, GitHub warning, and donation links; font customization with a startup-applied CSS variable; unsaved-changes dialog and an open-config-folder button
### Fixes
- Data race in the channel fetch handler
- `sandboxPath` returned an unresolved path instead of the resolved canonical one
- Stuck "converting" state on server disconnect (missing `ws.onclose` guard)
- Desktop-only converter paths now reject gracefully instead of failing silently, with accessibility attributes added to the drop zone
---
## v3.1.0 (2026-04-03)
### Internal
- **Migrated off the local `backend/` package onto `youflac-core` as a shared module**: `server.go`, `main.go`, `app.go`, and `handlers.go` all moved to import youflac-core directly instead of a copy of the same code living in this repo
---
## v3.0.1 (2026-04-03)
### Fixes
- Qobuz URL regex now accepts alphanumeric IDs, not just digits
- Artist name extraction from the Lucida API response object fixed
- `LoadConfig`/`SaveConfig` now respect `CONFIG_DIR` via `GetConfigPathWithEnv`, fixing config paths under Docker
- Qobuz/Tidal/Spotify URLs routed to the wrong queue field; now routed to `SpotifyURL` correctly
- Tidal stream quality was hardcoded to `LOSSLESS` instead of honoring `PreferredQuality`
- Missing HTTP status checks before JSON parsing in `audio_orpheus`
### New features
- Qobuz credentials added to config and the settings UI
---
## v3.0.0 (2026-03-12)
### New features
- Light theme aligned with the Flacidal palette, with system preference detection; all hardcoded colors replaced with CSS variables
- Mobile-first responsive layout: sidebar becomes a bottom tab bar under 768px, with responsive padding, scrollable tabs, and wrapping filter pills
- Audio format converter (FLAC/WAV/MP3/AAC/OGG/ALAC) and YouTube search integration with video preview
- Queue enhancements: sort, filter, edit and retry, pause and resume
### Fixes
- Dependency updates to resolve security vulnerabilities
---
## v2.0.2 (2026-02-21)
### Fixes
- Cache-hit write in `CheckServiceStatus` was unprotected, causing a data race; now guarded by a mutex
### Internal
- Docker Go builds switched to pre-built binaries to fix a 6 hour CI timeout
- CI race detector merged in; the `golangci-lint` job (incompatible with Go 1.25 at the time) and the paid Codecov step were both removed in favor of a printed coverage summary
- Unit tests, benchmarks, a Makefile, and lint config added
- README rewritten with banner, screenshot, and full feature/API docs; broken Docker Hub pulls badge replaced with a static ghcr.io badge
---
## v2.0.1 (2026-02-20)
### Fixes
- Page title now correctly reads "YouFLAC"
- `docker-compose` now pulls the ghcr.io image instead of building locally
- ghcr.io image tagging now includes the v-prefixed semver tag (`v2.0.0`) alongside the bare version
### Internal
- Install docs updated with Docker (ghcr.io) and native binary instructions
---
## v2.0.0 (2026-02-20)
### New features
- **YouFLAC v2**: security hardening, a backend refactor, additional audio sources, and a CI/CD pipeline aligned with Flacidal's feature parity and design
- Endpoint rotation, proxy support, timeout config, and quality fallback for source lookups
- Structured logging via `log/slog`
- Explicit-content flag, M3U8 playlist export, and pause/resume on queue items
- Failed export, retry-all, and service status endpoints
- Music matching improvements with metadata-override retry
### Fixes
- Path traversal, input validation, and command injection issues closed as part of the security hardening pass
- FLAC audio trimmed of leading silence, and video/FLAC silence compared, to correct A/V sync drift
### Internal
- Large backend files split into focused modules
- Unit tests added for the new audio tools, queue, and API handlers
- Docker builder bumped to match `go.mod`'s Go version
- No GitHub Release was published for this tag
---
## v1.0.1 (2026-01-06)
### New features
- Docker containerization with a multi-stage build, plus an HTTP REST API server (Go Fiber) and websocket support for real-time queue updates, enabling a non-desktop deployment
- Audio analyzer with spectrogram/waveform visualization
- Download history with search and re-download, lyrics fetching from LRCLIB with embed/LRC options, accent color customization, and a sound effects toggle
### Fixes
- File Manager returned `null` instead of an empty array
- Naming template presets (Jellyfin, Plex, etc.) weren't resolving
- `SOUND_EFFECTS_ENABLED` environment variable naming corrected
---
## v1.0.0 (2026-01-05)
Initial release: YouTube + FLAC to MKV.
---