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)
This commit is contained in:
Psychotoxical
2026-06-11 23:34:58 +02:00
committed by GitHub
parent 1a82376f8c
commit 3de7b57cc5
14 changed files with 47 additions and 24 deletions
+8 -18
View File
@@ -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<string | null> {
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;
}