Commit Graph
50 Commits
Author SHA1 Message Date
Deluan QuintãoandGitHub 4ddb0774ec perf(artwork): improve image serving performance with WebP encoding and optimized pipeline (#5181)
* test(artwork): add benchmark helpers for generating test images

* test(artwork): add image decode benchmarks for JPEG/PNG at various sizes

* test(artwork): add image resize benchmarks for Lanczos at various sizes

* test(artwork): add image encode benchmarks for JPEG quality levels and PNG

* test(artwork): add full resize pipeline benchmark (decode+resize+encode)

* test(artwork): add tag extraction benchmark for embedded art

* test(cache): add file cache benchmarks for read, write, and concurrent access

* test(artwork): add E2E benchmarks for artwork.Get with cache on/off and concurrency

* fix(test): use absolute path for tag extraction benchmark fixture

* test(artwork): add resize alternatives benchmark comparing resamplers

* perf(artwork): switch to CatmullRom resampler and JPEG for square images

Replace imaging.Lanczos with imaging.CatmullRom for image resizing
(30% faster, indistinguishable quality at thumbnail sizes). Stop forcing
PNG encoding for square images when the source is JPEG — JPEG is smaller
and faster to encode. Square images from JPEG sources went from 52ms to
10ms (80% improvement). Add sync.Pool for encode buffers to reduce GC
pressure under concurrent load.

* perf(artwork): increase cache warmer concurrency from 2 to 4 workers

Resize is CPU-bound, so more workers improve throughput on multi-core
systems. Doubled worker count to better utilize available cores during
background cache warming.

* perf(artwork): switch to xdraw.ApproxBiLinear and always encode as JPEG

Replace disintegration/imaging with golang.org/x/image/draw for image
resizing. This eliminates ~92K allocations per resize (from imaging's
internal goroutine parallelism) down to ~20, reducing GC pressure under
concurrent load.

Always encode resized artwork as JPEG regardless of source format, since
cover art doesn't need transparency. This is ~5x faster than PNG encode
and produces much smaller output (e.g. 18KB JPEG vs 124KB PNG).

* perf(artwork): skip external API call when artist image URL is cached

ArtistImage() was always calling the external agent (Spotify/Last.fm)
to get the image URL, even when the artist already had URLs stored in
the database. This caused every artist image request to block on an
external API call, creating severe serialization when loading artist
grids (5-20 seconds for the first page).

Now use the stored URL directly when available. Artists with no stored
URL still fetch synchronously. Background refresh via UpdateArtistInfo
handles TTL-based URL updates.

* perf(artwork): increase getCoverArt throttle from NumCPU/3 to NumCPU

The previous default of max(2, NumCPU/3) was too aggressive for artist
images which are I/O-bound (downloading from external CDNs), not
CPU-bound. On an 8-core machine this meant only 2 concurrent requests,
causing a staircase pattern where 12 images took ~2.4s wall-clock.

Bumping to max(4, NumCPU) cuts wall-clock time by ~50% for artist image
grids while still preventing unbounded concurrency for CPU-bound resizes.

* perf(artwork): encode resized images as WebP instead of JPEG

Switch from JPEG to WebP encoding for resized artwork using gen2brain/webp
(libwebp via WASM, no CGo). WebP produces ~74% smaller output at the same
quality with only ~25% slower full-pipeline encode time (cached, so only
paid once per artwork+size).

Use NRGBA image type to preserve alpha channel in WebP output, and
transparent padding for square canvas instead of black.

Also removes the disintegration/imaging dependency entirely by replacing
imaging.Fill in playlist tile generation with a custom fillCenter function
using xdraw.ApproxBiLinear.

* perf(artwork): switch from ApproxBiLinear to BiLinear scaling for improved image processing

Signed-off-by: Deluan <[email protected]>

* refactor(configuration): rename CoverJpegQuality to CoverArtQuality and update references

Signed-off-by: Deluan <[email protected]>

* feat(artwork): add DevJpegCoverArt option to control JPEG encoding for cover art

Signed-off-by: Deluan <[email protected]>

* fix(artwork): remove redundant transparent fill and handle encode errors in resizeImage

Removed a no-op draw.Draw call that filled the NRGBA canvas with
transparent pixels — NewNRGBA already zero-initializes to fully
transparent. Also added an early return on encode failure to avoid
allocating and copying potentially corrupt buffer data before returning
the error.

* fix(configuration): reorder default agents (deezer is faster)

Signed-off-by: Deluan <[email protected]>

* fix(test): resolve dogsled lint warning in tag extraction benchmark

Use all return values from runtime.Caller instead of discarding three
with blank identifiers, which triggered the dogsled linter.

* fix(artwork): revert cache key format

Signed-off-by: Deluan <[email protected]>

* fix(configuration): remove deprecated CoverJpegQuality field and update references to CoverArtQuality

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2026-03-13 09:35:59 -04:00
MaximilianandGitHub a704e86ac1 refactor: run Go modernize (#5002) 2026-02-08 09:57:30 -05:00
Deluan QuintãoandGitHub 76042ba173 feat(ui): add Now Playing panel for admins (#4209)
* feat(ui): add Now Playing panel and integrate now playing count updates

Signed-off-by: Deluan <[email protected]>

* fix: check return value in test to satisfy linter

* fix: format React code with prettier

* fix: resolve race condition in play tracker test

* fix: log error when fetching now playing data fails

Signed-off-by: Deluan <[email protected]>

* feat(ui): refactor Now Playing panel with new components and error handling

Signed-off-by: Deluan <[email protected]>

* fix(ui): adjust padding and height in Now Playing panel for improved layout

Signed-off-by: Deluan <[email protected]>

* fix(cache): add automatic cleanup to prevent goroutine leak on cache garbage collection

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2025-06-10 17:22:13 -04:00
Deluan de698918ac Revert "fix(server): failed transcoded files should not be cached (#4124)"
This reverts commit 9dd5a8c334.
2025-05-27 19:53:10 -04:00
Deluan QuintãoandGitHub 9dd5a8c334 fix(server): failed transcoded files should not be cached (#4124)
* Close stream on caching errors

* fix(test): replace errPartialReader with errFakeReader to fix lint error

Signed-off-by: Deluan <[email protected]>

* fix(test): update error assertion to check for substring in closed file error

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2025-05-26 20:30:26 -04:00
Deluan QuintãoandGitHub 6731787053 fix(server): memory leak in cache warmer (#4095)
* Prevent cache warmer memory leak when cache disabled

* refactor(tests): replace disabledCache with mockFileCache in CacheWarmer tests

Signed-off-by: Deluan <[email protected]>

* test(cache): enhance CacheWarmer tests for initialization, buffer management, and error handling

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2025-05-21 21:48:49 -04:00
Deluan QuintãoandGitHub 5ab345c83e chore(server): add more info to scrobble errors logs (#3889)
* chore(server): add more info to scrobble errors

Signed-off-by: Deluan <[email protected]>

* chore(server): add more info to scrobble errors

Signed-off-by: Deluan <[email protected]>

* chore(server): add more info to scrobble errors

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2025-03-27 18:57:06 -04:00
c795bcfcf7 feat(bfr): Big Refactor: new scanner, lots of new fields and tags, improvements and DB schema changes (#2709)
* fix(server): more race conditions when updating artist/album from external sources

Signed-off-by: Deluan <[email protected]>

* feat(scanner): add .gitignore syntax to .ndignore. Resolves #1394

Signed-off-by: Deluan <[email protected]>

* fix(ui): null

Signed-off-by: Deluan <[email protected]>

* fix(scanner): pass configfile option to child process

Signed-off-by: Deluan <[email protected]>

* fix(scanner): resume interrupted fullScans

Signed-off-by: Deluan <[email protected]>

* fix(scanner): remove old scanner code

Signed-off-by: Deluan <[email protected]>

* fix(scanner): rename old metadata package

Signed-off-by: Deluan <[email protected]>

* fix(scanner): move old metadata package

Signed-off-by: Deluan <[email protected]>

* fix: tests

Signed-off-by: Deluan <[email protected]>

* chore(deps): update Go to 1.23.4

Signed-off-by: Deluan <[email protected]>

* fix: logs

Signed-off-by: Deluan <[email protected]>

* fix(test):

Signed-off-by: Deluan <[email protected]>

* fix: log level

Signed-off-by: Deluan <[email protected]>

* fix: remove log message

Signed-off-by: Deluan <[email protected]>

* feat: add config for scanner watcher

Signed-off-by: Deluan <[email protected]>

* refactor: children playlists

Signed-off-by: Deluan <[email protected]>

* refactor: replace `interface{}` with `any`

Signed-off-by: Deluan <[email protected]>

* fix: smart playlists with genres

Signed-off-by: Deluan <[email protected]>

* fix: allow any tags in smart playlists

Signed-off-by: Deluan <[email protected]>

* fix: artist names in playlists

Signed-off-by: Deluan <[email protected]>

* fix: smart playlist's sort by tags

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add moods to child

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add moods to AlbumID3

Signed-off-by: Deluan <[email protected]>

* refactor(subsonic): use generic JSONArray for OS arrays

Signed-off-by: Deluan <[email protected]>

* refactor(subsonic): use https in test

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add releaseTypes to AlbumID3

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add recordLabels to AlbumID3

Signed-off-by: Deluan <[email protected]>

* refactor(subsonic): rename JSONArray to Array

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add artists to AlbumID3

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add artists to Child

Signed-off-by: Deluan <[email protected]>

* fix(scanner): do not pre-populate smart playlists

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): implement a simplified version of ArtistID3.

See https://github.com/opensubsonic/open-subsonic-api/discussions/120

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add artists to album child

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add contributors to mediafile Child

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add albumArtists to mediafile Child

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add displayArtist and displayAlbumArtist

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add displayComposer to Child

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add roles to ArtistID3

Signed-off-by: Deluan <[email protected]>

* fix(subsonic): use " • " separator for displayComposer

Signed-off-by: Deluan <[email protected]>

* refactor:

Signed-off-by: Deluan <[email protected]>

* fix(subsonic):

Signed-off-by: Deluan <[email protected]>

* fix(subsonic): respect `PreferSortTags` config option

Signed-off-by: Deluan <[email protected]>

* refactor(subsonic):

Signed-off-by: Deluan <[email protected]>

* refactor: optimize purging non-unused tags

Signed-off-by: Deluan <[email protected]>

* refactor: don't run 'refresh artist stats' concurrently with other transactions

Signed-off-by: Deluan <[email protected]>

* refactor:

Signed-off-by: Deluan <[email protected]>

* fix: log message

Signed-off-by: Deluan <[email protected]>

* feat: add Scanner.ScanOnStartup config option, default true

Signed-off-by: Deluan <[email protected]>

* feat: better json parsing error msg when importing NSPs

Signed-off-by: Deluan <[email protected]>

* fix: don't update album's imported_time when updating external_metadata

Signed-off-by: Deluan <[email protected]>

* fix: handle interrupted scans and full scans after migrations

Signed-off-by: Deluan <[email protected]>

* feat: run `analyze` when migration requires a full rescan

Signed-off-by: Deluan <[email protected]>

* feat: run `PRAGMA optimize` at the end of the scan

Signed-off-by: Deluan <[email protected]>

* fix: don't update artist's updated_at when updating external_metadata

Signed-off-by: Deluan <[email protected]>

* feat: handle multiple artists and roles in smart playlists

Signed-off-by: Deluan <[email protected]>

* feat(ui): dim missing tracks

Signed-off-by: Deluan <[email protected]>

* fix: album missing logic

Signed-off-by: Deluan <[email protected]>

* fix: error encoding in gob

Signed-off-by: Deluan <[email protected]>

* feat: separate warnings from errors

Signed-off-by: Deluan <[email protected]>

* fix: mark albums as missing if they were contained in a deleted folder

Signed-off-by: Deluan <[email protected]>

* refactor: add participant names to media_file and album tables

Signed-off-by: Deluan <[email protected]>

* refactor: use participations in criteria, instead of m2m relationship

Signed-off-by: Deluan <[email protected]>

* refactor: rename participations to participants

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add moods to album child

Signed-off-by: Deluan <[email protected]>

* fix: albumartist role case

Signed-off-by: Deluan <[email protected]>

* feat(scanner): run scanner as an external process by default

Signed-off-by: Deluan <[email protected]>

* fix(ui): show albumArtist names

Signed-off-by: Deluan <[email protected]>

* fix(ui): dim out missing albums

Signed-off-by: Deluan <[email protected]>

* fix: flaky test

Signed-off-by: Deluan <[email protected]>

* fix(server): scrobble buffer mapping. fix #3583

Signed-off-by: Deluan <[email protected]>

* refactor: more participations renaming

Signed-off-by: Deluan <[email protected]>

* fix: listenbrainz scrobbling

Signed-off-by: Deluan <[email protected]>

* feat: send release_group_mbid to listenbrainz

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): implement OpenSubsonic explicitStatus field (#3597)

* feat: implement OpenSubsonic explicitStatus field

* fix(subsonic): fix failing snapshot tests

* refactor: create helper for setting explicitStatus

* fix: store smaller values for explicit-status on database

* test: ToAlbum explicitStatus

* refactor: rename explicitStatus helper function

---------

Co-authored-by: Deluan Quintão <[email protected]>

* fix: handle album and track tags in the DB based on the mappings.yaml file

Signed-off-by: Deluan <[email protected]>

* save similar artists as JSONB

Signed-off-by: Deluan <[email protected]>

* fix: getAlbumList byGenre

Signed-off-by: Deluan <[email protected]>

* detect changes in PID configuration

Signed-off-by: Deluan <[email protected]>

* set default album PID to legacy_pid

Signed-off-by: Deluan <[email protected]>

* fix tests

Signed-off-by: Deluan <[email protected]>

* fix SIGSEGV

Signed-off-by: Deluan <[email protected]>

* fix: don't lose album stars/ratings when migrating

Signed-off-by: Deluan <[email protected]>

* store full PID conf in properties

Signed-off-by: Deluan <[email protected]>

* fix: keep album annotations when changing PID.Album config

Signed-off-by: Deluan <[email protected]>

* fix: reassign album annotations

Signed-off-by: Deluan <[email protected]>

* feat: use (display) albumArtist and add links to each artist

Signed-off-by: Deluan <[email protected]>

* fix: not showing albums by albumartist

Signed-off-by: Deluan <[email protected]>

* fix: error msgs

Signed-off-by: Deluan <[email protected]>

* fix: hide PID from Native API

Signed-off-by: Deluan <[email protected]>

* fix: album cover art resolution

Signed-off-by: Deluan <[email protected]>

* fix: trim participant names

Signed-off-by: Deluan <[email protected]>

* fix: reduce watcher log spam

Signed-off-by: Deluan <[email protected]>

* fix: panic when initializing the watcher

Signed-off-by: Deluan <[email protected]>

* fix: various artists

Signed-off-by: Deluan <[email protected]>

* fix: don't store empty lyrics in the DB

Signed-off-by: Deluan <[email protected]>

* remove unused methods

Signed-off-by: Deluan <[email protected]>

* drop full_text indexes, as they are not being used by SQLite

Signed-off-by: Deluan <[email protected]>

* keep album created_at when upgrading

Signed-off-by: Deluan <[email protected]>

* fix(ui): null pointer

Signed-off-by: Deluan <[email protected]>

* fix: album artwork cache

Signed-off-by: Deluan <[email protected]>

* fix: don't expose missing files in Subsonic API

Signed-off-by: Deluan <[email protected]>

* refactor: searchable interface

Signed-off-by: Deluan <[email protected]>

* fix: filter out missing items from subsonic search

* fix: filter out missing items from playlists

* fix: filter out missing items from shares

Signed-off-by: Deluan <[email protected]>

* feat(ui): add filter by artist role

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): only return albumartists in getIndexes and getArtists endpoints

Signed-off-by: Deluan <[email protected]>

* sort roles alphabetically

Signed-off-by: Deluan <[email protected]>

* fix: artist playcounts

Signed-off-by: Deluan <[email protected]>

* change default Album PID conf

Signed-off-by: Deluan <[email protected]>

* fix albumartist link when it does not match any albumartists values

Signed-off-by: Deluan <[email protected]>

* fix `Ignoring filter not whitelisted` (role) message

Signed-off-by: Deluan <[email protected]>

* fix: trim any names/titles being imported

Signed-off-by: Deluan <[email protected]>

* remove unused genre code

Signed-off-by: Deluan <[email protected]>

* serialize calls to Last.fm's getArtist

Signed-off-by: Deluan <[email protected]>

xxx

Signed-off-by: Deluan <[email protected]>

* add counters to genres

Signed-off-by: Deluan <[email protected]>

* nit: fix migration `notice` message

Signed-off-by: Deluan <[email protected]>

* optimize similar artists query

Signed-off-by: Deluan <[email protected]>

* fix: last.fm.getInfo when mbid does not exist

Signed-off-by: Deluan <[email protected]>

* ui only show missing items for admins

Signed-off-by: Deluan <[email protected]>

* don't allow interaction with missing items

Signed-off-by: Deluan <[email protected]>

* Add Missing Files view (WIP)

Signed-off-by: Deluan <[email protected]>

* refactor: merged tag_counts into tag table

Signed-off-by: Deluan <[email protected]>

* add option to completely disable automatic scanner

Signed-off-by: Deluan <[email protected]>

* add delete missing files functionality

Signed-off-by: Deluan <[email protected]>

* fix: playlists not showing for regular users

Signed-off-by: Deluan <[email protected]>

* reduce updateLastAccess frequency to once every minute

Signed-off-by: Deluan <[email protected]>

* reduce update player frequency to once every minute

Signed-off-by: Deluan <[email protected]>

* add timeout when updating player

Signed-off-by: Deluan <[email protected]>

* remove dead code

Signed-off-by: Deluan <[email protected]>

* fix duplicated roles in stats

Signed-off-by: Deluan <[email protected]>

* add `; ` to artist splitters

Signed-off-by: Deluan <[email protected]>

* fix stats query

Signed-off-by: Deluan <[email protected]>

* more logs

Signed-off-by: Deluan <[email protected]>

* fix: support legacy clients (DSub) by removing OpenSubsonic extra fields - WIP

Signed-off-by: Deluan <[email protected]>

* fix: support legacy clients (DSub) by removing OpenSubsonic extra fields - WIP

Signed-off-by: Deluan <[email protected]>

* fix: support legacy clients (DSub) by removing OpenSubsonic extra fields - WIP

Signed-off-by: Deluan <[email protected]>

* fix: support legacy clients (DSub) by removing OpenSubsonic extra fields - WIP

Signed-off-by: Deluan <[email protected]>

* add record label filter

Signed-off-by: Deluan <[email protected]>

* add release type filter

Signed-off-by: Deluan <[email protected]>

* fix purgeUnused tags

Signed-off-by: Deluan <[email protected]>

* add grouping filter to albums

Signed-off-by: Deluan <[email protected]>

* allow any album tags to be used in as filters in the API

Signed-off-by: Deluan <[email protected]>

* remove empty tags from album info

Signed-off-by: Deluan <[email protected]>

* comments in the migration

Signed-off-by: Deluan <[email protected]>

* fix: Cannot read properties of undefined

Signed-off-by: Deluan <[email protected]>

* fix: listenbrainz scrobbling (#3640)

Signed-off-by: Deluan <[email protected]>

* fix: remove duplicated tag values

Signed-off-by: Deluan <[email protected]>

* fix: don't ignore the taglib folder!

Signed-off-by: Deluan <[email protected]>

* feat: show track subtitle tag

Signed-off-by: Deluan <[email protected]>

* fix: show artists stats based on selected role

Signed-off-by: Deluan <[email protected]>

* fix: inspect

Signed-off-by: Deluan <[email protected]>

* add media type to album info/filters

Signed-off-by: Deluan <[email protected]>

* fix: change format of subtitle in the UI

Signed-off-by: Deluan <[email protected]>

* fix: subtitle in Subsonic API and search

Signed-off-by: Deluan <[email protected]>

* fix: subtitle in UI's player

Signed-off-by: Deluan <[email protected]>

* fix: split strings should be case-insensitive

Signed-off-by: Deluan <[email protected]>

* disable ScanSchedule

Signed-off-by: Deluan <[email protected]>

* increase default sessiontimeout

Signed-off-by: Deluan <[email protected]>

* add sqlite command line tool to docker image

Signed-off-by: Deluan <[email protected]>

* fix: resources override

Signed-off-by: Deluan <[email protected]>

* fix: album PID conf

Signed-off-by: Deluan <[email protected]>

* change migration to mark current artists as albumArtists

Signed-off-by: Deluan <[email protected]>

* feat(ui): Allow filtering on multiple genres (#3679)

* feat(ui): Allow filtering on multiple genres

Signed-off-by: Henrik Nordvik <[email protected]>
Signed-off-by: Deluan <[email protected]>

* add multi-genre filter in Album list

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Henrik Nordvik <[email protected]>
Signed-off-by: Deluan <[email protected]>
Co-authored-by: Henrik Nordvik <[email protected]>

* add more multi-valued tag filters to Album and Song views

Signed-off-by: Deluan <[email protected]>

* fix(ui): unselect missing files after removing

Signed-off-by: Deluan <[email protected]>

* fix(ui): song filter

Signed-off-by: Deluan <[email protected]>

* fix sharing tracks. fix #3687

Signed-off-by: Deluan <[email protected]>

* use rowids when using search for sync (ex: Symfonium)

Signed-off-by: Deluan <[email protected]>

* fix "Report Real Paths" option for subsonic clients

Signed-off-by: Deluan <[email protected]>

* fix "Report Real Paths" option for subsonic clients for search

Signed-off-by: Deluan <[email protected]>

* add libraryPath to Native API /songs endpoint

Signed-off-by: Deluan <[email protected]>

* feat(subsonic): add album version

Signed-off-by: Deluan <[email protected]>

* made all tags lowercase as they are case-insensitive anyways.

Signed-off-by: Deluan <[email protected]>

* feat(ui): Show full paths, extended properties for album/song (#3691)

* feat(ui): Show full paths, extended properties for album/song

- uses library path + os separator + path
- show participants (album/song) and tags (song)
- make album/participant clickable in show info

* add source to path

* fix pathSeparator in UI

Signed-off-by: Deluan <[email protected]>

* fix local artist artwork (#3695)

Signed-off-by: Deluan <[email protected]>

* fix: parse vorbis performers

Signed-off-by: Deluan <[email protected]>

* refactor: clean function into smaller functions

Signed-off-by: Deluan <[email protected]>

* fix translations for en and pt

Signed-off-by: Deluan <[email protected]>

* add trace log to show annotations reassignment

Signed-off-by: Deluan <[email protected]>

* add trace log to show annotations reassignment

Signed-off-by: Deluan <[email protected]>

* fix: allow performers without instrument/subrole

Signed-off-by: Deluan <[email protected]>

* refactor: metadata clean function again

Signed-off-by: Deluan <[email protected]>

* refactor: optimize split function

Signed-off-by: Deluan <[email protected]>

* refactor: split function is now a method of TagConf

Signed-off-by: Deluan <[email protected]>

* fix: humanize Artist total size

Signed-off-by: Deluan <[email protected]>

* add album version to album details

Signed-off-by: Deluan <[email protected]>

* don't display album-level tags in SongInfo

Signed-off-by: Deluan <[email protected]>

* fix genre clicking in Album Page

Signed-off-by: Deluan <[email protected]>

* don't use mbids in Last.fm api calls.

From https://discord.com/channels/671335427726114836/704303730660737113/1337574018143879248:

With MBID:
```
GET https://ws.audioscrobbler.com/2.0/?api_key=XXXX&artist=Van+Morrison&format=json&lang=en&mbid=a41ac10f-0a56-4672-9161-b83f9b223559&method=artist.getInfo

{
artist: {
name: "Bee Gees",
mbid: "bf0f7e29-dfe1-416c-b5c6-f9ebc19ea810",
url: "https://www.last.fm/music/Bee+Gees",
}
```

Without MBID:
```
GET https://ws.audioscrobbler.com/2.0/?api_key=XXXX&artist=Van+Morrison&format=json&lang=en&method=artist.getInfo

{
artist: {
name: "Van Morrison",
mbid: "a41ac10f-0a56-4672-9161-b83f9b223559",
url: "https://www.last.fm/music/Van+Morrison",
}
```

Signed-off-by: Deluan <[email protected]>

* better logging for when the artist folder is not found

Signed-off-by: Deluan <[email protected]>

* fix various issues with artist image resolution

Signed-off-by: Deluan <[email protected]>

* hide "Additional Tags" header if there are none.

Signed-off-by: Deluan <[email protected]>

* simplify tag rendering

Signed-off-by: Deluan <[email protected]>

* enhance logging for artist folder detection

Signed-off-by: Deluan <[email protected]>

* make folderID consistent for relative and absolute folderPaths

Signed-off-by: Deluan <[email protected]>

* handle more folder paths scenarios

Signed-off-by: Deluan <[email protected]>

* filter out other roles when SubsonicArtistParticipations = true

Signed-off-by: Deluan <[email protected]>

* fix "Cannot read properties of undefined"

Signed-off-by: Deluan <[email protected]>

* fix lyrics and comments being truncated (#3701)

* fix lyrics and comments being truncated

* specifically test for lyrics and comment length

* reorder assertions

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
Co-authored-by: Deluan <[email protected]>

* fix(server): Expose library_path for playlist (#3705)

Allows showing absolute path for UI, and makes "report real path" work for playlists (Subsonic)

* fix BFR on Windows (#3704)

* fix potential reflected cross-site scripting vulnerability

Signed-off-by: Deluan <[email protected]>

* hack to make it work on Windows

* ignore windows executables

* try fixing the pipeline

Signed-off-by: Deluan <[email protected]>

* allow MusicFolder in other drives

* move windows local drive logic to local storage implementation

---------

Signed-off-by: Deluan <[email protected]>

* increase pagination sizes for missing files

Signed-off-by: Deluan <[email protected]>

* reduce level of "already scanning" watcher log message

Signed-off-by: Deluan <[email protected]>

* only count folders with audio files in it

See https://github.com/navidrome/navidrome/discussions/3676#discussioncomment-11990930

Signed-off-by: Deluan <[email protected]>

* add album version and catalog number to search

Signed-off-by: Deluan <[email protected]>

* add `organization` alias for `recordlabel`

Signed-off-by: Deluan <[email protected]>

* remove mbid from Last.fm agent

Signed-off-by: Deluan <[email protected]>

* feat: support inspect in ui (#3726)

* inspect in ui

* address round 1

* add catalogNum to AlbumInfo

Signed-off-by: Deluan <[email protected]>

* remove dependency on metadata_old (deprecated) package

Signed-off-by: Deluan <[email protected]>

* add `RawTags` to model

Signed-off-by: Deluan <[email protected]>

* support parsing MBIDs for roles (from the https://github.com/kgarner7/picard-all-mbids plugin) (#3698)


* parse standard roles, vorbis/m4a work for now

* fix djmixer

* working roles, use DJ-mix

* add performers to file

* map mbids

* add a few more tests

* add test

Signed-off-by: Deluan <[email protected]>

* try to simplify the performers logic

Signed-off-by: Deluan <[email protected]>

* stylistic changes

---------

Signed-off-by: Deluan <[email protected]>
Co-authored-by: Deluan <[email protected]>

* remove param mutation

Signed-off-by: Deluan <[email protected]>

* run automated SQLite optimizations

Signed-off-by: Deluan <[email protected]>

* fix playlists import/export on Windows

* fix import playlists

* fix export playlists

* better handling of Windows volumes

Signed-off-by: Deluan <[email protected]>

* handle more album ID reassignments

Signed-off-by: Deluan <[email protected]>

* allow adding/overriding tags in the config file

Signed-off-by: Deluan <[email protected]>

* fix(ui): Fix playlist track id, handle missing tracks better (#3734)

- Use `mediaFileId` instead of `id` for playlist tracks
- Only fetch if the file is not missing
- If extractor fails to get the file, also error (rather than panic)

* optimize DB after each scan.

Signed-off-by: Deluan <[email protected]>

* remove sortable from AlbumSongs columns

Signed-off-by: Deluan <[email protected]>

* simplify query to get missing tracks

Signed-off-by: Deluan <[email protected]>

* mark Scanner.Extractor as deprecated

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
Signed-off-by: Henrik Nordvik <[email protected]>
Co-authored-by: Caio Cotts <[email protected]>
Co-authored-by: Henrik Nordvik <[email protected]>
Co-authored-by: Kendall Garner <[email protected]>
2025-02-19 20:35:17 -05:00
Deluan d229ff39e5 refactor: reduce GC pressure by pre-allocating slices
Signed-off-by: Deluan <[email protected]>
2024-11-19 18:41:50 -05:00
Deluan QuintãoandGitHub cd0cf7c12b feat: cache login background images (#3462)
* feat: use direct links to unsplash for background images

Signed-off-by: Deluan <[email protected]>

* feat: cache images from unsplash

Signed-off-by: Deluan <[email protected]>

* refactor: use cache.HTTPClient to reduce complexity

Signed-off-by: Deluan <[email protected]>

* refactor: remove magic numbers

Signed-off-by: Deluan <[email protected]>

---------

Signed-off-by: Deluan <[email protected]>
2024-11-08 20:23:30 -05:00
Deluan c95fa11a2f Remove potential integer overflow conversion uint64 -> int64 2024-08-22 19:28:22 -04:00
Deluan 3bc9e75b28 Evict expired items from SimpleCache 2024-06-24 17:32:34 -04:00
Deluan 3993c4d17f Upgrade to ttlcache/v3 2024-06-21 18:09:34 -04:00
Deluan 29b7b740ce Also use SimpleCache in cache.HTTPClient 2024-06-21 17:40:18 -04:00
Deluan 29bc17acd7 Wrap ttlcache in our own SimpleCache implementation 2024-06-21 17:21:09 -04:00
Deluan ec68d69d56 Refactor cache.HTTPClient 2024-05-11 19:37:12 -04:00
Deluan 4cd7c7f39f Fix FileHaunter tests 2023-12-02 19:40:59 -05:00
Deluan 81daee3b9b Fix FileHaunter tests 2023-12-02 18:43:24 -05:00
Deluan 9b434d743f Ignore flaky FileHaunter tests 2023-12-02 18:32:48 -05:00
257ccc5f43 Allow configuring cache folder (#2357)
* Set all clients to dev_download for make get-music

* Use multiple TranscodingCache instances in tests

This fixes flaky tests. The issue is that the TranscodingCache object
was being reused in tests from media_stream_Internal_test.go and
media_stream_test.go. If tests from the former was run first, the cache
would be filled up, so that when running tests from the latter, the `NON
seekable` test would fail.

* Allow configuring cache folder

This commit introduces a new configuration option to configure the cache
folder. This allows the cache to be in a separate folder such as
/var/cache/navidrome on Linux distributions.

* Fix tests

* Removed unused test setup code

---------

Co-authored-by: Deluan <[email protected]>
Co-authored-by: Deluan <[email protected]>
2023-06-02 17:14:11 -04:00
Deluan bd402fb2a8 Fix IntelliJ warning 2023-04-04 13:01:32 -04:00
Deluan a134b1b608 Use sync/atomic package, now that we are at Go 1.19 2023-02-15 21:21:59 -05:00
Deluan 6dce4b2478 Remove custom atomic.Bool, we are now at Go 1.19 2023-02-15 21:18:24 -05:00
DeluanandDeluan Quintão 05c6cdea1a Don't cancel transcoding session if context is canceled 2023-02-07 09:58:50 -05:00
Deluan bfaf4a3388 Add logs to cache hunter 2023-02-06 10:41:33 -05:00
Deluan 4a7e86e989 Fix file descriptor leaking. 2023-02-02 10:36:49 -05:00
Deluan 580e9ae4bd Fix timer going awry 2023-01-17 22:04:09 -05:00
Deluan cc14485194 When trying to PreCache, wait for ImageCache to be available 2022-12-28 23:26:39 -05:00
DeluanandDeluan Quintão 52a4721c91 Remove empty (invalid) entries from the cache 2022-12-28 15:31:56 -05:00
DeluanandDeluan Quintão 9ec349dce0 Make sure album is updated if external cover changes 2022-12-28 15:31:56 -05:00
DeluanandDeluan Quintão 73bb0104f0 Cache original images 2022-12-28 15:31:56 -05:00
Deluan 5943e8f953 Rename log.LevelCritical to log.LevelFatal 2022-12-21 14:53:36 -05:00
Deluan QuintãoandGitHub 24d520882e Don't cache transcoded files if the request was cancelled (#2041)
* Don't cache transcoded files if the request was cancelled (or there was a transcoding error)

* Add context to logs

* Simplify Wait error handling

* Fix flaky test

* Change log level for "populating cache" error message

* Small cleanups
2022-12-18 12:22:12 -05:00
Deluan f82df70302 Add nilerr linter 2022-09-30 20:18:14 -04:00
Deluan a7a0e23956 Fix formatting 2022-09-26 21:28:10 -04:00
Deluan 31882abf6f Upgrade Ginkgo to V2 2022-07-26 16:53:17 -04:00
Deluan f4bffb1676 Update @djherbis's packages 2022-07-26 15:16:56 -04:00
Deluan 35bec14d4d Add missing test case for #1778 2022-07-25 23:34:09 -04:00
Deluan 321b3c5a64 Fix fscache key mapping. Closes #1778 2022-07-25 23:01:19 -04:00
Deluan 66a9cbb7d9 Remove temp folders after tests 2021-10-28 10:40:31 -04:00
Deluan dbde0ffa0c Bump github.com/djherbis/atime to v1.1.0 2021-10-03 22:50:25 -04:00
Deluan 8afa2cd833 Remove dependency of deprecated ioutil package 2021-07-20 20:12:28 -04:00
Deluan 94e36d7f60 Remove old feature flag for cache layout 2021-07-02 10:04:41 -04:00
Deluan 452c8dc44b Fixed the enduring nasty "too many files open" bug!! Fix #446 2021-07-01 12:07:32 -04:00
Deluan d1605dcfbe Replace godirwalk with standard Go 1.16 filepath.WalkDir
Should fix https://github.com/navidrome/navidrome/issues/1048
2021-04-27 11:28:47 -04:00
Deluan 240de70026 Add tests for SpreadFS 2021-04-22 14:02:42 -04:00
Deluan 467eb345ad Don't panic if fscache could not be initialized due to a FS error 2021-04-21 23:39:23 -04:00
Deluan 31b553e972 Add missing error log message in fscache initialization 2021-04-21 14:15:42 -04:00
Deluan 1d681d92d3 Better explanation of NewSpreadFS 2021-02-09 15:33:34 -05:00
Deluan 5fdd8b32d7 Move utilitarian/generic packages to utils: lastfm, spotify, gravatar, cache, and pool 2021-02-09 15:33:33 -05:00