diff --git a/CHANGELOG.md b/CHANGELOG.md index b096ae46..51d83fea 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -139,6 +139,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * The header search field on the Playlists page now filters the list by playlist name (same scoped badge pattern as Artists / Albums), including in folder view. +### Artist page — add the whole discography to the queue + +**By [@Psychotoxical](https://github.com/Psychotoxical), PR [#1321](https://github.com/Psychotoxical/psysonic/pull/1321)** + +* A new queue button on the artist page appends the artist's entire discography to the current queue in one click, next to Play all and Shuffle — matching what album pages already offer. + ## Changed diff --git a/src/config/settingsCredits.ts b/src/config/settingsCredits.ts index 2aff7c1a..b6d23489 100644 --- a/src/config/settingsCredits.ts +++ b/src/config/settingsCredits.ts @@ -430,6 +430,7 @@ const CONTRIBUTOR_ENTRIES = [ 'Settings → System: community theme authors credited in a Themes sub-section; theme card What\'s new shows the latest version only (PR #1248)', 'Fullscreen player style — selectable Minimal or Immersive view, with the artist backdrop, cover-derived accent, and rail/Apple lyrics (PR #1249)', 'Word-by-word lyrics from the server via OpenSubsonic songLyrics v2, no third-party backend needed (PR #1265)', + 'Artist page — add the whole discography to the queue (PR #1321)', ], }, { diff --git a/src/features/artist/components/ArtistDetailHero.tsx b/src/features/artist/components/ArtistDetailHero.tsx index c18aeb61..4710920a 100644 --- a/src/features/artist/components/ArtistDetailHero.tsx +++ b/src/features/artist/components/ArtistDetailHero.tsx @@ -3,7 +3,7 @@ import { useTranslation } from 'react-i18next'; import { useAlbumDetailBack } from '@/features/album'; import { ArrowLeft, Camera, Check, HardDriveDownload, Heart, - Loader2, Play, Radio, Share2, Shuffle, Users, + ListPlus, Loader2, Play, Radio, Share2, Shuffle, Users, } from 'lucide-react'; import type { SubsonicAlbum, SubsonicArtist, SubsonicArtistInfo } from '@/lib/api/subsonicTypes'; import { useOfflineStore } from '@/features/offline'; @@ -35,6 +35,7 @@ interface Props { toggleStar: () => Promise; handlePlayAll: () => void; handleShuffle: () => void; + handleEnqueueAll: () => void; handleStartRadio: () => void; handleShareArtist: () => void; handleImageUpload: (e: React.ChangeEvent) => Promise; @@ -100,7 +101,7 @@ function ArtistHeaderBg({ url, position }: { url: string; position?: string }) { export default function ArtistDetailHero({ artist, id, albums, info, isStarred, artistEntityRating, handleArtistEntityRating, - toggleStar, handlePlayAll, handleShuffle, handleStartRadio, handleShareArtist, + toggleStar, handlePlayAll, handleShuffle, handleEnqueueAll, handleStartRadio, handleShareArtist, handleImageUpload, playAllLoading, radioLoading, uploading, openedLink, openLink, coverId, coverRef, coverRevision, headerCoverFailed, setHeaderCoverFailed, @@ -302,6 +303,15 @@ export default function ArtistDetailHero({ {playAllLoading ?
: } {!isMobile && {t('artistDetail.shuffle')}} + )}