add new lyricsmanager missed in last commit

This commit is contained in:
Drew Weymouth
2025-11-01 11:26:49 -07:00
parent 711d564509
commit 61a04e86b5
+75
View File
@@ -0,0 +1,75 @@
package backend
import (
"context"
"log"
"sync"
"github.com/dweymouth/supersonic/backend/mediaprovider"
)
type LyricsManager struct {
sm *ServerManager
lrclib *LrcLibFetcher
// right now only one song can have lyrics being fetched
// at any given time (b/c we only show lyrics for the currently playing song)
lock sync.Mutex
fetchInProgressID string
fetchInProgressCancel context.CancelFunc
cbs []func(string, *mediaprovider.Lyrics)
}
func NewLyricsManager(sm *ServerManager, lrclib *LrcLibFetcher) *LyricsManager {
return &LyricsManager{
sm: sm,
lrclib: lrclib,
}
}
func (lm *LyricsManager) FetchLyricsAsync(song *mediaprovider.Track, cb func(string, *mediaprovider.Lyrics)) {
lm.lock.Lock()
defer lm.lock.Unlock()
if lm.fetchInProgressID == song.ID {
lm.cbs = append(lm.cbs, cb)
return
}
lm.fetchInProgressID = song.ID
if lm.fetchInProgressCancel != nil {
lm.fetchInProgressCancel()
}
lm.cbs = []func(string, *mediaprovider.Lyrics){cb}
ctx, cancel := context.WithCancel(context.Background())
lm.fetchInProgressCancel = cancel
go lm.fetchLyrics(ctx, song, func(id string, lyrics *mediaprovider.Lyrics) {
lm.lock.Lock()
defer lm.lock.Unlock()
for _, cb := range lm.cbs {
cb(id, lyrics)
}
})
}
func (lm *LyricsManager) fetchLyrics(ctx context.Context, song *mediaprovider.Track, cb func(string, *mediaprovider.Lyrics)) {
var lyrics *mediaprovider.Lyrics
var err error
if lp, ok := lm.sm.Server.(mediaprovider.LyricsProvider); ok {
if lyrics, err = lp.GetLyrics(song); err != nil {
log.Printf("Error fetching lyrics: %v", err)
}
}
if lyrics == nil && lm.lrclib != nil {
lyrics, err = lm.lrclib.FetchLrcLibLyrics(song.Title, song.ArtistNames[0], song.Album, int(song.Duration.Seconds()))
if err != nil {
log.Println(err.Error())
}
}
select {
case <-ctx.Done():
return
default:
cb(song.ID, lyrics)
}
}