diff --git a/src/extractor/Uqload.test.ts b/src/extractor/Uqload.test.ts new file mode 100644 index 0000000..615d6e5 --- /dev/null +++ b/src/extractor/Uqload.test.ts @@ -0,0 +1,21 @@ +import winston from 'winston'; +import { FetcherMock } from '../utils'; +import { CountryCode } from '../types'; +import { ExtractorRegistry } from './ExtractorRegistry'; +import { Uqload } from './Uqload'; +import { createTestContext } from '../test'; + +const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); +const extractorRegistry = new ExtractorRegistry(logger, [new Uqload(new FetcherMock(`${__dirname}/__fixtures__/Uqload`))]); + +const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow-proxy.test', mediaFlowProxyPassword: 'asdfg' }); + +describe('Uqload', () => { + test('uqload.net /embed-', async () => { + expect(await extractorRegistry.handle(ctx, new URL('https://uqload.net/embed-z0xbr87oz637.html'), CountryCode.fr)).toMatchSnapshot(); + }); + + test('uqload.net /', async () => { + expect(await extractorRegistry.handle(ctx, new URL('https://uqload.net/z0xbr87oz637.html'), CountryCode.fr)).toMatchSnapshot(); + }); +}); diff --git a/src/extractor/Uqload.ts b/src/extractor/Uqload.ts new file mode 100644 index 0000000..ca9588c --- /dev/null +++ b/src/extractor/Uqload.ts @@ -0,0 +1,54 @@ +import * as cheerio from 'cheerio'; +import { Extractor } from './Extractor'; +import { buildMediaFlowProxyUrl, Fetcher, hasMediaFlowProxy } from '../utils'; +import { Context, CountryCode, Format, UrlResult } from '../types'; + +export class Uqload extends Extractor { + public readonly id = 'uqload'; + + public readonly label = 'Uqload (via MediaFlow Proxy)'; + + public override readonly ttl = 0; + + private readonly fetcher: Fetcher; + + public constructor(fetcher: Fetcher) { + super(); + + this.fetcher = fetcher; + } + + public supports(ctx: Context, url: URL): boolean { + return null !== url.host.match(/uqload/) && hasMediaFlowProxy(ctx.config); + } + + public override normalize(url: URL): URL { + return new URL(url.href.replace('/embed-', '/')); + } + + protected async extractInternal(ctx: Context, url: URL, countryCode: CountryCode): Promise { + const html = await this.fetcher.text(ctx, url); + + const heightMatch = html.match(/\d{3,}x(\d{3,})/); + + const $ = cheerio.load(html); + const title = $('h1').text().trim(); + + return [ + { + url: buildMediaFlowProxyUrl(ctx.config, 'Uqload', url), + format: Format.mp4, + label: this.label, + sourceId: `${this.id}_${countryCode}`, + ttl: this.ttl, + meta: { + countryCode, + title, + ...(heightMatch && { + height: parseInt(heightMatch[1] as string) as number, + }), + }, + }, + ]; + }; +} diff --git a/src/extractor/__fixtures__/Uqload/https:uqload.netz0xbr87oz637.html b/src/extractor/__fixtures__/Uqload/https:uqload.netz0xbr87oz637.html new file mode 100644 index 0000000..f82a64e --- /dev/null +++ b/src/extractor/__fixtures__/Uqload/https:uqload.netz0xbr87oz637.html @@ -0,0 +1,428 @@ + + + + + + Watch Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 x265 TyHD mkv The Ultimate Free Video Hosting Solution for Webmasters and Bloggers + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ + + + + + + +

+ Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 5 1 x265-TyHD + + +

+ + + +
+ + + + +
+
+ + +
+ Upgrade your account to watch videos with no limits! +
+ + + + + +
+
+
+ + + + +
+
+
+
+ +
+
+
+ +
+ +
+
+
+ x +
+
+ +
+

+ +

+
+
+ + +
+ +

+ +

+
+
+ +

+ +

+
+ +
+
+
+
+
+ + +
+ + +
+
+ + +
+ +
+
+
+ + + + + +
+
+
+ + + + + + + + + + + + +
+ + + + + +
+ +
+
+ +
+ + diff --git a/src/extractor/__snapshots__/Uqload.test.ts.snap b/src/extractor/__snapshots__/Uqload.test.ts.snap new file mode 100644 index 0000000..3e65fff --- /dev/null +++ b/src/extractor/__snapshots__/Uqload.test.ts.snap @@ -0,0 +1,35 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`Uqload uqload.net / 1`] = ` +[ + { + "format": "mp4", + "label": "Uqload (via MediaFlow Proxy)", + "meta": { + "countryCode": "fr", + "height": 360, + "title": "Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 5 1 x265-TyHD", + }, + "sourceId": "uqload_fr", + "ttl": 0, + "url": "https://mediaflow-proxy.test/extractor/video?host=Uqload&redirect_stream=true&api_password=asdfg&d=https%3A%2F%2Fuqload.net%2Fz0xbr87oz637.html", + }, +] +`; + +exports[`Uqload uqload.net /embed- 1`] = ` +[ + { + "format": "mp4", + "label": "Uqload (via MediaFlow Proxy)", + "meta": { + "countryCode": "fr", + "height": 360, + "title": "Black Mirror S07E06 MULTI VFF 1080p WEBrip EAC3 5 1 x265-TyHD", + }, + "sourceId": "uqload_fr", + "ttl": 0, + "url": "https://mediaflow-proxy.test/extractor/video?host=Uqload&redirect_stream=true&api_password=asdfg&d=https%3A%2F%2Fuqload.net%2Fz0xbr87oz637.html", + }, +] +`; diff --git a/src/extractor/index.ts b/src/extractor/index.ts index 48e83e6..96baed2 100644 --- a/src/extractor/index.ts +++ b/src/extractor/index.ts @@ -2,13 +2,14 @@ import { DoodStream } from './DoodStream'; import { Dropload } from './Dropload'; import { ExternalUrl } from './ExternalUrl'; import { Extractor } from './Extractor'; +import { Fetcher } from '../utils'; import { Fsst } from './Fsst'; import { KinoGer } from './KinoGer'; +import { Mixdrop } from './Mixdrop'; import { Soaper } from './Soaper'; import { SuperVideo } from './SuperVideo'; +import { Uqload } from './Uqload'; import { VidSrc } from './VidSrc'; -import { Fetcher } from '../utils'; -import { Mixdrop } from './Mixdrop'; export * from './Extractor'; export * from './ExtractorRegistry'; @@ -21,6 +22,7 @@ export const createExtractors = (fetcher: Fetcher): Extractor[] => [ new KinoGer(fetcher), new Mixdrop(fetcher), new Soaper(fetcher), + new Uqload(fetcher), new VidSrc(fetcher), new ExternalUrl(fetcher), // fallback extractor which must come last ];