diff --git a/api/package.json b/api/package.json index 0c446d3c..fc5304ed 100644 --- a/api/package.json +++ b/api/package.json @@ -1,7 +1,7 @@ { "name": "@imput/cobalt-api", "description": "save what you love", - "version": "10.7.6", + "version": "10.7.7", "author": "imput", "exports": "./src/cobalt.js", "type": "module", diff --git a/api/src/stream/internal.js b/api/src/stream/internal.js index e421fd14..6d4ce318 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) { diff --git a/api/src/util/tests/facebook.json b/api/src/util/tests/facebook.json index d0c8cc7b..70e2db68 100644 --- a/api/src/util/tests/facebook.json +++ b/api/src/util/tests/facebook.json @@ -46,7 +46,7 @@ }, { "name": "shared video link", - "url": "https://www.facebook.com/share/v/NEf87jbPTvFE8LsL/", + "url": "https://www.facebook.com/share/v/6EJK4Z8EAEAHtz8K/", "params": {}, "expected": { "code": 200,