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')}
auth.setNowPlayingEnabled(e.target.checked)} />
diff --git a/src/cover/integrations/discord.ts b/src/cover/integrations/discord.ts
index 47e4be87..52ef7d59 100644
--- a/src/cover/integrations/discord.ts
+++ b/src/cover/integrations/discord.ts
@@ -1,23 +1,13 @@
-import { coverCacheEnsure } from '../../api/coverCache';
import { buildCoverArtFetchUrl } from '../fetchUrl';
import type { CoverArtRef } from '../types';
-function fileUrlFromDiskPath(path: string): string {
- if (!path) return '';
- if (path.startsWith('file://')) return path;
- return `file://${path}`;
-}
-
-/** Discord large image — disk 800 path or HTTPS fetch URL. */
+/**
+ * Discord large image — always the HTTPS fetch URL, never a local cache path.
+ * Discord Rich Presence images are fetched by Discord's own servers, so the
+ * large_image must be a key or an https:// URL they can reach. A `file://` path
+ * to the on-disk webp cache (what MPRIS uses) is meaningless to Discord and
+ * silently falls back to the app icon — so we hand it the getCoverArt URL.
+ */
export async function coverArtUrlForDiscord(ref: CoverArtRef): Promise {
- try {
- const result = await coverCacheEnsure(ref, 800);
- if (result.hit && result.path) {
- return fileUrlFromDiskPath(result.path);
- }
- } catch {
- /* fall through */
- }
- const url = buildCoverArtFetchUrl(ref, 800);
- return url || null;
+ return buildCoverArtFetchUrl(ref, 800) || null;
}
diff --git a/src/locales/de/settings.ts b/src/locales/de/settings.ts
index 7519b988..8b4a1f3b 100644
--- a/src/locales/de/settings.ts
+++ b/src/locales/de/settings.ts
@@ -225,6 +225,7 @@ export const settings = {
preloadMiniPlayerDesc: 'Baut das Mini-Player-Fenster beim App-Start im Hintergrund auf, damit es beim ersten Öffnen sofort Inhalt zeigt. Kostet etwas mehr RAM.',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Zeigt den aktuell gespielten Titel im Discord-Profil an. Discord muss dafür geöffnet sein.',
+ discordRichPresenceNotice: 'Achtung: Dies ist die in Psysonic integrierte Discord Rich Presence. Wenn du stattdessen das offizielle Navidrome-Discord-Rich-Presence-Plugin nutzen möchtest, lass diese Funktion deaktiviert und aktiviere stattdessen weiter unten auf dieser Seite „Im Livefenster anzeigen".',
useCustomTitlebar: 'Eigene Titelleiste',
useCustomTitlebarDesc: 'Ersetzt die System-Titelleiste durch eine eingebaute, die zum App-Theme passt. Deaktivieren, um die native GNOME/GTK-Titelleiste zu verwenden.',
linuxWebkitSmoothScroll: 'Sanftes Mausrad (Linux)',
@@ -252,6 +253,7 @@ export const settings = {
discordTemplateName: 'Userliste-Zeile (name)',
nowPlayingEnabled: 'Im Livefenster anzeigen',
nowPlayingEnabledDesc: 'Überträgt den aktuell gespielten Titel an die Livehörer-Ansicht des Servers. Deaktivieren, um keine Wiedergabedaten zu senden.',
+ nowPlayingPluginNote: 'Notwendig bei Verwendung des offiziellen Navidrome-Discord-Rich-Presence-Plugins.',
enableBandsintown: 'Bandsintown-Tourdaten',
enableBandsintownDesc: 'Zeigt anstehende Konzerte des aktuellen Künstlers im Info-Tab. Daten werden über die öffentliche Bandsintown-API abgerufen.',
lyricsServerFirst: 'Server-Lyrics bevorzugen',
diff --git a/src/locales/en/settings.ts b/src/locales/en/settings.ts
index ed757646..5fd84cd4 100644
--- a/src/locales/en/settings.ts
+++ b/src/locales/en/settings.ts
@@ -228,6 +228,7 @@ export const settings = {
preloadMiniPlayerDesc: 'Build the mini player window in the background at app start so it shows content instantly on first open. Uses a little extra memory.',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Show the currently playing track on your Discord profile. Requires Discord to be running.',
+ discordRichPresenceNotice: 'Heads up: this is Psysonic\'s built-in Discord Rich Presence. If you\'d rather use the official Navidrome Discord Rich Presence plugin, leave this switched off and enable "Show in Now Playing" further down this page instead.',
useCustomTitlebar: 'Custom title bar',
useCustomTitlebarDesc: 'Replace the system title bar with a built-in one that matches the app theme. Disable to use the native GNOME/GTK title bar.',
linuxWebkitSmoothScroll: 'Smooth wheel (Linux)',
@@ -255,6 +256,7 @@ export const settings = {
discordTemplateName: 'User list line (name)',
nowPlayingEnabled: 'Show in Now Playing',
nowPlayingEnabledDesc: 'Broadcast your currently playing track to the server\'s live listener view. Disable to stop sending playback data.',
+ nowPlayingPluginNote: 'Required when using the official Navidrome Discord Rich Presence plugin.',
enableBandsintown: 'Bandsintown tour dates',
enableBandsintownDesc: 'Show upcoming concerts for the current artist in the Info tab. Data is fetched from the public Bandsintown API.',
lyricsServerFirst: 'Prefer server lyrics',
diff --git a/src/locales/es/settings.ts b/src/locales/es/settings.ts
index 94b8feab..56a4d6c1 100644
--- a/src/locales/es/settings.ts
+++ b/src/locales/es/settings.ts
@@ -224,6 +224,7 @@ export const settings = {
preloadMiniPlayerDesc: 'Crea la ventana del mini reproductor en segundo plano al iniciar la aplicación para que muestre contenido al instante la primera vez que se abre. Consume un poco más de memoria.',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Muestra la pista actual en tu perfil de Discord. Requiere que Discord esté ejecutándose.',
+ discordRichPresenceNotice: 'Aviso: esta es la Discord Rich Presence integrada en Psysonic. Si prefieres usar el plugin oficial de Discord Rich Presence de Navidrome, deja esta función desactivada y activa en su lugar «Mostrar en Reproduciendo Ahora» más abajo en esta página.',
useCustomTitlebar: 'Barra de título personalizada',
useCustomTitlebarDesc: 'Reemplaza la barra de título del sistema con una integrada que coincide con el tema de la app. Desactiva para usar la barra nativa de GNOME/GTK.',
linuxWebkitSmoothScroll: 'Rueda suave (Linux)',
@@ -251,6 +252,7 @@ export const settings = {
discordTemplateName: 'Línea de la lista (name)',
nowPlayingEnabled: 'Mostrar en Reproduciendo Ahora',
nowPlayingEnabledDesc: 'Transmite tu pista actual a la vista de oyentes en vivo del servidor. Desactiva para dejar de enviar datos de reproducción.',
+ nowPlayingPluginNote: 'Necesario al usar el plugin oficial de Discord Rich Presence de Navidrome.',
enableBandsintown: 'Fechas de gira de Bandsintown',
enableBandsintownDesc: 'Muestra próximos conciertos del artista actual en la pestaña Info. Los datos se obtienen de la API pública de Bandsintown.',
lyricsServerFirst: 'Preferir letras del servidor',
diff --git a/src/locales/fr/settings.ts b/src/locales/fr/settings.ts
index 8c524fe5..af19e015 100644
--- a/src/locales/fr/settings.ts
+++ b/src/locales/fr/settings.ts
@@ -235,6 +235,7 @@ export const settings = {
linuxWaylandTextRenderMinimal: 'Minimal (lissage CSS par défaut)',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Affiche le titre en cours de lecture sur votre profil Discord. Discord doit être ouvert.',
+ discordRichPresenceNotice: 'Attention : il s\'agit de la Discord Rich Presence intégrée à Psysonic. Si vous préférez utiliser le plugin officiel Discord Rich Presence de Navidrome, laissez cette fonction désactivée et activez plutôt « Afficher dans la fenêtre live » plus bas sur cette page.',
discordCoverSource: 'Source de pochette',
discordCoverSourceDesc: 'D\'où récupérer la pochette pour votre profil Discord.',
discordCoverNone: 'Aucune (icône de l\'app uniquement)',
@@ -249,6 +250,7 @@ export const settings = {
discordTemplateName: 'Ligne de la liste (name)',
nowPlayingEnabled: 'Afficher dans la fenêtre live',
nowPlayingEnabledDesc: 'Diffuse le titre en cours de lecture vers la vue des auditeurs en direct du serveur. Désactiver pour ne pas envoyer de données de lecture.',
+ nowPlayingPluginNote: 'Requis lors de l\'utilisation du plugin officiel Discord Rich Presence de Navidrome.',
enableBandsintown: 'Dates de tournée Bandsintown',
enableBandsintownDesc: 'Affiche les concerts à venir de l\'artiste actuel dans l\'onglet Info. Les données proviennent de l\'API publique Bandsintown.',
lyricsServerFirst: 'Préférer les paroles du serveur',
diff --git a/src/locales/nb/settings.ts b/src/locales/nb/settings.ts
index 45c41fb8..1c534fb2 100644
--- a/src/locales/nb/settings.ts
+++ b/src/locales/nb/settings.ts
@@ -234,6 +234,7 @@ export const settings = {
linuxWaylandTextRenderMinimal: 'Minimum (standard CSS-utjevning)',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Vis sporet som spilles i din Discord-profil. Krever at Discord kjører.',
+ discordRichPresenceNotice: 'Merk: dette er den innebygde Discord Rich Presence i Psysonic. Vil du heller bruke det offisielle Navidrome Discord Rich Presence-tillegget, la denne funksjonen være av og aktiver i stedet «Vis i "Nå spiller"» lenger ned på denne siden.',
discordCoverSource: 'Coverkilde',
discordCoverSourceDesc: 'Hvor albumcoveret for Discord-profilen din hentes fra.',
discordCoverNone: 'Ingen (kun app-ikon)',
@@ -248,6 +249,7 @@ export const settings = {
discordTemplateName: 'Brukerliste-linje (name)',
nowPlayingEnabled: 'Vis i "Nå spiller"',
nowPlayingEnabledDesc: 'Send sporet som spilles av til tjenerens live-lyttervisning. Deaktiver for å stoppe sending av avspillingsdata.',
+ nowPlayingPluginNote: 'Nødvendig ved bruk av det offisielle Navidrome Discord Rich Presence-tillegget.',
enableBandsintown: 'Bandsintown-turnédatoer',
enableBandsintownDesc: 'Vis kommende konserter for gjeldende artist i Info-fanen. Data hentes fra det offentlige Bandsintown-API-et.',
lyricsServerFirst: 'Foretrekk server-sangtekst',
diff --git a/src/locales/nl/settings.ts b/src/locales/nl/settings.ts
index 54c0b004..e18885ab 100644
--- a/src/locales/nl/settings.ts
+++ b/src/locales/nl/settings.ts
@@ -235,6 +235,7 @@ export const settings = {
linuxWaylandTextRenderMinimal: 'Minimaal (standaard CSS-verzachting)',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: 'Toont het huidige nummer op je Discord-profiel. Discord moet daarvoor geopend zijn.',
+ discordRichPresenceNotice: 'Let op: dit is de in Psysonic ingebouwde Discord Rich Presence. Wil je liever de officiële Navidrome Discord Rich Presence-plug-in gebruiken, laat deze functie dan uitgeschakeld en schakel in plaats daarvan verderop op deze pagina „Weergeven in live-venster" in.',
discordCoverSource: 'Hoesbron',
discordCoverSourceDesc: 'Waar de albumhoes voor je Discord-profiel vandaan komt.',
discordCoverNone: 'Geen (alleen app-icoon)',
@@ -249,6 +250,7 @@ export const settings = {
discordTemplateName: 'Gebruikerslijst-regel (name)',
nowPlayingEnabled: 'Weergeven in live-venster',
nowPlayingEnabledDesc: 'Stuurt het huidige nummer naar de live-luisteraarsweergave van de server. Uitschakelen om geen afspeelgegevens te verzenden.',
+ nowPlayingPluginNote: 'Vereist bij gebruik van de officiële Navidrome Discord Rich Presence-plug-in.',
enableBandsintown: 'Bandsintown-tourdata',
enableBandsintownDesc: 'Toon aankomende concerten van de huidige artiest in het Info-tabblad. Gegevens komen van de openbare Bandsintown-API.',
lyricsServerFirst: 'Server-songtekst voorrang geven',
diff --git a/src/locales/ro/settings.ts b/src/locales/ro/settings.ts
index 8df1cc07..91ca87ef 100644
--- a/src/locales/ro/settings.ts
+++ b/src/locales/ro/settings.ts
@@ -227,6 +227,7 @@ export const settings = {
preloadMiniPlayerDesc: 'Crează fereastra mini player în fundal la deschiderea aplicației pentru a arăta conținut instantaneu la prima deschidere. Folosește puțină extra memorie.',
discordRichPresence: 'Prezență Discord Rich',
discordRichPresenceDesc: 'Arată piesa redată curent pe profilul tău de Discord. Necesită Discord să ruleze.',
+ discordRichPresenceNotice: 'Atenție: aceasta este Discord Rich Presence integrată în Psysonic. Dacă preferi să folosești pluginul oficial Discord Rich Presence de la Navidrome, lasă această funcție dezactivată și activează în schimb „Se afișează în Now Playing" mai jos pe această pagină.',
useCustomTitlebar: 'Bară de titlu personalizată',
useCustomTitlebarDesc: 'Înlocuiește bara de titlu a sistemului cu una care corespunde cu tema aplicației. Dezactivează pentru a folosi bara de titlu nativ GNOME/GTK.',
linuxWebkitSmoothScroll: 'Rotiță lină (Linux)',
@@ -254,6 +255,7 @@ export const settings = {
discordTemplateName: 'Linia din listă (name)',
nowPlayingEnabled: 'Se afișează în Now Playing',
nowPlayingEnabledDesc: 'Difuzează piesa redată curent către vizualizatorul de ascultare live a serverului. Dezactivează pentru a opri trimiterea datelor de redare.',
+ nowPlayingPluginNote: 'Necesar la utilizarea pluginului oficial Discord Rich Presence de la Navidrome.',
enableBandsintown: 'Date de turneu Bandsintown',
enableBandsintownDesc: 'Arată concertele următoare pentru artisul curent în tab-ul Informații. Datele sunt preluate din API-ul public Bandsintown.',
lyricsServerFirst: 'Preferă versurile de pe server',
diff --git a/src/locales/ru/settings.ts b/src/locales/ru/settings.ts
index a4b19e99..927f4cdf 100644
--- a/src/locales/ru/settings.ts
+++ b/src/locales/ru/settings.ts
@@ -244,6 +244,7 @@ export const settings = {
discordRichPresence: 'Статус в Discord',
discordRichPresenceDesc:
'Показывать текущий трек в профиле и статусе Discord. Нужен запущенный клиент Discord.',
+ discordRichPresenceNotice: 'Внимание: это встроенная Discord Rich Presence в Psysonic. Если вы хотите использовать официальный плагин Discord Rich Presence для Navidrome, оставьте эту функцию выключенной и вместо этого включите «Показывать в „Сейчас играет"» ниже на этой странице.',
discordCoverSource: 'Источник обложки',
discordCoverSourceDesc: 'Откуда загружать обложку альбома для профиля Discord.',
discordCoverNone: 'Нет (только иконка приложения)',
@@ -259,6 +260,7 @@ export const settings = {
nowPlayingEnabled: 'Показывать в «Сейчас играет»',
nowPlayingEnabledDesc:
'Отправлять на сервер, что вы сейчас слушаете. Отключите, чтобы не делиться этим.',
+ nowPlayingPluginNote: 'Необходимо при использовании официального плагина Discord Rich Presence для Navidrome.',
enableBandsintown: 'Даты туров Bandsintown',
enableBandsintownDesc: 'Показывает предстоящие концерты текущего исполнителя на вкладке «Инфо». Данные берутся из публичного API Bandsintown.',
lyricsServerFirst: 'Предпочитать тексты с сервера',
diff --git a/src/locales/zh/settings.ts b/src/locales/zh/settings.ts
index 4099ceac..fc0b616f 100644
--- a/src/locales/zh/settings.ts
+++ b/src/locales/zh/settings.ts
@@ -234,6 +234,7 @@ export const settings = {
linuxWaylandTextRenderMinimal: '最小(默认 CSS 平滑)',
discordRichPresence: 'Discord Rich Presence',
discordRichPresenceDesc: '在 Discord 个人资料上显示当前播放的曲目。需要 Discord 处于运行状态。',
+ discordRichPresenceNotice: '注意:这是 Psysonic 内置的 Discord Rich Presence。如果你想使用官方的 Navidrome Discord Rich Presence 插件,请保持此功能关闭,并改为启用本页下方的"在实时窗口中显示"。',
discordCoverSource: '封面来源',
discordCoverSourceDesc: '从何处获取 Discord 个人资料上显示的专辑封面。',
discordCoverNone: '无(仅显示应用图标)',
@@ -248,6 +249,7 @@ export const settings = {
discordTemplateName: '用户列表行 (name)',
nowPlayingEnabled: '在实时窗口中显示',
nowPlayingEnabledDesc: '将当前播放的曲目广播到服务器的实时听众视图。禁用以停止发送播放数据。',
+ nowPlayingPluginNote: '使用官方 Navidrome Discord Rich Presence 插件时必需。',
enableBandsintown: 'Bandsintown 巡演日期',
enableBandsintownDesc: '在信息标签页中显示当前艺术家的即将到来的演出。数据通过公开的 Bandsintown API 获取。',
lyricsServerFirst: '优先使用服务器歌词',
diff --git a/src/styles/components/fullscreen-player-static.css b/src/styles/components/fullscreen-player-static.css
index d6d22254..4d0892ce 100644
--- a/src/styles/components/fullscreen-player-static.css
+++ b/src/styles/components/fullscreen-player-static.css
@@ -182,7 +182,7 @@
margin: 0;
font-size: 46px;
font-weight: 700;
- line-height: 1.05;
+ line-height: 1.25;
letter-spacing: -0.01em;
white-space: nowrap;
overflow: hidden;