feat(extractor): add FileLions extractor
This commit is contained in:
parent
0bfced503c
commit
8430e5d0d1
14 changed files with 815 additions and 3 deletions
|
|
@ -54,7 +54,7 @@ export class ExtractorRegistry {
|
|||
|
||||
this.logger.info(`Extract stream URL using ${extractor.id} extractor from ${url}`, ctx);
|
||||
|
||||
const urlResults = await extractor.extract(ctx, normalizedUrl, meta || { countryCodes: [] });
|
||||
const urlResults = await extractor.extract(ctx, normalizedUrl, { ...meta, countryCodes: meta?.countryCodes ?? [] });
|
||||
|
||||
if (!urlResults.some(urlResult => urlResult.error) && extractor.ttl) {
|
||||
await this.urlResultCache.set<UrlResult[]>(cacheKey, urlResults, extractor.ttl);
|
||||
|
|
|
|||
20
src/extractor/FileLions.test.ts
Normal file
20
src/extractor/FileLions.test.ts
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
import winston from 'winston';
|
||||
import { createTestContext } from '../test';
|
||||
import { FetcherMock } from '../utils';
|
||||
import { ExtractorRegistry } from './ExtractorRegistry';
|
||||
import { FileLions } from './FileLions';
|
||||
|
||||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new FileLions(new FetcherMock(`${__dirname}/__fixtures__/FileLions`))]);
|
||||
|
||||
const ctx = createTestContext({ mediaFlowProxyUrl: 'https://mediaflow.test.org', mediaFlowProxyPassword: 'test' });
|
||||
|
||||
describe('FileLions', () => {
|
||||
test('filelions f', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://filelions.to/f/tyn45apubte2'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('mivalyo v referer lock', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://mivalyo.com/v/tah5znapz3e5'), { referer: 'https://kinoger.com' })).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
93
src/extractor/FileLions.ts
Normal file
93
src/extractor/FileLions.ts
Normal file
|
|
@ -0,0 +1,93 @@
|
|||
import bytes from 'bytes';
|
||||
import * as cheerio from 'cheerio';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { buildMediaFlowProxyExtractorStreamUrl, guessHeightFromPlaylist, supportsMediaFlowProxy } from '../utils';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
/** @see https://github.com/Gujal00/ResolveURL/commits/master/script.module.resolveurl/lib/resolveurl/plugins/filelions.py */
|
||||
export class FileLions extends Extractor {
|
||||
public readonly id = 'filelions';
|
||||
|
||||
public readonly label = 'FileLions (via MediaFlow Proxy)';
|
||||
|
||||
public override readonly ttl = 0;
|
||||
|
||||
public override viaMediaFlowProxy = true;
|
||||
|
||||
public supports(ctx: Context, url: URL): boolean {
|
||||
const supportedDomain = null !== url.host.match(/.*lions?/)
|
||||
|| [
|
||||
'6sfkrspw4u.sbs',
|
||||
'ajmidyadfihayh.sbs',
|
||||
'alhayabambi.sbs',
|
||||
'anime7u.com',
|
||||
'azipcdn.com',
|
||||
'coolciima.online',
|
||||
'dhtpre.com',
|
||||
'e4xb5c2xnz.sbs',
|
||||
'egsyxutd.sbs',
|
||||
'fdewsdc.sbs',
|
||||
'gsfomqu.sbs',
|
||||
'javplaya.com',
|
||||
'katomen.online',
|
||||
'kinoger.be',
|
||||
'lumiawatch.top',
|
||||
'mivalyo.com',
|
||||
'moflix-stream.click',
|
||||
'motvy55.store',
|
||||
'movearnpre.com',
|
||||
'peytonepre.com',
|
||||
'ryderjet.com',
|
||||
'smoothpre.com',
|
||||
'taylorplayer.com',
|
||||
'techradar.ink',
|
||||
'videoland.sbs',
|
||||
'vidhide.com',
|
||||
'vidhide.fun',
|
||||
'vidhidefast.com',
|
||||
'vidhidehub.com',
|
||||
'vidhideplus.com',
|
||||
'vidhidepre.com',
|
||||
'vidhidepro.com',
|
||||
'vidhidevip.com',
|
||||
].includes(url.host);
|
||||
|
||||
return supportedDomain && supportsMediaFlowProxy(ctx);
|
||||
}
|
||||
|
||||
public override normalize(url: URL): URL {
|
||||
return new URL(url.href.replace('/f/', '/v/').replace('/download/', '/v/').replace('/file/', '/v/'));
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
const headers = { ...(meta.referer && { Referer: meta.referer }) };
|
||||
|
||||
const playlistUrl = await buildMediaFlowProxyExtractorStreamUrl(ctx, this.fetcher, 'FileLions', url, headers);
|
||||
|
||||
const fileUrl = new URL(url.href.replace('/v/', '/f/'));
|
||||
const html = await this.fetcher.text(ctx, fileUrl, { headers });
|
||||
|
||||
const sizeMatch = html.match(/([\d.]+ ?[GM]B)/);
|
||||
|
||||
const $ = cheerio.load(html);
|
||||
const title = $('title').text().trim().replace(/^Watch /, '').trim();
|
||||
|
||||
return [
|
||||
{
|
||||
url: playlistUrl,
|
||||
format: Format.hls,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
height: await guessHeightFromPlaylist(ctx, this.fetcher, playlistUrl),
|
||||
...(sizeMatch && {
|
||||
bytes: bytes.parse(sizeMatch[1] as string) as number,
|
||||
}),
|
||||
...(title && { title }),
|
||||
},
|
||||
},
|
||||
];
|
||||
};
|
||||
}
|
||||
503
src/extractor/__fixtures__/FileLions/https:filelions.toftyn45apubte2
generated
Normal file
503
src/extractor/__fixtures__/FileLions/https:filelions.toftyn45apubte2
generated
Normal file
File diff suppressed because one or more lines are too long
6
src/extractor/__fixtures__/FileLions/https:mediaflow.test.org-3ae485009fb31845c4840cef8ccac74b
generated
Normal file
6
src/extractor/__fixtures__/FileLions/https:mediaflow.test.org-3ae485009fb31845c4840cef8ccac74b
generated
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
#EXTM3U
|
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="Deutsch",LANGUAGE="de",AUTOSELECT=YES,DEFAULT=YES,CHANNELS="2",URI="https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Fkinoger.com&d=https%3A%2F%2F6dkdxt1udlqhbho.ovaltinecdn.com%2Fhls2%2F01%2F01552%2Ftah5znapz3e5_n%2Findex-a1.m3u8"
|
||||
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio0",NAME="English",LANGUAGE="en",AUTOSELECT=NO,DEFAULT=NO,CHANNELS="2",URI="https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Fkinoger.com&d=https%3A%2F%2F6dkdxt1udlqhbho.ovaltinecdn.com%2Fhls2%2F01%2F01552%2Ftah5znapz3e5_n%2Findex-a2.m3u8"
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=2862563,RESOLUTION=1920x1080,FRAME-RATE=25.000,CODECS="avc1.640028,mp4a.40.2",VIDEO-RANGE=SDR,AUDIO="audio0"
|
||||
https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Fkinoger.com&d=https%3A%2F%2F6dkdxt1udlqhbho.ovaltinecdn.com%2Fhls2%2F01%2F01552%2Ftah5znapz3e5_n%2Findex-v1-a1.m3u8
|
||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=123231,RESOLUTION=1920x1080,CODECS="avc1.640028",URI="https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Fkinoger.com&d=https%3A%2F%2F6dkdxt1udlqhbho.ovaltinecdn.com%2Fhls2%2F01%2F01552%2Ftah5znapz3e5_n%2Fiframes-v1-a1.m3u8",VIDEO-RANGE=SDR
|
||||
4
src/extractor/__fixtures__/FileLions/https:mediaflow.test.org-efb89e5a2d68b05cdb412bff3f87e8b7
generated
Normal file
4
src/extractor/__fixtures__/FileLions/https:mediaflow.test.org-efb89e5a2d68b05cdb412bff3f87e8b7
generated
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
#EXTM3U
|
||||
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1242387,RESOLUTION=1728x720,FRAME-RATE=23.974,CODECS="avc1.640020,mp4a.40.2",VIDEO-RANGE=SDR
|
||||
https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Ffilelions.to%2Fv%2Ftyn45apubte2&d=https%3A%2F%2Frnzt2t4xvku08.acek-cdn.com%2Fhls2%2F01%2F05594%2Ftyn45apubte2_n%2Findex-v1-a1.m3u8%3Ft%3D8y6hK40boUynXnkyW5s63kFaWpt6_A5UcG5LBUX3j_4%26s%3D1756131487%26e%3D129600%26f%3D27974684%26srv%3DF6vE2P5Wjncn%26i%3D0.4%26sp%3D500%26p1%3DF6vE2P5Wjncn%26p2%3DF6vE2P5Wjncn%26asn%3D31898
|
||||
#EXT-X-I-FRAME-STREAM-INF:BANDWIDTH=69531,RESOLUTION=1728x720,CODECS="avc1.640020",URI="https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Ffilelions.to%2Fv%2Ftyn45apubte2&d=https%3A%2F%2Frnzt2t4xvku08.acek-cdn.com%2Fhls2%2F01%2F05594%2Ftyn45apubte2_n%2Fiframes-v1-a1.m3u8%3Ft%3D8y6hK40boUynXnkyW5s63kFaWpt6_A5UcG5LBUX3j_4%26s%3D1756131487%26e%3D129600%26f%3D27974684%26srv%3DF6vE2P5Wjncn%26i%3D0.4%26sp%3D500%26p1%3DF6vE2P5Wjncn%26p2%3DF6vE2P5Wjncn%26asn%3D31898",VIDEO-RANGE=SDR
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"destination_url":"https://RNzT2t4XVKU08.acek-cdn.com/hls2/01/05594/tyn45apubte2_n/master.m3u8?t=8y6hK40boUynXnkyW5s63kFaWpt6_A5UcG5LBUX3j_4&s=1756131487&e=129600&f=27974684&srv=F6vE2P5Wjncn&i=0.4&sp=500&p1=F6vE2P5Wjncn&p2=F6vE2P5Wjncn&asn=31898","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://filelions.to/v/tyn45apubte2"},"mediaflow_proxy_url":"https://mediaflow.test.org/proxy/hls/manifest.m3u8","query_params":{"api_password":"test"}}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"destination_url":"https://6dkDxt1udLQhbho.ovaltinecdn.com/hls2/01/01552/tah5znapz3e5_n/master.m3u8?t=MnSHt6lZx3bdKvTdoU1JsTLWp56dlRDLwze5Prnefew&s=1756131487&e=129600&f=7760835&srv=GOweneve6B0I&i=0.4&sp=500&p1=GOweneve6B0I&p2=GOweneve6B0I&asn=31898","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://kinoger.com"},"mediaflow_proxy_url":"https://mediaflow.test.org/proxy/hls/manifest.m3u8","query_params":{"api_password":"test"}}
|
||||
138
src/extractor/__fixtures__/FileLions/https:mivalyo.comftah5znapz3e5
generated
Normal file
138
src/extractor/__fixtures__/FileLions/https:mivalyo.comftah5znapz3e5
generated
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>
|
||||
|
||||
Watch Versailles S01E01 German AC3 1080p BDRip x265 FuN
|
||||
|
||||
</title>
|
||||
<META NAME="description" CONTENT="">
|
||||
<META NAME="keywords" CONTENT="">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
<meta name="theme-color" content="#FFF">
|
||||
|
||||
<link rel="apple-touch-icon" href="/static/images/favicon/apple-touch-icon.png" sizes="180x180">
|
||||
<link rel="icon" href="/static/images/favicon/favicon-32x32.png" sizes="32x32">
|
||||
<link rel="icon" href="/static/images/favicon/favicon-16x16.png" sizes="16x16">
|
||||
<link rel="manifest" href="/static/images/favicon/manifest.json">
|
||||
<link rel="icon" href="/static/images/favicon/favicon.ico">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin="crossorigin">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link href="/static/css/style.css?" rel="stylesheet">
|
||||
|
||||
<script src="/static/js/jquery-3.2.1.min.js?"></script>
|
||||
<script src="/static/js/bootstrap.bundle.min.js?"></script>
|
||||
<script src="/static/js/app.js?"></script>
|
||||
<script src="/static/js/xupload.js?"></script>
|
||||
|
||||
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-48ZJD1VPGZ"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-48ZJD1VPGZ');
|
||||
</script>
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript" >
|
||||
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
|
||||
m[i].l=1*new Date();
|
||||
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
|
||||
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
|
||||
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
|
||||
|
||||
ym(93381808, "init", {
|
||||
clickmap:true,
|
||||
trackLinks:true,
|
||||
accurateTrackBounce:true,
|
||||
webvisor:true
|
||||
});
|
||||
</script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/93381808" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<header class="header">
|
||||
<div class="container">
|
||||
<div class="row align-items-center flex-nowrap">
|
||||
<div class="col-auto flex-grow-1 flex-shrink-1">
|
||||
<div class="row align-items-center">
|
||||
|
||||
<div class="col-auto" style="margin: 0 auto;">
|
||||
<a href="/" class="logo">
|
||||
|
||||
<img src="/static/images/logo.svg" alt="">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
|
||||
<main>
|
||||
<section class="section">
|
||||
<div class="container">
|
||||
|
||||
<div class="alert alert-danger">
|
||||
This video can be watched as embed only
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-lg-4 col-xs-12">
|
||||
<div class="mb-3 text-center">
|
||||
<a href="#" class="logo">
|
||||
|
||||
<img src="/static/images/logo.svg" alt="">
|
||||
|
||||
</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 col-xs-12" style="position: relative">
|
||||
<div class="mb-4 text-center">
|
||||
<p class="text-muted ">
|
||||
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
<style>
|
||||
@media (min-width:481px) {
|
||||
.text-muted {}
|
||||
}
|
||||
|
||||
@media (min-width:961px) {
|
||||
.text-muted {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 15px
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
||||
37
src/extractor/__snapshots__/FileLions.test.ts.snap
Normal file
37
src/extractor/__snapshots__/FileLions.test.ts.snap
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||
|
||||
exports[`FileLions filelions f 1`] = `
|
||||
[
|
||||
{
|
||||
"format": "hls",
|
||||
"label": "FileLions (via MediaFlow Proxy)",
|
||||
"meta": {
|
||||
"bytes": 481191526,
|
||||
"countryCodes": [],
|
||||
"height": 720,
|
||||
"title": "dexter resurrection s01e01 1080p web h264 successfulcrab",
|
||||
},
|
||||
"sourceId": "filelions_",
|
||||
"ttl": 0,
|
||||
"url": "https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Ffilelions.to%2Fv%2Ftyn45apubte2&d=https%3A%2F%2FRNzT2t4XVKU08.acek-cdn.com%2Fhls2%2F01%2F05594%2Ftyn45apubte2_n%2Fmaster.m3u8%3Ft%3D8y6hK40boUynXnkyW5s63kFaWpt6_A5UcG5LBUX3j_4%26s%3D1756131487%26e%3D129600%26f%3D27974684%26srv%3DF6vE2P5Wjncn%26i%3D0.4%26sp%3D500%26p1%3DF6vE2P5Wjncn%26p2%3DF6vE2P5Wjncn%26asn%3D31898",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`FileLions mivalyo v referer lock 1`] = `
|
||||
[
|
||||
{
|
||||
"format": "hls",
|
||||
"label": "FileLions (via MediaFlow Proxy)",
|
||||
"meta": {
|
||||
"countryCodes": [],
|
||||
"height": 1080,
|
||||
"referer": "https://kinoger.com",
|
||||
"title": "Versailles S01E01 German AC3 1080p BDRip x265 FuN",
|
||||
},
|
||||
"sourceId": "filelions_",
|
||||
"ttl": 0,
|
||||
"url": "https://mediaflow.test.org/proxy/hls/manifest.m3u8?api_password=test&h_user-agent=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F136.0.0.0+Safari%2F537.36&h_referer=https%3A%2F%2Fkinoger.com&d=https%3A%2F%2F6dkDxt1udLQhbho.ovaltinecdn.com%2Fhls2%2F01%2F01552%2Ftah5znapz3e5_n%2Fmaster.m3u8%3Ft%3DMnSHt6lZx3bdKvTdoU1JsTLWp56dlRDLwze5Prnefew%26s%3D1756131487%26e%3D129600%26f%3D7760835%26srv%3DGOweneve6B0I%26i%3D0.4%26sp%3D500%26p1%3DGOweneve6B0I%26p2%3DGOweneve6B0I%26asn%3D31898",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
|
@ -4,6 +4,7 @@ import { Dropload } from './Dropload';
|
|||
import { ExternalUrl } from './ExternalUrl';
|
||||
import { Extractor } from './Extractor';
|
||||
import { Fastream } from './Fastream';
|
||||
import { FileLions } from './FileLions';
|
||||
import { HubCloud } from './HubCloud';
|
||||
import { KinoGer } from './KinoGer';
|
||||
import { Mixdrop } from './Mixdrop';
|
||||
|
|
@ -25,6 +26,7 @@ export const createExtractors = (fetcher: Fetcher): Extractor[] => [
|
|||
new DoodStream(fetcher),
|
||||
new Dropload(fetcher),
|
||||
new Fastream(fetcher),
|
||||
new FileLions(fetcher),
|
||||
new HubCloud(fetcher),
|
||||
new KinoGer(fetcher),
|
||||
new Mixdrop(fetcher),
|
||||
|
|
|
|||
|
|
@ -70,6 +70,7 @@ export interface Meta {
|
|||
bytes?: number | undefined;
|
||||
countryCodes?: CountryCode[];
|
||||
height?: number | undefined;
|
||||
referer?: string | undefined;
|
||||
title?: string | undefined;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ export class StreamResolver {
|
|||
this.logger.info(`${source.id} returned ${sourceResults.length} urls`, ctx);
|
||||
|
||||
const sourceUrlResults = await Promise.all(
|
||||
sourceResults.map(({ url, meta }) => this.extractorRegistry.handle(ctx, url, meta)),
|
||||
sourceResults.map(({ url, meta }) => this.extractorRegistry.handle(ctx, url, { ...meta, referer: source.baseUrl })),
|
||||
);
|
||||
|
||||
urlResults.push(...sourceUrlResults.flat());
|
||||
|
|
|
|||
|
|
@ -28,8 +28,11 @@ export const buildMediaFlowProxyExtractorRedirectUrl = (ctx: Context, host: stri
|
|||
return mediaFlowProxyUrl;
|
||||
};
|
||||
|
||||
export const buildMediaFlowProxyExtractorStreamUrl = async (ctx: Context, fetcher: Fetcher, host: string, url: URL): Promise<URL> => {
|
||||
export const buildMediaFlowProxyExtractorStreamUrl = async (ctx: Context, fetcher: Fetcher, host: string, url: URL, headers: Record<string, string> = {}): Promise<URL> => {
|
||||
const mediaFlowProxyUrl = buildMediaFlowProxyExtractorUrl(ctx, host, url);
|
||||
for (const headerKey in headers) {
|
||||
mediaFlowProxyUrl.searchParams.set('h_' + headerKey.toLowerCase(), headers[headerKey] as string);
|
||||
}
|
||||
|
||||
const extractResult: ExtractResult = JSON.parse(await fetcher.text(ctx, mediaFlowProxyUrl));
|
||||
|
||||
|
|
@ -41,6 +44,9 @@ export const buildMediaFlowProxyExtractorStreamUrl = async (ctx: Context, fetche
|
|||
for (const requestHeadersKey in extractResult.request_headers) {
|
||||
streamUrl.searchParams.append(`h_${requestHeadersKey}`, extractResult.request_headers[requestHeadersKey] as string);
|
||||
}
|
||||
for (const headerKey in headers) {
|
||||
streamUrl.searchParams.set('h_' + headerKey.toLowerCase(), headers[headerKey] as string);
|
||||
}
|
||||
streamUrl.searchParams.append('d', extractResult.destination_url);
|
||||
|
||||
return streamUrl;
|
||||
|
|
|
|||
Loading…
Reference in a new issue