Commit graph

4890 commits

Author SHA1 Message Date
Philip Peterson
176012478b Write the cask with postflight_steps and depends_on :macos
All checks were successful
CI / ci (push) Successful in 4m0s
Matches what Homebrew 7's style check wants; Ruby flight blocks are
only tolerated in third-party taps for now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 07:44:57 -08:00
Philip Peterson
671c5e6fae README: trust the tap before installing
All checks were successful
CI / ci (push) Successful in 4m1s
Current Homebrew refuses to load casks from untrusted third-party taps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 07:35:36 -08:00
Philip Peterson
6ef5ccd71b README: install with the Homebrew tap
Some checks are pending
CI / ci (push) Waiting to run
Also point at the Forgejo desktop workflow, not the GitHub one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 07:33:37 -08:00
Philip Peterson
f31e861fb9 Use the public Forgejo URL in the Homebrew cask
All checks were successful
Desktop Release / Build desktop (macos) (push) Successful in 3m16s
CI / ci (push) Successful in 4m13s
Desktop Release / Publish Gitea release (push) Successful in 14s
Desktop Release / Update Homebrew tap (push) Successful in 13s
$GITHUB_SERVER_URL is the runner's own address for Forgejo
(http://localhost:3000 on mainframe), so the cask pointed its url and
homepage at localhost.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 07:21:10 -08:00
Philip Peterson
a94a56499e Push to the tap over Forgejo's SSH port
All checks were successful
Desktop Release / Build desktop (macos) (push) Successful in 4m9s
CI / ci (push) Successful in 4m27s
Desktop Release / Publish Gitea release (push) Successful in 18s
Desktop Release / Update Homebrew tap (push) Successful in 14s
Forgejo's SSH server listens on 2200. Port 22 is the host's own sshd,
which only admits root, so the clone was refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 07:05:40 -08:00
Philip Peterson
1669d74a71 Add Rust targets to the pinned toolchain before building
Some checks failed
Desktop Release / Build desktop (macos) (push) Successful in 2m29s
CI / ci (push) Successful in 7m46s
Desktop Release / Publish Gitea release (push) Successful in 23s
Desktop Release / Update Homebrew tap (push) Failing after 18s
desktop/rust-toolchain.toml pins 1.98.0, but Setup Rust installs the
targets into stable, so the x86_64 Tauri build found no x86_64 std.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:06:25 -08:00
Philip Peterson
a7da442a3b Build both Mac targets in one desktop job
Some checks failed
Desktop Release / Build desktop (macos) (push) Failing after 1m52s
CI / ci (push) Has been cancelled
Desktop Release / Publish Gitea release (push) Has been cancelled
Desktop Release / Update Homebrew tap (push) Has been cancelled
Forgejo ignores max-parallel, so the two matrix jobs still ran at once on
the single Mac runner and collided on the act cache's git locks. Build
aarch64 then x86_64 within one job and upload them as one artifact.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 23:02:44 -08:00
Philip Peterson
8170818742 Build desktop targets one at a time
Some checks failed
Desktop Release / Build desktop (x86_64-apple-darwin) (push) Failing after 5s
Desktop Release / Publish Gitea release (push) Has been cancelled
Desktop Release / Update Homebrew tap (push) Has been cancelled
Desktop Release / Build desktop (aarch64-apple-darwin) (push) Has been cancelled
CI / ci (push) Has been cancelled
Both matrix jobs land on the same Mac, whose runners share the act
action cache; running them concurrently collides on its git shallow.lock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 22:58:59 -08:00
Philip Peterson
04478192a6 Install Go with a shell step on the Mac desktop runner
Some checks failed
Desktop Release / Build desktop (x86_64-apple-darwin) (push) Failing after 2s
Desktop Release / Publish Gitea release (push) Has been cancelled
Desktop Release / Update Homebrew tap (push) Has been cancelled
Desktop Release / Build desktop (aarch64-apple-darwin) (push) Has been cancelled
CI / ci (push) Successful in 7m33s
actions/setup-go downloads Go on the host-mode Mac runner but then fails
to find it ("/bin/sh: version: command not found"). Fetch the latest
patch of go.mod's release from go.dev instead; keep setup-go for Windows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 22:58:01 -08:00
Philip Peterson
81bce29025 Fetch GitHub-only actions by full URL in the desktop workflow
Some checks failed
Desktop Release / Build desktop (aarch64-apple-darwin) (push) Failing after 44s
CI / ci (push) Has been cancelled
Desktop Release / Build desktop (x86_64-apple-darwin) (push) Failing after 2m45s
Desktop Release / Publish Gitea release (push) Has been cancelled
Desktop Release / Update Homebrew tap (push) Has been cancelled
The Forgejo runner resolves bare action names against code.forgejo.org,
which doesn't mirror dtolnay/rust-toolchain (or rust-cache, setup-msys2),
so the macOS build jobs failed before starting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 22:51:27 -08:00
Philip Peterson
868afc95a2 Commit the Dagger module's go.mod and pin OpenTelemetry to v1.43.0
All checks were successful
CI / ci (push) Successful in 7m34s
Without a go.mod, Dagger regenerated one on every run and resolved
otel to the latest release (v1.47.0), while the Go SDK pins otel/log
to v0.16.0. The newer otel/internal/global imports otel/log, which
imports it back, so the module failed to build with an import cycle.

Pin otel, otel/trace and otel/metric to v1.43.0 (matching otel-go and
otel/sdk) and commit go.mod/go.sum so CI stops re-resolving.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:53:28 -08:00
Philip Peterson
6927026dae Pin the Dagger CLI to the engine version (0.20.6)
Some checks failed
CI / ci (push) Failing after 39s
CI now talks to the shared engine on mainframe instead of starting its
own; keep the CLI in step with it and with dagger.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
(cherry picked from commit 0a1c52794c)
2026-10-10 20:58:30 -08:00
Philip Peterson
533dfd2b0c Run workflows on main instead of master
Some checks are pending
CI / ci (push) Waiting to run
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:37:47 -08:00
Philip Peterson
fedab328f5 Push cask to the renamed tap, quine-global/homebrew-tap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:37:47 -08:00
Philip Peterson
6a5ee813ef Fix Forgejo workflows: Node 20 actions, renamed tap org
Some checks failed
CI / ci (push) Failing after 10m49s
- Pin checkout/setup-node/setup-go to their Node 20 majors; the Linux
  runner on mainframe can't run node24 actions yet.
- The Homebrew tap moved with the Quine → quine-global org rename.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:03:45 -08:00
Philip Peterson
604fef1188 Use Forgejo's artifact actions in the desktop workflow
Some checks failed
CI / ci (push) Failing after 39s
GitHub's actions/upload-artifact@v7 and download-artifact@v8 only work
against github.com/GHES; Forgejo needs its own v4-protocol forks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 18:13:56 -08:00
Philip Peterson
7e38bbdef1 Rename to com.quineglobal.drome and publish a Homebrew tap from Forgejo
- Change the bundle identifier to com.quineglobal.drome (Tauri config,
  Flatpak manifest/metainfo, Linux build, Justfile, READMEs). On first
  launch the app moves the old com.quintodrome.desktop data folder over so
  existing users keep their library.
- Ad-hoc sign macOS builds (signingIdentity "-") so the whole bundle is
  signed; the linker-only signature made Gatekeeper report the app as
  "damaged".
- Forgejo desktop workflow: cross-compile the Intel build on the Mac runner,
  drop Windows (no runner), create releases on the pushed tag instead of a
  "v"-less copy, fail on upload errors, and update the Quine/homebrew-quintodrome
  cask after each release.
- Add Flatpak AppStream metainfo and a 512px icon, and document the macOS
  "damaged" workaround in the README and GitHub release notes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 21:50:54 -08:00
Philip Peterson
570cf59102 Fix 2026-09-26 04:13:51 -08:00
Philip Peterson
9ee9a00a4b Fix toolbar/content webview layout not applying on startup
layout() bailed out silently whenever window.inner_size() or
scale_factor() failed or reported 0x0 - which can happen during the
setup() call on Linux/Wayland before the compositor has realized the
window. When that happened, the toolbar webview was left in its
default auto-resize state (filling the whole window) while the
content webview kept its hardcoded 800x600 initial size from
add_child(), producing an oversized toolbar and a small, disconnected
content pane.

Now the toolbar is forced out of auto-resize with an explicit size at
creation time regardless of whether layout() succeeds, the content
webview's initial size is derived from the real window size (falling
back to the configured 1280x800) instead of an arbitrary guess, and a
one-shot re-layout runs ~250ms after startup as a safety net for cases
where no later Resized event corrects an initially-wrong layout.
layout() also logs why it bails now instead of failing silently.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-26 03:40:34 -08:00
Philip Peterson
635b9d9ebd Fix goreleaser release body exceeding GitHub's 125000-char limit
v1.0.0-alpha is the first tag, so the changelog had no previous tag
to diff against and pulled in the full inherited history (~4800
commits), blowing past GitHub's release body size limit. Disable
the changelog for now, and fix the footer's hardcoded
navidrome/navidrome compare link to point at the actual repo and
only render once a previous tag exists.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-24 15:25:09 -08:00
Philip Peterson
4cad9aeb4f Match any version in pipeline package globs
The package globs assumed 0.x versions (navidrome_0*), so a 1.x tag
produced an empty package list and upload-packages failed with an
empty matrix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 08:36:12 -08:00
Philip Peterson
d56a30fffd Use macos-15-intel runner for Intel desktop build
macos-13 runner images were retired, leaving the x86_64-apple-darwin
job queued indefinitely.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-24 08:20:07 -08:00
Philip Peterson
c7caf452a9 Fix build 2026-09-24 07:05:23 -08:00
Philip Peterson
155a04baf3 Merge branch 'master' of github.com:philip-peterson/quintodrome 2026-09-24 04:22:21 -08:00
Philip Peterson
3241f8cb53 Add build actions 2026-09-24 04:21:55 -08:00
Philip Peterson
9d69b16bdd
Simplify app launch description in README
Removed detailed launch process steps for the app.
2026-09-23 01:18:49 -08:00
Philip Peterson
4e446533c3
Add files via upload 2026-09-23 01:16:23 -08:00
Philip Peterson
163f47ef9b
Replace external screenshot with local image
Updated screenshot image in README to a local file.
2026-09-23 01:16:06 -08:00
Philip Peterson
22d53b3d92
Add screenshot to README for app visualization
Added a screenshot to the README for better visualization.
2026-09-23 01:14:25 -08:00
Philip Peterson
7a1b0e6072 Quintodrome 2026-09-02 23:41:24 -08:00
Deluan Quintão
3b958dd6a7
refactor(stream): remove dead type branches from getIntClaim (#5594)
The jwx library always deserializes numeric claims from a parsed token as
float64, so the int and int64 branches in getIntClaim could never succeed
and were dead code. Keep only the float64 path, which is the one actually
exercised by the token round-trip, and update the comment to document the
library behavior.
2026-06-10 23:15:58 -04:00
Deluan Quintão
08fd222791
fix(smartplaylist): support isMissing/isPresent operators on ReplayGain fields (#5585)
* fix(smartplaylist): support isMissing/isPresent operators on ReplayGain fields

ReplayGain values are stored in dedicated nullable columns (rg_album_gain,
rg_album_peak, rg_track_gain, rg_track_peak) rather than in the media_file.tags
JSON blob. The isMissing/isPresent operators previously only supported tag and
role fields, causing two failure modes:

1. Using the documented alias names (replaygain_album_gain etc.) from PR #5256:
   these got registered as JSON tags from mappings.yaml, so isMissing queried
   json_tree(media_file.tags, '$.replaygain_album_gain') which is always empty
   -> the playlist matched ALL songs.

2. Using the canonical field names (rgalbumgain etc.): not a tag/role, so SQL
   generation returned an error. Because refreshSmartPlaylist deletes old tracks
   before regenerating, the abort left the playlist empty.

Fix: add Nullable bool to FieldInfo and mark the four ReplayGain fields. Add
static alias entries (replaygain_album_gain -> rgalbumgain etc.) with
Numeric+Nullable set; because AddTagNames skips names already in the field map,
these static entries take precedence over the mappings.yaml tag registration.
missingExpr now emits IS NULL / IS NOT NULL for nullable column fields instead
of the json_tree lookup.

Fixes #5584

* chore(smartplaylist): address code review feedback

- Simplify the isMissing/isPresent unsupported-field error message,
  removing the internal "nullable fields" jargon
- Standardize comments on mappings.yaml (the actual filename)
- Clarify the alias precedence comment in the LookupField test
2026-06-10 21:12:31 -04:00
Jan Mrzygłód
37e5a1d248
fix(ui): Fix Nautiline theme font and width on mobile devices (#5590)
Signed-off-by: devBoi76 <mrzyglodjan@protonmail.com>
2026-06-10 16:47:54 -04:00
Deluan
bd3192be0b fix(server): make DB PRAGMA optimize error non-fatal
Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-09 19:29:58 -04:00
Deluan
b6fba33b14 chore(docs): add Danian hosting option to installation instructions
Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-09 19:29:58 -04:00
Deluan Quintão
9cd2cd0a8b
fix(ui): load ND_DEFAULTLANGUAGE on app startup (#4000)
* fix: load ND_DEFAULTLANGUAGE on app startup

Added  in  to apply  on initial mount, ensuring the locale is set even when the login page is skipped by reverse-proxy authentication. Removed the redundant language-init effect from . Fixes #3605.

* style(ui): format App.jsx with Prettier

Ran Prettier on ui/src/App.jsx to satisfy code style checks after adding default-language useEffect.

* fix(ui): move default language initialization to Admin component

Signed-off-by: Deluan <deluan@navidrome.org>

* fix(ui): streamline locale setting in App component

Signed-off-by: Deluan <deluan@navidrome.org>

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-09 19:27:15 -04:00
Deluan Quintão
1b46b97712
fix(ui): update Indonesian translations from POEditor (#5575)
Co-authored-by: navidrome-bot <navidrome-bot@navidrome.org>
2026-06-08 08:22:59 -04:00
Deluan Quintão
5c387630ff
fix(ui): update Estonian translations from POEditor (#5573)
Co-authored-by: navidrome-bot <navidrome-bot@navidrome.org>
2026-06-07 12:29:17 -04:00
Deluan
9a2eb483e8 fix(transcode): log warning for invalid or stale transcode tokens
Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-06 11:00:27 -04:00
Metalhearf
cc18bf7329
feat(ui): add Tokyo Night theme (#5497)
* feat(themes): add Tokyo Night theme

Signed-off-by: Metalhearf <6446231+Metalhearf@users.noreply.github.com>

* fix(themes): address review feedback on Tokyo Night

Signed-off-by: Metalhearf <6446231+Metalhearf@users.noreply.github.com>

---------

Signed-off-by: Metalhearf <6446231+Metalhearf@users.noreply.github.com>
Co-authored-by: Deluan <deluan@navidrome.org>
2026-06-05 21:04:48 -04:00
Love
e15896bf32 feat(ui): Add Catppuccin Latte (#5250)
Add Catppuccin Latte (the light version) theme based on the existing Catppuccin Macchiato theme.
The palette and player styling are adapted for light mode while staying as close as practical
to the existing Macchiato theme behavior. I've opted to use gray for the
color for controls.

The dark version appears to mix a few control/accent colors,
so for Latte I standardized those choices. This might be worth looking
into in a separate PR. It uses gray and blue.

Signed-off-by: Love Billenius <lovebillenius@disroot.org>
Co-authored-by: Deluan Quintão <deluan@navidrome.org>
Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-05 20:42:53 -04:00
craiglush
29c123854c
feat(ui): Add Moonbase themes (Alpha light + Bravo dark) (#5243)
* Add Moonbase theme

A warm dark theme with gold (#d4a039) accents on deep charcoal
backgrounds (#0a0a09/#141413). Features muted cream text (#e5ddd3),
copper error states (#c45c3c), and subtle earthy secondary tones.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Fix review comments on Moonbase theme

- Fix CSS selector: use :not(.player-delete) instead of :not([class=".player-delete"])
- Fix MuiFormHelperText override structure: target error key directly
- Remove empty icon: {} and avatar: {} from NDLogin overrides
- Use comma-separated rgba syntax and hex for linear-gradient

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* Add Moonbase Alpha (light) and rename dark to Moonbase Bravo

Split the Moonbase theme into a complementary pair:
- Moonbase Alpha: warm cream/stone light theme with deep gold accents
- Moonbase Bravo: the original deep charcoal dark theme

Both share the same gold (#d4a039) brand accent, copper error states,
and earthy neutral palette. Alpha uses darkened gold (#9a7420) for
better contrast on light backgrounds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Deluan Quintão <deluan@navidrome.org>
2026-06-05 20:35:56 -04:00
Buck DeFore
318ad164df
fix(ui): suppress capitalization and correction for login on mobile keyboards (#3783)
* suppress capitalization and correction for login on mobile keyboards

* prettier pass

---------

Co-authored-by: Deluan Quintão <deluan@navidrome.org>
2026-06-05 18:35:00 -04:00
Daniel Barrientos Anariba
1709ce37f6
fix(ui): update Spanish translations and add missing gain keys (#5433)
* fix(ui): update Spanish translations and add missing gain keys

- Add missing 'albumGain' and 'trackGain' keys (matches recent additions in pt-br, ru)
- Translate 'Playlists' and 'Shared Playlists' to 'Listas de reproducción' / '...compartidas'
- Translate 'OFFLINE' (server down indicator) to 'DESCONECTADO'

Spanish translation now covers 553/553 keys (was 551/553).

Signed-off-by: Daniel Banariba <banaribad@gmail.com>

* fix(ui): address review feedback on Spanish translations

- Use 'Ganancia del álbum' (with article 'del') for consistency with the existing pattern in line 624 ('album': 'Ganancia del álbum') and 'Artista del álbum'. Thanks @gemini-code-assist for the catch.
- Revert 'playlists' and 'sharedPlaylists' to keep the loanword 'Playlist(s)' which is the form actually used by Spanish-speaking music app users (Spotify ES, etc.) and matches existing usage elsewhere in this same file (e.g. line 48 'Agregar a la playlist').

Signed-off-by: Daniel Banariba <banaribad@gmail.com>

---------

Signed-off-by: Daniel Banariba <banaribad@gmail.com>
Co-authored-by: Deluan Quintão <deluan@navidrome.org>
2026-06-05 18:32:57 -04:00
Xabi
a6451f75d6
fix(ui): update Basque localisation (#5364)
Added two strings (gain), imrpoved some, fixed a typo

Co-authored-by: Deluan Quintão <deluan@navidrome.org>
2026-06-05 18:32:10 -04:00
Deluan Quintão
03841ffe96
fix(ui): update German, Finnish, Galician, Dutch, Slovak, Thai, Chinese (traditional) translations from POEditor (#5351)
Co-authored-by: navidrome-bot <navidrome-bot@navidrome.org>
2026-06-05 18:16:21 -04:00
Deluan Quintão
fb61827ab6
test: fix flaky tests in utils/cache (#5567)
* test: fix flaky tests in utils/cache

Two tests in the utils/cache suite were timing- and ordering-dependent
and failed intermittently on CI (notably on the Windows runner).

The FileHaunter tests raced the asynchronous cache-cleanup goroutine with
a fixed 400ms sleep, then asserted the directory state once. On slow
runners the haunter had not finished scrubbing, so the assertion saw the
original files and failed. Replace the fixed sleep with Eventually polling
so the assertions wait for the haunter to converge. While doing so, the
exact set and count of reaped files proved nondeterministic (the empty
file is double-counted in the size loop and LRU survivors depend on
OS access-time ordering), so the assertions now check the haunter's
actual guarantees: the empty file is always scrubbed and the cache stays
within the configured maxSize/maxItems bound. This also lets the
previously-disabled maxItems context and its commented-out assertions be
re-enabled.

The HTTPClient 'caches repeated requests' test relied on a shared
requestsReceived counter that was never reset in BeforeEach. Under
randomized spec order another spec could run first and leave the counter
non-zero, breaking the first assertion. Reset the counter and header in
BeforeEach to make the spec independent of execution order.

Verified with: ginkgo -race -repeat=80 --randomize-all ./utils/cache/

* test: surface errors in dirSize and align Eventually with house style

Address code review feedback on the cache flaky-test fix:

- dirSize now returns (uint64, error) and the maxSize spec asserts the
  error is nil. Previously a ReadDir/Info failure silently returned 0,
  which always satisfies '<= maxSize' and would mask a real filesystem
  error as a passing test.
- dirSize skips non-regular entries (info.Mode().IsRegular()) to match
  its doc comment and avoid counting directories or symlinks.
- The Eventually blocks now use .WithTimeout()/.WithPolling() with
  time.Duration values instead of string-literal durations, matching the
  prevailing pattern in the test suite.
2026-06-05 18:06:52 -04:00
Deluan
1e7996f5d7 fix(share): enforce per-user ownership on share reads
Share repository read methods (Get, GetAll, Read, ReadAll, Exists, Count,
CountAll) did not apply an owner filter, so non-admin users saw shares
belonging to other users. The write paths already enforced per-user ownership;
this brings reads in line with them.

Add an addRestriction()/ownerFilter() based scope to share reads, keeping
admins and the headless public-share resolution path unrestricted. Route share
and player Delete through a new base-repo deleteOwned() primitive that applies
the ownership predicate in the DELETE's WHERE clause (atomic, no select-then-
delete window) and classifies a zero-row result as permission-denied vs
not-found, mirroring updateOwned. The addRestriction helper and the write-miss
classifier are hoisted onto the base repository so player and share share one
implementation.

Also map rest.ErrPermissionDenied and rest.ErrNotFound in the Subsonic error
handler so ownership/not-found failures from the rest-backed repositories
return the proper Subsonic codes (50 / 70) instead of a generic error.

Covered by unit tests (persistence, subsonic error mapping) and an end-to-end
cross-user sharing isolation test.
2026-06-05 15:50:59 -04:00
Deluan Quintão
174621f259 fix(nativeapi): make /api/song path filter work and use startsWith (#5566)
The native API exposes a `path` query param on /api/song, but it was not
registered in the media file filter map. Unmapped real columns fall through
to a default LIKE predicate that emits an unqualified `path LIKE ?`. Since
the song query joins the library table (which also has a `path` column),
SQLite returned "ambiguous column name: path" and the request failed with
HTTP 500.

Register a dedicated path filter qualified to media_file.path, resolving the
ambiguity. The value is matched with startsWith semantics (LIKE arg || '%')
against the library-relative path stored in media_file.path.

To register it inline (without a one-off wrapper), startsWithFilter now takes
a bound field and returns a filterFunc, mirroring containsFilter. The two
existing callers are updated accordingly, and the now-unused withTableName
helper is removed. The user 'name' filter, which previously relied on
withTableName, is now qualified directly as user.name; tests are added to
guard that filter against the same column-ambiguity class (the user query
also joins the library table, which has a name column).

Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-05 14:00:08 -04:00
Deluan
cf1f190bb5 fix(subsonic): use SQLite RANDOM() sorting in getRandomSongs, for faster results
Related to #5558

Signed-off-by: Deluan <deluan@navidrome.org>
2026-06-05 08:14:00 -04:00