From 6a52b94593e873a9a5c8d015b0d8c46eaeb3e82e Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Wed, 19 Feb 2025 09:22:09 -0700 Subject: [PATCH] add slidemovies --- src/providers/all.ts | 2 + src/providers/sources/slidemovies.ts | 74 ++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/providers/sources/slidemovies.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index d6e6305..010fdb7 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -91,6 +91,7 @@ import { nepuScraper } from './sources/nepu'; import { nitesScraper } from './sources/nites'; import { primewireScraper } from './sources/primewire'; import { ridooMoviesScraper } from './sources/ridomovies'; +import { slidemoviesScraper } from './sources/slidemovies'; import { smashyStreamScraper } from './sources/smashystream'; import { soaperTvScraper } from './sources/soapertv'; import { vidlinkScraper } from './sources/vidlink'; @@ -138,6 +139,7 @@ export function gatherAllSources(): Array { vidlinkScraper, FedAPIScraper, iosmirrorScraper, + slidemoviesScraper, ]; } diff --git a/src/providers/sources/slidemovies.ts b/src/providers/sources/slidemovies.ts new file mode 100644 index 0000000..5c0f693 --- /dev/null +++ b/src/providers/sources/slidemovies.ts @@ -0,0 +1,74 @@ +import { load } from 'cheerio'; + +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://pupp.slidemovies-dev.workers.dev'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const watchPageUrl = + ctx.media.type === 'movie' + ? `${baseUrl}/movie/${ctx.media.tmdbId}` + : `${baseUrl}/tv/${ctx.media.tmdbId}/${ctx.media.season.number}/-${ctx.media.episode.number}`; + + ctx.progress(60); + + const watchPage = await ctx.proxiedFetcher(watchPageUrl); + const $ = load(watchPage); + + const proxiedStreamUrl = $('media-player').attr('src'); + + if (!proxiedStreamUrl) { + throw new NotFoundError('Stream URL not found'); + } + + const isoLanguageMap: Record = { + ng: 'en', + re: 'fr', + pa: 'es', + }; + + const captions = $('media-provider track') + .map((_, el) => { + const url = $(el).attr('src') || ''; + const rawLang = $(el).attr('lang') || 'unknown'; + const languageCode = isoLanguageMap[rawLang] || rawLang; + const isVtt = url.endsWith('.vtt') ? 'vtt' : 'srt'; + + return { + type: isVtt as 'vtt' | 'srt', + id: url, + url, + language: languageCode, + hasCorsRestrictions: false, + }; + }) + .get(); + + ctx.progress(90); + + return { + embeds: [], + stream: [ + { + id: 'primary', + type: 'hls', + flags: [], + playlist: proxiedStreamUrl, + captions, + }, + ], + }; +} + +export const slidemoviesScraper = makeSourcerer({ + id: 'slidemovies', + name: 'SlideMovies', + rank: 181, + disabled: false, + flags: [flags.CORS_ALLOWED], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +});