package artwork import ( "context" "path/filepath" "github.com/navidrome/navidrome/core/storage" "github.com/navidrome/navidrome/model" ) // libraryView bundles the MusicFS for a library with its absolute root path, // so readers can open library-relative paths through FS and compose absolute // paths (for ffmpeg, which is path-based) via Abs. type libraryView struct { FS storage.MusicFS absRoot string } // Abs returns the absolute path for a library-relative path. Returns "" for an // empty rel so callers (fromFFmpegTag) can treat it as "no path available". func (v libraryView) Abs(rel string) string { if rel == "" { return "" } return filepath.Join(v.absRoot, rel) } // loadLibraryView resolves the MusicFS and absolute root path in a single // library lookup. func loadLibraryView(ctx context.Context, ds model.DataStore, libID int) (libraryView, error) { lib, err := ds.Library(ctx).Get(libID) if err != nil { return libraryView{}, err } s, err := storage.For(lib.Path) if err != nil { return libraryView{}, err } fs, err := s.FS() if err != nil { return libraryView{}, err } return libraryView{FS: fs, absRoot: lib.Path}, nil }