misc: Decouple Grid view from Albums

The Grid view and related components were highly coupled to Albums,
including the filter button that is currently used only for album
filtering.

As part of the migration of Artists to Grid view, this is the smallest
possible change to convert many of the existing code to
generics/interfaces that will allow different media to be displayed and
filtered by using Grid views.

The main changes in this diff are:

* Introduction of generics for Media types (`M`) and Filter options
  (`F`), which can be later extended to other entities besides Albums.
* Complete decoupling of `GridViewPage` and related components from
  Albums (making these pages also generic).
* Refactoring of Subsonic/Jellyfin specific code to understand these new
  generics when dealing with filtering logic.
This commit is contained in:
Michael Manganiello
2024-03-11 00:44:20 -03:00
parent 3b5e5171b5
commit a220243279
12 changed files with 281 additions and 187 deletions
+21 -15
View File
@@ -58,7 +58,7 @@ func (j *jellyfinMediaProvider) IterateAlbums(sortOrder string, filter mediaprov
jfSort.Field = jellyfin.SortByYear
jfSort.Mode = jellyfin.SortDesc
}
jfFilt := jfFilterFromFilter(&filter)
jfFilt := jfFilterFromFilter(filter)
fetcher := func(offs, limit int) ([]*mediaprovider.Album, error) {
al, err := j.client.GetAlbums(jellyfin.QueryOpts{
@@ -152,23 +152,29 @@ func (j *jellyfinMediaProvider) IterateArtists(sortOrder string) mediaprovider.A
// 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 {
func jfFilterFromFilter(filter mediaprovider.AlbumFilter) jellyfin.Filter {
var jfFilt jellyfin.Filter
if filter.ExcludeUnfavorited {
filterOptions := filter.Options()
if filterOptions.ExcludeUnfavorited {
jfFilt.Favorite = true
filter.ExcludeUnfavorited = false // Jellyfin will handle this filter
filterOptions.ExcludeUnfavorited = false // Jellyfin will handle this filter
}
if filter.MinYear > 0 && filter.MaxYear > 0 {
jfFilt.YearRange = [2]int{filter.MinYear, filter.MaxYear}
filter.MinYear, filter.MaxYear = 0, 0
} else if filter.MinYear > 0 {
jfFilt.YearRange = [2]int{filter.MinYear, time.Now().Year()}
filter.MinYear, filter.MaxYear = 0, 0
} else if filter.MaxYear > 0 {
jfFilt.YearRange = [2]int{1900, filter.MaxYear}
filter.MinYear, filter.MaxYear = 0, 0
if filterOptions.MinYear > 0 && filterOptions.MaxYear > 0 {
jfFilt.YearRange = [2]int{filterOptions.MinYear, filterOptions.MaxYear}
filterOptions.MinYear, filterOptions.MaxYear = 0, 0
} else if filterOptions.MinYear > 0 {
jfFilt.YearRange = [2]int{filterOptions.MinYear, time.Now().Year()}
filterOptions.MinYear, filterOptions.MaxYear = 0, 0
} else if filterOptions.MaxYear > 0 {
jfFilt.YearRange = [2]int{1900, filterOptions.MaxYear}
filterOptions.MinYear, filterOptions.MaxYear = 0, 0
}
jfFilt.Genres = filter.Genres
filter.Genres = nil
jfFilt.Genres = filterOptions.Genres
filterOptions.Genres = nil
filter.SetOptions(filterOptions)
return jfFilt
}