chore: remove XPrime

backend API responses are encrypted and use webassembly for decryption
This commit is contained in:
WebStreamr 2025-09-22 09:30:14 +00:00
parent 1a2b40d6f2
commit 6d5a511cb4
No known key found for this signature in database
21 changed files with 2 additions and 287 deletions

View file

@ -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();
});
});

View file

@ -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;
};
}

View file

@ -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"}

View file

@ -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"}

View file

@ -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"}

View file

@ -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"}

View file

@ -1 +0,0 @@
{"available_qualities":[],"has_subtitles":false,"message":"No exact match found for Jurassic World Rebirth (2025)","status":"not_found","streams":{},"subtitles":[]}

View file

@ -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`] = `[]`;

View file

@ -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));

View file

@ -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),

View file

@ -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();
});
});

View file

@ -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 } };
});
};
}

View file

@ -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}

View file

@ -1 +0,0 @@
{"id":1061474,"imdb_id":"tt5950044","wikidata_id":"Q116547790","facebook_id":"superman","instagram_id":"superman","twitter_id":"Superman"}

View file

@ -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}

View file

@ -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}

View file

@ -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",
},
]
`;

View file

@ -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),

View file

@ -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",