mirror of
https://github.com/navidrome/navidrome.git
synced 2026-05-03 06:51:16 +00:00
* feat: add Path to TrackInfo struct * refactor: improve naming to follow the rest of the code * test: add tests * fix: actually check for filesystem permission * refactor: remove library logic from specific plugins * refactor: move hasFilesystemPermission to a Manifest method * test(plugins): add unit tests for hasLibraryFilesystemAccess method Signed-off-by: Deluan <deluan@navidrome.org> * refactor(plugins): remove hasFilesystemPerm field and use manifest for filesystem permission checks Signed-off-by: Deluan <deluan@navidrome.org> * refactor(plugins): streamline library filesystem access checks in lyrics and scrobbler adapters Signed-off-by: Deluan <deluan@navidrome.org> --------- Signed-off-by: Deluan <deluan@navidrome.org> Co-authored-by: Deluan <deluan@navidrome.org>
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package plugins
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/navidrome/navidrome/log"
|
|
"github.com/navidrome/navidrome/model"
|
|
"github.com/navidrome/navidrome/plugins/capabilities"
|
|
)
|
|
|
|
const CapabilityLyrics Capability = "Lyrics"
|
|
|
|
const (
|
|
FuncLyricsGetLyrics = "nd_lyrics_get_lyrics"
|
|
)
|
|
|
|
func init() {
|
|
registerCapability(
|
|
CapabilityLyrics,
|
|
FuncLyricsGetLyrics,
|
|
)
|
|
}
|
|
|
|
// LyricsPlugin adapts a WASM plugin with the Lyrics capability.
|
|
type LyricsPlugin struct {
|
|
name string
|
|
plugin *plugin
|
|
}
|
|
|
|
// GetLyrics calls the plugin to fetch lyrics, then parses the raw text responses
|
|
// using model.ToLyrics.
|
|
func (l *LyricsPlugin) GetLyrics(ctx context.Context, mf *model.MediaFile) (model.LyricList, error) {
|
|
req := capabilities.GetLyricsRequest{
|
|
Track: mediaFileToTrackInfo(l.plugin, mf),
|
|
}
|
|
resp, err := callPluginFunction[capabilities.GetLyricsRequest, capabilities.GetLyricsResponse](
|
|
ctx, l.plugin, FuncLyricsGetLyrics, req,
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var result model.LyricList
|
|
for _, lt := range resp.Lyrics {
|
|
lang := lt.Lang
|
|
if lang == "" {
|
|
lang = "xxx"
|
|
}
|
|
parsed, err := model.ToLyrics(lang, lt.Text)
|
|
if err != nil {
|
|
log.Warn(ctx, "Error parsing plugin lyrics", "plugin", l.name, err)
|
|
continue
|
|
}
|
|
if parsed != nil && !parsed.IsEmpty() {
|
|
result = append(result, *parsed)
|
|
}
|
|
}
|
|
return result, nil
|
|
}
|