add xprime apollo

This commit is contained in:
Pas 2025-04-10 11:39:18 -06:00
parent b08d33bce1
commit 648729a40e
4 changed files with 150 additions and 64 deletions

View file

@ -61,6 +61,7 @@ import { warezcdnembedHlsScraper } from './embeds/warezcdn/hls';
import { warezcdnembedMp4Scraper } from './embeds/warezcdn/mp4';
import { warezPlayerScraper } from './embeds/warezcdn/warezplayer';
import { webtor1080Scraper, webtor480Scraper, webtor4kScraper, webtor720Scraper } from './embeds/webtor';
import { xprimeApolloEmbed, xprimeFoxEmbed } from './embeds/xprime';
import { EightStreamScraper } from './sources/8stream';
import { coitusScraper } from './sources/coitus';
import { embedsuScraper } from './sources/embedsu';
@ -165,5 +166,7 @@ export function gatherAllEmbeds(): Array<Embed> {
riveKageScraper,
riveNovaScraper,
rivePutafilmeScraper,
xprimeFoxEmbed,
xprimeApolloEmbed,
];
}

View file

@ -0,0 +1,120 @@
/* eslint-disable no-console */
import { flags } from '@/entrypoint/utils/targets';
import { EmbedOutput, makeEmbed } from '@/providers/base';
import { NotFoundError } from '@/utils/errors';
const foxBaseUrl = 'https://xprime.tv/foxtemp';
const apolloBaseUrl = 'http://kendrickl-3amar.site';
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
'chinese - traditional': 'zh',
czech: 'cs',
danish: 'da',
dutch: 'nl',
english: 'en',
'english - sdh': 'en',
finnish: 'fi',
french: 'fr',
german: 'de',
greek: 'el',
hungarian: 'hu',
italian: 'it',
korean: 'ko',
norwegian: 'no',
polish: 'pl',
portuguese: 'pt',
'portuguese - brazilian': 'pt',
romanian: 'ro',
'spanish - european': 'es',
'spanish - latin american': 'es',
swedish: 'sv',
turkish: 'tr',
};
export const xprimeFoxEmbed = makeEmbed({
id: 'xprime-fox',
name: 'Fox',
rank: 240,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
const params = new URLSearchParams({
name: query.title,
pstream: 'true',
});
if (query.type === 'show') {
params.append('season', query.season.toString());
params.append('episode', query.episode.toString());
}
const apiRes = await ctx.fetcher(`${foxBaseUrl}?${params.toString()}`);
if (!apiRes) throw new NotFoundError('No response received');
const data = await JSON.parse(apiRes);
if (!data.url) throw new NotFoundError('No stream URL found in response');
const captions =
data.subtitles?.map((sub: { file: string; label: string }) => ({
type: 'vtt',
url: sub.file,
language: languageMap[sub.label.toLowerCase()] || 'unknown',
})) || [];
ctx.progress(90);
return {
stream: [
{
type: 'hls',
id: 'primary',
playlist: `https://oca.kendrickl-3amar.site/?v=${encodeURIComponent(data.url)}&headers=${encodeURIComponent(JSON.stringify({ referer: 'https://megacloud.store/', origin: 'https://megacloud.store' }))}`,
flags: [flags.CORS_ALLOWED],
captions,
},
],
};
},
});
export const xprimeApolloEmbed = makeEmbed({
id: 'xprime-apollo',
name: 'Appolo',
rank: 241,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${apolloBaseUrl}/${query.tmdbId}`;
if (query.type === 'show') {
url += `/${query.season}/${query.episode}`;
}
console.log('Fetching URL:', url);
const data = await ctx.fetcher(url);
console.log('Response data:', data);
if (!data) throw new NotFoundError('No response received');
if (data.error) throw new NotFoundError(data.error);
if (!data.url) throw new NotFoundError('No stream URL found in response');
const captions =
data.subtitles?.map((sub: { file: string; label: string }) => ({
type: 'vtt',
url: sub.file,
language: languageMap[sub.label.toLowerCase()] || 'unknown',
})) || [];
ctx.progress(90);
return {
stream: [
{
type: 'hls',
id: 'primary',
playlist: data.url,
flags: [flags.CORS_ALLOWED],
captions,
},
],
};
},
});

View file

@ -1,73 +1,35 @@
import { flags } from '@/entrypoint/utils/targets';
import { SourcererOutput, makeSourcerer } from '@/providers/base';
import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context';
import { NotFoundError } from '@/utils/errors';
const baseUrl = 'https://xprime.tv/foxtemp';
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
'chinese - traditional': 'zh',
czech: 'cs',
danish: 'da',
dutch: 'nl',
english: 'en',
'english - sdh': 'en',
finnish: 'fi',
french: 'fr',
german: 'de',
greek: 'el',
hungarian: 'hu',
italian: 'it',
korean: 'ko',
norwegian: 'no',
polish: 'pl',
portuguese: 'pt',
'portuguese - brazilian': 'pt',
romanian: 'ro',
'spanish - european': 'es',
'spanish - latin american': 'es',
swedish: 'sv',
turkish: 'tr',
};
async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise<SourcererOutput> {
const params = new URLSearchParams({
name: ctx.media.title,
pstream: 'true',
const embeds = [];
embeds.push({
embedId: 'xprime-fox',
url: JSON.stringify({
type: ctx.media.type,
title: ctx.media.title,
...(ctx.media.type === 'show' && {
season: ctx.media.season.number,
episode: ctx.media.episode.number,
}),
}),
});
if (ctx.media.type === 'show') {
params.append('season', ctx.media.season.number.toString());
params.append('episode', ctx.media.episode.number.toString());
}
embeds.push({
embedId: 'xprime-apollo',
url: JSON.stringify({
type: ctx.media.type,
tmdbId: ctx.media.tmdbId,
...(ctx.media.type === 'show' && {
season: ctx.media.season.number,
episode: ctx.media.episode.number,
}),
}),
});
const apiRes = await ctx.fetcher(`${baseUrl}?${params.toString()}`);
if (!apiRes) throw new NotFoundError('No response received');
const data = await JSON.parse(apiRes);
if (!data.url) throw new NotFoundError('No stream URL found in response');
const captions =
data.subtitles?.map((sub: { file: string; label: string }) => ({
type: 'vtt',
url: sub.file,
language: languageMap[sub.label.toLowerCase()] || 'unknown',
})) || [];
ctx.progress(90);
return {
stream: [
{
type: 'hls',
id: 'primary',
playlist: `https://oca.kendrickl-3amar.site/?v=${encodeURIComponent(data.url)}&headers=${encodeURIComponent(JSON.stringify({ referer: 'https://megacloud.store/', origin: 'https://megacloud.store' }))}`,
flags: [flags.CORS_ALLOWED],
captions,
},
],
embeds: [],
};
return { embeds };
}
export const xprimeScraper = makeSourcerer({

View file

@ -2,9 +2,9 @@
// import { astraScraper, novaScraper, orionScraper } from '@/providers/embeds/whvx';
import { FedAPIPrivateScraper, FedDBScraper } from '@/providers/embeds/fedapi';
import { warezcdnembedMp4Scraper } from '@/providers/embeds/warezcdn/mp4';
import { xprimeApolloEmbed, xprimeFoxEmbed } from '@/providers/embeds/xprime';
import { embedsuScraper } from '@/providers/sources/embedsu';
import { uiraliveScraper } from '@/providers/sources/uiralive';
import { xprimeScraper } from '@/providers/sources/xprime';
import { Stream } from '@/providers/streams';
import { IndividualEmbedRunnerOptions } from '@/runners/individualRunner';
import { ProviderRunnerOptions } from '@/runners/runner';
@ -20,7 +20,8 @@ const SKIP_VALIDATION_CHECK_IDS = [
embedsuScraper.id,
FedAPIPrivateScraper.id,
FedDBScraper.id,
xprimeScraper.id,
xprimeFoxEmbed.id,
xprimeApolloEmbed.id,
];
export function isValidStream(stream: Stream | undefined): boolean {