From 3de7b57cc5cfeefe01dfcdaee897d41132ff6c05 Mon Sep 17 00:00:00 2001 From: Psychotoxical <171614930+Psychotoxical@users.noreply.github.com> Date: Thu, 11 Jun 2026 23:34:58 +0200 Subject: [PATCH] Fullscreen player polish + Discord Rich Presence fixes (#1068) * fix(fullscreen-player): drop track-number prefix from title, stop clipping descenders The big title showed a zero-padded queue position ("11. ") before the song name; remove it (the position still lives in the top bar). Also bump line-height 1.05 -> 1.25 so overflow:hidden no longer crops descenders (g, j, p, q, y) at 46px. * feat(settings): clarify built-in Discord RP vs official Navidrome plugin Add a bold notice atop the Discord Rich Presence block explaining it is the built-in integration, and that users wanting the official Navidrome Discord RP plugin should leave it off and enable "Show in Now Playing" instead. Add a matching bold note to the Now Playing setting. New i18n keys discordRichPresenceNotice / nowPlayingPluginNote across all 5 locales. * fix(discord-rp): use HTTPS cover URL instead of local file:// path Discord Rich Presence images are fetched by Discord's servers, so large_image must be a key or an https:// URL they can reach. Since the cover pipeline moved to an on-disk webp cache, coverArtUrlForDiscord returned a file://.../800.webp path on cache hit, which Discord cannot load and silently falls back to the app icon. Always hand it the getCoverArt URL; MPRIS keeps the local file:// path unchanged. * i18n(settings): fill discordRichPresenceNotice + nowPlayingPluginNote for es, nb, ro, ru The two new Discord-RP notice keys had only landed in 5 of the 9 locales; complete the set so no locale falls back to English. * docs(changelog): fullscreen title + Discord RP fixes (PR #1068) --- CHANGELOG.md | 13 ++++++++++ .../FullscreenPlayerStatic.tsx | 6 +---- src/components/settings/IntegrationsTab.tsx | 6 +++++ src/cover/integrations/discord.ts | 26 ++++++------------- src/locales/de/settings.ts | 2 ++ src/locales/en/settings.ts | 2 ++ src/locales/es/settings.ts | 2 ++ src/locales/fr/settings.ts | 2 ++ src/locales/nb/settings.ts | 2 ++ src/locales/nl/settings.ts | 2 ++ src/locales/ro/settings.ts | 2 ++ src/locales/ru/settings.ts | 2 ++ src/locales/zh/settings.ts | 2 ++ .../components/fullscreen-player-static.css | 2 +- 14 files changed, 47 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dd14bae6..b532edca 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -191,6 +191,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Fixed +### Fullscreen player — title cleanup + +**By [@Psychotoxical](https://github.com/Psychotoxical), PR [#1068](https://github.com/Psychotoxical/psysonic/pull/1068)** + +* The song title no longer shows a leading track number, and letters with descenders (g, j, p, q, y) are no longer clipped along the bottom edge. + +### Discord Rich Presence — album art and clearer settings + +**By [@Psychotoxical](https://github.com/Psychotoxical), PR [#1068](https://github.com/Psychotoxical/psysonic/pull/1068)** + +* Album art shows again when the cover source is "Server (via album info)" — Discord was handed a local file path it cannot fetch and fell back to the app icon; it now receives a reachable image URL. +* **Settings → Integrations:** added notices clarifying that this is the built-in Discord Rich Presence, and that the official Navidrome Discord RP plugin needs "Show in Now Playing" enabled instead. + ### Local index — multi-genre browse, filters, and counts **By [@cucadmuh](https://github.com/cucadmuh), reported by HiveMind on the Psysonic Discord, PR [#1059](https://github.com/Psychotoxical/psysonic/pull/1059)** diff --git a/src/components/fullscreenPlayer/FullscreenPlayerStatic.tsx b/src/components/fullscreenPlayer/FullscreenPlayerStatic.tsx index c7a1a356..533402dd 100644 --- a/src/components/fullscreenPlayer/FullscreenPlayerStatic.tsx +++ b/src/components/fullscreenPlayer/FullscreenPlayerStatic.tsx @@ -75,10 +75,6 @@ export default function FullscreenPlayerStatic({ onClose }: Props) { const [queueOpen, setQueueOpen] = useState(false); const [lyricsOpen, setLyricsOpen] = useState(false); - // Prefix the title with the queue position so it matches "Track x / N". - const titlePrefix = queueLen > 0 - ? `${String(queueIndex + 1).padStart(2, '0')}. ` - : ''; const metaParts = useMemo( () => [currentTrack?.year?.toString(), currentTrack?.genre].filter(Boolean) as string[], [currentTrack?.year, currentTrack?.genre], @@ -139,7 +135,7 @@ export default function FullscreenPlayerStatic({ onClose }: Props) { :
}
-

{titlePrefix}{currentTrack?.title ?? '—'}

+

{currentTrack?.title ?? '—'}

{currentTrack?.artist ?? '—'}

{currentTrack && (
diff --git a/src/components/settings/IntegrationsTab.tsx b/src/components/settings/IntegrationsTab.tsx index ff86e322..947aa1df 100644 --- a/src/components/settings/IntegrationsTab.tsx +++ b/src/components/settings/IntegrationsTab.tsx @@ -36,6 +36,11 @@ export function IntegrationsTab() { icon={} >
+
+ {t('settings.discordRichPresenceNotice')} +
{t('settings.discordRichPresence')}
@@ -160,6 +165,7 @@ export function IntegrationsTab() {
{t('settings.nowPlayingEnabled')}
{t('settings.nowPlayingEnabledDesc')}
+
{t('settings.nowPlayingPluginNote')}