feat(plugins): add LibraryID to TrackInfo

Add LibraryID field to TrackInfo so plugins with library filesystem access
can determine which library a track belongs to. This lets plugins resolve
the full filesystem path by combining the library's root path with the
track's relative path. LibraryID is gated behind the same filesystem
access permission check as Path.
This commit is contained in:
Deluan 2026-04-26 16:36:57 -04:00 committed by Rob Emery
parent a40edb892e
commit c7c494abcc
3 changed files with 16 additions and 6 deletions

View File

@ -68,6 +68,9 @@ type TrackInfo struct {
MBZReleaseGroupID string `json:"mbzReleaseGroupId,omitempty"`
// MBZReleaseTrackID is the MusicBrainz release track ID.
MBZReleaseTrackID string `json:"mbzReleaseTrackId,omitempty"`
// LibraryID is the ID of the library the track belongs to.
// Only included if the plugin has library permission with filesystem access for the track's library.
LibraryID int32 `json:"libraryId,omitempty"`
// Path is the full path to the track file, relative to the library root.
// Only included if the plugin has library permission with filesystem access for the track's library.
Path string `json:"path,omitempty"`

View File

@ -130,6 +130,7 @@ func mediaFileToTrackInfo(p *plugin, mf *model.MediaFile) capabilities.TrackInfo
MBZReleaseTrackID: mf.MbzReleaseTrackID,
}
if p.hasLibraryFilesystemAccess(mf.LibraryID) {
ti.LibraryID = int32(mf.LibraryID)
ti.Path = mf.Path
}
return ti

View File

@ -259,19 +259,25 @@ var _ = Describe("ScrobblerPlugin", Ordered, func() {
},
}
It("includes Path when the plugin has filesystem access to the track's library", func() {
It("includes LibraryID and Path when the plugin has filesystem access to the track's library", func() {
p := &plugin{manifest: fsManifest, libraries: newLibraryAccess([]int{1}, false)}
Expect(mediaFileToTrackInfo(p, track).Path).To(Equal("/music/test.flac"))
ti := mediaFileToTrackInfo(p, track)
Expect(ti.LibraryID).To(Equal(int32(1)))
Expect(ti.Path).To(Equal("/music/test.flac"))
})
It("omits Path when the plugin lacks filesystem permission", func() {
It("omits LibraryID and Path when the plugin lacks filesystem permission", func() {
p := &plugin{manifest: &Manifest{}, libraries: newLibraryAccess([]int{1}, false)}
Expect(mediaFileToTrackInfo(p, track).Path).To(BeEmpty())
ti := mediaFileToTrackInfo(p, track)
Expect(ti.LibraryID).To(BeZero())
Expect(ti.Path).To(BeEmpty())
})
It("omits Path when the track's library is not in the allowed set", func() {
It("omits LibraryID and Path when the track's library is not in the allowed set", func() {
p := &plugin{manifest: fsManifest, libraries: newLibraryAccess([]int{2}, false)}
Expect(mediaFileToTrackInfo(p, track).Path).To(BeEmpty())
ti := mediaFileToTrackInfo(p, track)
Expect(ti.LibraryID).To(BeZero())
Expect(ti.Path).To(BeEmpty())
})
})
})