chore: remove XPrime
backend API responses are encrypted and use webassembly for decryption
This commit is contained in:
parent
1a2b40d6f2
commit
6d5a511cb4
21 changed files with 2 additions and 287 deletions
|
|
@ -1,28 +0,0 @@
|
|||
import winston from 'winston';
|
||||
import { createTestContext } from '../test';
|
||||
import { FetcherMock } from '../utils';
|
||||
import { ExtractorRegistry } from './ExtractorRegistry';
|
||||
import { XPrime } from './XPrime';
|
||||
|
||||
const logger = winston.createLogger({ transports: [new winston.transports.Console({ level: 'nope' })] });
|
||||
const extractorRegistry = new ExtractorRegistry(logger, [new XPrime(new FetcherMock(`${__dirname}/__fixtures__/XPrime`))]);
|
||||
|
||||
const ctx = createTestContext();
|
||||
|
||||
describe('XPrime', () => {
|
||||
test('unknown backend is ignored', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/unknown?name=Superman&year=2025&id=1061474&imdbId=tt5950044'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('primebox Superman', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Superman&year=2025&id=1061474&imdbId=tt5950044'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('primebox Alien: Earth', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Alien%3A%20Earth&year=2025&id=157239&imdb=tt13623632&season=1&episode=1'))).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('primebox not found', async () => {
|
||||
expect(await extractorRegistry.handle(ctx, new URL('https://backend.xprime.tv/primebox?name=Jurassic%20World%20Rebirth&year=2025'))).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
import { Context, Format, Meta, UrlResult } from '../types';
|
||||
import { guessSizeFromMp4 } from '../utils/size';
|
||||
import { Extractor } from './Extractor';
|
||||
|
||||
interface XPrimePrimeboxResponsePartial {
|
||||
streams: Record<string, string>;
|
||||
series_info?: {
|
||||
episode: number;
|
||||
season: number;
|
||||
title: string;
|
||||
year: string;
|
||||
};
|
||||
title?: string;
|
||||
}
|
||||
|
||||
export class XPrime extends Extractor {
|
||||
public readonly id = 'xprime';
|
||||
|
||||
public readonly label = 'XPrime';
|
||||
|
||||
public override readonly ttl: number = 21600000; // 6h
|
||||
|
||||
public supports(_ctx: Context, url: URL): boolean {
|
||||
return null !== url.host.match(/xprime/);
|
||||
}
|
||||
|
||||
protected async extractInternal(ctx: Context, url: URL, meta: Meta): Promise<UrlResult[]> {
|
||||
const urlResults: UrlResult[] = [];
|
||||
|
||||
const headers = {
|
||||
Referer: url.protocol + '//' + url.hostname.split('.').slice(-2).join('.'), // Strip subdomains
|
||||
};
|
||||
|
||||
if (url.href.includes('primebox')) {
|
||||
const jsonResponse = JSON.parse(await this.fetcher.text(ctx, url)) as XPrimePrimeboxResponsePartial;
|
||||
|
||||
for (const [resolution, stream] of Object.entries(jsonResponse.streams)) {
|
||||
const url = new URL(stream);
|
||||
const title = jsonResponse.series_info
|
||||
? `${jsonResponse.series_info.title} ${jsonResponse.series_info.season}x${jsonResponse.series_info.episode} (${jsonResponse.series_info.year})`
|
||||
: jsonResponse.title;
|
||||
|
||||
urlResults.push({
|
||||
url,
|
||||
format: Format.mp4,
|
||||
label: `${this.label} Primebox`,
|
||||
sourceId: `${this.id}_primebox_${meta.countryCodes?.join('_')}`,
|
||||
ttl: this.ttl,
|
||||
meta: {
|
||||
...meta,
|
||||
bytes: await guessSizeFromMp4(ctx, this.fetcher, url, { headers, minCacheTtl: this.ttl }),
|
||||
height: parseInt(resolution),
|
||||
title,
|
||||
},
|
||||
requestHeaders: headers,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return urlResults;
|
||||
};
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"accept-ranges":"bytes","access-control-allow-headers":"*","access-control-allow-origin":"https://xprime.tv","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-ray":"97d1622e3ad44d26-FRA","connection":"close","content-length":"896638128","content-type":"video/mp4","date":"Wed, 10 Sep 2025 19:38:03 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=FzrMqwYe6qwzeh76DC9F4xwUbJJIwR3NLN%2BXEdKyul1Lv6zBocsQrsZtj%2F3mRAtOkr1R3fTuSSVikTLF3GqLes6idwSj2KRFSNQYB2qg%2BaS72v2SjbfnuEWL0eroypJ2346tnFninrVROOjBDB4vkwOI2e0tOyQ%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=0ab2b8c6b809570f&ts=85&x=0\"","vary":"Accept-Encoding"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"accept-ranges":"bytes","access-control-allow-headers":"*","access-control-allow-origin":"https://xprime.tv","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-ray":"97d1622daa5b4d26-FRA","connection":"close","content-length":"401394599","content-type":"video/mp4","date":"Wed, 10 Sep 2025 19:38:03 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=gs1y2VcEagyahSUbca2EMr5ZaVaQapIixbj3Mcgu4FGR8iUd5Sc0z8rXXo%2B2gVs6VpYrYqpTwv9ErfpTGbPrUc1Sc%2FYWrqfvE49d3MXKzCXu8LiDLj6Ap1q732n8DNyM8CUnpTt5559%2Bs1OsGhHzsfUqo646vhk%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=ee1864c7dc839181&ts=77&x=0\"","vary":"Accept-Encoding"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"accept-ranges":"bytes","access-control-allow-headers":"*","access-control-allow-origin":"https://xprime.tv","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-ray":"97d1622f5bbf4d26-FRA","connection":"close","content-length":"871281904","content-type":"video/mp4","date":"Wed, 10 Sep 2025 19:38:04 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=KlG4q7%2FQZ7c2zxVghnbfh2TtHUadFAQfG%2F2MRX9YZS6lceSdjj93MyYssn7%2FJcnAWVtcR%2BlQ%2FuQHz7lp0PW0%2B1WIfBXn5mbLxMotY7mWWBS58JCSTZlDc2huJ8MZUuFCQiLLRO2o3IJhPCOVK%2FtkTrVqthc57AY%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=32fc89755f2b0f98&ts=110&x=0\"","vary":"Accept-Encoding"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"accept-ranges":"bytes","access-control-allow-headers":"*","access-control-allow-origin":"https://xprime.tv","alt-svc":"h3=\":443\"; ma=86400","cache-control":"public, max-age=31536000, immutable","cdn-cache-control":"public, max-age=31536000, immutable","cf-ray":"97d162302c654d26-FRA","connection":"close","content-length":"420170402","content-type":"video/mp4","date":"Wed, 10 Sep 2025 19:38:04 GMT","nel":"{\"success_fraction\":0,\"report_to\":\"cf-nel\",\"max_age\":604800}","report-to":"{\"endpoints\":[{\"url\":\"https:\\/\\/a.nel.cloudflare.com\\/report\\/v4?s=fmqjV4Q2%2FjwPS%2F78MMmXHqgH9ibjI9QnwLkXiaGHmstwNDlLe0qOxfoKb2DvobWxarVPzYAxoyB3GdKKZ3GO%2B4KnNX5MHkDVgVFLVhUB04lqEHJTHwb4aG34yMdI5uziLuLxjz2t7BIprl4UFt%2BOinEinax4WH8%3D\"}],\"group\":\"cf-nel\",\"max_age\":604800}","server":"cloudflare","server-timing":"cfL4;desc=\"?proto=TCP&rtt=0&min_rtt=0&rtt_var=0&sent=0&recv=0&lost=0&retrans=0&sent_bytes=0&recv_bytes=0&delivery_rate=0&cwnd=0&unsent_bytes=0&cid=935db57878fc96c4&ts=62&x=0\"","vary":"Accept-Encoding"}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1 +0,0 @@
|
|||
{"available_qualities":[],"has_subtitles":false,"message":"No exact match found for Jurassic World Rebirth (2025)","status":"not_found","streams":{},"subtitles":[]}
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,79 +0,0 @@
|
|||
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||
|
||||
exports[`XPrime primebox Alien: Earth 1`] = `
|
||||
[
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "XPrime Primebox",
|
||||
"meta": {
|
||||
"bytes": 871281904,
|
||||
"countryCodes": [],
|
||||
"height": 1080,
|
||||
"title": "Alien: Earth 1x1 (2025)",
|
||||
},
|
||||
"requestHeaders": {
|
||||
"Referer": "https://xprime.tv",
|
||||
},
|
||||
"sourceId": "xprime_primebox_",
|
||||
"ttl": 21600000,
|
||||
"url": "https://oca.flutch05.workers.dev/?v=mOwlY2kjThQa8NCWs32mchoiQHzclPNneNoDGQPimK%2B3Bp%2F1cqnza7Leu1hSMqLl6oRqOYEWTcx2WwszBsdBABFyqhRv8OpdZrGuGaoeNaiBFA5Ugx5%2BfwVDxx8kgPmu9hg8UjpwPo4B49s92Z%2BC5%2FfUJFGbJOp60JaP5NFEbfaIIdgqnUc0xUrUBfZPTOW%2FYAmi4D7C86WqUnPjCOh5RMYV3tWbwJ2LaZfJw%2Bfe7PAF9En4SRvsYmKGt8w6VCWzuxCCtpmRQr1E8PILpi%2Fr%2BkZOXtm%2B01mGCzY5Cv0OYAcVdqqtIylF%2FBQDbzxOuLnoXVz1QWSrroL1OiZ7dOT6TUilA5v%2F8T5ujpRy%2FDgwOvyYav%2BoiZud%2FOiY4eL%2F9UckLsgka85QlOmvvnXVzsvg%2BX1u4R02UWmJ6xlHGp5pTkRImbhERu0fJmGOjtrgDsjKy7DPVTHWPHr83nJC8dnDpw%3D%3D&headers=%7B%22Referer%22%3A%22https%3A%2F%2Frivestream.org%22%2C%22Origin%22%3A%22https%3A%2F%2Frivestream.org%22%7D&safe",
|
||||
},
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "XPrime Primebox",
|
||||
"meta": {
|
||||
"bytes": 420170402,
|
||||
"countryCodes": [],
|
||||
"height": 480,
|
||||
"title": "Alien: Earth 1x1 (2025)",
|
||||
},
|
||||
"requestHeaders": {
|
||||
"Referer": "https://xprime.tv",
|
||||
},
|
||||
"sourceId": "xprime_primebox_",
|
||||
"ttl": 21600000,
|
||||
"url": "https://oca.flutch05.workers.dev/?v=67b6sL674qhHEUcDMks3X12qkFala9ovis0QX%2F35qibiyzDOJ8IWc8yIS6kHsxUNW1x9MCx3DC79NiJLW7S86tNy94b7iW7Ec8tOalViCMsASELZnMo9lTzq08PXalRsC6E78VInBlJW5L50sTXmzBS83meFSenCqIO1VS70n1p9Q1tt%2B7frpHSdfvuQV%2FrZiWKCPsHS%2F8b3qC630HIopHQfd9tvdzCHKgtTLXJUKBdz%2BYAQBeD2T%2FovyhHLZDawtlOjqBC6w19xw1m1%2FZsVymS%2FJPFoNgCtSQf47iSKVdeDOEyLyD8vl675LxaQB0LXgjJL1JbRhqR6IbPTvNfDK1cWAeGZZybsxWM4t%2FC9bOZZAmhT3At7Vm3WFYRwWawK2YiV3Rl84umGFELYq%2BTYUstaDm6EJnu%2F8S56A92ELLJ7beFzfHjdGkEuxjhVF6me7v3awmcysmGfAw%3D%3D&headers=%7B%22Referer%22%3A%22https%3A%2F%2Frivestream.org%22%2C%22Origin%22%3A%22https%3A%2F%2Frivestream.org%22%7D&safe",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`XPrime primebox Superman 1`] = `
|
||||
[
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "XPrime Primebox",
|
||||
"meta": {
|
||||
"bytes": 401394599,
|
||||
"countryCodes": [],
|
||||
"height": 480,
|
||||
"title": "Superman",
|
||||
},
|
||||
"requestHeaders": {
|
||||
"Referer": "https://xprime.tv",
|
||||
},
|
||||
"sourceId": "xprime_primebox_",
|
||||
"ttl": 21600000,
|
||||
"url": "https://oca.flutch05.workers.dev/?v=AM%2FpjvLx5HEQnDENoM67g5My54wbHl3T7s3ATEfiGXU8bibIkxZ0FXSYF3rjcs1EhAuU4hj%2BgV7pVNvSPKcMn6CEJsOqF9uhHXvgLwZBpBXgh15P2EBL6V01xWTYjRlxBBQ%2B7cCae4ZM4xDY1A7AQ9Ss7nTSydP8CBMpQSW7f0ia1kHvfSr9MGtMuXQfQbPdBmgPGwONotzQSwoqfTvXoKvYV2KO00wc%2BMdYo0AIpsvQ%2B9ATjOar0kplFsIoNMBuZdbFsXn3AMVmEvUmGJ8s6O0dwZsa%2F4k3j0Id%2F3egMnl2uHyFwP3PFIZUCk8kmJq%2FL4DscSij9M9%2B%2F4dbRCN0EV5bTMHmTAWmB%2FZVOkLQGNQyMKCV1m9Ynodh%2F%2BDgkVXd%2FvekQ%2BZLdGL7rhD9s6%2BeRo3FrpySv%2BMaChLwF%2FvA0D%2FASO3jxZ533tWWBWZMIxeVfb5GvowKNuZVMYEmzCdceQ%3D%3D&headers=%7B%22Referer%22%3A%22https%3A%2F%2Frivestream.org%22%2C%22Origin%22%3A%22https%3A%2F%2Frivestream.org%22%7D&safe",
|
||||
},
|
||||
{
|
||||
"format": "mp4",
|
||||
"label": "XPrime Primebox",
|
||||
"meta": {
|
||||
"bytes": 896638128,
|
||||
"countryCodes": [],
|
||||
"height": 720,
|
||||
"title": "Superman",
|
||||
},
|
||||
"requestHeaders": {
|
||||
"Referer": "https://xprime.tv",
|
||||
},
|
||||
"sourceId": "xprime_primebox_",
|
||||
"ttl": 21600000,
|
||||
"url": "https://oca.flutch05.workers.dev/?v=UNkCgqoMa91gkb8oj4GjENnh0sf4IVcpm0knnDuHACk2rVfVyotHGJiSuTGoCXPtwXIk0rYh8mmEQpHKklZBH%2FPWKk6OPytymZB4rTF6CtFCTIu8uvFChPm%2BidnA9yIXdehDBKNV37LQY9jBze6CYdOuHA7NFEAAwbp4wi%2FzuCkLCEnvSrkqUa8n%2FxJpjjz3ftZjR3jtrqFPU3r7kyGinkMYYbGZIHBDLM3r%2F72mpuzqpXrrlUig%2FEPOkUKPoUWJEAbR34TRDi1M1S1hSLUswluTSeN5BRt5SQfBZU6RA6f4Wkd5x0ua5yF1z69qfoBluu%2BEjbd83BRb%2Fo8p%2B8oMKeNJkv54Z48dmKXQDmAteRWF6uwPRmpIQfjggl%2B%2Bagp17nXhjufCgz23EY11qBR5%2B3AN074A016DbiGv4sXA%2FA2fKQ8I5NBFCCOsFqv4b03PVJCLoMPEMHY7eFfNF3N%2BsQ%3D%3D&headers=%7B%22Referer%22%3A%22https%3A%2F%2Frivestream.org%22%2C%22Origin%22%3A%22https%3A%2F%2Frivestream.org%22%7D&safe",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`XPrime primebox not found 1`] = `[]`;
|
||||
|
||||
exports[`XPrime unknown backend is ignored 1`] = `[]`;
|
||||
|
|
@ -16,7 +16,6 @@ import { SuperVideo } from './SuperVideo';
|
|||
import { Uqload } from './Uqload';
|
||||
import { VidSrc } from './VidSrc';
|
||||
import { VixSrc } from './VixSrc';
|
||||
import { XPrime } from './XPrime';
|
||||
import { YouTube } from './YouTube';
|
||||
|
||||
export * from './Extractor';
|
||||
|
|
@ -41,7 +40,6 @@ export const createExtractors = (fetcher: Fetcher): Extractor[] => {
|
|||
new Uqload(fetcher),
|
||||
new VidSrc(fetcher, ['in', 'net', 'xyz', 'io', 'vc']), // https://vidsrc.domains/
|
||||
new VixSrc(fetcher),
|
||||
new XPrime(fetcher),
|
||||
new YouTube(fetcher),
|
||||
new ExternalUrl(fetcher), // fallback extractor which must come last
|
||||
].filter(extractor => !disabledExtractors.includes(extractor.id));
|
||||
|
|
|
|||
|
|
@ -8,7 +8,6 @@ import { createSources, Source } from './source';
|
|||
import { HomeCine } from './source/HomeCine';
|
||||
import { MeineCloud } from './source/MeineCloud';
|
||||
import { MostraGuarda } from './source/MostraGuarda';
|
||||
import { XPrime } from './source/XPrime';
|
||||
import { contextFromRequestAndResponse, envGet, envIsProd, Fetcher, StreamResolver } from './utils';
|
||||
|
||||
if (envIsProd()) {
|
||||
|
|
@ -82,7 +81,6 @@ addon.get('/live', async (req: Request, res: Response) => {
|
|||
new HomeCine(fetcher),
|
||||
new MeineCloud(fetcher),
|
||||
new MostraGuarda(fetcher),
|
||||
new XPrime(fetcher),
|
||||
];
|
||||
const hrefs = [
|
||||
...sources.map(source => source.baseUrl),
|
||||
|
|
|
|||
|
|
@ -1,23 +0,0 @@
|
|||
import { createTestContext } from '../test';
|
||||
import { FetcherMock, TmdbId } from '../utils';
|
||||
import { XPrime } from './XPrime';
|
||||
|
||||
const ctx = createTestContext();
|
||||
|
||||
describe('XPrime', () => {
|
||||
let source: XPrime;
|
||||
|
||||
beforeEach(() => {
|
||||
source = new XPrime(new FetcherMock(`${__dirname}/__fixtures__/XPrime`));
|
||||
});
|
||||
|
||||
test('handle alien: earth 1x1', async () => {
|
||||
const streams = await source.handle(ctx, 'series', new TmdbId(157239, 1, 1));
|
||||
expect(streams).toMatchSnapshot();
|
||||
});
|
||||
|
||||
test('handle superman', async () => {
|
||||
const streams = await source.handle(ctx, 'series', new TmdbId(1061474, undefined, undefined));
|
||||
expect(streams).toMatchSnapshot();
|
||||
});
|
||||
});
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
import { ContentType } from 'stremio-addon-sdk';
|
||||
import { Context, CountryCode } from '../types';
|
||||
import { Fetcher, getImdbId, getTmdbId, getTmdbNameAndYear, Id } from '../utils';
|
||||
import { Source, SourceResult } from './Source';
|
||||
|
||||
export class XPrime extends Source {
|
||||
public readonly id = 'xprime';
|
||||
|
||||
public readonly label = 'XPrime';
|
||||
|
||||
public readonly contentTypes: ContentType[] = ['movie', 'series'];
|
||||
|
||||
public readonly countryCodes: CountryCode[] = [CountryCode.en];
|
||||
|
||||
public readonly baseUrl = 'https://backend.xprime.tv';
|
||||
|
||||
private readonly fetcher: Fetcher;
|
||||
|
||||
public constructor(fetcher: Fetcher) {
|
||||
super();
|
||||
|
||||
this.fetcher = fetcher;
|
||||
}
|
||||
|
||||
public async handleInternal(ctx: Context, _type: string, id: Id): Promise<SourceResult[]> {
|
||||
const imdbId = await getImdbId(ctx, this.fetcher, id);
|
||||
const tmdbId = await getTmdbId(ctx, this.fetcher, id);
|
||||
|
||||
const [name, year] = await getTmdbNameAndYear(ctx, this.fetcher, tmdbId);
|
||||
|
||||
const servers = ['primebox'];
|
||||
|
||||
return servers.map((server) => {
|
||||
const url = new URL(`/${server}?name=${encodeURIComponent(name)}&year=${year}&id=${tmdbId.id}&imdbId=${imdbId.id}`, this.baseUrl);
|
||||
if (tmdbId.season) {
|
||||
url.searchParams.set('season', `${tmdbId.season}`);
|
||||
url.searchParams.set('episode', `${tmdbId.episode}`);
|
||||
}
|
||||
|
||||
const title = tmdbId.season
|
||||
? `${name} ${tmdbId.season}x${tmdbId.episode}`
|
||||
: `${name} (${year})`;
|
||||
|
||||
return { url, meta: { countryCodes: [CountryCode.en], title } };
|
||||
});
|
||||
};
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"adult":false,"backdrop_path":"/eU7IfdWq8KQy0oNd4kKXS0QUR08.jpg","belongs_to_collection":null,"budget":225000000,"genres":[{"id":878,"name":"Science Fiction"},{"id":12,"name":"Adventure"},{"id":28,"name":"Action"}],"homepage":"https://www.superman.com","id":1061474,"imdb_id":"tt5950044","origin_country":["US"],"original_language":"en","original_title":"Superman","overview":"Superman, a journalist in Metropolis, embarks on a journey to reconcile his Kryptonian heritage with his human upbringing as Clark Kent.","popularity":168.8676,"poster_path":"/ombsmhYUqR4qqOLOxAyr5V8hbyv.jpg","production_companies":[{"id":184898,"logo_path":"/2Z2hiM1ERqFOWRxNxWoJZ8lTxhb.png","name":"DC Studios","origin_country":"US"},{"id":94218,"logo_path":"/kxuhS8wyKtVprOn5nckdHyNuSg1.png","name":"Troll Court Entertainment","origin_country":"US"},{"id":11565,"logo_path":"/odU3l6csuBmXUrzFm6araUgEUHQ.png","name":"The Safran Company","origin_country":"US"},{"id":216687,"logo_path":"/kKVYqekveOvLK1IgqdJojLjQvtu.png","name":"Domain Entertainment","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"release_date":"2025-07-09","revenue":581086143,"runtime":130,"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Released","tagline":"Look up.","title":"Superman","video":false,"vote_average":7.7,"vote_count":1684}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"id":1061474,"imdb_id":"tt5950044","wikidata_id":"Q116547790","facebook_id":"superman","instagram_id":"superman","twitter_id":"Superman"}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"adult":false,"backdrop_path":"/25g7mthXoJFcNZhAKz0evk17Bsx.jpg","created_by":[{"id":202816,"credit_id":"620bdfc73e01ea002b2f90b1","name":"Noah Hawley","original_name":"Noah Hawley","gender":2,"profile_path":"/pxVP1lywEBA9y8x5Xe3kM7m4ai3.jpg"}],"episode_run_time":[],"first_air_date":"2025-08-12","genres":[{"id":10765,"name":"Sci-Fi & Fantasy"},{"id":18,"name":"Drama"}],"homepage":"https://www.fxnetworks.com/shows/alien-earth","id":157239,"in_production":true,"languages":["en"],"last_air_date":"2025-08-12","last_episode_to_air":{"id":6231083,"name":"Mr. October","overview":"Tensions rise between rival corporations, a reunion takes place, and a secret is revealed.","vote_average":8.5,"vote_count":10,"air_date":"2025-08-12","episode_number":2,"episode_type":"standard","production_code":"XWYV1002","runtime":56,"season_number":1,"show_id":157239,"still_path":"/hZclNGZx4pjOx6MNdJfTZid113f.jpg"},"name":"Alien: Earth","next_episode_to_air":{"id":6231084,"name":"Metamorphosis","overview":"The team returns home with unexpected cargo. An unsettling experiment occurs, and a new talent is discovered.","vote_average":0.0,"vote_count":0,"air_date":"2025-08-19","episode_number":3,"episode_type":"standard","production_code":"","runtime":54,"season_number":1,"show_id":157239,"still_path":null},"networks":[{"id":88,"logo_path":"/aexGjtcs42DgRtZh7zOxayiry4J.png","name":"FX","origin_country":"US"},{"id":453,"logo_path":"/pqUTCleNUiTLAVlelGxUgWn1ELh.png","name":"Hulu","origin_country":"US"}],"number_of_episodes":8,"number_of_seasons":1,"origin_country":["US"],"original_language":"en","original_name":"Alien: Earth","overview":"When the mysterious deep space research vessel USCSS Maginot crash-lands on Earth, Wendy and a ragtag group of tactical soldiers make a fateful discovery that puts them face-to-face with the planet's greatest threat.","popularity":395.6075,"poster_path":"/yueXS3q8BtoWekcHOATFHicLl3e.jpg","production_companies":[{"id":15990,"logo_path":"/5cT4zwHA66uNAr2p3CcBDLddXu2.png","name":"FX Productions","origin_country":"US"},{"id":221347,"logo_path":"/6Ry6uNBaa0IbbSs1XYIgX5DkA9r.png","name":"Scott Free Productions","origin_country":"US"},{"id":20814,"logo_path":null,"name":"26 Keys Productions","origin_country":"US"}],"production_countries":[{"iso_3166_1":"US","name":"United States of America"}],"seasons":[{"air_date":null,"episode_count":2,"id":469846,"name":"Specials","overview":"","poster_path":null,"season_number":0,"vote_average":0.0},{"air_date":"2025-08-12","episode_count":8,"id":243129,"name":"Season 1","overview":"As members of the crash recovery crew search for survivors among the wreckage of a mysterious crashed space vessel, they encounter mysterious predatory life forms more terrifying than they could have ever imagined.With this new threat unlocked, the search crew must fight for survival and what they choose to do with this discovery could change planet Earth as they know it.","poster_path":"/dJ7lUdzZ98AlhZ38BpfG6jy3UDa.jpg","season_number":1,"vote_average":8.3}],"spoken_languages":[{"english_name":"English","iso_639_1":"en","name":"English"}],"status":"Returning Series","tagline":"We were safer in space.","type":"Scripted","vote_average":8.26,"vote_count":96}
|
||||
|
|
@ -1 +0,0 @@
|
|||
{"id":157239,"imdb_id":"tt13623632","freebase_mid":null,"freebase_id":null,"tvdb_id":458912,"tvrage_id":null,"wikidata_id":"Q116200246","facebook_id":"alienearthfx","instagram_id":"alienearthfx","twitter_id":null}
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||
|
||||
exports[`XPrime handle alien: earth 1x1 1`] = `
|
||||
[
|
||||
{
|
||||
"meta": {
|
||||
"countryCodes": [
|
||||
"en",
|
||||
],
|
||||
"title": "Alien: Earth 1x1",
|
||||
},
|
||||
"url": "https://backend.xprime.tv/primebox?name=Alien%3A+Earth&year=2025&id=157239&imdbId=tt13623632&season=1&episode=1",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
||||
exports[`XPrime handle superman 1`] = `
|
||||
[
|
||||
{
|
||||
"meta": {
|
||||
"countryCodes": [
|
||||
"en",
|
||||
],
|
||||
"title": "Superman (2025)",
|
||||
},
|
||||
"url": "https://backend.xprime.tv/primebox?name=Superman&year=2025&id=1061474&imdbId=tt5950044",
|
||||
},
|
||||
]
|
||||
`;
|
||||
|
|
@ -18,7 +18,6 @@ import { StreamKiste } from './StreamKiste';
|
|||
import { VerHdLink } from './VerHdLink';
|
||||
import { VidSrc } from './VidSrc';
|
||||
import { VixSrc } from './VixSrc';
|
||||
import { XPrime } from './XPrime';
|
||||
|
||||
export * from './Source';
|
||||
|
||||
|
|
@ -33,7 +32,6 @@ export const createSources = (fetcher: Fetcher): Source[] => {
|
|||
new PrimeWire(fetcher),
|
||||
// new Soaper(fetcher), // "temporarily" rate-limited for over a week
|
||||
new VidSrc(fetcher),
|
||||
new XPrime(fetcher),
|
||||
// ES / MX
|
||||
new CineHDPlus(fetcher),
|
||||
new Cuevana(fetcher),
|
||||
|
|
|
|||
|
|
@ -21,7 +21,7 @@ exports[`buildManifest default manifest 1`] = `
|
|||
},
|
||||
{
|
||||
"key": "en",
|
||||
"title": "English 🇺🇸 (PrimeWire, VidSrc, XPrime)",
|
||||
"title": "English 🇺🇸 (PrimeWire, VidSrc)",
|
||||
"type": "checkbox",
|
||||
},
|
||||
{
|
||||
|
|
@ -82,7 +82,7 @@ exports[`buildManifest default manifest 1`] = `
|
|||
|
||||
Supported languages: German, English, Castilian Spanish, French, Italian, Latin American Spanish
|
||||
|
||||
Supported sources: 4KHDHub, VixSrc, PrimeWire, VidSrc, XPrime, CineHDPlus, Cuevana, HomeCine, VerHdLink, Einschalten, KinoGer, MegaKino, MeineCloud, StreamKiste, Frembed, FrenchCloud, Movix, Eurostreaming, MostraGuarda
|
||||
Supported sources: 4KHDHub, VixSrc, PrimeWire, VidSrc, CineHDPlus, Cuevana, HomeCine, VerHdLink, Einschalten, KinoGer, MegaKino, MeineCloud, StreamKiste, Frembed, FrenchCloud, Movix, Eurostreaming, MostraGuarda
|
||||
|
||||
Supported extractors: ",
|
||||
"id": "webstreamr",
|
||||
|
|
|
|||
Loading…
Reference in a new issue