@@ -44,6 +44,8 @@ type jellyfinMediaProvider struct {
4444 client * jellyfin.Client
4545 prefetchCoverCB func (coverArtID string )
4646
47+ currentLibraryID string
48+
4749 genresCached []* mediaprovider.Genre
4850 genresCachedAt int64 // unix
4951}
@@ -59,6 +61,22 @@ func (j *jellyfinMediaProvider) SetPrefetchCoverCallback(cb func(coverArtID stri
5961 j .prefetchCoverCB = cb
6062}
6163
64+ func (j * jellyfinMediaProvider ) GetLibraries () ([]mediaprovider.Library , error ) {
65+ v , err := j .client .GetUserViews ()
66+ if err != nil {
67+ return nil , err
68+ }
69+ return sharedutil .FilterMapSlice (v , func (v * jellyfin.BaseItem ) (mediaprovider.Library , bool ) {
70+ return mediaprovider.Library {Name : v .Name , ID : v .ID }, v .CollectionType == string (jellyfin .CollectionTypeMusic )
71+ }), nil
72+ }
73+
74+ func (j * jellyfinMediaProvider ) SetLibrary (id string ) error {
75+ j .currentLibraryID = id
76+ j .genresCached = nil
77+ return nil
78+ }
79+
6280func (j * jellyfinMediaProvider ) CreatePlaylist (name string , trackIDs []string ) error {
6381 return j .client .CreatePlaylist (name , trackIDs )
6482}
@@ -178,6 +196,9 @@ func (j *jellyfinMediaProvider) GetTopTracks(artist mediaprovider.Artist, limit
178196 opts .Filter .ArtistID = artist .ID
179197 opts .Sort .Field = jellyfin .SortByCommunityRating
180198 opts .Sort .Mode = jellyfin .SortDesc
199+ if j .currentLibraryID != "" {
200+ opts .Filter .ParentID = j .currentLibraryID
201+ }
181202 tr , err := j .client .GetSongs (opts )
182203 if err != nil {
183204 return nil , err
@@ -193,6 +214,9 @@ func (j *jellyfinMediaProvider) GetRandomTracks(genreName string, limit int) ([]
193214 opts .Paging .Limit = limit
194215 opts .Filter .Genres = []string {genreName }
195216 opts .Sort .Field = jellyfin .SortByRandom
217+ if j .currentLibraryID != "" {
218+ opts .Filter .ParentID = j .currentLibraryID
219+ }
196220 tr , err := j .client .GetSongs (opts )
197221 if err != nil {
198222 return nil , err
@@ -212,15 +236,16 @@ func (j *jellyfinMediaProvider) GetCoverArt(id string, size int) (image.Image, e
212236 return j .client .GetItemImage (id , "Primary" , size , 92 )
213237}
214238
215- func (s * jellyfinMediaProvider ) GetFavorites () (mediaprovider.Favorites , error ) {
239+ func (j * jellyfinMediaProvider ) GetFavorites () (mediaprovider.Favorites , error ) {
216240 var wg sync.WaitGroup
217241 var favorites mediaprovider.Favorites
218242
243+ var opts jellyfin.QueryOpts
244+ opts .Filter .Favorite = true
245+ opts .Filter .ParentID = j .currentLibraryID
219246 wg .Add (1 )
220247 go func () {
221- var opts jellyfin.QueryOpts
222- opts .Filter .Favorite = true
223- al , err := s .client .GetAlbums (opts )
248+ al , err := j .client .GetAlbums (opts )
224249 if err == nil && len (al ) > 0 {
225250 favorites .Albums = sharedutil .MapSlice (al , toAlbum )
226251 }
@@ -229,9 +254,7 @@ func (s *jellyfinMediaProvider) GetFavorites() (mediaprovider.Favorites, error)
229254
230255 wg .Add (1 )
231256 go func () {
232- var opts jellyfin.QueryOpts
233- opts .Filter .Favorite = true
234- ar , err := s .client .GetAlbumArtists (opts )
257+ ar , err := j .client .GetAlbumArtists (opts )
235258 if err == nil && len (ar ) > 0 {
236259 favorites .Artists = sharedutil .MapSlice (ar , toArtist )
237260 }
@@ -240,9 +263,7 @@ func (s *jellyfinMediaProvider) GetFavorites() (mediaprovider.Favorites, error)
240263
241264 wg .Add (1 )
242265 go func () {
243- var opts jellyfin.QueryOpts
244- opts .Filter .Favorite = true
245- tr , err := s .client .GetSongs (opts )
266+ tr , err := j .client .GetSongs (opts )
246267 if err == nil && len (tr ) > 0 {
247268 favorites .Tracks = sharedutil .MapSlice (tr , toTrack )
248269 }
@@ -258,7 +279,7 @@ func (j *jellyfinMediaProvider) GetGenres() ([]*mediaprovider.Genre, error) {
258279 return j .genresCached , nil
259280 }
260281
261- g , err := j .client .GetGenres (jellyfin.Paging {})
282+ g , err := j .client .GetGenres (jellyfin.Paging {}, j . currentLibraryID )
262283 if err != nil {
263284 return nil , err
264285 }
0 commit comments