diff --git a/src/providers/all.ts b/src/providers/all.ts index 42c4332..3bb7e33 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -55,6 +55,7 @@ import { vidplayScraper } from './embeds/vidplay'; import { voeScraper } from './embeds/voe'; import { warezcdnembedHlsScraper } from './embeds/warezcdn/hls'; import { warezcdnembedMp4Scraper } from './embeds/warezcdn/mp4'; +import { warezPlayerScraper } from './embeds/warezcdn/warezplayer'; import { wootlyScraper } from './embeds/wootly'; import { goojaraScraper } from './sources/goojara'; import { hdRezkaScraper } from './sources/hdrezka'; @@ -133,6 +134,7 @@ export function gatherAllEmbeds(): Array { vTubeScraper, warezcdnembedHlsScraper, warezcdnembedMp4Scraper, + warezPlayerScraper, bflixScraper, playm4uNMScraper, hydraxScraper, diff --git a/src/providers/embeds/warezcdn/warezplayer.ts b/src/providers/embeds/warezcdn/warezplayer.ts new file mode 100644 index 0000000..5eb9b66 --- /dev/null +++ b/src/providers/embeds/warezcdn/warezplayer.ts @@ -0,0 +1,58 @@ +import { makeEmbed } from '@/providers/base'; +import { warezcdnApiBase, warezcdnPlayerBase } from '@/providers/sources/warezcdn/common'; + +export const warezPlayerScraper = makeEmbed({ + id: 'warezplayer', + name: 'warezPLAYER', + rank: 85, + async scrape(ctx) { + const page = await ctx.proxiedFetcher.full(`/player.php`, { + baseUrl: warezcdnPlayerBase, + headers: { + Referer: `${warezcdnApiBase}/getEmbed.php?${new URLSearchParams({ + id: ctx.url, + sv: 'warezcdn', + })}`, + }, + query: { + id: ctx.url, + }, + }); + // ex url: https://basseqwevewcewcewecwcw.xyz/video/0e4a2c65bdaddd66a53422d93daebe68 + const playerPageUrl = new URL(page.finalUrl); + + const hash = playerPageUrl.pathname.split('/')[2]; + const playerApiRes = await ctx.proxiedFetcher('/player/index.php', { + baseUrl: playerPageUrl.origin, + query: { + data: hash, + do: 'getVideo', + }, + method: 'POST', + body: new URLSearchParams({ + hash, + }), + headers: { + 'X-Requested-With': 'XMLHttpRequest', + }, + }); + const sources = JSON.parse(playerApiRes); // json isn't parsed by fetcher due to content-type being text/html. + if (!sources.videoSource) throw new Error('Playlist not found'); + + return { + stream: [ + { + id: 'primary', + type: 'hls', + flags: [], + captions: [], + playlist: sources.videoSource, + headers: { + // without this it returns "security error" + Accept: '*/*', + }, + }, + ], + }; + }, +}); diff --git a/src/providers/sources/warezcdn/index.ts b/src/providers/sources/warezcdn/index.ts index f27b052..a119f8f 100644 --- a/src/providers/sources/warezcdn/index.ts +++ b/src/providers/sources/warezcdn/index.ts @@ -5,6 +5,7 @@ import { SourcererEmbed, makeSourcerer } from '@/providers/base'; import { mixdropScraper } from '@/providers/embeds/mixdrop'; import { warezcdnembedHlsScraper } from '@/providers/embeds/warezcdn/hls'; import { warezcdnembedMp4Scraper } from '@/providers/embeds/warezcdn/mp4'; +import { warezPlayerScraper } from '@/providers/embeds/warezcdn/warezplayer'; import { NotFoundError } from '@/utils/errors'; import { getExternalPlayerUrl, warezcdnBase } from './common'; @@ -48,6 +49,10 @@ export const warezcdnScraper = makeSourcerer({ embedId: warezcdnembedMp4Scraper.id, url: embedUrl, }, + { + embedId: warezPlayerScraper.id, + url: embedUrl, + }, ); } });