
mickey-17-2025-[latino]
+titanic-1997-3[subtitulado]
1332x720, 1.1 GB + HD quality
1280x556, 1.4 GB @@ -270,7 +270,7 @@ $.cookie('aff', '149', { expires: 10 });
From bb395f03759daaaeffced3d82aec1244c7598fdf Mon Sep 17 00:00:00 2001 From: WebStreamr <210764791+webstreamr@users.noreply.github.com> Date: Sat, 17 May 2025 01:05:20 +0200 Subject: [PATCH] revert: "feat(extractor): implement Mixdrop" This reverts commit 4c53161e98ca6ea24bdc76ba22fdf16785044f2c. Mixdrop seems to be IP-locked. --- src/extractor/ExtractorRegistry.ts | 2 - src/extractor/Mixdrop.ts | 43 -- src/handler/FrenchCloud.test.ts | 17 +- src/handler/MeineCloud.test.ts | 17 +- src/handler/MostraGuarda.test.ts | 17 +- src/handler/VerHdLink.test.ts | 78 +-- src/utils/Fetcher.ts | 4 +- src/utils/StreamResolver.test.ts | 32 -- .../Fetcher/http:dood.toe2ld51itfvzib | 1 - .../Fetcher/http:dood.toe4xpbdr8vx5qc | 1 - .../Fetcher/http:dood.toegy8l8mb2i311 | 1 + .../Fetcher/http:dood.toerw7rxdfrbg09 | 1 + ...b17485799f5b02f543xfjqlaupznxh9878fn3lc9db | 1 - ...77fee0aa7891eb270aly7u2yzord2mx08ozt1vch47 | 1 - ...tml => https:dropload.io3rj3nyfors6b.html} | 60 +-- ...tml => https:dropload.ioick4ti66vt6s.html} | 60 +-- .../https:dropload.iojjjx9j5joiz8.html | 502 ++++++++++++++++++ .../Fetcher/https:mixdrop.age3nzwveprim63or6 | 48 -- .../Fetcher/https:mixdrop.age7k3wwq14cdw6w6p | 47 -- .../Fetcher/https:mixdrop.agel7v73zqrfdj19z | 48 -- .../Fetcher/https:mixdrop.agevk196d6xfzwwo1 | 47 -- .../Fetcher/https:mixdrop.agexw01q6w4uk3rn7 | 47 -- .../Fetcher/https:mixdrop.agf3nzwveprim63or6 | 213 -------- .../Fetcher/https:mixdrop.agf7k3wwq14cdw6w6p | 213 -------- .../Fetcher/https:mixdrop.agfl7v73zqrfdj19z | 213 -------- .../Fetcher/https:mixdrop.agfvk196d6xfzwwo1 | 213 -------- .../Fetcher/https:mixdrop.agfxw01q6w4uk3rn7 | 213 -------- ...pow9za => https:supervideo.cc8xc9f2x2w09p} | 76 +-- ...wrqj06 => https:supervideo.ccg6okbr0kd790} | 76 +-- .../Fetcher/https:supervideo.ccqe1fviow8uwy | 401 ++++++++++++++ ...9608 => https:verhdlink.cammoviett0120338} | 48 +- src/utils/__mocks__/Fetcher.ts | 4 - src/utils/embed.ts | 4 +- 33 files changed, 1087 insertions(+), 1662 deletions(-) delete mode 100644 src/extractor/Mixdrop.ts delete mode 100644 src/utils/__fixtures__/Fetcher/http:dood.toe2ld51itfvzib delete mode 100644 src/utils/__fixtures__/Fetcher/http:dood.toe4xpbdr8vx5qc create mode 100644 src/utils/__fixtures__/Fetcher/http:dood.toegy8l8mb2i311 create mode 100644 src/utils/__fixtures__/Fetcher/http:dood.toerw7rxdfrbg09 delete mode 100644 src/utils/__fixtures__/Fetcher/http:dood.topass_md5206423523-139-197-1747424982-e1005ab93b4c5ab17485799f5b02f543xfjqlaupznxh9878fn3lc9db delete mode 100644 src/utils/__fixtures__/Fetcher/http:dood.topass_md5206735176-139-197-1747424982-9973f08f7b32c977fee0aa7891eb270aly7u2yzord2mx08ozt1vch47 rename src/utils/__fixtures__/Fetcher/{https:dropload.io96mnzbkw3gg5.html => https:dropload.io3rj3nyfors6b.html} (84%) rename src/utils/__fixtures__/Fetcher/{https:dropload.iorlqh0n87n00f.html => https:dropload.ioick4ti66vt6s.html} (74%) create mode 100644 src/utils/__fixtures__/Fetcher/https:dropload.iojjjx9j5joiz8.html delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.age3nzwveprim63or6 delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.age7k3wwq14cdw6w6p delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agel7v73zqrfdj19z delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agevk196d6xfzwwo1 delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agexw01q6w4uk3rn7 delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agf3nzwveprim63or6 delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agf7k3wwq14cdw6w6p delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agfl7v73zqrfdj19z delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agfvk196d6xfzwwo1 delete mode 100644 src/utils/__fixtures__/Fetcher/https:mixdrop.agfxw01q6w4uk3rn7 rename src/utils/__fixtures__/Fetcher/{https:supervideo.cca0iiampow9za => https:supervideo.cc8xc9f2x2w09p} (81%) rename src/utils/__fixtures__/Fetcher/{https:supervideo.ccxrbn7pwrqj06 => https:supervideo.ccg6okbr0kd790} (80%) create mode 100644 src/utils/__fixtures__/Fetcher/https:supervideo.ccqe1fviow8uwy rename src/utils/__fixtures__/Fetcher/{https:verhdlink.cammoviett12299608 => https:verhdlink.cammoviett0120338} (87%) diff --git a/src/extractor/ExtractorRegistry.ts b/src/extractor/ExtractorRegistry.ts index 7d8c9cb..ed67bfb 100644 --- a/src/extractor/ExtractorRegistry.ts +++ b/src/extractor/ExtractorRegistry.ts @@ -6,7 +6,6 @@ import { Fetcher } from '../utils'; import { DoodStream } from './DoodStream'; import { Dropload } from './Dropload'; import { SuperVideo } from './SuperVideo'; -import { Mixdrop } from './Mixdrop'; export class ExtractorRegistry { private readonly logger: winston.Logger; @@ -18,7 +17,6 @@ export class ExtractorRegistry { this.extractors = [ new DoodStream(fetcher), new Dropload(fetcher), - new Mixdrop(fetcher), new SuperVideo(fetcher), ]; this.urlResultCache = new TTLCache({ max: 1024 }); diff --git a/src/extractor/Mixdrop.ts b/src/extractor/Mixdrop.ts deleted file mode 100644 index bfff90f..0000000 --- a/src/extractor/Mixdrop.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Extractor } from './types'; -import { extractUrlFromPacked, Fetcher } from '../utils'; -import { Context } from '../types'; -import bytes from 'bytes'; - -export class Mixdrop implements Extractor { - readonly id = 'mixdrop'; - - readonly label = 'Mixdrop'; - - readonly ttl = 900000; // 15m - - private readonly fetcher: Fetcher; - - constructor(fetcher: Fetcher) { - this.fetcher = fetcher; - } - - readonly supports = (url: URL): boolean => null !== url.host.match(/mixdrop/); - - readonly extract = async (ctx: Context, url: URL, countryCode: string) => { - const normalizedFullUrl = url.href.replace('/e/', '/f/'); - const fullHtml = await this.fetcher.text(ctx, new URL(normalizedFullUrl)); - - const sizeMatch = fullHtml.match(/([\d.]+ ?[GM]B)/) as string[]; - - const normalizedEmbedUrl = url.href.replace('/f/', '/e/'); - const embedHtml = await this.fetcher.text(ctx, new URL(normalizedEmbedUrl)); - - return { - url: extractUrlFromPacked(embedHtml, [/MDCore.wurl="(.*?)"/]), - label: this.label, - sourceId: `${this.id}_${countryCode.toLowerCase()}`, - height: 0, - bytes: bytes.parse(sizeMatch[1] as string) as number, - countryCode, - requestHeaders: { - 'Referer': url.origin, - 'User-Agent': this.fetcher.getUserAgentForIp(ctx.ip), - }, - }; - }; -} diff --git a/src/handler/FrenchCloud.test.ts b/src/handler/FrenchCloud.test.ts index cee903b..b1e8b8a 100644 --- a/src/handler/FrenchCloud.test.ts +++ b/src/handler/FrenchCloud.test.ts @@ -27,7 +27,7 @@ describe('FrenchCloud', () => { test('handle imdb the devil\'s bath', async () => { const streams = (await handler.handle(ctx, 'movie', 'tt29141112')).filter(stream => stream !== undefined); - expect(streams).toHaveLength(4); + expect(streams).toHaveLength(3); expect(streams[0]).toStrictEqual({ url: expect.any(URL), label: 'SuperVideo', @@ -47,19 +47,6 @@ describe('FrenchCloud', () => { }); expect(streams[1]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); expect(streams[2]).toStrictEqual({ - url: expect.any(URL), - label: 'Mixdrop', - sourceId: 'mixdrop_fr', - height: 0, - bytes: 966703185, - countryCode: 'fr', - requestHeaders: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }); - expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?s=.*?e=.*?t=/); - expect(streams[3]).toStrictEqual({ url: expect.any(URL), label: 'DoodStream', sourceId: 'doodstream_fr', @@ -70,6 +57,6 @@ describe('FrenchCloud', () => { Referer: 'http://dood.to/', }, }); - expect(streams[3]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); + expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); }); }); diff --git a/src/handler/MeineCloud.test.ts b/src/handler/MeineCloud.test.ts index b2a2fc1..ff65fef 100644 --- a/src/handler/MeineCloud.test.ts +++ b/src/handler/MeineCloud.test.ts @@ -27,7 +27,7 @@ describe('MeineCloud', () => { test('handle imdb the devil\'s bath', async () => { const streams = (await handler.handle(ctx, 'movie', 'tt29141112')).filter(stream => stream !== undefined); - expect(streams).toHaveLength(4); + expect(streams).toHaveLength(3); expect(streams[0]).toStrictEqual({ url: expect.any(URL), label: 'SuperVideo', @@ -47,19 +47,6 @@ describe('MeineCloud', () => { }); expect(streams[1]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); expect(streams[2]).toStrictEqual({ - url: expect.any(URL), - label: 'Mixdrop', - sourceId: 'mixdrop_de', - height: 0, - bytes: 1256277934, - countryCode: 'de', - requestHeaders: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }); - expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?s=.*?e=.*?t=/); - expect(streams[3]).toStrictEqual({ url: expect.any(URL), label: 'DoodStream', sourceId: 'doodstream_de', @@ -70,6 +57,6 @@ describe('MeineCloud', () => { Referer: 'http://dood.to/', }, }); - expect(streams[3]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); + expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); }); }); diff --git a/src/handler/MostraGuarda.test.ts b/src/handler/MostraGuarda.test.ts index 8ea193c..0b07098 100644 --- a/src/handler/MostraGuarda.test.ts +++ b/src/handler/MostraGuarda.test.ts @@ -27,7 +27,7 @@ describe('MostraGuarda', () => { test('handle imdb the devil\'s bath', async () => { const streams = (await handler.handle(ctx, 'movie', 'tt29141112')).filter(stream => stream !== undefined); - expect(streams).toHaveLength(4); + expect(streams).toHaveLength(3); expect(streams[0]).toStrictEqual({ url: expect.any(URL), label: 'SuperVideo', @@ -47,19 +47,6 @@ describe('MostraGuarda', () => { }); expect(streams[1]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); expect(streams[2]).toStrictEqual({ - url: expect.any(URL), - label: 'Mixdrop', - sourceId: 'mixdrop_it', - height: 0, - bytes: 1170378588, - countryCode: 'it', - requestHeaders: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }); - expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?s=.*?e=.*?t=/); - expect(streams[3]).toStrictEqual({ url: expect.any(URL), label: 'DoodStream', sourceId: 'doodstream_it', @@ -70,6 +57,6 @@ describe('MostraGuarda', () => { Referer: 'http://dood.to/', }, }); - expect(streams[3]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); + expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); }); }); diff --git a/src/handler/VerHdLink.test.ts b/src/handler/VerHdLink.test.ts index a2d2e47..693defa 100644 --- a/src/handler/VerHdLink.test.ts +++ b/src/handler/VerHdLink.test.ts @@ -24,16 +24,16 @@ describe('VerHdLink', () => { expect(streams).toHaveLength(0); }); - test('handle mickey 17', async () => { - const streams = (await handler.handle(ctx, 'movie', 'tt12299608')).filter(stream => stream !== undefined); + test('handle titanic', async () => { + const streams = (await handler.handle(ctx, 'movie', 'tt0120338')).filter(stream => stream !== undefined); - expect(streams).toHaveLength(8); + expect(streams).toHaveLength(4); expect(streams[0]).toStrictEqual({ url: expect.any(URL), label: 'SuperVideo', sourceId: 'supervideo_mx', - height: 720, - bytes: 1288490188, + height: 556, + bytes: 1503238553, countryCode: 'mx', }); expect(streams[0]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); @@ -41,78 +41,28 @@ describe('VerHdLink', () => { url: expect.any(URL), label: 'Dropload', sourceId: 'dropload_mx', - height: 720, - bytes: 1181116006, + height: 556, + bytes: 1503238553, countryCode: 'mx', }); expect(streams[1]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); expect(streams[2]).toStrictEqual({ - url: expect.any(URL), - label: 'Mixdrop', - sourceId: 'mixdrop_mx', - height: 0, - bytes: 1299227607, - countryCode: 'mx', - requestHeaders: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }); - expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?s=.*?e=.*?t=/); - expect(streams[3]).toStrictEqual({ - url: expect.any(URL), - label: 'DoodStream', - sourceId: 'doodstream_mx', - height: 0, - bytes: 0, - countryCode: 'mx', - requestHeaders: { - Referer: 'http://dood.to/', - }, - }); - expect(streams[3]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); - expect(streams[4]).toStrictEqual({ url: expect.any(URL), label: 'SuperVideo', sourceId: 'supervideo_es', - height: 720, - bytes: 1288490188, + height: 544, + bytes: 1610612736, countryCode: 'es', }); - expect(streams[4]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); - expect(streams[5]).toStrictEqual({ + expect(streams[2]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); + expect(streams[3]).toStrictEqual({ url: expect.any(URL), label: 'Dropload', sourceId: 'dropload_es', - height: 720, - bytes: 1181116006, + height: 544, + bytes: 1610612736, countryCode: 'es', }); - expect(streams[5]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); - expect(streams[6]).toStrictEqual({ - url: expect.any(URL), - label: 'Mixdrop', - sourceId: 'mixdrop_es', - height: 0, - bytes: 1342177280, - countryCode: 'es', - requestHeaders: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }); - expect(streams[6]?.url.href).toMatch(/^https:\/\/.*?s=.*?e=.*?t=/); - expect(streams[7]).toStrictEqual({ - url: expect.any(URL), - label: 'DoodStream', - sourceId: 'doodstream_es', - height: 0, - bytes: 0, - countryCode: 'es', - requestHeaders: { - Referer: 'http://dood.to/', - }, - }); - expect(streams[7]?.url.href).toMatch(/^https:\/\/.*?token.*?expiry/); + expect(streams[3]?.url.href).toMatch(/^https:\/\/.*?.m3u8/); }); }); diff --git a/src/utils/Fetcher.ts b/src/utils/Fetcher.ts index 4d735f6..87a3f62 100644 --- a/src/utils/Fetcher.ts +++ b/src/utils/Fetcher.ts @@ -37,7 +37,7 @@ export class Fetcher { return { ...config, headers: { - 'User-Agent': this.getUserAgentForIp(ctx.ip), + 'User-Agent': this.createUserAgentForIp(ctx.ip), 'Forwarded': `for=${ctx.ip}`, 'Referer': `${url.origin}`, 'X-Forwarded-For': ctx.ip, @@ -48,7 +48,7 @@ export class Fetcher { }; }; - public readonly getUserAgentForIp = (ip: string): string => { + private readonly createUserAgentForIp = (ip: string): string => { let userAgent = this.ipUserAgentCache.get(ip); if (userAgent) { return userAgent; diff --git a/src/utils/StreamResolver.test.ts b/src/utils/StreamResolver.test.ts index 392cdb0..171be4a 100644 --- a/src/utils/StreamResolver.test.ts +++ b/src/utils/StreamResolver.test.ts @@ -91,38 +91,6 @@ describe('resolve', () => { videoSize: 1073741824, }, }, - { - url: expect.any(String), - name: 'WebStreamr', - title: 'Mixdrop | 💾 1.17 GB | 🇩🇪', - behaviorHints: { - bingeGroup: 'webstreamr-mixdrop_de', - notWebReady: true, - proxyHeaders: { - request: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }, - videoSize: 1256277934, - }, - }, - { - url: expect.any(String), - name: 'WebStreamr', - title: 'Mixdrop | 💾 1.09 GB | 🇮🇹', - behaviorHints: { - bingeGroup: 'webstreamr-mixdrop_it', - notWebReady: true, - proxyHeaders: { - request: { - 'Referer': 'https://mixdrop.ag', - 'User-Agent': 'Fake UserAgent', - }, - }, - videoSize: 1170378588, - }, - }, { url: expect.any(String), name: 'WebStreamr', diff --git a/src/utils/__fixtures__/Fetcher/http:dood.toe2ld51itfvzib b/src/utils/__fixtures__/Fetcher/http:dood.toe2ld51itfvzib deleted file mode 100644 index 9aea138..0000000 --- a/src/utils/__fixtures__/Fetcher/http:dood.toe2ld51itfvzib +++ /dev/null @@ -1 +0,0 @@ -
video you are looking for is not found.
video you are looking for is not found.
video you are looking for is not found.
video you are looking for is not found.
