added album list filtering

This commit is contained in:
austinried
2021-08-22 11:48:22 +09:00
parent 17bf9e4a2a
commit 290a62588e
7 changed files with 226 additions and 28 deletions

View File

@@ -10,7 +10,7 @@ import {
StarrableItemType,
} from '@app/models/music'
import { Store } from '@app/state/store'
import { GetAlbumList2Type, Search3Params, StarParams } from '@app/subsonic/params'
import { GetAlbumList2Params, GetAlbumList2TypeBase, Search3Params, StarParams } from '@app/subsonic/params'
import produce from 'immer'
import { GetState, SetState } from 'zustand'
@@ -218,7 +218,37 @@ export const createMusicSlice = (set: SetState<Store>, get: GetState<Store>): Mu
}
try {
const response = await client.getAlbumList2({ type: 'alphabeticalByArtist', size, offset })
const filter = get().settings.screens.library.albums
let params: GetAlbumList2Params
switch (filter.type) {
case 'byYear':
params = {
size,
offset,
type: filter.type,
fromYear: filter.fromYear,
toYear: filter.toYear,
}
break
case 'byGenre':
params = {
size,
offset,
type: filter.type,
genre: filter.genre,
}
break
default:
params = {
size,
offset,
type: filter.type,
}
break
}
const response = await client.getAlbumList2(params)
const albums = response.data.albums.map(get().mapAlbumID3toAlbumListItem)
set(
@@ -294,13 +324,13 @@ export const createMusicSlice = (set: SetState<Store>, get: GetState<Store>): Mu
}
set({ homeListsUpdating: true })
const types = get().settings.home.lists
const types = get().settings.screens.home.lists
try {
const promises: Promise<any>[] = []
for (const type of types) {
promises.push(
client.getAlbumList2({ type: type as GetAlbumList2Type, size: 20 }).then(response => {
client.getAlbumList2({ type: type as GetAlbumList2TypeBase, size: 20 }).then(response => {
const list = response.data.albums.map(get().mapAlbumID3toAlbumListItem)
set(
produce<MusicSlice>(state => {

View File

@@ -1,4 +1,4 @@
import { AppSettings, Server } from '@app/models/settings'
import { AppSettings, FilterSettings, Server } from '@app/models/settings'
import { Store } from '@app/state/store'
import { SubsonicApiClient } from '@app/subsonic/api'
import produce from 'immer'
@@ -22,6 +22,8 @@ export type SettingsSlice = {
setMaxBuffer: (maxBuffer: number) => void
pingServer: (server?: Server) => Promise<boolean>
setLibraryAlbumFilter: (filter: FilterSettings) => void
}
export const selectSettings = {
@@ -35,7 +37,7 @@ export const selectSettings = {
removeServer: (state: SettingsSlice) => state.removeServer,
updateServer: (state: SettingsSlice) => state.updateServer,
homeLists: (state: SettingsSlice) => state.settings.home.lists,
homeLists: (state: SettingsSlice) => state.settings.screens.home.lists,
scrobble: (state: SettingsSlice) => state.settings.scrobble,
setScrobble: (state: SettingsSlice) => state.setScrobble,
@@ -54,13 +56,26 @@ export const selectSettings = {
setMaxBuffer: (state: SettingsSlice) => state.setMaxBuffer,
pingServer: (state: SettingsSlice) => state.pingServer,
setLibraryAlbumFilter: (state: SettingsSlice) => state.setLibraryAlbumFilter,
libraryAlbumFilter: (state: SettingsSlice) => state.settings.screens.library.albums,
}
export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>): SettingsSlice => ({
settings: {
servers: [],
home: {
lists: ['recent', 'random', 'frequent', 'starred'],
screens: {
home: {
lists: ['recent', 'random', 'frequent', 'starred'],
},
library: {
albums: {
type: 'alphabeticalByArtist',
fromYear: 1,
toYear: 9999,
genre: '',
},
},
},
scrobble: false,
estimateContentLength: true,
@@ -226,6 +241,14 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
return false
}
},
setLibraryAlbumFilter: filter => {
set(
produce<SettingsSlice>(state => {
state.settings.screens.library.albums = filter
}),
)
},
})
function replaceIndex<T>(array: T[], index: number, replacement: T): T[] {