quintodrome/ui/src
Deluan Quintão ba8d427890
feat(ui): add cover art support for internet radio stations (#5229)
* feat(artwork): add KindRadioArtwork and EntityRadio constant

* feat(model): add UploadedImage field and artwork methods to Radio

* feat(model): add Radio to GetEntityByID lookup chain

* feat(db): add uploaded_image column to radio table

* feat(artwork): add radio artwork reader with uploaded image fallback

* feat(api): add radio image upload/delete endpoints

* feat(ui): add radio artwork ID prefix to getCoverArtUrl

* feat(ui): add cover art display and upload to RadioEdit

* feat(ui): add cover art thumbnails to radio list

* feat(ui): prefer artwork URL in radio player helper

* refactor: remove redundant code in radio artwork

- Remove duplicate Avatar rendering in RadioList by reusing CoverArtField
- Remove redundant UpdatedAt assignment in radio image handlers (already set by repository Put)

* refactor(ui): extract shared useImageLoadingState hook

Move image loading/error/lightbox state management into a shared
useImageLoadingState hook in common/. Consolidates duplicated logic
from AlbumDetails, PlaylistDetails, RadioEdit, and artist detail views.

* feat(ui): use radio placeholder icon when no uploaded image

Remove album placeholder fallback from radio artwork reader so radios
without an uploaded image return ErrUnavailable. On the frontend, show
the internet-radio-icon.svg placeholder instead of requesting server
artwork when no image is uploaded, allowing favicon fallback in the
player.

* refactor(ui): update defaultOff fields in useSelectedFields for RadioList

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

* fix: address code review feedback

- Add missing alt attribute to CardMedia in RadioEdit for accessibility
- Fix UpdateInternetRadio to preserve UploadedImage field by fetching
  existing radio before updating (prevents Subsonic API from clearing
  custom artwork)
- Add Reader() level tests to verify ErrUnavailable is returned when
  radio has no uploaded image

* refactor: add colsToUpdate to RadioRepository.Put

Use the base sqlRepository.put with column filtering instead of
hand-rolled SQL. UpdateInternetRadio now specifies only the Subsonic API
fields, preventing UploadedImage from being cleared. Image upload/delete
handlers specify only UploadedImage.

* fix: ensure UpdatedAt is included in colsToUpdate for radio Put

---------

Signed-off-by: Deluan <deluan@navidrome.org>
2026-03-18 18:57:33 -04:00
..
actions feat(ui): integrate transcode decision into web player (#5155) 2026-03-09 11:06:31 -04:00
album feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
artist feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
audioplayer feat(ui): integrate transcode decision into web player (#5155) 2026-03-09 11:06:31 -04:00
common feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
dataProvider fix(ui): fix library selection state for single-library users (#4686) 2025-11-15 17:42:28 -05:00
dialogs feat(ui): add download config toml link, disable copy when clipboard not available (#5035) 2026-02-12 10:54:04 -05:00
i18n feat: add artist image uploads and image-folder artwork source (#5198) 2026-03-15 22:19:55 -04:00
icons build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
layout feat(ui): add tooltips for long playlist and album names - 5068 (#5070) 2026-03-15 14:55:55 -04:00
library feat(ui): conditionally display 'path' field in LibraryList for desktop view 2026-03-01 10:50:37 -05:00
missing fix(ui): export all missing files instead of first 1000 2025-12-16 06:43:02 -05:00
personal fix(ui): show last.fm api-key missing in a FormHelperText 2024-12-19 16:59:26 -05:00
player build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
playlist feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
plugin feat(plugins): allow mounting library directories as read-write (#5122) 2026-02-28 10:59:13 -05:00
radio feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
reducers fix(player): fix play next after transcoding changes 2026-03-17 12:15:03 -04:00
share fix(ui): allow scrolling in shareplayer queue by adding delay #4748 2025-11-29 12:54:46 -05:00
song feat(ui): add composer field to table views (#4857) 2026-01-18 13:15:53 -05:00
store feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
subsonic feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
themes fix(ui): enforce consistent delete button contrast for delete in AMusic theme 2026-03-10 18:12:57 -04:00
transcode fix(ui): improve browser codec detection and limit Safari transcoding to mp3 (#5171) 2026-03-12 08:21:49 -04:00
transcoding fix(ui): minor icon inconsistencies and "no missing files" translation (#3837) 2025-03-16 19:39:19 -04:00
user feat: Multi-library support (#4181) 2025-07-18 18:41:12 -04:00
utils fix(ui): use div for fragment, check lastfm url for artist page (#4980) 2026-02-04 17:34:26 -05:00
App.jsx feat(ui): integrate transcode decision into web player (#5155) 2026-03-09 11:06:31 -04:00
authProvider.js feat(server): add ExtAuth logout URL configuration (#5074) 2026-02-23 20:28:38 -05:00
config.js feat(server): add EnableCoverArtUpload config option 2026-03-02 16:59:05 -05:00
consts.js feat(ui): add cover art support for internet radio stations (#5229) 2026-03-18 18:57:33 -04:00
eventStream.js fix(ui): keep the NowPlayingPanel badge in sync. 2025-06-29 11:35:10 -04:00
eventStream.test.js chore(deps): update all dependencies (#4618) 2025-10-25 17:05:16 -04:00
hotkeys.js Change "Go to current song" hotkey. 2022-12-18 20:58:01 -05:00
index.css chore(deps): bump JS dependencies 2025-03-07 19:47:08 -05:00
index.jsx fix(ui): service worker does not load new version of ui (#3402) 2024-10-16 21:39:14 -04:00
routes.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
setupTests.js Use the default import path for jest-dom. 2024-01-17 17:07:43 -05:00
sw.js fix(ui): service worker crashing on precacheAndRoute (#3528) 2024-12-08 17:43:34 -05:00
useChangeThemeColor.jsx build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00
vite-env.d.ts build(ui): migrate from CRA/Jest to Vite/Vitest (#3311) 2024-09-28 11:54:36 -04:00