diff --git a/CHANGELOG.md b/CHANGELOG.md
index aa2276f1..6a760c32 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -384,6 +384,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
* Fixes issue [#606](https://github.com/Psychotoxical/psysonic/issues/606): the small cover in the **player bar** (and other `CachedImage` surfaces) no longer flashes the browser **broken-image** placeholder for a split second when skipping tracks or changing the current queue item.
+### Album & player — split OpenSubsonic album credits and performers
+
+**By [@cucadmuh](https://github.com/cucadmuh), PR [#696](https://github.com/Psychotoxical/psysonic/pull/696)**
+
+* Album detail **header** shows **multiple album artists** when the server sends OpenSubsonic **`albumArtists`** on the album or on child songs — each name links to its artist page instead of only the first id (issue [#552](https://github.com/Psychotoxical/psysonic/issues/552)).
+* **Player bar**, **mobile now playing**, and **mini player** copy **`artists`** through **`songToTrack`** so multi-performer tracks get **per-artist** links like the album tracklist column.
+
## [1.45.0] - 2026-05-04
## Added
diff --git a/src/api/subsonicTypes.ts b/src/api/subsonicTypes.ts
index 1a91e6fa..4255530f 100644
--- a/src/api/subsonicTypes.ts
+++ b/src/api/subsonicTypes.ts
@@ -20,6 +20,8 @@ export interface SubsonicAlbum {
isCompilation?: boolean;
/** OpenSubsonic: release types from MusicBrainz tags (e.g. "Album", "EP", "Single", "Compilation", "Live"). */
releaseTypes?: string[];
+ /** OpenSubsonic: album-level credits (Navidrome may attach on album and/or child songs). */
+ albumArtists?: SubsonicOpenArtistRef[];
}
/** OpenSubsonic `artists` / `albumArtists` entries on a child song (may include `userRating`). */
diff --git a/src/components/AlbumHeader.tsx b/src/components/AlbumHeader.tsx
index 86ce9a31..49ac4cf3 100644
--- a/src/components/AlbumHeader.tsx
+++ b/src/components/AlbumHeader.tsx
@@ -1,5 +1,5 @@
import { buildCoverArtUrl } from '../api/subsonicStreamUrl';
-import type { EntityRatingSupportLevel, SubsonicSong } from '../api/subsonicTypes';
+import type { EntityRatingSupportLevel, SubsonicOpenArtistRef, SubsonicSong } from '../api/subsonicTypes';
import React, { useMemo, useState } from 'react';
import { useNavigate } from 'react-router-dom';
import { Play, Heart, ExternalLink, X, ChevronLeft, Download, ListPlus, HardDriveDownload, Share2, Highlighter, Loader2, Shuffle } from 'lucide-react';
@@ -15,6 +15,7 @@ import { isAlbumRecentlyAdded } from '../utils/albumRecency';
import { formatLongDuration } from '../utils/format/formatDuration';
import { formatMb } from '../utils/format/formatBytes';
import { sanitizeHtml } from '../utils/sanitizeHtml';
+import { OpenArtistRefInline } from './OpenArtistRefInline';
function BioModal({ bio, onClose }: { bio: string; onClose: () => void }) {
const { t } = useTranslation();
@@ -44,6 +45,8 @@ interface AlbumInfo {
interface AlbumHeaderProps {
info: AlbumInfo;
+ /** OpenSubsonic album credits (derived from album + songs). */
+ headerArtistRefs: SubsonicOpenArtistRef[];
songs: SubsonicSong[];
coverUrl: string;
coverKey: string;
@@ -71,6 +74,7 @@ interface AlbumHeaderProps {
export default function AlbumHeader({
info,
+ headerArtistRefs,
songs,
coverUrl,
coverKey,
@@ -166,13 +170,12 @@ export default function AlbumHeader({
)}