quintodrome/ui/src/common
Deluan Quintão 49a14d4583
feat(artwork): add per-disc cover art support (#5182)
* feat(artwork): add KindDiscArtwork and ParseDiscArtworkID

Add new disc artwork kind with 'dc' prefix for per-disc cover art
support. The composite ID format is albumID:discNumber, parsed by
the new ParseDiscArtworkID helper.

* feat(conf): add DiscArtPriority configuration option

Default: 'disc*.*, cd*.*, embedded'. Controls how per-disc cover
art is resolved, following the same pattern as CoverArtPriority
and ArtistArtPriority.

* feat(artwork): implement extractDiscNumber helper

Extracts disc number from filenames based on glob patterns by
parsing leading digits from the wildcard-matched portion.
Used for matching disc-specific artwork files like disc1.jpg.

* feat(artwork): implement fromDiscExternalFile source function

Disc-aware variant of fromExternalFile that filters image files
by disc number (extracted from filename) or folder association
(for multi-folder albums).

* feat(artwork): implement discArtworkReader

Resolves disc artwork using DiscArtPriority config patterns.
Supports glob patterns with disc number extraction, embedded
images from first track, and falls back to album cover art.
Handles both multi-folder and single-folder multi-disc albums.

* feat(artwork): register disc artwork reader in dispatcher

Add KindDiscArtwork case to getArtworkReader switch, routing
disc artwork requests to the new discArtworkReader.

* feat(subsonic): add CoverArt field to DiscTitle response

Implements OpenSubsonic PR #220: optional cover art ID in
DiscTitle responses for per-disc artwork support.

* feat(subsonic): populate CoverArt in DiscTitle responses

Each DiscTitle now includes a disc artwork ID (dc-albumID:discNum)
that clients can use with getCoverArt to retrieve per-disc artwork.

* style: fix file permission in test to satisfy gosec

* feat(ui): add disc cover art display and lightbox functionality

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

* refactor: simplify disc artwork code

- Add DiscArtworkID constructor to encapsulate the "albumID:discNumber"
  format in one place
- Convert fromDiscExternalFile to a method on discArtworkReader,
  reducing parameter count from 6 to 2
- Remove unused rootFolder field from discArtworkReader

* style: fix prettier formatting in subsonic index

* style(ui): move cursor style to makeStyles in SongDatagrid

* feat(artwork): add discsubtitle option to DiscArtPriority

Allow matching disc cover art by the disc's subtitle/name.
When the "discsubtitle" keyword is in the priority list, image files
whose stem matches the disc subtitle (case-insensitive) are used.
This is useful for box sets with named discs (e.g., "The Blue Disc.jpg").

* feat(configuration): update discartpriority to include cover art options

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

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-03-13 18:33:18 -04:00
..
AddToPlaylistButton.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
ArtistLinkField.jsx fix(ui): update artist link rendering and improve button styles 2025-05-23 17:42:19 -04:00
ArtistLinkField.test.jsx feat(server): custom ArtistJoiner config (#3873) 2025-03-23 10:53:21 -04:00
BatchPlayButton.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
BatchShareButton.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
BitrateField.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
CollapsibleComment.jsx feat(ui) add Save Queue to Playlist (#4110) 2025-05-23 22:04:18 -04:00
ContextMenus.jsx fix(ui): always order album tracks by disc and track number (fixes #3720) (#3975) 2025-04-17 19:23:53 -04:00
DateField.jsx feat: add Rated At field - #4653 (#4660) 2025-11-24 23:18:05 -05:00
DocLink.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
DurationField.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
formatRange.js build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
index.js fix(ui): Search focus after clear (#4932) 2026-02-21 14:39:38 -05:00
LibrarySelector.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
LibrarySelector.test.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
Linkify.jsx Merge commit from fork 2026-02-03 12:22:57 -05:00
Linkify.test.jsx chore(deps): update all dependencies (#4618) 2025-10-25 17:05:16 -04:00
List.jsx feat(server): implement FTS5-based full-text search (#5079) 2026-02-21 17:52:42 -05:00
LoveButton.jsx fix(ui): UI issues & styling coherence (#4910) 2026-01-20 12:45:33 -05:00
MultiLineTextField.jsx chore: format JSX components 2026-02-03 12:46:39 -05:00
Pagination.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
ParticipantsInfo.jsx feat(bfr): Big Refactor: new scanner, lots of new fields and tags, improvements and DB schema changes (#2709) 2025-02-19 20:35:17 -05:00
PathField.jsx feat(ui): hide absolute paths from regular users 2025-03-25 20:05:24 -04:00
PathField.test.jsx feat(ui): hide absolute paths from regular users 2025-03-25 20:05:24 -04:00
playbackActions.js feat: add similar songs functionality in agents, and Instant Mix (song-based) to UI (#4919) 2026-01-25 16:16:43 -05:00
PlayButton.jsx fix(ui): always order album tracks by disc and track number (fixes #3720) (#3975) 2025-04-17 19:23:53 -04:00
playlistUtils.js build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
playlistUtils.test.js build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
QualityInfo.jsx feat(ui): integrate transcode decision into web player (#5155) 2026-03-09 11:06:31 -04:00
QualityInfo.test.jsx feat(ui): integrate transcode decision into web player (#5155) 2026-03-09 11:06:31 -04:00
QuickFilter.jsx fix(ui): fix make dev (#3795) 2025-03-10 14:50:16 -04:00
QuickFilter.test.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
RangeField.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
RatingField.jsx feat: add Rated At field - #4653 (#4660) 2025-11-24 23:18:05 -05:00
SafeHTML.jsx fix(ui): use div for fragment, check lastfm url for artist page (#4980) 2026-02-04 17:34:26 -05:00
sanitizeFieldRestProps.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
SelectLibraryInput.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
SelectLibraryInput.test.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
ShuffleAllButton.jsx fix(ui): skip missing files in bulk operations (#3807) 2025-03-11 20:19:46 -04:00
SimpleList.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
SizeField.jsx feat(bfr): Big Refactor: new scanner, lots of new fields and tags, improvements and DB schema changes (#2709) 2025-02-19 20:35:17 -05:00
SongBulkActions.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
SongContextMenu.jsx fix(ui): disable shuffle for instant mix playback 2026-01-29 17:04:10 -05:00
SongContextMenu.test.jsx feat: add similar songs functionality in agents, and Instant Mix (song-based) to UI (#4919) 2026-01-25 16:16:43 -05:00
SongDatagrid.jsx feat(artwork): add per-disc cover art support (#5182) 2026-03-13 18:33:18 -04:00
SongInfo.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
SongSimpleList.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
SongTitleField.jsx feat(bfr): Big Refactor: new scanner, lots of new fields and tags, improvements and DB schema changes (#2709) 2025-02-19 20:35:17 -05:00
Title.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
ToggleFieldsMenu.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useAlbumsPerPage.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useGetHandleArtistClick.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useInterval.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useLibrarySelection.js feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
useLibrarySelection.test.js feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
useRating.jsx feat(ui): add song Love and Rating functionality to playlist view (#4134) 2025-06-04 20:38:28 -04:00
useRating.test.js feat(ui): add song Love and Rating functionality to playlist view (#4134) 2025-06-04 20:38:28 -04:00
useRefreshOnEvents.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
useRefreshOnEvents.test.js feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
useResourceRefresh.jsx feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
useResourceRefresh.test.js build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useSearchRefocus.js fix(ui): Search focus after clear (#4932) 2026-02-21 14:39:38 -05:00
useSearchRefocus.test.js fix(ui): Search focus after clear (#4932) 2026-02-21 14:39:38 -05:00
useSelectedFields.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
useToggleLove.jsx feat(ui): add song Love and Rating functionality to playlist view (#4134) 2025-06-04 20:38:28 -04:00
useToggleLove.test.js feat(ui): add song Love and Rating functionality to playlist view (#4134) 2025-06-04 20:38:28 -04:00
useTraceUpdate.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
Writable.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00