From c5727e76538e2777ea526c1dbe92cb5a2fb89fc8 Mon Sep 17 00:00:00 2001 From: TPN Date: Tue, 9 Jul 2024 08:08:21 +0100 Subject: [PATCH] Add whvs source --- src/providers/all.ts | 5 ++++ src/providers/embeds/whvx.ts | 56 +++++++++++++++++++++++++++++++++++ src/providers/sources/whvx.ts | 45 ++++++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 src/providers/embeds/whvx.ts create mode 100644 src/providers/sources/whvx.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 90903a6..6ac4f00 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -12,6 +12,7 @@ import { upcloudScraper } from '@/providers/embeds/upcloud'; import { upstreamScraper } from '@/providers/embeds/upstream'; import { vidsrcembedScraper } from '@/providers/embeds/vidsrc'; import { vTubeScraper } from '@/providers/embeds/vtube'; +import { astraScraper, novaScraper } from '@/providers/embeds/whvx'; import { autoembedScraper } from '@/providers/sources/autoembed'; import { flixhqScraper } from '@/providers/sources/flixhq/index'; import { goMoviesScraper } from '@/providers/sources/gomovies/index'; @@ -23,6 +24,7 @@ import { remotestreamScraper } from '@/providers/sources/remotestream'; import { showboxScraper } from '@/providers/sources/showbox/index'; import { tugaflixScraper } from '@/providers/sources/tugaflix'; import { vidsrcScraper } from '@/providers/sources/vidsrc/index'; +import { whvxScraper } from '@/providers/sources/whvx'; import { zoechipScraper } from '@/providers/sources/zoechip'; import { @@ -88,6 +90,7 @@ export function gatherAllSources(): Array { soaperTvScraper, autoembedScraper, tugaflixScraper, + whvxScraper, ]; } @@ -131,5 +134,7 @@ export function gatherAllEmbeds(): Array { autoembedBengaliScraper, autoembedTamilScraper, autoembedTeluguScraper, + novaScraper, + astraScraper, ]; } diff --git a/src/providers/embeds/whvx.ts b/src/providers/embeds/whvx.ts new file mode 100644 index 0000000..d509c41 --- /dev/null +++ b/src/providers/embeds/whvx.ts @@ -0,0 +1,56 @@ +import { EmbedOutput, makeEmbed } from '@/providers/base'; +import { NotFoundError } from '@/utils/errors'; + +import { baseUrl } from '../sources/whvx'; + +const providers = [ + { + id: 'nova', + name: 'VidBinge Nova', + rank: 697, + }, + { + id: 'astra', + name: 'VidBinge Astra', + rank: 696, + }, +]; + +function embed(provider: { id: string; name: string; rank: number }) { + return makeEmbed({ + id: provider.id, + name: provider.name, + rank: provider.rank, + disabled: false, + async scrape(ctx) { + const query = ctx.url; + + const search = await ctx.fetcher.full('/search', { + query: { + query, + provider: provider.id, + }, + baseUrl, + }); + + if (search.statusCode === 429) throw new Error('Rate limited'); + if (search.statusCode !== 200) throw new NotFoundError('Failed to search'); + + ctx.progress(50); + + const result = await ctx.fetcher('/source', { + query: { + resourceId: search.body.url, + provider: provider.id, + }, + baseUrl, + }); + + ctx.progress(100); + + return result as EmbedOutput; + }, + }); +} + +export const [novaScraper, astraScraper] = providers.map(embed); diff --git a/src/providers/sources/whvx.ts b/src/providers/sources/whvx.ts new file mode 100644 index 0000000..da5b590 --- /dev/null +++ b/src/providers/sources/whvx.ts @@ -0,0 +1,45 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererOutput, makeSourcerer } from '@/providers/base'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; + +export const baseUrl = 'https://api.whvx.net'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const query = { + title: ctx.media.title, + releaseYear: ctx.media.releaseYear, + tmdbId: ctx.media.tmdbId, + imdbId: ctx.media.imdbId, + type: ctx.media.type, + ...(ctx.media.type === 'show' && { + season: ctx.media.season.number.toString(), + episode: ctx.media.episode.number.toString(), + }), + }; + + const res: { providers: string[] } = await ctx.fetcher('/status', { baseUrl }); + + if (res.providers?.length === 0) throw new NotFoundError('No providers available'); + + const embeds = res.providers.map((provider: string) => { + return { + embedId: provider, + url: JSON.stringify(query), + }; + }); + + return { + embeds, + }; +} + +export const whvxScraper = makeSourcerer({ + id: 'whvx', + name: 'WHVX', + rank: 149, + flags: [flags.CORS_ALLOWED], + disabled: false, + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +});