diff --git a/api/src/stream/internal.js b/api/src/stream/internal.js index f55a1b913..8c97c6567 100644 --- a/api/src/stream/internal.js +++ b/api/src/stream/internal.js @@ -53,14 +53,25 @@ async function handleYoutubeStream(streamInfo, res) { const cleanup = () => (res.end(), closeRequest(streamInfo.controller)); try { - const req = await fetch(streamInfo.url, { - headers: getHeaders('youtube'), - method: 'HEAD', - dispatcher: streamInfo.dispatcher, - signal - }); + let req, attempts = 3; + while (attempts--) { + req = await fetch(streamInfo.url, { + headers: getHeaders('youtube'), + method: 'HEAD', + dispatcher: streamInfo.dispatcher, + signal + }); + + streamInfo.url = req.url; + if (req.status === 403 && streamInfo.transplant) { + try { + await streamInfo.transplant(streamInfo.dispatcher); + } catch { + break; + } + } else break; + } - streamInfo.url = req.url; const size = BigInt(req.headers.get('content-length')); if (req.status !== 200 || !size) {