mirror of
https://github.com/p-stream/providers.git
synced 2026-04-21 17:32:19 +00:00
add CineHDPlus (Latino)
This commit is contained in:
parent
c51ae7fa86
commit
abefc21dc7
2 changed files with 109 additions and 0 deletions
|
|
@ -75,6 +75,7 @@ import { zunimeEmbeds } from './embeds/zunime';
|
||||||
import { EightStreamScraper } from './sources/8stream';
|
import { EightStreamScraper } from './sources/8stream';
|
||||||
import { animeflvScraper } from './sources/animeflv';
|
import { animeflvScraper } from './sources/animeflv';
|
||||||
import { animetsuScraper } from './sources/animetsu';
|
import { animetsuScraper } from './sources/animetsu';
|
||||||
|
import { cinehdplusScraper } from './sources/cinehdplus-es';
|
||||||
import { cinemaosScraper } from './sources/cinemaos';
|
import { cinemaosScraper } from './sources/cinemaos';
|
||||||
import { coitusScraper } from './sources/coitus';
|
import { coitusScraper } from './sources/coitus';
|
||||||
import { cuevana3Scraper } from './sources/cuevana3';
|
import { cuevana3Scraper } from './sources/cuevana3';
|
||||||
|
|
@ -147,6 +148,7 @@ export function gatherAllSources(): Array<Sourcerer> {
|
||||||
primewireScraper,
|
primewireScraper,
|
||||||
movies4fScraper,
|
movies4fScraper,
|
||||||
debridScraper,
|
debridScraper,
|
||||||
|
cinehdplusScraper,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
107
src/providers/sources/cinehdplus-es.ts
Normal file
107
src/providers/sources/cinehdplus-es.ts
Normal file
|
|
@ -0,0 +1,107 @@
|
||||||
|
import { load } from 'cheerio';
|
||||||
|
|
||||||
|
import { SourcererOutput, makeSourcerer } from '@/providers/base';
|
||||||
|
import { ShowScrapeContext } from '@/utils/context';
|
||||||
|
import { NotFoundError } from '@/utils/errors';
|
||||||
|
|
||||||
|
const baseUrl = 'https://cinehdplus.gratis';
|
||||||
|
|
||||||
|
async function comboScraper(ctx: ShowScrapeContext): Promise<SourcererOutput> {
|
||||||
|
const searchUrl = `${baseUrl}/series/?story=${ctx.media.tmdbId}&do=search&subaction=search`;
|
||||||
|
|
||||||
|
// Fetch the search results page
|
||||||
|
const searchPage = await ctx.proxiedFetcher<string>(searchUrl, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent':
|
||||||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||||||
|
Referer: baseUrl,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const $search = load(searchPage);
|
||||||
|
|
||||||
|
// Find the series page URL from search results
|
||||||
|
const seriesUrl = $search('.card__title a[href]:first').attr('href');
|
||||||
|
if (!seriesUrl) {
|
||||||
|
throw new NotFoundError('Series not found in search results');
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.progress(30);
|
||||||
|
|
||||||
|
// Fetch the series page
|
||||||
|
const seriesPageUrl = new URL(seriesUrl, baseUrl);
|
||||||
|
const seriesPage = await ctx.proxiedFetcher<string>(seriesPageUrl.href, {
|
||||||
|
headers: {
|
||||||
|
'User-Agent':
|
||||||
|
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
|
||||||
|
Referer: baseUrl,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const $ = load(seriesPage);
|
||||||
|
|
||||||
|
// Build episode selector using season and episode numbers
|
||||||
|
const episodeSelector = `[data-num="${ctx.media.season.number}x${ctx.media.episode.number}"]`;
|
||||||
|
|
||||||
|
// Find mirror links for the specific episode
|
||||||
|
const mirrorUrls = $(episodeSelector)
|
||||||
|
.siblings('.mirrors')
|
||||||
|
.children('[data-link]')
|
||||||
|
.map((_, el) => $(el).attr('data-link'))
|
||||||
|
.get()
|
||||||
|
.filter(Boolean)
|
||||||
|
.filter((link) => !link.match(/cinehdplus/)) // Filter out internal cinehdplus links
|
||||||
|
.map((link) => {
|
||||||
|
// Ensure URLs are properly formatted with https
|
||||||
|
const url = link.startsWith('http') ? link : `https://${link}`;
|
||||||
|
try {
|
||||||
|
return new URL(url);
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter((url): url is URL => url !== null && url.hostname !== 'cinehdplus.gratis');
|
||||||
|
|
||||||
|
if (!mirrorUrls.length) {
|
||||||
|
throw new NotFoundError('No streaming links found for this episode');
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.progress(70);
|
||||||
|
|
||||||
|
// Map URLs to appropriate embed scrapers
|
||||||
|
const embeds = mirrorUrls
|
||||||
|
.map((url) => {
|
||||||
|
let embedId: string;
|
||||||
|
|
||||||
|
// Map hostname to embed scraper ID
|
||||||
|
if (url.hostname.includes('supervideo')) {
|
||||||
|
embedId = 'supervideo';
|
||||||
|
} else if (url.hostname.includes('dropload')) {
|
||||||
|
embedId = 'dropload';
|
||||||
|
} else {
|
||||||
|
// Fallback for unknown hosts - skip this embed
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
embedId,
|
||||||
|
url: url.href,
|
||||||
|
};
|
||||||
|
})
|
||||||
|
.filter((embed): embed is NonNullable<typeof embed> => embed !== null);
|
||||||
|
|
||||||
|
ctx.progress(90);
|
||||||
|
|
||||||
|
return {
|
||||||
|
embeds,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const cinehdplusScraper = makeSourcerer({
|
||||||
|
id: 'cinehdplus',
|
||||||
|
name: 'CineHDPlus (Latino)',
|
||||||
|
rank: 4,
|
||||||
|
disabled: false,
|
||||||
|
flags: [],
|
||||||
|
scrapeShow: comboScraper,
|
||||||
|
});
|
||||||
Loading…
Reference in a new issue