Skip to content

Commit 19be26b

Browse files
fix: prevent YouTube stream recovery loop when paused
Prevents repeated URL refresh attempts while track is paused
1 parent 46848b3 commit 19be26b

1 file changed

Lines changed: 38 additions & 0 deletions

File tree

src/sources/youtube/YouTube.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2362,6 +2362,44 @@ export default class YouTubeSource {
23622362
return
23632363
}
23642364

2365+
if (isAborted && stream.writableNeedDrain) {
2366+
logger(
2367+
'debug',
2368+
'YouTube',
2369+
`Stream is paused/backed up, skipping recovery (cause: ${causeError?.message}). Player will recover on resume.`
2370+
)
2371+
return
2372+
}
2373+
2374+
if (isAborted && stream.writableNeedDrain) {
2375+
logger(
2376+
'debug',
2377+
'YouTube',
2378+
`Stream is paused/backed up, waiting for drain before recovery (cause: ${causeError?.message})`
2379+
)
2380+
await new Promise<void>((resolve) => {
2381+
const onDrain = () => {
2382+
stream.off('drain', onDrain)
2383+
resolve()
2384+
}
2385+
stream.once('drain', onDrain)
2386+
const timeout = setTimeout(() => {
2387+
stream.off('drain', onDrain)
2388+
resolve()
2389+
}, 60000)
2390+
if (typeof timeout.unref === 'function') timeout.unref()
2391+
})
2392+
if (destroyed || cancelSignal.aborted || stream.destroyed) return
2393+
if (stream.writableNeedDrain) {
2394+
logger(
2395+
'debug',
2396+
'YouTube',
2397+
'Stream still backed up after drain wait, deferring recovery until resume'
2398+
)
2399+
return
2400+
}
2401+
}
2402+
23652403
try {
23662404
const newUrlData = await this.getTrackUrl(decodedTrack, null, true)
23672405

0 commit comments

Comments
 (0)