diff --git a/src/extractor/DoodStream.ts b/src/extractor/DoodStream.ts index 693bb51..de374d2 100644 --- a/src/extractor/DoodStream.ts +++ b/src/extractor/DoodStream.ts @@ -24,7 +24,9 @@ export class DoodStream extends Extractor { }; protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); const passMd5Match = html.match(/\/pass_md5\/[\w-]+\/([\w-]+)/); if (!passMd5Match) { @@ -33,7 +35,7 @@ export class DoodStream extends Extractor { const token = passMd5Match[1] as string; - const baseUrl = await this.fetcher.text(ctx, new URL(passMd5Match[0], url.origin)); + const baseUrl = await this.fetcher.text(ctx, new URL(passMd5Match[0], url.origin), { headers: { Referer: url.href } }); const $ = cheerio.load(html); const title = $('title').text().trim().replace(/ - DoodStream$/, '').trim(); @@ -44,7 +46,7 @@ export class DoodStream extends Extractor { mp4Url = new URL(baseUrl); } else { mp4Url = new URL(`${baseUrl}${randomstring.generate(10)}?token=${token}&expiry=${Date.now()}`); - bytes = await guessSizeFromMp4(ctx, this.fetcher, mp4Url, { headers: { Referer: url.origin } }); + bytes = await guessSizeFromMp4(ctx, this.fetcher, mp4Url, { headers: { Referer: url.href } }); } return [ diff --git a/src/extractor/Dropload.ts b/src/extractor/Dropload.ts index 958659a..57d9d5e 100644 --- a/src/extractor/Dropload.ts +++ b/src/extractor/Dropload.ts @@ -19,7 +19,9 @@ export class Dropload extends Extractor { public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/d/', '/').replace('/e/', '/').replace('/embed-', '/')); protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); if (html.includes('File Not Found') || html.includes('Pending in queue')) { throw new NotFoundError(); diff --git a/src/extractor/ExternalUrl.ts b/src/extractor/ExternalUrl.ts index e3f57b5..34d5c0d 100644 --- a/src/extractor/ExternalUrl.ts +++ b/src/extractor/ExternalUrl.ts @@ -15,9 +15,11 @@ export class ExternalUrl extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { + const headers = { Referer: meta.referer ?? url.href }; + try { // Make sure the URL is accessible, but avoid causing noise and delays doing this - await this.fetcher.head(ctx, url, { noFlareSolverr: true, timeout: 1000, headers: { Referer: url.origin } }); + await this.fetcher.head(ctx, url, { noFlareSolverr: true, timeout: 1000, headers }); } catch (error) { /* istanbul ignore if */ if (!(error instanceof BlockedError)) { diff --git a/src/extractor/Extractor.ts b/src/extractor/Extractor.ts index 00a4252..e436a7c 100644 --- a/src/extractor/Extractor.ts +++ b/src/extractor/Extractor.ts @@ -41,7 +41,7 @@ export abstract class Extractor { error, label: this.label, sourceId: `${this.id}`, - ...(meta && meta), + meta, }, ]; } diff --git a/src/extractor/Fastream.ts b/src/extractor/Fastream.ts index 6ad4e58..0fe226e 100644 --- a/src/extractor/Fastream.ts +++ b/src/extractor/Fastream.ts @@ -19,10 +19,12 @@ export class Fastream extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Fastream', url); + const headers = { Referer: meta.referer ?? url.href }; + + const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Fastream', url, headers); const downloadUrl = new URL(url.href.replace('/embed-', '/d/')); - const html = await this.fetcher.text(ctx, downloadUrl); + const html = await this.fetcher.text(ctx, downloadUrl, { headers }); const heightAndSizeMatch = html.match(/\d{3,}x(\d{3,}), ([\d.]+ ?[GM]B)/) as string[]; const titleMatch = html.match(/>Download (.*?) { - const headers = { ...(meta.referer && { Referer: meta.referer }) }; + const headers = { Referer: meta.referer ?? url.href }; const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers); @@ -80,7 +80,7 @@ export class FileLions extends Extractor { ttl: this.ttl, meta: { ...meta, - height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl), + height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: { Referer: url.href } }), ...(sizeMatch && { bytes: bytes.parse(sizeMatch[1] as string) as number, }), diff --git a/src/extractor/Fsst.ts b/src/extractor/Fsst.ts index 8573500..078b0da 100644 --- a/src/extractor/Fsst.ts +++ b/src/extractor/Fsst.ts @@ -12,7 +12,7 @@ export class Fsst extends Extractor { }; protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const headers = { Referer: meta.referer ?? url.origin }; + const headers = { Referer: meta.referer ?? url.href }; const html = await this.fetcher.text(ctx, url, { headers }); diff --git a/src/extractor/HubCloud.ts b/src/extractor/HubCloud.ts index aaa982a..272ccd0 100644 --- a/src/extractor/HubCloud.ts +++ b/src/extractor/HubCloud.ts @@ -15,10 +15,12 @@ export class HubCloud extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const redirectHtml = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const redirectHtml = await this.fetcher.text(ctx, url, { headers }); const redirectUrlMatch = redirectHtml.match(/var url ?= ?'(.*?)'/) as string[]; - const linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string)); + const linksHtml = await this.fetcher.text(ctx, new URL(redirectUrlMatch[1] as string), { headers: { Referer: url.href } }); const $ = cheerio.load(linksHtml); const urlResults = [ diff --git a/src/extractor/KinoGer.ts b/src/extractor/KinoGer.ts index 4ac7021..1222831 100644 --- a/src/extractor/KinoGer.ts +++ b/src/extractor/KinoGer.ts @@ -36,7 +36,7 @@ export class KinoGer extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const headers = { 'Referer': meta.referer ?? url.origin, 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36' }; + const headers = { 'Referer': meta.referer ?? url.href, 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36' }; const hexData = await this.fetcher.text(ctx, url, { headers }); @@ -59,7 +59,7 @@ export class KinoGer extends Extractor { ttl: this.ttl, meta: { ...meta, - height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }), + height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } }), title, }, requestHeaders: { diff --git a/src/extractor/Mixdrop.test.ts b/src/extractor/Mixdrop.test.ts index e8e6046..946e795 100644 --- a/src/extractor/Mixdrop.test.ts +++ b/src/extractor/Mixdrop.test.ts @@ -7,7 +7,7 @@ import { Mixdrop } from './Mixdrop'; const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] }); const extractorRegistry = new ExtractorRegistry(logger, [new Mixdrop(new FetcherMock(`${__dirname}/__fixtures__/Mixdrop`))]); -const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow-proxy.test', mediaFlowProxyPassword: 'asdfg' }); +const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', mediaFlowProxyPassword: 'test' }); describe('Mixdrop', () => { test('mixdrop.my /e/', async () => { diff --git a/src/extractor/Mixdrop.ts b/src/extractor/Mixdrop.ts index 0c603d5..beb5455 100644 --- a/src/extractor/Mixdrop.ts +++ b/src/extractor/Mixdrop.ts @@ -2,7 +2,7 @@ import bytes from 'bytes'; import * as cheerio from 'cheerio'; import { NotFoundError } from '../error'; import { Context, Format, Meta, UrlResult } from '../types'; -import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils'; +import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils'; import { Extractor } from './Extractor'; export class Mixdrop extends Extractor { @@ -19,8 +19,10 @@ export class Mixdrop extends Extractor { public override readonly normalize = (url: URL): URL => new URL(url.href.replace('/f/', '/e/')); protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { + const headers = { Referer: meta.referer ?? url.href }; + const fileUrl = new URL(url.href.replace('/e/', '/f/')); - const html = await this.fetcher.text(ctx, fileUrl); + const html = await this.fetcher.text(ctx, fileUrl, { headers }); if (/can't find the (file|video)/.test(html)) { throw new NotFoundError(); @@ -33,7 +35,7 @@ export class Mixdrop extends Extractor { return [ { - url: buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Mixdrop', url), + url: await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Mixdrop', url, headers), format: Format.mp4, label: this.label, sourceId: `${this.id}_${meta.countryCodes?.join('_')}`, diff --git a/src/extractor/SaveFiles.ts b/src/extractor/SaveFiles.ts index 7a120ff..d1cd441 100644 --- a/src/extractor/SaveFiles.ts +++ b/src/extractor/SaveFiles.ts @@ -19,7 +19,9 @@ export class SaveFiles extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); if (/file was locked|file was deleted/i.test(html)) { throw new NotFoundError(); diff --git a/src/extractor/Soaper.ts b/src/extractor/Soaper.ts index 13174be..b63a3ce 100644 --- a/src/extractor/Soaper.ts +++ b/src/extractor/Soaper.ts @@ -52,7 +52,7 @@ export class Soaper extends Extractor { ttl: this.ttl, meta: { ...meta, - height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url), + height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } }), }, }, ]; diff --git a/src/extractor/StreamEmbed.ts b/src/extractor/StreamEmbed.ts index 25587cb..70883f8 100644 --- a/src/extractor/StreamEmbed.ts +++ b/src/extractor/StreamEmbed.ts @@ -11,7 +11,9 @@ export class StreamEmbed extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); const video = JSON.parse((html.match(/video ?= ?(.*);/) as string[])[1] as string); diff --git a/src/extractor/Streamtape.test.ts b/src/extractor/Streamtape.test.ts index 15bb144..40c7b5f 100644 --- a/src/extractor/Streamtape.test.ts +++ b/src/extractor/Streamtape.test.ts @@ -11,6 +11,6 @@ const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', describe('Streamtape', () => { test('streamtape.com /e', async () => { - expect(await extractorRegistry.handle(ctx, new URL('https://streamtape.com/e/84Kb3mkoYAiokmW'))).toMatchSnapshot(); + expect(await extractorRegistry.handle(ctx, new URL('https://streamtape.com/e/DjmZBG0K9gHkJ7z/WALL-E.2008.1080p.BrRip.x264.YIFY.mp4'))).toMatchSnapshot(); }); }); diff --git a/src/extractor/Streamtape.ts b/src/extractor/Streamtape.ts index 9910558..ea1fc82 100644 --- a/src/extractor/Streamtape.ts +++ b/src/extractor/Streamtape.ts @@ -1,7 +1,7 @@ import * as cheerio from 'cheerio'; import { Context, Format, Meta, UrlResult } from '../types'; import { - buildMediaFlowProxyExtractorRedirectUrl, + buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy, } from '../utils'; import { guessSizeFromMp4 } from '../utils/size'; @@ -21,12 +21,14 @@ export class Streamtape extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); const $ = cheerio.load(html); const title = $('meta[name="og:title"]').attr('content') as string; - const mp4Url = buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Streamtape', url); + const mp4Url = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Streamtape', url, headers); return [ { @@ -38,7 +40,7 @@ export class Streamtape extends Extractor { meta: { ...meta, title, - bytes: await guessSizeFromMp4(ctx, this.fetcher, mp4Url), + bytes: await guessSizeFromMp4(ctx, this.fetcher, mp4Url, { headers: { Referer: url.href } }), }, }, ]; diff --git a/src/extractor/SuperVideo.ts b/src/extractor/SuperVideo.ts index 8e71a3f..9eedda2 100644 --- a/src/extractor/SuperVideo.ts +++ b/src/extractor/SuperVideo.ts @@ -21,7 +21,7 @@ export class SuperVideo extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const headers = { Referer: meta.referer ?? url.origin }; + const headers = { Referer: meta.referer ?? url.href }; const html = await this.fetcher.text(ctx, url, { headers }); @@ -39,7 +39,7 @@ export class SuperVideo extends Extractor { const size = heightAndSizeMatch ? bytes.parse(heightAndSizeMatch[2] as string) as number : undefined; const height = heightAndSizeMatch ? parseInt(heightAndSizeMatch[1] as string) - : await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers }); + : await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: url.href } }); const $ = cheerio.load(html); const title = $('.download__title').text().trim(); diff --git a/src/extractor/Uqload.ts b/src/extractor/Uqload.ts index 4d9f26d..ae01abf 100644 --- a/src/extractor/Uqload.ts +++ b/src/extractor/Uqload.ts @@ -1,6 +1,6 @@ import * as cheerio from 'cheerio'; import { Context, Format, Meta, UrlResult } from '../types'; -import { buildMediaFlowProxyExtractorRedirectUrl, supportsMediaFlowProxy } from '../utils'; +import { buildMediaFlowProxyExtractorStreamUrl, supportsMediaFlowProxy } from '../utils'; import { guessSizeFromMp4 } from '../utils/size'; import { Extractor } from './Extractor'; @@ -20,14 +20,16 @@ export class Uqload extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); const heightMatch = html.match(/\d{3,}x(\d{3,})/); const $ = cheerio.load(html); const title = $('h1').text().trim(); - const mp4Url = buildMediaFlowProxyExtractorRedirectUrl(ctx, 'Uqload', url); + const mp4Url = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'Uqload', url, headers); return [ { @@ -39,7 +41,7 @@ export class Uqload extends Extractor { meta: { ...meta, title, - bytes: await guessSizeFromMp4(ctx, this.fetcher, mp4Url), + bytes: await guessSizeFromMp4(ctx, this.fetcher, mp4Url, { headers: { Referer: url.href } }), ...(heightMatch && { height: parseInt(heightMatch[1] as string), }), diff --git a/src/extractor/VidSrc.ts b/src/extractor/VidSrc.ts index 98f41e0..2ffa4cb 100644 --- a/src/extractor/VidSrc.ts +++ b/src/extractor/VidSrc.ts @@ -79,7 +79,7 @@ export class VidSrc extends Extractor { ttl: this.ttl, meta: { ...meta, - height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url), + height: await guessHeightFromPlaylist(ctx, this.fetcher, m3u8Url, { headers: { Referer: iframeUrl.href } }), title, }, }; diff --git a/src/extractor/VixSrc.ts b/src/extractor/VixSrc.ts index b02a730..1e299e6 100644 --- a/src/extractor/VixSrc.ts +++ b/src/extractor/VixSrc.ts @@ -1,6 +1,6 @@ import { Context, CountryCode, Format, Meta, UrlResult } from '../types'; import { - buildMediaFlowProxyExtractorStreamUrl, guessHeightFromPlaylist, + buildMediaFlowProxyExtractorStreamUrl, CustomRequestInit, guessHeightFromPlaylist, hasMultiEnabled, iso639FromCountryCode, supportsMediaFlowProxy, @@ -20,7 +20,7 @@ export class VixSrc extends Extractor { protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'VixCloud', url); - const countryCodes = await this.determineCountryCodesFromPlaylist(ctx, playlistUrl); + const countryCodes = await this.determineCountryCodesFromPlaylist(ctx, playlistUrl, { headers: { Referer: url.href } }); if (!hasMultiEnabled(ctx.config) && !countryCodes.some(countryCode => countryCode in ctx.config)) { return []; @@ -35,14 +35,14 @@ export class VixSrc extends Extractor { ttl: this.ttl, meta: { countryCodes, - height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl), + height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl, { headers: { Referer: url.href } }), }, }, ]; }; - private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL): Promise { - const playlist = await this.fetcher.text(ctx, playlistUrl); + private async determineCountryCodesFromPlaylist(ctx: Context, playlistUrl: URL, init?: CustomRequestInit): Promise { + const playlist = await this.fetcher.text(ctx, playlistUrl, init); const countryCodes: CountryCode[] = [CountryCode.it]; diff --git a/src/extractor/YouTube.ts b/src/extractor/YouTube.ts index a6a7ed7..7529a73 100644 --- a/src/extractor/YouTube.ts +++ b/src/extractor/YouTube.ts @@ -13,7 +13,9 @@ export class YouTube extends Extractor { } protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise { - const html = await this.fetcher.text(ctx, url); + const headers = { Referer: meta.referer ?? url.href }; + + const html = await this.fetcher.text(ctx, url, { headers }); const titleMatch = html.match(/"title":{"runs":\[{"text":"(.*?)"/) as string[]; diff --git a/src/extractor/__fixtures__/Fastream/https:mediaflow-proxy.testextractorvideohostFastreamandapi_passwordasdfganddhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.html b/src/extractor/__fixtures__/Fastream/https:mediaflow-proxy.testextractorvideohostFastreamandapi_passwordasdfganddhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.htmlandh_refererhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.html similarity index 100% rename from src/extractor/__fixtures__/Fastream/https:mediaflow-proxy.testextractorvideohostFastreamandapi_passwordasdfganddhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.html rename to src/extractor/__fixtures__/Fastream/https:mediaflow-proxy.testextractorvideohostFastreamandapi_passwordasdfganddhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.htmlandh_refererhttpspercent3Apercent2Fpercent2Ffastream.topercent2Fembed-3aooif4ozt10.html diff --git a/src/extractor/__fixtures__/FileLions/https:mediaflow.test.orgextractorvideohostFileLionsandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2 b/src/extractor/__fixtures__/FileLions/https:mediaflow.test.orgextractorvideohostFileLionsandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2andh_refererhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2 similarity index 100% rename from src/extractor/__fixtures__/FileLions/https:mediaflow.test.orgextractorvideohostFileLionsandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2 rename to src/extractor/__fixtures__/FileLions/https:mediaflow.test.orgextractorvideohostFileLionsandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2andh_refererhttpspercent3Apercent2Fpercent2Ffilelions.topercent2Fvpercent2Ftyn45apubte2 diff --git a/src/extractor/__fixtures__/Mixdrop/https:mediaflow.test.orgextractorvideohostMixdropandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8andh_refererhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8 b/src/extractor/__fixtures__/Mixdrop/https:mediaflow.test.orgextractorvideohostMixdropandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8andh_refererhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8 new file mode 100644 index 0000000..c539f41 --- /dev/null +++ b/src/extractor/__fixtures__/Mixdrop/https:mediaflow.test.orgextractorvideohostMixdropandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8andh_refererhttpspercent3Apercent2Fpercent2Fmixdrop.mypercent2Fepercent2Fknq0kj8waq44l8 @@ -0,0 +1 @@ +{"destination_url":"https://s-delivery29.mxcontent.net/v2/knq0kj8waq44l8.mp4?s=85VD8DA80IfkbMa3zZR3XA&e=1758851244&_t=1758837735","request_headers":{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","referer":"https://mixdrop.my/e/knq0kj8waq44l8"},"mediaflow_proxy_url":"https://mediaflow.test.org/proxy/stream","query_params":{"api_password":"test"}} diff --git a/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.org-e0b2005f2027508023cbe94c61ed2d21 b/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.org-e0b2005f2027508023cbe94c61ed2d21 new file mode 100644 index 0000000..8ddb72e --- /dev/null +++ b/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.org-e0b2005f2027508023cbe94c61ed2d21 @@ -0,0 +1 @@ +{"connection":"close","content-length":"1293552945","content-range":"bytes 0-1293552944/1293552945","content-type":"video/mp4","date":"Thu, 25 Sep 2025 19:52:25 GMT","etag":"\"6878008a-4d1a0d31\"","last-modified":"Wed, 16 Jul 2025 19:42:02 GMT","server":"nginx/1.24.0 (Ubuntu)"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.orgextractorvideohostStreamtapeandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fstreamtape.compercent2Fepercent2F84Kb3mkoYAiokmWandredirect_streamtrue b/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.orgextractorvideohostStreamtapeandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fstreamtape.compercent2Fepercent2F84Kb3mkoYAiokmWandredirect_streamtrue deleted file mode 100644 index 91858cc..0000000 --- a/src/extractor/__fixtures__/Streamtape/head-https:mediaflow.test.orgextractorvideohostStreamtapeandapi_passwordtestanddhttpspercent3Apercent2Fpercent2Fstreamtape.compercent2Fepercent2F84Kb3mkoYAiokmWandredirect_streamtrue +++ /dev/null @@ -1 +0,0 @@ -{"connection":"close","content-length":"1187340184","content-range":"bytes 0-1187340183/1187340184","content-type":"video/mp4","date":"Thu, 28 Aug 2025 19:09:50 GMT","etag":"\"68acb5cc-46c55f98\"","last-modified":"Mon, 25 Aug 2025 19:13:16 GMT","server":"nginx/1.24.0 (Ubuntu)"} \ No newline at end of file diff --git a/src/extractor/__fixtures__/Streamtape/https:mediaflow.test.org-6a49ba4b2831cab213994ba51da632c7 b/src/extractor/__fixtures__/Streamtape/https:mediaflow.test.org-6a49ba4b2831cab213994ba51da632c7 new file mode 100644 index 0000000..6638ddc --- /dev/null +++ b/src/extractor/__fixtures__/Streamtape/https:mediaflow.test.org-6a49ba4b2831cab213994ba51da632c7 @@ -0,0 +1 @@ +{"destination_url":"https://streamtape.com/get_video?id=DjmZBG0K9gHkJ7z&expires=1758899945&ip=F0AOKRISKxSHDN&token=uQu83SOzkLwi","request_headers":{"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36","referer":"https://streamtape.com/e/DjmZBG0K9gHkJ7z/WALL-E.2008.1080p.BrRip.x264.YIFY.mp4"},"mediaflow_proxy_url":"https://mediaflow.test.org/proxy/stream","query_params":{"api_password":"test"}} \ No newline at end of file diff --git a/src/extractor/__fixtures__/Streamtape/https:streamtape.come84Kb3mkoYAiokmW b/src/extractor/__fixtures__/Streamtape/https:streamtape.comeDjmZBG0K9gHkJ7zWALL-E.2008.1080p.BrRip.x264.YIFY.mp4 similarity index 97% rename from src/extractor/__fixtures__/Streamtape/https:streamtape.come84Kb3mkoYAiokmW rename to src/extractor/__fixtures__/Streamtape/https:streamtape.comeDjmZBG0K9gHkJ7zWALL-E.2008.1080p.BrRip.x264.YIFY.mp4 index c0e9d00..3c8e70a 100644 --- a/src/extractor/__fixtures__/Streamtape/https:streamtape.come84Kb3mkoYAiokmW +++ b/src/extractor/__fixtures__/Streamtape/https:streamtape.comeDjmZBG0K9gHkJ7zWALL-E.2008.1080p.BrRip.x264.YIFY.mp4 @@ -94,17 +94,15 @@ body.loader{ } } - - + + - + - - - - - + + +
@@ -157,18 +155,19 @@ try{count++;if(loop && !did && count < 100) setTimeout(function(){adblock(loop); } adblock(true); document.addEventListener("readystatechange", function(){adblock();}); -window.ychkrLfxAj=adblock; +window.WJSzQHSJRp=adblock; })(); - + + var vidconfig = {"id":"DjmZBG0K9gHkJ7z","cors":"https:\/\/thumb.tapecontent.net\/remotecaption\/expires=1758899945&ip=FOSOF0xJREWCFxf&token=BLQHfj0VTYB2","showtitle":"WALL-E.2008.1080p.BrRip.x264.YIFY.mp4","subload":true,"subsize":true,"logo":null};$(document).on("contextmenu",function(){return false;}); +
-
- - - - @@ -233,7 +232,7 @@ document.getElementById('robotlink').innerHTML = '//streamtape.com/get_video?id=