From e1bcf9a356e8dddb756d1978c85dcc8779cbf28a Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Tue, 5 Aug 2025 10:39:11 -0600 Subject: [PATCH] add Flicky Thanks Lew! --- src/providers/all.ts | 2 ++ src/providers/sources/flicky.ts | 62 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 src/providers/sources/flicky.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index a81dfaf..4a91539 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -63,6 +63,7 @@ import { cinemaosScraper } from './sources/cinemaos'; import { coitusScraper } from './sources/coitus'; import { cuevana3Scraper } from './sources/cuevana3'; import { embedsuScraper } from './sources/embedsu'; +import { flickyScraper } from './sources/flicky'; import { hdRezkaScraper } from './sources/hdrezka'; import { iosmirrorScraper } from './sources/iosmirror'; import { iosmirrorPVScraper } from './sources/iosmirrorpv'; @@ -110,6 +111,7 @@ export function gatherAllSources(): Array { pirxcyScraper, vidsrcvipScraper, vidsrccxScraper, + flickyScraper, ]; } diff --git a/src/providers/sources/flicky.ts b/src/providers/sources/flicky.ts new file mode 100644 index 0000000..5ba0235 --- /dev/null +++ b/src/providers/sources/flicky.ts @@ -0,0 +1,62 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererOutput, makeSourcerer } from '@/providers/base'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; +import { createM3U8ProxyUrl } from '@/utils/proxy'; + +const baseUrl = 'madplay.site'; +const headers = { + referer: 'https://madplay.site/', + origin: 'https://madplay.site', + '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', +}; + +async function comboScraper(ctx: MovieScrapeContext | ShowScrapeContext): Promise { + const { media } = ctx; + let url = `https://${baseUrl}/api/playsrc`; + + if (media.type === 'movie') { + url += `?id=${media.tmdbId}`; + } else if (media.type === 'show') { + const { tmdbId, season, episode } = media; + url += `?id=${tmdbId}&season=${season.number}&episode=${episode.number}`; + } else { + throw new NotFoundError('Unsupported media type'); + } + + const res = await ctx.proxiedFetcher(url, { headers }); + + if (!Array.isArray(res) || res.length === 0) { + throw new NotFoundError('No streams found'); + } + const stream = res[0]; + + if (!stream.file) { + throw new NotFoundError('No file URL found in stream'); + } + + ctx.progress(100); + + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist: createM3U8ProxyUrl(stream.file, headers), + flags: [flags.CORS_ALLOWED], + captions: [], + }, + ], + embeds: [], + }; +} + +export const flickyScraper = makeSourcerer({ + id: 'flicky', + name: 'Flicky', + rank: 155, + flags: [flags.CORS_ALLOWED], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +});