From 31b8501b60008b8b2fcd617229a3342be451e197 Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Sun, 30 Nov 2025 17:23:05 +0100 Subject: [PATCH 1/6] Create Vidoza.ts This extractor is IP locked so it needs mediaflow proxy. I already added the pr to the mediaflow proxy to support this extractor and the author merged it. --- src/extractor/Vidoza.ts | 101 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 src/extractor/Vidoza.ts diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts new file mode 100644 index 0000000..8123943 --- /dev/null +++ b/src/extractor/Vidoza.ts @@ -0,0 +1,101 @@ +import { NotFoundError } from '../error'; +import { Context, Format, Meta, UrlResult } from '../types'; +import { Extractor } from './Extractor'; +import { + buildMediaFlowProxyExtractorStreamUrl, + supportsMediaFlowProxy, +} from '../utils'; +import bytes from 'bytes'; + +export class Vidoza extends Extractor { + public readonly id = 'Vidoza'; + public readonly label = 'Vidoza (via MediaFlow Proxy)'; + public override readonly ttl = 10800000; // 3h + public override viaMediaFlowProxy = true; + + private domains = ['vidoza.net', 'vidoza.co', 'videzz.net']; + + public supports(ctx: Context, url: URL): boolean { + return ( + this.domains.some(d => url.host.includes(d)) && + supportsMediaFlowProxy(ctx) + ); + } + + public override normalize(url: URL): URL { + const id = + url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] || + url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; + + if (!id) return url; + + return new URL(`https://videzz.net/${id}.html`); + } + + protected override async extractInternal( + ctx: Context, + url: URL, + meta: Meta + ): Promise { + + const headers: Record = { + Referer: 'https://vidoza.net/', + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + Accept: '*/*', + 'Accept-Language': 'en-US,en;q=0.9', + }; + + const html = await this.fetcher.text(ctx, url, headers); + if (!html) throw new NotFoundError('Vidoza: video page unavailable'); + + const titleMatch = html.match(/]*>([^<]+)<\/h1>/i); + const title = titleMatch?.[1]?.trim() || this.label; + + let bytesSize: number | null = null; + const sizeMatch = html.match(/File size:\s*([\d.]+\s*[GM]B)<\/span>/i); + + if (sizeMatch?.[1]) { + const parsed = bytes.parse(sizeMatch[1]); + if (parsed !== null) { + bytesSize = parsed; + } + } + + const extractedLabel = this.extractLabelFromHtml(html); // returns "720" etc. + const height = extractedLabel ? parseInt(extractedLabel, 10) : null; + + const proxiedUrl = await buildMediaFlowProxyExtractorStreamUrl( + ctx, + this.fetcher, + this.id, + url, + headers + ); + + return [ + { + url: proxiedUrl, + format: Format.mp4, + label: extractedLabel ? `${extractedLabel}p` : this.label, + ttl: this.ttl, + requestHeaders: headers, + sourceId: `${this.id}_${meta.countryCodes?.join('_') ?? 'all'}`, + meta: { + ...meta, + title, + ...(height ? { height } : {}), + ...(bytesSize && bytesSize > 16777216 ? { bytes: bytesSize } : {}), + }, + }, + ]; + } + + private extractLabelFromHtml(html: string): string | null { + const regex = + /["']?\s*(?:file|src)\s*["']?\s*[:=,]?\s*["'][^"']+(?:[^}>\]]+)["']?\s*res\s*["']?\s*[:=]\s*["']?(\d{3,4})/i; + + const m = html.match(regex); + return m && m[1] ? m[1] : null; + } +} From 40b54a62f0793a07bee9456bf4f233e64e86b544 Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Sun, 30 Nov 2025 23:16:26 +0100 Subject: [PATCH 2/6] Update Vidoza.ts Remove double height. --- src/extractor/Vidoza.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts index 8123943..744ebc2 100644 --- a/src/extractor/Vidoza.ts +++ b/src/extractor/Vidoza.ts @@ -62,7 +62,7 @@ export class Vidoza extends Extractor { } } - const extractedLabel = this.extractLabelFromHtml(html); // returns "720" etc. + const extractedLabel = this.extractLabelFromHtml(html); const height = extractedLabel ? parseInt(extractedLabel, 10) : null; const proxiedUrl = await buildMediaFlowProxyExtractorStreamUrl( @@ -77,14 +77,14 @@ export class Vidoza extends Extractor { { url: proxiedUrl, format: Format.mp4, - label: extractedLabel ? `${extractedLabel}p` : this.label, + label: this.label, ttl: this.ttl, requestHeaders: headers, sourceId: `${this.id}_${meta.countryCodes?.join('_') ?? 'all'}`, meta: { ...meta, title, - ...(height ? { height } : {}), + ...(height !== null ? { height } : {}), ...(bytesSize && bytesSize > 16777216 ? { bytes: bytesSize } : {}), }, }, From 1b1b78d56c883f9f97a6a920f5246272ea2f20b5 Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:12:45 +0100 Subject: [PATCH 3/6] Update Vidoza.ts Lints fix. --- src/extractor/Vidoza.ts | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts index 744ebc2..cd5b501 100644 --- a/src/extractor/Vidoza.ts +++ b/src/extractor/Vidoza.ts @@ -1,11 +1,11 @@ +import bytes from 'bytes'; import { NotFoundError } from '../error'; -import { Context, Format, Meta, UrlResult } from '../types'; -import { Extractor } from './Extractor'; import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, } from '../utils'; -import bytes from 'bytes'; +import { Context, Format, Meta, UrlResult } from '../types'; +import { Extractor } from './Extractor'; export class Vidoza extends Extractor { public readonly id = 'Vidoza'; @@ -17,15 +17,15 @@ export class Vidoza extends Extractor { public supports(ctx: Context, url: URL): boolean { return ( - this.domains.some(d => url.host.includes(d)) && - supportsMediaFlowProxy(ctx) + this.domains.some(d => url.host.includes(d)) + && supportsMediaFlowProxy(ctx) ); } public override normalize(url: URL): URL { const id = - url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] || - url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; + url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] + || url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; if (!id) return url; @@ -35,14 +35,13 @@ export class Vidoza extends Extractor { protected override async extractInternal( ctx: Context, url: URL, - meta: Meta + meta: Meta, ): Promise { - const headers: Record = { - Referer: 'https://vidoza.net/', + 'Referer': 'https://vidoza.net/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', - Accept: '*/*', + 'Accept': '*/*', 'Accept-Language': 'en-US,en;q=0.9', }; @@ -70,7 +69,7 @@ export class Vidoza extends Extractor { this.fetcher, this.id, url, - headers + headers, ); return [ @@ -95,7 +94,9 @@ export class Vidoza extends Extractor { const regex = /["']?\s*(?:file|src)\s*["']?\s*[:=,]?\s*["'][^"']+(?:[^}>\]]+)["']?\s*res\s*["']?\s*[:=]\s*["']?(\d{3,4})/i; - const m = html.match(regex); + const m = + html.match(regex); + return m && m[1] ? m[1] : null; } } From 80cd2726900b536536e4b2677993e8122be37c73 Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:16:53 +0100 Subject: [PATCH 4/6] Update Vidoza.ts Lists fix 2. --- src/extractor/Vidoza.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts index cd5b501..e1a94f5 100644 --- a/src/extractor/Vidoza.ts +++ b/src/extractor/Vidoza.ts @@ -1,10 +1,10 @@ import bytes from 'bytes'; import { NotFoundError } from '../error'; +import { Context, Format, Meta, UrlResult } from '../types'; import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, } from '../utils'; -import { Context, Format, Meta, UrlResult } from '../types'; import { Extractor } from './Extractor'; export class Vidoza extends Extractor { @@ -23,8 +23,8 @@ export class Vidoza extends Extractor { } public override normalize(url: URL): URL { - const id = - url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] + const id + = url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] || url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; if (!id) return url; @@ -91,11 +91,11 @@ export class Vidoza extends Extractor { } private extractLabelFromHtml(html: string): string | null { - const regex = - /["']?\s*(?:file|src)\s*["']?\s*[:=,]?\s*["'][^"']+(?:[^}>\]]+)["']?\s*res\s*["']?\s*[:=]\s*["']?(\d{3,4})/i; + const regex + = /["']?\s*(?:file|src)\s*["']?\s*[:=,]?\s*["'][^"']+(?:[^}>\]]+)["']?\s*res\s*["']?\s*[:=]\s*["']?(\d{3,4})/i; - const m = - html.match(regex); + const m + = html.match(regex); return m && m[1] ? m[1] : null; } From 91a4f93ea745a23e88859c6f0fec41418641fd54 Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Mon, 1 Dec 2025 00:20:40 +0100 Subject: [PATCH 5/6] Update Vidoza.ts List fix 3. --- src/extractor/Vidoza.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts index e1a94f5..4fa025b 100644 --- a/src/extractor/Vidoza.ts +++ b/src/extractor/Vidoza.ts @@ -25,7 +25,7 @@ export class Vidoza extends Extractor { public override normalize(url: URL): URL { const id = url.pathname.match(/embed-([A-Za-z0-9]+)\.html?/i)?.[1] - || url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; + || url.pathname.match(/\/([A-Za-z0-9]+)\.html?/i)?.[1]; if (!id) return url; From e15b247a768bcb4ffe9a9de0600c0af8f25eebfe Mon Sep 17 00:00:00 2001 From: GSTAR <44748406+GLlgGL@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:36:41 +0100 Subject: [PATCH 6/6] Update Vidoza.ts Give to Caesar what belongs to Caesar. --- src/extractor/Vidoza.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/extractor/Vidoza.ts b/src/extractor/Vidoza.ts index 4fa025b..7cc2a1a 100644 --- a/src/extractor/Vidoza.ts +++ b/src/extractor/Vidoza.ts @@ -7,6 +7,7 @@ import { } from '../utils'; import { Extractor } from './Extractor'; +/** @see https://github.com/Gujal00/ResolveURL/blob/master/script.module.resolveurl/lib/resolveurl/plugins/vidoza.py */ export class Vidoza extends Extractor { public readonly id = 'Vidoza'; public readonly label = 'Vidoza (via MediaFlow Proxy)';