From 654cde6796b0b53e263a6a695a9c02361fcc4d22 Mon Sep 17 00:00:00 2001 From: Honey Date: Wed, 20 May 2026 18:54:45 +0200 Subject: [PATCH] =?UTF-8?q?refactor:=20remove=20LRCLIB=20fallback=20?= =?UTF-8?q?=E2=80=94=20handled=20by=20navidrome-lyrics-plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- src/nowplaying.js | 51 +++-------------------------------------------- 1 file changed, 3 insertions(+), 48 deletions(-) diff --git a/src/nowplaying.js b/src/nowplaying.js index e21c8b7..b8cb5be 100644 --- a/src/nowplaying.js +++ b/src/nowplaying.js @@ -95,18 +95,6 @@ let _lyricsLoadToken = 0; const LYRICS_LOOKAHEAD_MS = 200; -function _parseLrc(text) { - let offsetMs = 0; - const lines = []; - for(const raw of text.split('\n')) { - const offM = raw.match(/^\[offset:\s*([+-]?\d+)\s*\]/i); - if(offM) { offsetMs = parseInt(offM[1]); continue; } - const m = raw.match(/^\[(\d+):(\d+(?:\.\d+)?)\](.*)/); - if(m) lines.push({ start: Math.round((parseInt(m[1])*60 + parseFloat(m[2]))*1000), value: m[3].trim() }); - } - if(offsetMs) lines.forEach(l => l.start = Math.max(0, l.start + offsetMs)); - return lines.sort((a,b) => a.start - b.start).filter(l => l.value); -} function _renderSyncedLines(content, lines) { const top = document.createElement('div'); @@ -138,53 +126,20 @@ async function _loadNpLyrics(songId) { content.innerHTML = '
Lade Lyrics…
'; const token = ++_lyricsLoadToken; - const s = S.queue[S.qIdx]; const { getLyricsBySongId } = await import('./api.js'); if(token !== _lyricsLoadToken) return; - // 1. Try Navidrome structured lyrics const lyrics = await getLyricsBySongId(songId); if(token !== _lyricsLoadToken) return; const track = lyrics[0]; + + content.innerHTML = ''; if(track?.synced && track.line?.length) { - content.innerHTML = ''; _renderSyncedLines(content, track.line.map(l => ({ start: l.start, value: l.value || '' })).filter(l => l.value)); return; } - // 2. Fallback: fetch lyrics from LRCLIB - // Use only first artist (multi-artist strings like "A / B" break lookup) - const firstArtist = (s?.artist||'').split(/[/,]/)[0].trim(); - let lrcText = null; - let lrclibPlain = null; - try { - // Try with album first, then without (album mismatch causes 404) - const attempts = [ - new URLSearchParams({ artist_name: firstArtist, track_name: s?.title||'', ...(s?.album ? { album_name: s.album } : {}) }), - ...(s?.album ? [new URLSearchParams({ artist_name: firstArtist, track_name: s?.title||'' })] : []), - ]; - for(const p of attempts) { - if(token !== _lyricsLoadToken) return; - const r = await fetch(`https://lrclib.net/api/get?${p}`, { signal: AbortSignal.timeout(6000) }); - if(r.ok) { - const d = await r.json(); - lrcText = d.syncedLyrics || null; - lrclibPlain = d.plainLyrics || null; - break; - } - } - } catch {} - if(token !== _lyricsLoadToken) return; - - content.innerHTML = ''; - if(lrcText) { - const parsed = _parseLrc(lrcText); - if(parsed.length) { _renderSyncedLines(content, parsed); return; } - } - - // 3. Plain text — prefer LRCLIB plain over Navidrome plain (usually better quality) - const plain = lrclibPlain - || (track?.line?.length ? track.line.map(l => l.value).join('\n') : null); + const plain = track?.line?.length ? track.line.map(l => l.value).join('\n') : null; if(plain) { const el = document.createElement('div'); el.className = 'lyrics-plain';