fix player crashing at the end of transcoded track

This commit is contained in:
austinried 2021-08-25 10:24:42 +09:00
parent 75da5d16ac
commit 3db1d795dc
2 changed files with 18 additions and 3 deletions

View File

@ -28,6 +28,12 @@ const setNetState = (netState: 'mobile' | 'wifi') => {
}) })
} }
const rebuildQueue = () => {
unstable_batchedUpdates(() => {
useStore.getState().rebuildQueue(useStore.getState().playerState === State.Playing)
})
}
let serviceCreated = false let serviceCreated = false
const createService = async () => { const createService = async () => {
useStore.subscribe( useStore.subscribe(
@ -112,6 +118,15 @@ const createService = async () => {
await TrackPlayer.seekTo(data.position) await TrackPlayer.seekTo(data.position)
}) })
}) })
TrackPlayer.addEventListener(Event.PlaybackError, data => {
const { code, message } = data as Record<string, string>
// fix for ExoPlayer aborting playback while esimating content length
if (code === 'playback-source' && message.includes('416')) {
rebuildQueue()
}
})
} }
module.exports = async function () { module.exports = async function () {

View File

@ -64,7 +64,7 @@ export type TrackPlayerSlice = {
netState: 'mobile' | 'wifi' netState: 'mobile' | 'wifi'
setNetState: (netState: 'mobile' | 'wifi') => Promise<void> setNetState: (netState: 'mobile' | 'wifi') => Promise<void>
rebuildQueue: () => Promise<void> rebuildQueue: (forcePlay?: boolean) => Promise<void>
buildStreamUri: (id: string) => string buildStreamUri: (id: string) => string
resetTrackPlayerState: () => void resetTrackPlayerState: () => void
@ -284,7 +284,7 @@ export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store
get().rebuildQueue() get().rebuildQueue()
}, },
rebuildQueue: async () => { rebuildQueue: async forcePlay => {
return trackPlayerCommands.enqueue(async () => { return trackPlayerCommands.enqueue(async () => {
const queue = await getQueue() const queue = await getQueue()
if (!queue.length) { if (!queue.length) {
@ -326,7 +326,7 @@ export const createTrackPlayerSlice = (set: SetState<Store>, get: GetState<Store
await TrackPlayer.seekTo(position) await TrackPlayer.seekTo(position)
if (state === State.Playing) { if (state === State.Playing || forcePlay) {
await TrackPlayer.play() await TrackPlayer.play()
} }
}) })