diff --git a/src/providers/all.ts b/src/providers/all.ts index 3bb7e33..30de4ce 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -24,6 +24,7 @@ import { insertunitScraper } from '@/providers/sources/insertunit'; import { kissAsianScraper } from '@/providers/sources/kissasian/index'; import { lookmovieScraper } from '@/providers/sources/lookmovie'; import { nsbxScraper } from '@/providers/sources/nsbx'; +import { redStarScraper } from '@/providers/sources/redstar'; import { remotestreamScraper } from '@/providers/sources/remotestream'; import { showboxScraper } from '@/providers/sources/showbox/index'; import { tugaflixScraper } from '@/providers/sources/tugaflix'; @@ -99,6 +100,7 @@ export function gatherAllSources(): Array { ee3Scraper, whvxScraper, fsharetvScraper, + redStarScraper, ]; } diff --git a/src/providers/sources/redstar.ts b/src/providers/sources/redstar.ts new file mode 100644 index 0000000..5055854 --- /dev/null +++ b/src/providers/sources/redstar.ts @@ -0,0 +1,42 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererOutput, makeSourcerer } from '@/providers/base'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; + +const universalScraper = async (ctx: ShowScrapeContext | MovieScrapeContext): Promise => { + try { + const res = await ctx.fetcher.full(`https://red-star.gobly.ru/scrape/showbox`, { + query: { + type: ctx.media.type, + title: ctx.media.title, + releaseYear: ctx.media.releaseYear.toString(), + tmdbId: ctx.media.tmdbId, + imdbId: ctx.media.imdbId ?? '', + ...(ctx.media.type === 'show' && { + episodeNumber: ctx.media.episode.number.toString(), + episodeTmdbId: ctx.media.episode.tmdbId, + seasonNumber: ctx.media.season.number.toString(), + seasonTmdbId: ctx.media.season.tmdbId, + }), + }, + }); + + if (res.statusCode === 200 && res.body.stream?.length) + return { stream: res.body.stream, embeds: [] } as SourcererOutput; + if (res.statusCode === 404) throw new NotFoundError('No watchable item found'); + + throw new Error(res.body.message ?? 'An error has occurred!'); + } catch (e: any) { + if (e instanceof NotFoundError) throw new NotFoundError(e.message); + throw new Error(e.message ?? 'An error has occurred!'); + } +}; + +export const redStarScraper = makeSourcerer({ + id: 'redstar', + name: 'redStar', + rank: 131, + flags: [flags.CORS_ALLOWED], + scrapeMovie: universalScraper, + scrapeShow: universalScraper, +});