mirror of
https://github.com/p-stream/providers.git
synced 2026-01-11 20:10:33 +00:00
add xprime apollo
This commit is contained in:
parent
b08d33bce1
commit
648729a40e
4 changed files with 150 additions and 64 deletions
|
|
@ -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,
|
||||
];
|
||||
}
|
||||
|
|
|
|||
120
src/providers/embeds/xprime.ts
Normal file
120
src/providers/embeds/xprime.ts
Normal 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,
|
||||
},
|
||||
],
|
||||
};
|
||||
},
|
||||
});
|
||||
|
|
@ -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({
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in a new issue