feat(extractor): bring back Fsst
This commit is contained in:
parent
7146c6cf11
commit
e1e8f37862
10 changed files with 331 additions and 5 deletions
16
src/extractor/Fsst.test.ts
Normal file
16
src/extractor/Fsst.test.ts
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
import winston from 'winston';
|
||||
import { createTestContext } from '../test';
|
||||
import { FetcherMock } from '../utils';
|
||||
import { ExtractorRegistry } from './ExtractorRegistry';
|
||||
import { Fsst } from './Fsst';
|
||||
|
||||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new Fsst(new FetcherMock(`${__dirname}/__fixtures__/Fsst`))]);
|
||||
|
||||
const ctx = createTestContext();
|
||||
|
||||
describe('Fsst', () => {
|
||||
test('Wake up Dead Man', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://fsst.online/embed/948429/'))).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
43
src/extractor/Fsst.ts
Normal file
43
src/extractor/Fsst.ts
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
import * as cheerio from 'cheerio';
|
||||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
export class Fsst extends Extractor {
|
||||
public readonly id = 'fsst';
|
||||
|
||||
public readonly label = 'Fsst';
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/fsst/);
|
||||
};
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
const headers = { Referer: meta.referer ?? url.href };
|
||||
|
||||
const html = await this.fetcher.text(ctx, url, { headers, noProxyHeaders: true });
|
||||
|
||||
const $ = cheerio.load(html);
|
||||
const title = $('title').text().trim();
|
||||
|
||||
const filesMatch = html.match(/file:"(.*)"/) as string[];
|
||||
|
||||
return Promise.all(
|
||||
(filesMatch[1] as string).split(',').map(async (fileString) => {
|
||||
const heightAndUrlMatch = fileString.match(/\[?([\d]*)p?]?(.*)/) as string[];
|
||||
const fileHref = heightAndUrlMatch[2] as string;
|
||||
|
||||
return {
|
||||
url: await this.fetcher.getFinalRedirectUrl(ctx, new URL(fileHref), { headers, noProxyHeaders: true }, 1),
|
||||
format: Format.mp4,
|
||||
label: this.label,
|
||||
sourceId: `${this.id}_${meta.countryCodes?.join('_')}`,
|
||||
meta: {
|
||||
...meta,
|
||||
height: parseInt(heightAndUrlMatch[1] as string),
|
||||
title,
|
||||
},
|
||||
};
|
||||
}),
|
||||
);
|
||||
};
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_720p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=6974d60c75ea0485c4f2a71b164a21ce"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_360p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=3ea2409b52380eb78c22c143fa6e27db"}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"server":"nginx","date":"Tue, 06 Jan 2026 15:18:15 GMT","content-type":"text/html; charset=UTF-8","connection":"close","referrer-policy":"strict-origin-when-cross-origin","location":"https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=7cf7fccae0c48291e3452c8ca2277f70"}
|
||||
211
src/extractor/__fixtures__/Fsst/https:fsst.onlineembed948429
generated
Normal file
211
src/extractor/__fixtures__/Fsst/https:fsst.onlineembed948429
generated
Normal file
|
|
@ -0,0 +1,211 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Wake.Up.Dead.Man.A.Knives.Out.Mystery.2025.mkv</title>
|
||||
<script src='/player/player-101224.js' type='text/javascript'></script>
|
||||
<!-- Google tag (gtag.js) -->
|
||||
<script async src="https://www.googletagmanager.com/gtag/js?id=G-CFYS4N19SL"></script>
|
||||
<script>
|
||||
window.dataLayer = window.dataLayer || [];
|
||||
function gtag(){dataLayer.push(arguments);}
|
||||
gtag('js', new Date());
|
||||
|
||||
gtag('config', 'G-CFYS4N19SL', {cookie_flags: 'max-age=7200;secure;samesite=none'});
|
||||
gtag('config', 'G-SZ2D21EHGZ', {cookie_flags: 'max-age=7200;secure;samesite=none'});
|
||||
gtag('config', 'G-7F9RVQ2TM0', {cookie_flags: 'max-age=7200;secure;samesite=none'});
|
||||
gtag('config', 'G-LZP7HENPSC', {cookie_flags: 'max-age=7200;secure;samesite=none'});
|
||||
</script>
|
||||
</head>
|
||||
<body style="margin:0; padding:0; background:#000000; color:#ffffff">
|
||||
<div id="Video948429" style="width:100%; height:100%;"></div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
var isMobile = {
|
||||
Android: function() {
|
||||
return navigator.userAgent.match(/Android/i);
|
||||
},
|
||||
BlackBerry: function() {
|
||||
return navigator.userAgent.match(/BlackBerry/i);
|
||||
},
|
||||
iOS: function() {
|
||||
return navigator.userAgent.match(/iPhone|iPad|iPod/i);
|
||||
},
|
||||
Opera: function() {
|
||||
return navigator.userAgent.match(/Opera Mini/i);
|
||||
},
|
||||
SmartTV: function() {
|
||||
return navigator.userAgent.match(/Apple TV|Tizen|Web0S|WebOS|TSBNetTV|PHILIPSTV|NETFLIX|BRAVIA|Opera TV Store|SmartTV|SmartTv/i);
|
||||
},
|
||||
Windows: function() {
|
||||
return navigator.userAgent.match(/IEMobile/i);
|
||||
},
|
||||
any: function() {
|
||||
return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.SmartTV() || isMobile.Windows());
|
||||
}
|
||||
};
|
||||
if(isMobile.iOS()){
|
||||
var player = new Playerjs({
|
||||
id: 'Video948429',
|
||||
subtitle: "",
|
||||
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
|
||||
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
|
||||
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
|
||||
embed: "https://fsst.online/embed/948429/",
|
||||
default_quality: "360p",
|
||||
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
|
||||
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
|
||||
} else {
|
||||
if(isMobile.Android()){
|
||||
var player = new Playerjs({
|
||||
id: 'Video948429',
|
||||
subtitle: "",
|
||||
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
|
||||
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
|
||||
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
|
||||
embed: "https://fsst.online/embed/948429/",
|
||||
default_quality: "360p",
|
||||
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
|
||||
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
|
||||
} else {
|
||||
if(isMobile.SmartTV()){
|
||||
var player = new Playerjs({
|
||||
id: 'Video948429',
|
||||
subtitle: "",
|
||||
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
|
||||
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
|
||||
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
|
||||
embed: "https://fsst.online/embed/948429/",
|
||||
default_quality: "360p",
|
||||
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
|
||||
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
|
||||
} else {
|
||||
var player = new Playerjs({
|
||||
id: 'Video948429',
|
||||
subtitle: "",
|
||||
poster: 'https://www.secvideo1.online/contents/videos_screenshots/948000/948429/preview.jpg',
|
||||
file:"[360p]https://www.secvideo1.online/get_file/18/5f4c7a9db5fbdfe139db2e22c9c8a2d20cb476bf49/948000/948429/948429_360p.mp4/,[720p]https://www.secvideo1.online/get_file/18/2b29f2b5e347fae9289b47644f3c93e1a94d9c7611/948000/948429/948429_720p.mp4/,[1080p]https://www.secvideo1.online/get_file/18/f4595a22a9b081291cd4107986a6f5e1c7e4ef6d10/948000/948429/948429.mp4/",
|
||||
url: 'https://fsst.online/videos/948429/wake-up-dead-man-a-knives-out-mystery-2025-mkv/',
|
||||
embed: "https://fsst.online/embed/948429/",
|
||||
default_quality: "360p",
|
||||
preroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemf&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemg&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemh&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemi&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemk&p2=jjsh and //adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeml&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemo&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemp&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgems&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgemt&p2=jjsh",
|
||||
pauseroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
postroll: "//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh",
|
||||
midroll:[{time:"50%",vast:"//adx.stack.bidster.net/vast/4e8317ad-ef6e-4880-963c-d698f63e5dd4 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuh&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeui&p2=jjsh or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuj&p2=jjsh or //z.cdn.trafficbass.com/load?o=v&z=1525212045&random=(random) or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeuk&p2=jjsh or //prfctmney.com/alpha/4052 or //yandex.ru/ads/adfox/12359998/getCode?p1=dgeul&p2=jjsh"}], });
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script>
|
||||
function PlayerjsEvents(event,id,info){
|
||||
if(event=="vast_url"){
|
||||
url = info;
|
||||
}
|
||||
if(event=="inited"){
|
||||
console.log("inited");
|
||||
console.log(Math.round(player.api("time")));
|
||||
window.parent.postMessage({
|
||||
event: 'inited',
|
||||
time: Math.round(player.api("time")),
|
||||
}, '*');
|
||||
}
|
||||
if(event=="vast_Impression"){
|
||||
console.log("Impression");
|
||||
console.log(url);
|
||||
yaCounter49597111.reachGoal('vast_impression', {Ads: url.split(/\/+/)[1]});
|
||||
gtag('event', 'ADS_viewed', {
|
||||
'send_to': 'G-LZP7HENPSC',
|
||||
'event_category': 'Video',
|
||||
'event_label': '28214',
|
||||
});
|
||||
gtag('event', 'Vast Impression', {
|
||||
'send_to': 'G-7F9RVQ2TM0',
|
||||
'event_category': 'Video',
|
||||
'event_label': url.split(/\/+/)[1],
|
||||
});
|
||||
}
|
||||
if(event=="start"){
|
||||
console.log("started");
|
||||
console.log(Math.round(player.api("time")));
|
||||
yaCounter49597111.reachGoal('play');
|
||||
gtag('event', 'Video_played', {
|
||||
'send_to': 'G-LZP7HENPSC',
|
||||
'event_category': 'Video',
|
||||
'event_label': '28214',
|
||||
});
|
||||
gtag('event', 'Play', {
|
||||
'send_to': 'G-SZ2D21EHGZ',
|
||||
'event_category': 'Video',
|
||||
'event_label': 'Play',
|
||||
});
|
||||
window.parent.postMessage({
|
||||
event: 'started',
|
||||
time: Math.round(player.api("time")),
|
||||
}, '*');
|
||||
}
|
||||
if(event=="pause"){
|
||||
console.log("paused");
|
||||
console.log(Math.round(player.api("time")));
|
||||
window.parent.postMessage({
|
||||
event: 'paused',
|
||||
time: Math.round(player.api("time")),
|
||||
}, '*');
|
||||
}
|
||||
if(event=="end"){
|
||||
console.log("ended");
|
||||
console.log(Math.round(player.api("time")));
|
||||
window.parent.postMessage({
|
||||
event: 'ended',
|
||||
time: Math.round(player.api("time")),
|
||||
}, '*');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- Yandex.Metrika counter -->
|
||||
<script type="text/javascript" >
|
||||
(function (d, w, c) {
|
||||
(w[c] = w[c] || []).push(function() {
|
||||
try {
|
||||
w.yaCounter49597111 = new Ya.Metrika2({
|
||||
id:49597111,
|
||||
clickmap:true,
|
||||
trackLinks:true,
|
||||
accurateTrackBounce:true
|
||||
});
|
||||
} catch(e) { }
|
||||
});
|
||||
|
||||
var n = d.getElementsByTagName("script")[0],
|
||||
s = d.createElement("script"),
|
||||
f = function () { n.parentNode.insertBefore(s, n); };
|
||||
s.type = "text/javascript";
|
||||
s.async = true;
|
||||
s.src = "https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js";
|
||||
|
||||
if (w.opera == "[object Opera]") {
|
||||
d.addEventListener("DOMContentLoaded", f, false);
|
||||
} else { f(); }
|
||||
})(document, window, "yandex_metrika_callbacks2");
|
||||
</script>
|
||||
<noscript><div><img src="https://mc.yandex.ru/watch/49597111" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
|
||||
<!-- /Yandex.Metrika counter -->
|
||||
<!-- https://fsst.online/embed/948429/ -->
|
||||
<!-- 2 -->
|
||||
<!-- -->
|
||||
|
||||
</body>
|
||||
</html>
|
||||
42
src/extractor/__snapshots__/Fsst.test.ts.snap
Normal file
42
src/extractor/__snapshots__/Fsst.test.ts.snap
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||
|
||||
exports[`Fsst Wake up Dead Man 1`] = `
|
||||
[
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "Fsst",
|
||||
"meta": {
|
||||
"countryCodes": [],
|
||||
"extractorId": "fsst",
|
||||
"height": 360,
|
||||
"title": "Wake.Up.Dead.Man.A.Knives.Out.Mystery.2025.mkv",
|
||||
},
|
||||
"sourceId": "fsst_",
|
||||
"url": "https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_360p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=3ea2409b52380eb78c22c143fa6e27db",
|
||||
},
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "Fsst",
|
||||
"meta": {
|
||||
"countryCodes": [],
|
||||
"extractorId": "fsst",
|
||||
"height": 720,
|
||||
"title": "Wake.Up.Dead.Man.A.Knives.Out.Mystery.2025.mkv",
|
||||
},
|
||||
"sourceId": "fsst_",
|
||||
"url": "https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429_720p.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=6974d60c75ea0485c4f2a71b164a21ce",
|
||||
},
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "Fsst",
|
||||
"meta": {
|
||||
"countryCodes": [],
|
||||
"extractorId": "fsst",
|
||||
"height": 1080,
|
||||
"title": "Wake.Up.Dead.Man.A.Knives.Out.Mystery.2025.mkv",
|
||||
},
|
||||
"sourceId": "fsst_",
|
||||
"url": "https://a41.filevideo1.com/remote_control.php?time=1767712695&cv=a5df8582e6558fcf6bc25d7f02e5e646&lr=0&cv2=81173262e5b3e34fa9ebf67326ca98a5&file=%2Fvideos%2F948000%2F948429%2F948429.mp4&cv3=2d8ee1a66c0ca6ce75d84c67a50a70e9&cv4=7cf7fccae0c48291e3452c8ca2277f70",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
|
@ -6,6 +6,7 @@ import { Extractor } from './Extractor';
|
|||
import { Fastream } from './Fastream';
|
||||
import { FileLions } from './FileLions';
|
||||
import { FileMoon } from './FileMoon';
|
||||
import { Fsst } from './Fsst';
|
||||
import { HubCloud } from './HubCloud';
|
||||
import { KinoGer } from './KinoGer';
|
||||
import { LuluStream } from './LuluStream';
|
||||
|
|
@ -32,6 +33,7 @@ export const createExtractors = (fetcher: Fetcher): Extractor[] => {
|
|||
new Fastream(fetcher),
|
||||
new FileLions(fetcher),
|
||||
new FileMoon(fetcher),
|
||||
new Fsst(fetcher),
|
||||
new HubCloud(fetcher),
|
||||
new KinoGer(fetcher),
|
||||
new LuluStream(fetcher),
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ type ProxyConfig = Pick<AxiosRequestConfig, 'httpAgent' | 'httpsAgent' | 'proxy'
|
|||
|
||||
export type CustomRequestConfig = AxiosRequestConfig & {
|
||||
minCacheTtl?: number;
|
||||
noProxyHeaders?: boolean;
|
||||
queueLimit?: number;
|
||||
queueTimeout?: number;
|
||||
timeout?: number;
|
||||
|
|
@ -92,12 +93,16 @@ export class Fetcher {
|
|||
return (await this.queuedFetch(ctx, url, { ...requestConfig, method: 'HEAD' })).headers;
|
||||
};
|
||||
|
||||
public async getFinalRedirectUrl(ctx: Context, url: URL, requestConfig?: CustomRequestConfig): Promise<URL> {
|
||||
public async getFinalRedirectUrl(ctx: Context, url: URL, requestConfig?: CustomRequestConfig, maxCount?: number, count?: number): Promise<URL> {
|
||||
const newRequestConfig = { ...requestConfig, method: 'HEAD', maxRedirects: 0 };
|
||||
|
||||
if (count && maxCount && count >= maxCount) {
|
||||
return url;
|
||||
}
|
||||
|
||||
const response = await this.queuedFetch(ctx, url, newRequestConfig);
|
||||
if (response.status >= 300 && response.status < 400) {
|
||||
return await this.getFinalRedirectUrl(ctx, new URL(response.headers['location']), newRequestConfig);
|
||||
return await this.getFinalRedirectUrl(ctx, new URL(response.headers['location']), newRequestConfig, maxCount, (count ?? 0) + 1);
|
||||
}
|
||||
|
||||
return url;
|
||||
|
|
@ -171,7 +176,7 @@ export class Fetcher {
|
|||
'User-Agent': this.hostUserAgentMap.get(url.host) ?? 'Mozilla',
|
||||
...(hostUserAgent && { 'User-Agent': hostUserAgent }),
|
||||
...(cookieString && { Cookie: cookieString }),
|
||||
...(ctx.ip && {
|
||||
...(ctx.ip && !requestConfig?.noProxyHeaders && {
|
||||
'Forwarded': `by=unknown;for=${ctx.ip};host=${url.host};proto=${forwardedProto}`,
|
||||
'X-Forwarded-For': ctx.ip,
|
||||
'X-Forwarded-Host': url.host,
|
||||
|
|
|
|||
|
|
@ -51,12 +51,16 @@ export class FetcherMock extends Fetcher {
|
|||
return (await this.fetchInternal(path, ctx, url, { ...init, method: 'HEAD' })).headers;
|
||||
};
|
||||
|
||||
public override async getFinalRedirectUrl(ctx: Context, url: URL, requestConfig?: CustomRequestConfig): Promise<URL> {
|
||||
public override async getFinalRedirectUrl(ctx: Context, url: URL, requestConfig?: CustomRequestConfig, maxCount?: number, count?: number): Promise<URL> {
|
||||
const newRequestConfig = { ...requestConfig, method: 'HEAD', maxRedirects: 0 };
|
||||
|
||||
if (count && maxCount && count >= maxCount) {
|
||||
return url;
|
||||
}
|
||||
|
||||
const response = await this.fetch(ctx, url, newRequestConfig);
|
||||
if (response.headers['location']) {
|
||||
return await this.getFinalRedirectUrl(ctx, new URL(response.headers['location']), newRequestConfig);
|
||||
return await this.getFinalRedirectUrl(ctx, new URL(response.headers['location']), newRequestConfig, maxCount, (count ?? 0) + 1);
|
||||
}
|
||||
|
||||
return url;
|
||||
|
|
|
|||
Loading…
Reference in a new issue