misc: Implement Iterator approach for artists

First step towards improving sorting for Artists. Use the same iterator
approach as albums and tracks.
This commit is contained in:
Michael Manganiello
2024-03-06 00:54:16 -03:00
parent 50980e7d56
commit 2cb002dde0
7 changed files with 140 additions and 30 deletions
@@ -16,6 +16,8 @@ const (
AlbumSortArtistAZ string = "Artist (A-Z)"
AlbumSortYearAscending string = "Year (ascending)"
AlbumSortYearDescending string = "Year (descending)"
ArtistSortNameAZ string = "Name (A-Z)"
)
func (j *jellyfinMediaProvider) AlbumSortOrders() []string {
@@ -29,6 +31,12 @@ func (j *jellyfinMediaProvider) AlbumSortOrders() []string {
}
}
func (j *jellyfinMediaProvider) ArtistSortOrders() []string {
return []string{
ArtistSortNameAZ,
}
}
func (j *jellyfinMediaProvider) IterateAlbums(sortOrder string, filter mediaprovider.AlbumFilter) mediaprovider.AlbumIterator {
var jfSort jellyfin.Sort
switch sortOrder {
@@ -116,6 +124,32 @@ func (j *jellyfinMediaProvider) IterateTracks(searchQuery string) mediaprovider.
return helpers.NewTrackIterator(fetcher, j.prefetchCoverCB)
}
func (j *jellyfinMediaProvider) IterateArtists(sortOrder string) mediaprovider.ArtistIterator {
var jfSort jellyfin.Sort
if sortOrder == "" {
sortOrder = ArtistSortNameAZ // default
}
switch sortOrder {
case ArtistSortNameAZ:
jfSort.Field = jellyfin.SortByName
jfSort.Mode = jellyfin.SortAsc
}
fetcher := func(offs, limit int) ([]*mediaprovider.Artist, error) {
ar, err := j.client.GetAlbumArtists(jellyfin.QueryOpts{
Sort: jfSort,
Paging: jellyfin.Paging{StartIndex: offs, Limit: limit},
})
if err != nil {
return nil, err
}
return sharedutil.MapSlice(ar, toArtist), nil
}
return helpers.NewArtistIterator(fetcher)
}
// Creates the Jellyfin filter to implement the given mediaprovider filter,
// and zeros out the now-unneeded fields in the mediaprovider filter.
func jfFilterFromFilter(filter *mediaprovider.AlbumFilter) jellyfin.Filter {
@@ -159,14 +159,6 @@ func (j *jellyfinMediaProvider) GetArtistInfo(artistID string) (*mediaprovider.A
}, nil
}
func (j *jellyfinMediaProvider) GetArtists() ([]*mediaprovider.Artist, error) {
ar, err := j.client.GetAlbumArtists(jellyfin.QueryOpts{})
if err != nil {
return nil, err
}
return sharedutil.MapSlice(ar, toArtist), nil
}
func (j *jellyfinMediaProvider) GetTrack(trackID string) (*mediaprovider.Track, error) {
tr, err := j.client.GetSong(trackID)
if err != nil {