add xprime harbor and organize

This commit is contained in:
Pas 2025-05-14 14:38:08 -06:00
parent 87fab6a453
commit fbe0abcd4a
4 changed files with 137 additions and 88 deletions

View file

@ -74,6 +74,7 @@ import { webtor1080Scraper, webtor480Scraper, webtor4kScraper, webtor720Scraper
import {
xprimeApolloEmbed,
xprimeFoxEmbed,
xprimeHarbourEmbed,
xprimeMarantEmbed,
xprimePrimenetEmbed,
xprimeStreamboxEmbed,
@ -185,6 +186,7 @@ export function gatherAllEmbeds(): Array<Embed> {
xprimeMarantEmbed,
xprimePrimenetEmbed,
xprimeVolkswagenEmbed,
xprimeHarbourEmbed,
ConsumetVidCloudScraper,
ConsumetStreamSBScraper,
ConsumetVidStreamingScraper,

View file

@ -9,6 +9,7 @@ const showboxBaseUrl = 'https://xprime.tv/primebox';
const marantBaseUrl = 'https://backend.xprime.tv/marant';
const primenetBaseUrl = 'https://backend.xprime.tv/primenet';
const volkswagenBaseUrl = 'https://backend.xprime.tv/volkswagen';
const harbourBaseUrl = 'https://backend.xprime.tv/harbour';
const languageMap: Record<string, string> = {
'chinese - hong kong': 'zh',
@ -41,54 +42,10 @@ const languageMap: Record<string, string> = {
اردو: 'ur',
};
export const xprimeFoxEmbed = makeEmbed({
id: 'xprime-fox',
name: 'Fox',
rank: 241,
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: 244,
rank: 237,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${apolloBaseUrl}/${query.tmdbId}`;
@ -137,7 +94,7 @@ export const xprimeApolloEmbed = makeEmbed({
export const xprimeStreamboxEmbed = makeEmbed({
id: 'xprime-streambox',
name: 'Streambox',
rank: 243,
rank: 236,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
@ -192,44 +149,10 @@ export const xprimeStreamboxEmbed = makeEmbed({
},
});
export const xprimeMarantEmbed = makeEmbed({
id: 'xprime-marant',
name: 'Marant (French + English)',
rank: 240,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${marantBaseUrl}?id=${query.tmdbId}`;
if (query.type === 'show') {
url += `&season=${query.season}&episode=${query.episode}`;
}
const data = await ctx.fetcher(url);
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');
ctx.progress(90);
return {
stream: [
{
type: 'hls',
id: 'primary',
playlist: data.url,
flags: [flags.CORS_ALLOWED],
captions: [],
},
],
};
},
});
export const xprimePrimenetEmbed = makeEmbed({
id: 'xprime-primenet',
name: 'Primenet',
rank: 242,
rank: 235,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${primenetBaseUrl}?id=${query.tmdbId}`;
@ -260,10 +183,132 @@ export const xprimePrimenetEmbed = makeEmbed({
},
});
export const xprimeFoxEmbed = makeEmbed({
id: 'xprime-fox',
name: 'Fox',
rank: 233,
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 xprimeHarbourEmbed = makeEmbed({
id: 'xprime-harbour',
name: 'Harbour',
rank: 232,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
const params = new URLSearchParams({
name: query.title,
year: query.releaseYear.toString(),
});
if (query.type === 'show') {
params.append('season', query.season.toString());
params.append('episode', query.episode.toString());
}
const apiRes = await ctx.fetcher(`${harbourBaseUrl}?${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: data.url,
flags: [flags.CORS_ALLOWED],
captions,
},
],
};
},
});
export const xprimeMarantEmbed = makeEmbed({
id: 'xprime-marant',
name: 'Marant (French + English)',
rank: 231,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${marantBaseUrl}?id=${query.tmdbId}`;
if (query.type === 'show') {
url += `&season=${query.season}&episode=${query.episode}`;
}
const data = await ctx.fetcher(url);
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');
ctx.progress(90);
return {
stream: [
{
type: 'hls',
id: 'primary',
playlist: data.url,
flags: [flags.CORS_ALLOWED],
captions: [],
},
],
};
},
});
export const xprimeVolkswagenEmbed = makeEmbed({
id: 'xprime-volkswagen',
name: 'Volkswagen (German)',
rank: 239,
rank: 230,
async scrape(ctx): Promise<EmbedOutput> {
const query = JSON.parse(ctx.url);
let url = `${volkswagenBaseUrl}?name=${query.title}`;

View file

@ -15,10 +15,6 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis
};
const embeds = [
{
embedId: 'xprime-fox',
url: JSON.stringify(query),
},
{
embedId: 'xprime-apollo',
url: JSON.stringify(query),
@ -28,11 +24,15 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis
url: JSON.stringify(query),
},
{
embedId: 'xprime-marant',
embedId: 'xprime-primenet',
url: JSON.stringify(query),
},
{
embedId: 'xprime-primenet',
embedId: 'xprime-fox',
url: JSON.stringify(query),
},
{
embedId: 'xprime-marant',
url: JSON.stringify(query),
},
{

View file

@ -34,6 +34,7 @@ import { warezcdnembedMp4Scraper } from '@/providers/embeds/warezcdn/mp4';
import {
xprimeApolloEmbed,
xprimeFoxEmbed,
xprimeHarbourEmbed,
xprimeMarantEmbed,
xprimePrimenetEmbed,
xprimeStreamboxEmbed,
@ -67,6 +68,7 @@ const SKIP_VALIDATION_CHECK_IDS = [
xprimeMarantEmbed.id,
xprimePrimenetEmbed.id,
xprimeVolkswagenEmbed.id,
xprimeHarbourEmbed.id,
ConsumetVidCloudScraper.id,
ConsumetStreamSBScraper.id,
ConsumetVidStreamingScraper.id,