diff --git a/app/models/cache.ts b/app/models/cache.ts index 86dc3f9..5bd23cd 100644 --- a/app/models/cache.ts +++ b/app/models/cache.ts @@ -2,12 +2,16 @@ import { Album, Playlist, Artist, Song } from './library' export enum CacheItemType { coverArt = 'coverArt', + coverArtThumb = 'coverArtThumb', artistArt = 'artistArt', + artistArtThumb = 'artistArtThumb', song = 'song', } export type CacheItemTypeKey = keyof typeof CacheItemType +export type CacheImageSize = 'thumbnail' | 'original' + export type CacheFile = { path: string date: number diff --git a/app/state/cache.ts b/app/state/cache.ts index 821060d..430cc54 100644 --- a/app/state/cache.ts +++ b/app/state/cache.ts @@ -1,4 +1,4 @@ -import { CacheFile, CacheItemType, CacheItemTypeKey, CacheRequest } from '@app/models/cache' +import { CacheFile, CacheImageSize, CacheItemType, CacheItemTypeKey, CacheRequest } from '@app/models/cache' import { mkdir, rmdir } from '@app/util/fs' import PromiseQueue from '@app/util/PromiseQueue' import produce from 'immer' @@ -8,7 +8,9 @@ import { Store } from './store' const queues: Record = { coverArt: new PromiseQueue(5), + coverArtThumb: new PromiseQueue(50), artistArt: new PromiseQueue(5), + artistArtThumb: new PromiseQueue(50), song: new PromiseQueue(1), } @@ -30,7 +32,7 @@ export type CacheSlice = { cacheFiles: CacheFilesByServer cacheRequests: CacheRequestsByServer - fetchCoverArtFilePath: (coverArt: string) => Promise + fetchCoverArtFilePath: (coverArt: string, size?: CacheImageSize) => Promise createCache: (serverId: string) => Promise prepareCache: (serverId: string) => void @@ -134,7 +136,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return await promise }, - fetchCoverArtFilePath: async coverArt => { + fetchCoverArtFilePath: async (coverArt, size = 'thumbnail') => { const client = get().client if (!client) { return @@ -145,7 +147,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return } - const key: CacheItemTypeKey = 'coverArt' + const key: CacheItemTypeKey = size === 'thumbnail' ? 'coverArtThumb' : 'coverArt' const existing = get().cacheFiles[activeServerId][key][coverArt] const inProgress = get().cacheRequests[activeServerId][key][coverArt] @@ -156,7 +158,12 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return `file://${existing.path}` } - await get().cacheItem(key, coverArt, () => client.getCoverArtUri({ id: coverArt })) + await get().cacheItem(key, coverArt, () => + client.getCoverArtUri({ + id: coverArt, + size: size === 'thumbnail' ? '256' : undefined, + }), + ) return `file://${get().cacheFiles[activeServerId][key][coverArt].path}` }, @@ -171,7 +178,9 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca state.cacheFiles[serverId] = { song: {}, coverArt: {}, + coverArtThumb: {}, artistArt: {}, + artistArtThumb: {}, } }), ) @@ -186,14 +195,18 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca state.cacheDirs[serverId] = { song: `${RNFS.DocumentDirectoryPath}/servers/${serverId}/song`, coverArt: `${RNFS.DocumentDirectoryPath}/servers/${serverId}/coverArt`, + coverArtThumb: `${RNFS.DocumentDirectoryPath}/servers/${serverId}/coverArtThumb`, artistArt: `${RNFS.DocumentDirectoryPath}/servers/${serverId}/artistArt`, + artistArtThumb: `${RNFS.DocumentDirectoryPath}/servers/${serverId}/artistArtThumb`, } } if (!state.cacheRequests[serverId]) { state.cacheRequests[serverId] = { song: {}, coverArt: {}, + coverArtThumb: {}, artistArt: {}, + artistArtThumb: {}, } } }), @@ -260,7 +273,9 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca set( produce(state => { state.cacheFiles[serverId].coverArt = {} + state.cacheFiles[serverId].coverArtThumb = {} state.cacheFiles[serverId].artistArt = {} + state.cacheFiles[serverId].artistArtThumb = {} }), ) } diff --git a/app/state/library.ts b/app/state/library.ts index 1891eab..a1beb6d 100644 --- a/app/state/library.ts +++ b/app/state/library.ts @@ -23,7 +23,7 @@ import { SubsonicResponse, } from '@app/subsonic/responses' import PromiseQueue from '@app/util/PromiseQueue' -import { reduceById, mergeById, mapId } from '@app/util/state' +import { reduceById, mergeById } from '@app/util/state' import produce from 'immer' import { WritableDraft } from 'immer/dist/types/types-external' import pick from 'lodash.pick' @@ -547,3 +547,7 @@ function mapSong(song: ChildElement): Song { starred: song.starred, } } + +function mapId(entities: { id: string }[]): string[] { + return entities.map(e => e.id) +} diff --git a/app/state/migrations.ts b/app/state/migrations.ts index 4f9c841..07c08d5 100644 --- a/app/state/migrations.ts +++ b/app/state/migrations.ts @@ -1,26 +1,9 @@ -import { Store } from './store' -import RNFS from 'react-native-fs' -import { rmdir } from '@app/util/fs' - -const migrations: Array<(state: any) => Promise> = [ - async state => { - for (const server of state.settings.servers) { +const migrations: Array<(state: any) => any> = [ + state => { + for (let server of state.settings.servers) { server.usePlainPassword = false } - return state - }, - async state => { - const store = state as Store - const keysToDelete = ['coverArtThumb', 'artistArtThumb'] - - for (const serverId in store.cacheDirs) { - for (const key in keysToDelete) { - await rmdir(`${RNFS.DocumentDirectoryPath}/servers/${serverId}/${key}`) - delete state.cacheFiles[serverId][key] - } - } - return state }, ] diff --git a/app/state/store.ts b/app/state/store.ts index 99ccda0..20be9ac 100644 --- a/app/state/store.ts +++ b/app/state/store.ts @@ -50,13 +50,13 @@ export const useStore = create< postState?.setHydrated(true) } }, - migrate: async (persistedState, version) => { + migrate: (persistedState, version) => { if (version > DB_VERSION) { throw new Error('cannot migrate db on a downgrade, delete all data first') } for (let i = version; i < DB_VERSION; i++) { - persistedState = await migrations[i](persistedState) + persistedState = migrations[i](persistedState) } return persistedState diff --git a/app/util/state.ts b/app/util/state.ts index 6c3fdbd..379e5f6 100644 --- a/app/util/state.ts +++ b/app/util/state.ts @@ -15,7 +15,3 @@ export function mergeById(object: T, source export function mapById(object: ById, ids: string[]): T[] { return ids.map(id => object[id]).filter(a => a !== undefined) } - -export function mapId(entities: { id: string }[]): string[] { - return entities.map(e => e.id) -}