From 84b7ff6dd52799d15e23231a204a23111a64bbc0 Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Mon, 7 Jul 2025 22:20:36 -0600 Subject: [PATCH] add vidjoy --- src/providers/all.ts | 2 ++ src/providers/sources/vidjoy.ts | 54 +++++++++++++++++++++++++++++++++ src/utils/valid.ts | 2 ++ 3 files changed, 58 insertions(+) create mode 100644 src/providers/sources/vidjoy.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 9f87249..97c5571 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -67,6 +67,7 @@ import { slidemoviesScraper } from './sources/slidemovies'; import { soaperTvScraper } from './sources/soapertv'; import { streamboxScraper } from './sources/streambox'; import { vidapiClickScraper } from './sources/vidapiclick'; +import { vidjoyScraper } from './sources/vidjoy'; import { warezcdnScraper } from './sources/warezcdn'; import { wecimaScraper } from './sources/wecima'; @@ -99,6 +100,7 @@ export function gatherAllSources(): Array { wecimaScraper, animeflvScraper, cinemaosScraper, + vidjoyScraper, ]; } diff --git a/src/providers/sources/vidjoy.ts b/src/providers/sources/vidjoy.ts new file mode 100644 index 0000000..f280d9b --- /dev/null +++ b/src/providers/sources/vidjoy.ts @@ -0,0 +1,54 @@ +/* eslint-disable no-console */ +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://mia.vidjoy.wtf'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const apiUrl = + ctx.media.type === 'show' + ? `${baseUrl}/tv/${ctx.media.tmdbId}/${ctx.media.season.number}/${ctx.media.episode.number}/index.m3u8` + : `${baseUrl}/movies/${ctx.media.tmdbId}/index.m3u8`; + + const streamRes = await ctx.proxiedFetcher.full(apiUrl, { + method: 'GET', + readHeaders: ['content-type'], + headers: { + referer: 'https://spencerdevs.xyz/', + origin: 'https://spencerdevs.xyz', + 'User-Agent': + 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + }, + }); + + if (streamRes.statusCode !== 200) throw new NotFoundError('Failed to fetch video source'); + + ctx.progress(90); + + return { + embeds: [], + stream: [ + { + id: 'primary', + type: 'hls', + playlist: + ctx.media.type === 'show' + ? `${baseUrl}/tv/${ctx.media.tmdbId}/${ctx.media.season.number}/${ctx.media.episode.number}/index.m3u8` + : `${baseUrl}/movies/${ctx.media.tmdbId}/index.m3u8`, + flags: [flags.CORS_ALLOWED], + captions: [], + }, + ], + }; +} + +export const vidjoyScraper = makeSourcerer({ + id: 'vidjoy', + name: 'Vidjoy', + rank: 185, + flags: [flags.CORS_ALLOWED], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +}); diff --git a/src/utils/valid.ts b/src/utils/valid.ts index 0dac59c..ceed1e5 100644 --- a/src/utils/valid.ts +++ b/src/utils/valid.ts @@ -10,6 +10,7 @@ import { viperScraper } from '@/providers/embeds/viper'; import { warezcdnembedMp4Scraper } from '@/providers/embeds/warezcdn/mp4'; import { embedsuScraper } from '@/providers/sources/embedsu'; import { soaperTvScraper } from '@/providers/sources/soapertv'; +import { vidjoyScraper } from '@/providers/sources/vidjoy'; import { vidsrcScraper } from '@/providers/sources/vidsrc'; import { wecimaScraper } from '@/providers/sources/wecima'; import { Stream } from '@/providers/streams'; @@ -32,6 +33,7 @@ const SKIP_VALIDATION_CHECK_IDS = [ ...cinemaosHexaEmbeds.map((e) => e.id), soaperTvScraper.id, vidsrcScraper.id, + vidjoyScraper.id, ]; export function isValidStream(stream: Stream | undefined): boolean {