diff --git a/app/playbackservice.ts b/app/playbackservice.ts index 59f79c2..8249281 100644 --- a/app/playbackservice.ts +++ b/app/playbackservice.ts @@ -28,6 +28,12 @@ const setNetState = (netState: 'mobile' | 'wifi') => { }) } +const rebuildQueue = () => { + unstable_batchedUpdates(() => { + useStore.getState().rebuildQueue(useStore.getState().playerState === State.Playing) + }) +} + let serviceCreated = false const createService = async () => { useStore.subscribe( @@ -112,6 +118,15 @@ const createService = async () => { await TrackPlayer.seekTo(data.position) }) }) + + TrackPlayer.addEventListener(Event.PlaybackError, data => { + const { code, message } = data as Record + + // fix for ExoPlayer aborting playback while esimating content length + if (code === 'playback-source' && message.includes('416')) { + rebuildQueue() + } + }) } module.exports = async function () { diff --git a/app/state/trackplayer.ts b/app/state/trackplayer.ts index b7d65b4..ad10f89 100644 --- a/app/state/trackplayer.ts +++ b/app/state/trackplayer.ts @@ -64,7 +64,7 @@ export type TrackPlayerSlice = { netState: 'mobile' | 'wifi' setNetState: (netState: 'mobile' | 'wifi') => Promise - rebuildQueue: () => Promise + rebuildQueue: (forcePlay?: boolean) => Promise buildStreamUri: (id: string) => string resetTrackPlayerState: () => void @@ -284,7 +284,7 @@ export const createTrackPlayerSlice = (set: SetState, get: GetState { + rebuildQueue: async forcePlay => { return trackPlayerCommands.enqueue(async () => { const queue = await getQueue() if (!queue.length) { @@ -326,7 +326,7 @@ export const createTrackPlayerSlice = (set: SetState, get: GetState