impl scrobble & scrobble setting

works even in background thanks zustand
This commit is contained in:
austinried
2021-08-04 17:59:43 +09:00
parent 706e57aa77
commit efc7e5c799
7 changed files with 106 additions and 13 deletions

View File

@@ -9,6 +9,7 @@ export type SettingsSlice = {
client?: SubsonicApiClient
createClient: (id?: string) => void
setActiveServer: (id?: string) => void
getActiveServer: () => Server | undefined
setServers: (servers: Server[]) => void
}
@@ -25,7 +26,7 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
return
}
const server = get().settings.servers.find(s => s.id === id)
const server = get().getActiveServer()
if (!server) {
set({ client: undefined })
return
@@ -52,10 +53,15 @@ export const createSettingsSlice = (set: SetState<Store>, get: GetState<Store>):
}),
)
},
getActiveServer: () => get().settings.servers.find(s => s.id === get().settings.activeServer),
setServers: servers =>
set(
produce<SettingsSlice>(state => {
state.settings.servers = servers
const activeServer = servers.find(s => s.id === state.settings.activeServer)
if (activeServer) {
state.client = new SubsonicApiClient(activeServer)
}
}),
),
})

View File

@@ -35,6 +35,8 @@ export type TrackPlayerSlice = {
progress: Progress
setProgress: (progress: Progress) => void
scrobbleTrack: (id: string) => Promise<void>
reset: () => void
}
@@ -59,12 +61,14 @@ export const selectTrackPlayer = {
progress: (store: TrackPlayerSlice) => store.progress,
setProgress: (store: TrackPlayerSlice) => store.setProgress,
scrobbleTrack: (store: TrackPlayerSlice) => store.scrobbleTrack,
reset: (store: TrackPlayerSlice) => store.reset,
}
export const trackPlayerCommands = new PromiseQueue(1)
export const createTrackPlayerSlice = (set: SetState<Store>, _get: GetState<Store>): TrackPlayerSlice => ({
export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store>): TrackPlayerSlice => ({
name: undefined,
setName: name => set({ name }),
@@ -91,6 +95,21 @@ export const createTrackPlayerSlice = (set: SetState<Store>, _get: GetState<Stor
progress: { position: 0, duration: 0, buffered: 0 },
setProgress: progress => set({ progress }),
scrobbleTrack: async id => {
const client = get().client
if (!client) {
return
}
if (!get().getActiveServer()?.scrobble) {
return
}
try {
await client.scrobble({ id })
} catch {}
},
reset: () => {
set({
name: undefined,