From af4d0010fb47c983931003efcd80b4c115175bd9 Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Thu, 4 Sep 2025 11:36:07 +0000 Subject: [PATCH] chore(source): retry also blocking errors with different VidSrc TLD --- src/extractor/VidSrc.test.ts | 16 ++++++++++++++++ src/extractor/VidSrc.ts | 4 ++-- src/extractor/__snapshots__/VidSrc.test.ts.snap | 13 +++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/extractor/VidSrc.test.ts b/src/extractor/VidSrc.test.ts index 3f34a3a..1e2a78e 100644 --- a/src/extractor/VidSrc.test.ts +++ b/src/extractor/VidSrc.test.ts @@ -38,4 +38,20 @@ describe('VidSrc', () => { expect(await vidSrc.extract(ctx, new URL('https://vidsrc.xyz/embed/movie/tt33043892/1/1'))).toMatchSnapshot(); }); + + test('blocking issues are retried and fail if no tlds are left', async () => { + const mockAgent = new MockAgent({ enableCallHistory: true }); + mockAgent.disableNetConnect(); + setGlobalDispatcher(mockAgent); + + mockAgent.get('https://vidsrc.xyz') + .intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(403); + mockAgent.get('https://vidsrc.net') + .intercept({ path: '/embed/movie/tt33043892/1/1' }).reply(403); + + const fetcher = new Fetcher(winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] })); + const vidSrc = new VidSrc(fetcher, ['net', 'xyz']); + + expect(await vidSrc.extract(ctx, new URL('https://vidsrc.xyz/embed/movie/tt33043892/1/1'))).toMatchSnapshot(); + }); }); diff --git a/src/extractor/VidSrc.ts b/src/extractor/VidSrc.ts index 0540897..af2b1c1 100644 --- a/src/extractor/VidSrc.ts +++ b/src/extractor/VidSrc.ts @@ -1,6 +1,6 @@ import * as cheerio from 'cheerio'; import slugify from 'slugify'; -import { NotFoundError, TooManyRequestsError } from '../error'; +import { BlockedError, NotFoundError, TooManyRequestsError } from '../error'; import { Context, Format, Meta, NonEmptyArray, UrlResult } from '../types'; import { Fetcher, guessHeightFromPlaylist } from '../utils'; import { Extractor } from './Extractor'; @@ -41,7 +41,7 @@ export class VidSrc extends Extractor { try { html = await this.fetcher.text(ctx, newUrl); } catch (error) { - if (error instanceof TooManyRequestsError && tlds.length) { + if (tlds.length && (error instanceof TooManyRequestsError || error instanceof BlockedError)) { return this.extractUsingRandomTld(ctx, url, meta, tlds); } diff --git a/src/extractor/__snapshots__/VidSrc.test.ts.snap b/src/extractor/__snapshots__/VidSrc.test.ts.snap index 607c242..4d62b6c 100644 --- a/src/extractor/__snapshots__/VidSrc.test.ts.snap +++ b/src/extractor/__snapshots__/VidSrc.test.ts.snap @@ -34,6 +34,19 @@ exports[`VidSrc Full Metal Jacket 1`] = ` ] `; +exports[`VidSrc blocking issues are retried and fail if no tlds are left 1`] = ` +[ + { + "error": [Error], + "format": "unknown", + "isExternal": true, + "label": "VidSrc", + "sourceId": "vidsrc", + "url": "https://vidsrc.xyz/embed/movie/tt33043892/1/1", + }, +] +`; + exports[`VidSrc not found 1`] = `[]`; exports[`VidSrc rate limit issues are retried and fail if no tlds are left 1`] = `