From 27255fb9aebcb3a807caa4bd909186caf765ec77 Mon Sep 17 00:00:00 2001 From: ranokay Date: Fri, 27 Mar 2026 07:55:08 +0200 Subject: [PATCH] chore(lyrics): polish rebased TTML branch --- core/lyrics/ttml.go | 8 ++++---- server/subsonic/media_retrieval.go | 2 ++ ui/src/audioplayer/lyrics.js | 7 ++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/core/lyrics/ttml.go b/core/lyrics/ttml.go index adbc0c054..a02fa52d8 100644 --- a/core/lyrics/ttml.go +++ b/core/lyrics/ttml.go @@ -814,9 +814,9 @@ func (p *ttmlParser) updateTimingParams(attrs []xml.Attr) { } } - p.params.frameRate = max(frameRate, defaultTTMLFrameRate) - p.params.subFrameRate = max(subFrameRate, defaultTTMLSubFrameRate) - p.params.tickRate = max(tickRate, defaultTTMLTickRate) + p.params.frameRate = positiveOrDefault(frameRate, defaultTTMLFrameRate) + p.params.subFrameRate = positiveOrDefault(subFrameRate, defaultTTMLSubFrameRate) + p.params.tickRate = positiveOrDefault(tickRate, defaultTTMLTickRate) } func parseTTMLDurationExpression(expr string, params ttmlTimingParams) (int64, bool) { @@ -1102,7 +1102,7 @@ func hydrateLineTimingFromTokens(line model.Line) model.Line { return model.NormalizeLineTiming(line) } -func max(v float64, fallback float64) float64 { +func positiveOrDefault(v float64, fallback float64) float64 { if v <= 0 { return fallback } diff --git a/server/subsonic/media_retrieval.go b/server/subsonic/media_retrieval.go index de88849a2..16d0d2666 100644 --- a/server/subsonic/media_retrieval.go +++ b/server/subsonic/media_retrieval.go @@ -99,6 +99,8 @@ func (api *Router) GetLyrics(r *http.Request) (*responses.Subsonic, error) { lyricsResponse := responses.Lyrics{} response.Lyrics = &lyricsResponse opts := filter.SongsByArtistTitleWithLyricsFirst(artist, title) + // Keep the search exhaustive so an older duplicate can still supply the + // matching sidecar lyrics when the newest candidate only has embedded data. opts.Max = 0 mediaFiles, err := api.ds.MediaFile(r.Context()).GetAll(opts) diff --git a/ui/src/audioplayer/lyrics.js b/ui/src/audioplayer/lyrics.js index cd5248096..87b218d05 100644 --- a/ui/src/audioplayer/lyrics.js +++ b/ui/src/audioplayer/lyrics.js @@ -84,7 +84,9 @@ const normalizeToken = (token) => { const buildAgentLookup = (structuredLyric) => { const lookup = new Map() - const agents = Array.isArray(structuredLyric?.agents) ? structuredLyric.agents : [] + const agents = Array.isArray(structuredLyric?.agents) + ? structuredLyric.agents + : [] for (const agent of agents) { const id = typeof agent?.id === 'string' ? agent.id : '' if (!id || lookup.has(id)) { @@ -112,8 +114,7 @@ const normalizeCueLine = (cueLine, fallbackIndex, agentLookup) => { : fallbackIndex const agentId = typeof cueLine?.agentId === 'string' ? cueLine.agentId : '' const agent = agentId ? agentLookup.get(agentId) || null : null - const fallbackRole = - typeof cueLine?.role === 'string' ? cueLine.role : '' + const fallbackRole = typeof cueLine?.role === 'string' ? cueLine.role : '' const tokens = sortTokensByStart( Array.isArray(cueLine?.cue) ? cueLine.cue.map(normalizeToken).filter(Boolean)