diff --git a/app/models/cache.ts b/app/models/cache.ts index 5bd23cd..86dc3f9 100644 --- a/app/models/cache.ts +++ b/app/models/cache.ts @@ -2,16 +2,12 @@ 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 430cc54..821060d 100644 --- a/app/state/cache.ts +++ b/app/state/cache.ts @@ -1,4 +1,4 @@ -import { CacheFile, CacheImageSize, CacheItemType, CacheItemTypeKey, CacheRequest } from '@app/models/cache' +import { CacheFile, 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,9 +8,7 @@ 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), } @@ -32,7 +30,7 @@ export type CacheSlice = { cacheFiles: CacheFilesByServer cacheRequests: CacheRequestsByServer - fetchCoverArtFilePath: (coverArt: string, size?: CacheImageSize) => Promise + fetchCoverArtFilePath: (coverArt: string) => Promise createCache: (serverId: string) => Promise prepareCache: (serverId: string) => void @@ -136,7 +134,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return await promise }, - fetchCoverArtFilePath: async (coverArt, size = 'thumbnail') => { + fetchCoverArtFilePath: async coverArt => { const client = get().client if (!client) { return @@ -147,7 +145,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return } - const key: CacheItemTypeKey = size === 'thumbnail' ? 'coverArtThumb' : 'coverArt' + const key: CacheItemTypeKey = 'coverArt' const existing = get().cacheFiles[activeServerId][key][coverArt] const inProgress = get().cacheRequests[activeServerId][key][coverArt] @@ -158,12 +156,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca return `file://${existing.path}` } - await get().cacheItem(key, coverArt, () => - client.getCoverArtUri({ - id: coverArt, - size: size === 'thumbnail' ? '256' : undefined, - }), - ) + await get().cacheItem(key, coverArt, () => client.getCoverArtUri({ id: coverArt })) return `file://${get().cacheFiles[activeServerId][key][coverArt].path}` }, @@ -178,9 +171,7 @@ export const createCacheSlice = (set: SetState, get: GetState): Ca state.cacheFiles[serverId] = { song: {}, coverArt: {}, - coverArtThumb: {}, artistArt: {}, - artistArtThumb: {}, } }), ) @@ -195,18 +186,14 @@ 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: {}, } } }), @@ -273,9 +260,7 @@ 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 ac4c0e9..496e8d9 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 } from '@app/util/state' +import { reduceById, mergeById, mapId } from '@app/util/state' import produce from 'immer' import { WritableDraft } from 'immer/dist/types/types-external' import pick from 'lodash.pick' @@ -547,7 +547,3 @@ 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 07c08d5..4f9c841 100644 --- a/app/state/migrations.ts +++ b/app/state/migrations.ts @@ -1,9 +1,26 @@ -const migrations: Array<(state: any) => any> = [ - state => { - for (let server of state.settings.servers) { +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) { 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 20be9ac..99ccda0 100644 --- a/app/state/store.ts +++ b/app/state/store.ts @@ -50,13 +50,13 @@ export const useStore = create< postState?.setHydrated(true) } }, - migrate: (persistedState, version) => { + migrate: async (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 = migrations[i](persistedState) + persistedState = await migrations[i](persistedState) } return persistedState diff --git a/app/util/state.ts b/app/util/state.ts index 379e5f6..6c3fdbd 100644 --- a/app/util/state.ts +++ b/app/util/state.ts @@ -15,3 +15,7 @@ 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) +}