From 03874e8e247dca6747c55ac75dfdcd28b98aa217 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 3 Apr 2024 10:51:02 +0000 Subject: [PATCH 01/19] return thumbnailTracks and add ip-locked flag to mixdrop --- src/providers/embeds/dood.ts | 9 +++++++++ src/providers/embeds/mixdrop.ts | 3 ++- src/providers/embeds/voe.ts | 15 +++++++++++++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/providers/embeds/dood.ts b/src/providers/embeds/dood.ts index 5dd8def..453588b 100644 --- a/src/providers/embeds/dood.ts +++ b/src/providers/embeds/dood.ts @@ -25,6 +25,7 @@ export const doodScraper = makeEmbed({ const dataForLater = doodData.match(/\?token=([^&]+)&expiry=/)?.[1]; const path = doodData.match(/\$\.get\('\/pass_md5([^']+)/)?.[1]; + const thumbnailTrack = doodData.match(/thumbnails:\s\{\s*vtt:\s'([^']*)'/); const doodPage = await ctx.proxiedFetcher(`/pass_md5${path}`, { headers: { @@ -53,6 +54,14 @@ export const doodScraper = makeEmbed({ headers: { Referer: baseUrl, }, + ...(thumbnailTrack + ? { + thumbnailTrack: { + type: 'vtt', + url: `https:${thumbnailTrack[1]}`, + }, + } + : {}), }, ], }; diff --git a/src/providers/embeds/mixdrop.ts b/src/providers/embeds/mixdrop.ts index 9a9ee60..ba9ebd0 100644 --- a/src/providers/embeds/mixdrop.ts +++ b/src/providers/embeds/mixdrop.ts @@ -1,5 +1,6 @@ import * as unpacker from 'unpacker'; +import { flags } from '@/entrypoint/utils/targets'; import { makeEmbed } from '@/providers/base'; const mixdropBase = 'https://mixdrop.ag'; @@ -47,7 +48,7 @@ export const mixdropScraper = makeEmbed({ { id: 'primary', type: 'file', - flags: [], + flags: [flags.IP_LOCKED], captions: [], qualities: { unknown: { diff --git a/src/providers/embeds/voe.ts b/src/providers/embeds/voe.ts index 7d92a3a..759d8f7 100644 --- a/src/providers/embeds/voe.ts +++ b/src/providers/embeds/voe.ts @@ -2,15 +2,18 @@ import { flags } from '@/entrypoint/utils/targets'; import { makeEmbed } from '@/providers/base'; const linkRegex = /'hls': ?'(http.*?)',/; +const tracksRegex = /previewThumbnails:\s{.*src:\["([^"]+)"]/; export const voeScraper = makeEmbed({ id: 'voe', name: 'voe.sx', rank: 180, async scrape(ctx) { - const embed = await ctx.proxiedFetcher(ctx.url); + const embedRes = await ctx.proxiedFetcher.full(ctx.url); + const embed = embedRes.body; const playerSrc = embed.match(linkRegex) ?? []; + const thumbnailTrack = embed.match(tracksRegex); const streamUrl = playerSrc[1]; if (!streamUrl) throw new Error('Stream url not found in embed code'); @@ -21,11 +24,19 @@ export const voeScraper = makeEmbed({ type: 'hls', id: 'primary', playlist: streamUrl, - flags: [flags.CORS_ALLOWED], + flags: [flags.CORS_ALLOWED, flags.IP_LOCKED], captions: [], headers: { Referer: 'https://voe.sx', }, + ...(thumbnailTrack + ? { + thumbnailTrack: { + type: 'vtt', + url: new URL(embedRes.finalUrl).origin + thumbnailTrack[1], + }, + } + : {}), }, ], }; From 6a72ec3481ce54823052e283d0915317368fbcc7 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 3 Apr 2024 10:51:51 +0000 Subject: [PATCH 02/19] add dropload, filelions and vtube --- src/providers/all.ts | 6 +++ src/providers/embeds/dropload.ts | 56 ++++++++++++++++++++++++ src/providers/embeds/filelions.ts | 51 +++++++++++++++++++++ src/providers/embeds/vtube.ts | 51 +++++++++++++++++++++ src/providers/sources/primewire/index.ts | 9 ++++ 5 files changed, 173 insertions(+) create mode 100644 src/providers/embeds/dropload.ts create mode 100644 src/providers/embeds/filelions.ts create mode 100644 src/providers/embeds/vtube.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index d20e14b..731b844 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -1,7 +1,9 @@ import { Embed, Sourcerer } from '@/providers/base'; import { doodScraper } from '@/providers/embeds/dood'; +import { droploadScraper } from '@/providers/embeds/dropload'; import { febboxHlsScraper } from '@/providers/embeds/febbox/hls'; import { febboxMp4Scraper } from '@/providers/embeds/febbox/mp4'; +import { filelionsScraper } from '@/providers/embeds/filelions'; import { mixdropScraper } from '@/providers/embeds/mixdrop'; import { mp4uploadScraper } from '@/providers/embeds/mp4upload'; import { streambucketScraper } from '@/providers/embeds/streambucket'; @@ -9,6 +11,7 @@ import { streamsbScraper } from '@/providers/embeds/streamsb'; 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 { flixhqScraper } from '@/providers/sources/flixhq/index'; import { goMoviesScraper } from '@/providers/sources/gomovies/index'; import { kissAsianScraper } from '@/providers/sources/kissasian/index'; @@ -82,5 +85,8 @@ export function gatherAllEmbeds(): Array { streamvidScraper, voeScraper, streamtapeScraper, + droploadScraper, + filelionsScraper, + vTubeScraper, ]; } diff --git a/src/providers/embeds/dropload.ts b/src/providers/embeds/dropload.ts new file mode 100644 index 0000000..ce7c91d --- /dev/null +++ b/src/providers/embeds/dropload.ts @@ -0,0 +1,56 @@ +import { unpack } from 'unpacker'; + +import { flags } from '@/entrypoint/utils/targets'; + +import { makeEmbed } from '../base'; + +const evalCodeRegex = /eval\((.*)\)/g; +const fileRegex = /file:"(.*?)"/g; +const tracksRegex = /\{file:"([^"]+)",kind:"thumbnails"\}/g; + +export const droploadScraper = makeEmbed({ + id: 'dropload', + name: 'Dropload', + rank: 120, + scrape: async (ctx) => { + const mainPageRes = await ctx.fetcher.full(ctx.url, { + headers: { + referer: ctx.url, + }, + }); + const mainPageUrl = new URL(mainPageRes.finalUrl); + const mainPage = mainPageRes.body; + + const evalCode = mainPage.match(evalCodeRegex); + if (!evalCode) throw new Error('Failed to find eval code'); + const unpacked = unpack(evalCode[1]); + + const file = fileRegex.exec(unpacked); + const thumbnailTrack = tracksRegex.exec(unpacked); + if (!file?.[1]) throw new Error('Failed to find file'); + + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist: file[1], + flags: [flags.IP_LOCKED, flags.CORS_ALLOWED], + captions: [], + preferredHeaders: { + Referer: mainPageUrl.origin, + origin: mainPageUrl.origin, + }, + ...(thumbnailTrack + ? { + thumbnailTrack: { + type: 'vtt', + url: mainPageUrl.origin + thumbnailTrack[1], + }, + } + : {}), + }, + ], + }; + }, +}); diff --git a/src/providers/embeds/filelions.ts b/src/providers/embeds/filelions.ts new file mode 100644 index 0000000..7576cf6 --- /dev/null +++ b/src/providers/embeds/filelions.ts @@ -0,0 +1,51 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { makeEmbed } from '@/providers/base'; + +const linkRegex = /file: ?"(http.*?)"/; +// the white space charecters may seem useless, but without them it breaks +const tracksRegex = /\{file:\s"([^"]+)",\skind:\s"thumbnails"\}/g; + +export const filelionsScraper = makeEmbed({ + id: 'filelions', + name: 'filelions', + rank: 115, + async scrape(ctx) { + const mainPageRes = await ctx.fetcher.full(ctx.url, { + headers: { + referer: ctx.url, + }, + }); + const mainPage = mainPageRes.body; + const mainPageUrl = new URL(mainPageRes.finalUrl); + + const streamUrl = mainPage.match(linkRegex) ?? []; + const thumbnailTrack = tracksRegex.exec(mainPage); + + const playlist = streamUrl[1]; + if (!playlist) throw new Error('Stream url not found'); + + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist, + flags: [flags.IP_LOCKED, flags.CORS_ALLOWED], + captions: [], + preferredHeaders: { + Referer: mainPageUrl.origin, + origin: mainPageUrl.origin, + }, + ...(thumbnailTrack + ? { + thumbnailTrack: { + type: 'vtt', + url: new URL(mainPageRes.finalUrl).origin + thumbnailTrack[1], + }, + } + : {}), + }, + ], + }; + }, +}); diff --git a/src/providers/embeds/vtube.ts b/src/providers/embeds/vtube.ts new file mode 100644 index 0000000..c8a4d63 --- /dev/null +++ b/src/providers/embeds/vtube.ts @@ -0,0 +1,51 @@ +import { load } from 'cheerio'; +import { unpack } from 'unpacker'; + +import { flags } from '@/entrypoint/utils/targets'; + +import { makeEmbed } from '../base'; + +const evalCodeRegex = /eval\((.*)\)/g; +const fileRegex = /file:"(.*?)"/g; +const tracksRegex = /\{file:"([^"]+)",kind:"thumbnails"\}/g; + +export const vTubeScraper = makeEmbed({ + id: 'vtube', + name: 'vTube', + rank: 145, + scrape: async (ctx) => { + const mainPageRes = await ctx.fetcher.full(ctx.url, { + headers: { + referer: ctx.url, + }, + }); + const mainPage = mainPageRes.body; + const html = load(mainPage); + const evalCode = html('script').text().match(evalCodeRegex); + if (!evalCode) throw new Error('Failed to find eval code'); + const unpacked = unpack(evalCode?.toString()); + const file = fileRegex.exec(unpacked); + const thumbnailTrack = tracksRegex.exec(unpacked); + if (!file?.[1]) throw new Error('Failed to find file'); + + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist: file[1], + flags: [flags.CORS_ALLOWED], + captions: [], + ...(thumbnailTrack + ? { + thumbnailTrack: { + type: 'vtt', + url: new URL(mainPageRes.finalUrl).origin + thumbnailTrack[1], + }, + } + : {}), + }, + ], + }; + }, +}); diff --git a/src/providers/sources/primewire/index.ts b/src/providers/sources/primewire/index.ts index dca155a..b83594c 100644 --- a/src/providers/sources/primewire/index.ts +++ b/src/providers/sources/primewire/index.ts @@ -54,6 +54,15 @@ async function getStreams(title: string) { case 'dood.watch': embedId = 'dood'; break; + case 'dropload.io': + embedId = 'dropload'; + break; + case 'filelions.to': + embedId = 'filelions'; + break; + case 'vtube.to': + embedId = 'vtube'; + break; default: embedId = null; } From 2d909d72cdb6525cebc5c11d878fbaf62a555438 Mon Sep 17 00:00:00 2001 From: Ciarands <74070993+Ciarands@users.noreply.github.com> Date: Wed, 3 Apr 2024 13:18:18 +0100 Subject: [PATCH 03/19] Update default encryption key --- src/providers/sources/vidsrcto/common.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/vidsrcto/common.ts b/src/providers/sources/vidsrcto/common.ts index 2c7272f..33c436e 100644 --- a/src/providers/sources/vidsrcto/common.ts +++ b/src/providers/sources/vidsrcto/common.ts @@ -1,7 +1,7 @@ // This file is based on https://github.com/Ciarands/vidsrc-to-resolver/blob/dffa45e726a4b944cb9af0c9e7630476c93c0213/vidsrc.py#L16 // Full credits to @Ciarands! -const DECRYPTION_KEY = '8z5Ag5wgagfsOuhz'; +const DECRYPTION_KEY = 'WXrUARXb1aDLaZjI'; export const decodeBase64UrlSafe = (str: string) => { const standardizedInput = str.replace(/_/g, '/').replace(/-/g, '+'); From 49d1e5868104441cd2e459cdab84d5eb7c65cfea Mon Sep 17 00:00:00 2001 From: Ciarands <74070993+Ciarands@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:31:50 +0100 Subject: [PATCH 04/19] Add IP_LOCKED flag to vidplay --- src/providers/embeds/vidplay/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/embeds/vidplay/index.ts b/src/providers/embeds/vidplay/index.ts index fb5b7c2..f37054b 100644 --- a/src/providers/embeds/vidplay/index.ts +++ b/src/providers/embeds/vidplay/index.ts @@ -54,7 +54,7 @@ export const vidplayScraper = makeEmbed({ id: 'primary', type: 'hls', playlist: source, - flags: [flags.CORS_ALLOWED], + flags: [flags.IP_LOCKED], captions, thumbnailTrack, }, From 97008a643965aad08e9d01a5ad4b39e6e785fb1c Mon Sep 17 00:00:00 2001 From: Ciarands <74070993+Ciarands@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:32:18 +0100 Subject: [PATCH 05/19] Add IP_LOCKED flag to vidsrcto --- src/providers/sources/vidsrcto/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/vidsrcto/index.ts b/src/providers/sources/vidsrcto/index.ts index d5f72e2..937a4af 100644 --- a/src/providers/sources/vidsrcto/index.ts +++ b/src/providers/sources/vidsrcto/index.ts @@ -78,6 +78,6 @@ export const vidSrcToScraper = makeSourcerer({ name: 'VidSrcTo', scrapeMovie: universalScraper, scrapeShow: universalScraper, - flags: [flags.CORS_ALLOWED], + flags: [flags.IP_LOCKED], rank: 130, }); From b8570bb560cfa1c2e74c92753fce85463d521b8c Mon Sep 17 00:00:00 2001 From: Ciarands <74070993+Ciarands@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:47:55 +0100 Subject: [PATCH 06/19] Add referrer and origin to vidplay --- src/providers/embeds/vidplay/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/providers/embeds/vidplay/index.ts b/src/providers/embeds/vidplay/index.ts index f37054b..a2914ee 100644 --- a/src/providers/embeds/vidplay/index.ts +++ b/src/providers/embeds/vidplay/index.ts @@ -29,6 +29,7 @@ export const vidplayScraper = makeEmbed({ } const url = new URL(ctx.url); + console.log(url); const subtitlesLink = url.searchParams.get('sub.info'); const captions: Caption[] = []; if (subtitlesLink) { @@ -55,6 +56,10 @@ export const vidplayScraper = makeEmbed({ type: 'hls', playlist: source, flags: [flags.IP_LOCKED], + headers: { + Referer: url.origin, + Origin: url.origin, + }, captions, thumbnailTrack, }, From 464f34d5748e10797999a51f37e989582b3a36ac Mon Sep 17 00:00:00 2001 From: Ciarands <74070993+Ciarands@users.noreply.github.com> Date: Wed, 3 Apr 2024 15:48:41 +0100 Subject: [PATCH 07/19] Remove console.log --- src/providers/embeds/vidplay/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/providers/embeds/vidplay/index.ts b/src/providers/embeds/vidplay/index.ts index a2914ee..0c34459 100644 --- a/src/providers/embeds/vidplay/index.ts +++ b/src/providers/embeds/vidplay/index.ts @@ -29,7 +29,6 @@ export const vidplayScraper = makeEmbed({ } const url = new URL(ctx.url); - console.log(url); const subtitlesLink = url.searchParams.get('sub.info'); const captions: Caption[] = []; if (subtitlesLink) { From d25e1eaede675625356e0265d8343ed1088ad1ee Mon Sep 17 00:00:00 2001 From: Jorrin Date: Wed, 3 Apr 2024 17:30:01 +0200 Subject: [PATCH 08/19] filemoon fix --- src/providers/embeds/filemoon/index.ts | 4 ++-- src/providers/embeds/vidplay/index.ts | 3 +-- src/providers/sources/vidsrcto/index.ts | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/providers/embeds/filemoon/index.ts b/src/providers/embeds/filemoon/index.ts index dc8a053..e63e2be 100644 --- a/src/providers/embeds/filemoon/index.ts +++ b/src/providers/embeds/filemoon/index.ts @@ -23,7 +23,7 @@ export const fileMoonScraper = makeEmbed({ const embedHtml = load(embedRes); const evalCode = embedHtml('script').text().match(evalCodeRegex); if (!evalCode) throw new Error('Failed to find eval code'); - const unpacked = unpack(evalCode[1]); + const unpacked = unpack(evalCode[0]); const file = fileRegex.exec(unpacked); if (!file?.[1]) throw new Error('Failed to find file'); @@ -53,7 +53,7 @@ export const fileMoonScraper = makeEmbed({ id: 'primary', type: 'hls', playlist: file[1], - flags: [flags.CORS_ALLOWED], + flags: [], captions, }, ], diff --git a/src/providers/embeds/vidplay/index.ts b/src/providers/embeds/vidplay/index.ts index 0c34459..781909c 100644 --- a/src/providers/embeds/vidplay/index.ts +++ b/src/providers/embeds/vidplay/index.ts @@ -1,4 +1,3 @@ -import { flags } from '@/entrypoint/utils/targets'; import { makeEmbed } from '@/providers/base'; import { Caption, getCaptionTypeFromUrl, labelToLanguageCode } from '@/providers/captions'; @@ -54,7 +53,7 @@ export const vidplayScraper = makeEmbed({ id: 'primary', type: 'hls', playlist: source, - flags: [flags.IP_LOCKED], + flags: [], headers: { Referer: url.origin, Origin: url.origin, diff --git a/src/providers/sources/vidsrcto/index.ts b/src/providers/sources/vidsrcto/index.ts index 937a4af..0f99b4e 100644 --- a/src/providers/sources/vidsrcto/index.ts +++ b/src/providers/sources/vidsrcto/index.ts @@ -1,6 +1,5 @@ import { load } from 'cheerio'; -import { flags } from '@/entrypoint/utils/targets'; import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base'; import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; @@ -78,6 +77,6 @@ export const vidSrcToScraper = makeSourcerer({ name: 'VidSrcTo', scrapeMovie: universalScraper, scrapeShow: universalScraper, - flags: [flags.IP_LOCKED], + flags: [], rank: 130, }); From 0382438fe189bb0485bb0f9946213884aa931180 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 3 Apr 2024 23:26:54 +0530 Subject: [PATCH 09/19] fixes --- src/providers/embeds/dropload.ts | 6 +----- src/providers/embeds/filelions.ts | 8 ++------ src/providers/embeds/vtube.ts | 2 +- 3 files changed, 4 insertions(+), 12 deletions(-) diff --git a/src/providers/embeds/dropload.ts b/src/providers/embeds/dropload.ts index ce7c91d..983035c 100644 --- a/src/providers/embeds/dropload.ts +++ b/src/providers/embeds/dropload.ts @@ -13,7 +13,7 @@ export const droploadScraper = makeEmbed({ name: 'Dropload', rank: 120, scrape: async (ctx) => { - const mainPageRes = await ctx.fetcher.full(ctx.url, { + const mainPageRes = await ctx.proxiedFetcher.full(ctx.url, { headers: { referer: ctx.url, }, @@ -37,10 +37,6 @@ export const droploadScraper = makeEmbed({ playlist: file[1], flags: [flags.IP_LOCKED, flags.CORS_ALLOWED], captions: [], - preferredHeaders: { - Referer: mainPageUrl.origin, - origin: mainPageUrl.origin, - }, ...(thumbnailTrack ? { thumbnailTrack: { diff --git a/src/providers/embeds/filelions.ts b/src/providers/embeds/filelions.ts index 7576cf6..c41c354 100644 --- a/src/providers/embeds/filelions.ts +++ b/src/providers/embeds/filelions.ts @@ -10,7 +10,7 @@ export const filelionsScraper = makeEmbed({ name: 'filelions', rank: 115, async scrape(ctx) { - const mainPageRes = await ctx.fetcher.full(ctx.url, { + const mainPageRes = await ctx.proxiedFetcher.full(ctx.url, { headers: { referer: ctx.url, }, @@ -32,15 +32,11 @@ export const filelionsScraper = makeEmbed({ playlist, flags: [flags.IP_LOCKED, flags.CORS_ALLOWED], captions: [], - preferredHeaders: { - Referer: mainPageUrl.origin, - origin: mainPageUrl.origin, - }, ...(thumbnailTrack ? { thumbnailTrack: { type: 'vtt', - url: new URL(mainPageRes.finalUrl).origin + thumbnailTrack[1], + url: mainPageUrl.origin + thumbnailTrack[1], }, } : {}), diff --git a/src/providers/embeds/vtube.ts b/src/providers/embeds/vtube.ts index c8a4d63..4558f38 100644 --- a/src/providers/embeds/vtube.ts +++ b/src/providers/embeds/vtube.ts @@ -14,7 +14,7 @@ export const vTubeScraper = makeEmbed({ name: 'vTube', rank: 145, scrape: async (ctx) => { - const mainPageRes = await ctx.fetcher.full(ctx.url, { + const mainPageRes = await ctx.proxiedFetcher.full(ctx.url, { headers: { referer: ctx.url, }, From 867313fce18768aa42c7d8debb46d78330d8833c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:40:39 +0000 Subject: [PATCH 10/19] Bump undici from 5.28.3 to 5.28.4 in /.docs Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.4. - [Release notes](https://github.com/nodejs/undici/releases) - [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.4) --- updated-dependencies: - dependency-name: undici dependency-type: indirect ... Signed-off-by: dependabot[bot] --- .docs/pnpm-lock.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.docs/pnpm-lock.yaml b/.docs/pnpm-lock.yaml index f129e9c..7e95e7e 100644 --- a/.docs/pnpm-lock.yaml +++ b/.docs/pnpm-lock.yaml @@ -7370,7 +7370,7 @@ packages: fast-glob: 3.3.2 js-yaml: 4.1.0 supports-color: 9.4.0 - undici: 5.28.3 + undici: 5.28.4 yargs-parser: 21.1.1 dev: true @@ -9117,8 +9117,8 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true - /undici@5.28.3: - resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==} + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 From 4238672f28bd7f8a5a5dc4e2fcd457d4fadc716e Mon Sep 17 00:00:00 2001 From: TPN Date: Fri, 5 Apr 2024 11:33:28 +0000 Subject: [PATCH 11/19] fix smashystream --- src/providers/all.ts | 10 +-- src/providers/embeds/smashystream/dued.ts | 71 ------------------- src/providers/embeds/smashystream/opstream.ts | 17 +++++ src/providers/embeds/smashystream/video1.ts | 30 ++++++-- src/providers/sources/smashystream/index.ts | 66 +++++------------ 5 files changed, 62 insertions(+), 132 deletions(-) delete mode 100644 src/providers/embeds/smashystream/dued.ts create mode 100644 src/providers/embeds/smashystream/opstream.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 731b844..dd88894 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -1,9 +1,7 @@ import { Embed, Sourcerer } from '@/providers/base'; import { doodScraper } from '@/providers/embeds/dood'; -import { droploadScraper } from '@/providers/embeds/dropload'; import { febboxHlsScraper } from '@/providers/embeds/febbox/hls'; import { febboxMp4Scraper } from '@/providers/embeds/febbox/mp4'; -import { filelionsScraper } from '@/providers/embeds/filelions'; import { mixdropScraper } from '@/providers/embeds/mixdrop'; import { mp4uploadScraper } from '@/providers/embeds/mp4upload'; import { streambucketScraper } from '@/providers/embeds/streambucket'; @@ -11,7 +9,6 @@ import { streamsbScraper } from '@/providers/embeds/streamsb'; 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 { flixhqScraper } from '@/providers/sources/flixhq/index'; import { goMoviesScraper } from '@/providers/sources/gomovies/index'; import { kissAsianScraper } from '@/providers/sources/kissasian/index'; @@ -24,7 +21,7 @@ import { zoechipScraper } from '@/providers/sources/zoechip'; import { closeLoadScraper } from './embeds/closeload'; import { fileMoonScraper } from './embeds/filemoon'; import { ridooScraper } from './embeds/ridoo'; -import { smashyStreamDScraper } from './embeds/smashystream/dued'; +import { smashyStreamOScraper } from './embeds/smashystream/opstream'; import { smashyStreamFScraper } from './embeds/smashystream/video1'; import { streamtapeScraper } from './embeds/streamtape'; import { streamvidScraper } from './embeds/streamvid'; @@ -75,7 +72,7 @@ export function gatherAllEmbeds(): Array { vidsrcembedScraper, streambucketScraper, smashyStreamFScraper, - smashyStreamDScraper, + smashyStreamOScraper, ridooScraper, closeLoadScraper, fileMoonScraper, @@ -85,8 +82,5 @@ export function gatherAllEmbeds(): Array { streamvidScraper, voeScraper, streamtapeScraper, - droploadScraper, - filelionsScraper, - vTubeScraper, ]; } diff --git a/src/providers/embeds/smashystream/dued.ts b/src/providers/embeds/smashystream/dued.ts deleted file mode 100644 index c7a1d1d..0000000 --- a/src/providers/embeds/smashystream/dued.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { load } from 'cheerio'; - -import { flags } from '@/entrypoint/utils/targets'; -import { makeEmbed } from '@/providers/base'; - -type DPlayerSourcesResponse = { - title: string; - id: string; - file: string; -}[]; - -export const smashyStreamDScraper = makeEmbed({ - id: 'smashystream-d', - name: 'SmashyStream (D)', - rank: 71, - async scrape(ctx) { - const mainPageRes = await ctx.proxiedFetcher(ctx.url, { - headers: { - Referer: ctx.url, - }, - }); - const mainPageRes$ = load(mainPageRes); - const iframeUrl = mainPageRes$('iframe').attr('src'); - if (!iframeUrl) throw new Error(`[${this.name}] failed to find iframe url`); - const mainUrl = new URL(iframeUrl); - const iframeRes = await ctx.proxiedFetcher(iframeUrl, { - headers: { - Referer: ctx.url, - }, - }); - const textFilePath = iframeRes.match(/"file":"([^"]+)"/)?.[1]; - const csrfToken = iframeRes.match(/"key":"([^"]+)"/)?.[1]; - if (!textFilePath || !csrfToken) throw new Error(`[${this.name}] failed to find text file url or token`); - const textFileUrl = `${mainUrl.origin}${textFilePath}`; - const textFileRes = await ctx.proxiedFetcher(textFileUrl, { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'X-CSRF-TOKEN': csrfToken, - Referer: iframeUrl, - }, - }); - // Playlists in Hindi, English, Tamil and Telugu are available. We only get the english one. - const textFilePlaylist = textFileRes.find((x) => x.title === 'English')?.file; - if (!textFilePlaylist) throw new Error(`[${this.name}] failed to find an english playlist`); - - const playlistRes = await ctx.proxiedFetcher( - `${mainUrl.origin}/playlist/${textFilePlaylist.slice(1)}.txt`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'X-CSRF-TOKEN': csrfToken, - Referer: iframeUrl, - }, - }, - ); - - return { - stream: [ - { - id: 'primary', - playlist: playlistRes, - type: 'hls', - flags: [flags.CORS_ALLOWED], - captions: [], - }, - ], - }; - }, -}); diff --git a/src/providers/embeds/smashystream/opstream.ts b/src/providers/embeds/smashystream/opstream.ts new file mode 100644 index 0000000..7e01c27 --- /dev/null +++ b/src/providers/embeds/smashystream/opstream.ts @@ -0,0 +1,17 @@ +import { makeEmbed } from '@/providers/base'; + +import { smashyStreamFScraper } from './video1'; + +export const smashyStreamOScraper = makeEmbed({ + // the scraping logic for all smashystream embeds is the same + // all the embeds can be added in the same way + id: 'smashystream-o', + name: 'SmashyStream (O)', + rank: 70, + async scrape(ctx) { + const result = await smashyStreamFScraper.scrape(ctx); + return { + stream: result.stream, + }; + }, +}); diff --git a/src/providers/embeds/smashystream/video1.ts b/src/providers/embeds/smashystream/video1.ts index 1fc2edf..19af888 100644 --- a/src/providers/embeds/smashystream/video1.ts +++ b/src/providers/embeds/smashystream/video1.ts @@ -1,16 +1,29 @@ import { flags } from '@/entrypoint/utils/targets'; import { makeEmbed } from '@/providers/base'; import { Caption, getCaptionTypeFromUrl, labelToLanguageCode } from '@/providers/captions'; +import { NotFoundError } from '@/utils/errors'; type FPlayerResponse = { sourceUrls: string[]; - subtitleUrls: string; + subtitles: string | null; }; +// if you don't understand how this is reversed +// check https://discord.com/channels/871713465100816424/1186646348137775164/1225644477188935770 +// feel free to reach out atpn or ciaran_ds on discord if you've any problems +function decode(str: string): string { + const b = ['U0ZML2RVN0IvRGx4', 'MGNhL0JWb0kvTlM5', 'Ym94LzJTSS9aU0Zj', 'SGJ0L1dGakIvN0dX', 'eE52L1QwOC96N0Yz']; + let formatedB64 = str.slice(2); + for (let i = 4; i > -1; i--) { + formatedB64 = formatedB64.replace(`//${b[i]}`, ''); + } + return atob(formatedB64); +} + export const smashyStreamFScraper = makeEmbed({ id: 'smashystream-f', name: 'SmashyStream (F)', - rank: 70, + rank: 71, async scrape(ctx) { const res = await ctx.proxiedFetcher(ctx.url, { headers: { @@ -18,15 +31,20 @@ export const smashyStreamFScraper = makeEmbed({ }, }); + if (!res.sourceUrls[0]) throw new NotFoundError('No watchable item found'); + + const playlist = decode(res.sourceUrls[0]); + if (!playlist.includes('.m3u8')) throw new Error('Failed to decode'); + const captions: Caption[] = - res.subtitleUrls - .match(/\[([^\]]+)\](https?:\/\/\S+?)(?=,\[|$)/g) + res.subtitles + ?.match(/\[([^\]]+)\](https?:\/\/\S+?)(?=,\[|$)/g) ?.map((entry: string) => { const match = entry.match(/\[([^\]]+)\](https?:\/\/\S+?)(?=,\[|$)/); if (match) { const [, language, url] = match; if (language && url) { - const languageCode = labelToLanguageCode(language); + const languageCode = labelToLanguageCode(language.replace(/ - .*/, '')); const captionType = getCaptionTypeFromUrl(url); if (!languageCode || !captionType) return null; return { @@ -46,7 +64,7 @@ export const smashyStreamFScraper = makeEmbed({ stream: [ { id: 'primary', - playlist: res.sourceUrls[0], + playlist, type: 'hls', flags: [flags.CORS_ALLOWED], captions, diff --git a/src/providers/sources/smashystream/index.ts b/src/providers/sources/smashystream/index.ts index f4a47d0..0937e6a 100644 --- a/src/providers/sources/smashystream/index.ts +++ b/src/providers/sources/smashystream/index.ts @@ -1,56 +1,29 @@ -import { load } from 'cheerio'; - import { flags } from '@/entrypoint/utils/targets'; -import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base'; -import { smashyStreamDScraper } from '@/providers/embeds/smashystream/dued'; +import { SourcererOutput, makeSourcerer } from '@/providers/base'; +import { smashyStreamOScraper } from '@/providers/embeds/smashystream/opstream'; import { smashyStreamFScraper } from '@/providers/embeds/smashystream/video1'; import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; -const smashyStreamBase = 'https://embed.smashystream.com'; -const referer = 'https://smashystream.com/'; - const universalScraper = async (ctx: ShowScrapeContext | MovieScrapeContext): Promise => { - const mainPage = await ctx.proxiedFetcher('/playere.php', { - query: { - tmdb: ctx.media.tmdbId, - ...(ctx.media.type === 'show' && { - season: ctx.media.season.number.toString(), - episode: ctx.media.episode.number.toString(), - }), - }, - headers: { - Referer: referer, - }, - baseUrl: smashyStreamBase, - }); - - ctx.progress(30); - - const mainPage$ = load(mainPage); - const sourceUrls = mainPage$('.dropdown-menu a[data-url]') - .map((_, el) => mainPage$(el).attr('data-url')) - .get(); - - const embeds: SourcererEmbed[] = []; - for (const sourceUrl of sourceUrls) { - if (sourceUrl.includes('video1d.php')) { - embeds.push({ - embedId: smashyStreamFScraper.id, - url: sourceUrl, - }); - } - if (sourceUrl.includes('dued.php')) { - embeds.push({ - embedId: smashyStreamDScraper.id, - url: sourceUrl, - }); - } - } - - ctx.progress(60); + // theres no point in fetching the player page + // because it too just calls the api with the tmdb id + // thats the only way to find out if the embed has any streams + const query = + ctx.media.type === 'movie' + ? `?tmdb=${ctx.media.tmdbId}` + : `?tmdbId=${ctx.media.tmdbId}&season=${ctx.media.season.number}&episode=${ctx.media.episode.number}`; return { - embeds, + embeds: [ + { + embedId: smashyStreamFScraper.id, + url: `https://embed.smashystream.com/video1dn.php${query}`, + }, + { + embedId: smashyStreamOScraper.id, + url: `https://embed.smashystream.com/videoop.php${query}`, + }, + ], }; }; @@ -59,7 +32,6 @@ export const smashyStreamScraper = makeSourcerer({ name: 'SmashyStream', rank: 30, flags: [flags.CORS_ALLOWED], - disabled: true, scrapeMovie: universalScraper, scrapeShow: universalScraper, }); From 7d5dca227d7f98ac0a15fc48c51451d44b2ffbc0 Mon Sep 17 00:00:00 2001 From: TPN Date: Fri, 5 Apr 2024 20:51:32 +0530 Subject: [PATCH 12/19] Update all.ts --- src/providers/all.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/providers/all.ts b/src/providers/all.ts index dd88894..04f809e 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -1,7 +1,9 @@ import { Embed, Sourcerer } from '@/providers/base'; import { doodScraper } from '@/providers/embeds/dood'; +import { droploadScraper } from '@/providers/embeds/dropload'; import { febboxHlsScraper } from '@/providers/embeds/febbox/hls'; import { febboxMp4Scraper } from '@/providers/embeds/febbox/mp4'; +import { filelionsScraper } from '@/providers/embeds/filelions'; import { mixdropScraper } from '@/providers/embeds/mixdrop'; import { mp4uploadScraper } from '@/providers/embeds/mp4upload'; import { streambucketScraper } from '@/providers/embeds/streambucket'; @@ -9,6 +11,7 @@ import { streamsbScraper } from '@/providers/embeds/streamsb'; 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 { flixhqScraper } from '@/providers/sources/flixhq/index'; import { goMoviesScraper } from '@/providers/sources/gomovies/index'; import { kissAsianScraper } from '@/providers/sources/kissasian/index'; @@ -72,7 +75,7 @@ export function gatherAllEmbeds(): Array { vidsrcembedScraper, streambucketScraper, smashyStreamFScraper, - smashyStreamOScraper, + smashyStreamDScraper, ridooScraper, closeLoadScraper, fileMoonScraper, @@ -82,5 +85,8 @@ export function gatherAllEmbeds(): Array { streamvidScraper, voeScraper, streamtapeScraper, + droploadScraper, + filelionsScraper, + vTubeScraper, ]; } From 296216c7341fc6289ed294ac771a36d4d85239d1 Mon Sep 17 00:00:00 2001 From: TPN Date: Fri, 5 Apr 2024 20:54:21 +0530 Subject: [PATCH 13/19] fix all.ts --- src/providers/all.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/all.ts b/src/providers/all.ts index 04f809e..63be995 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -75,7 +75,7 @@ export function gatherAllEmbeds(): Array { vidsrcembedScraper, streambucketScraper, smashyStreamFScraper, - smashyStreamDScraper, + smashyStreamOScraper, ridooScraper, closeLoadScraper, fileMoonScraper, From 2661e24908452279cb32626dcc868784eef5bef0 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 19:26:01 +0200 Subject: [PATCH 14/19] bump version and changelog --- .docs/content/1.get-started/4.changelog.md | 5 +++++ package.json | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.docs/content/1.get-started/4.changelog.md b/.docs/content/1.get-started/4.changelog.md index cec48fc..82b33fa 100644 --- a/.docs/content/1.get-started/4.changelog.md +++ b/.docs/content/1.get-started/4.changelog.md @@ -2,6 +2,11 @@ title: 'Changelog' --- +# Version 2.2.9 +- Fixed VidSrcTo (both Vidplay and Filemoon embeds) +- Added dropload, filelions and vtube embeds to Primewire +- Fixed and enabled Smashystream + # Version 2.2.8 - Fix package exports for CJS and ESM - Fixed Mixdrop embed diff --git a/package.json b/package.json index 992e559..69cfad1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@movie-web/providers", - "version": "2.2.8", + "version": "2.2.9", "description": "Package that contains all the providers of movie-web", "type": "module", "main": "./lib/index.js", From 301c9200ad2c92aec44f2ba27f41094f15ba15e5 Mon Sep 17 00:00:00 2001 From: TPN Date: Fri, 5 Apr 2024 17:41:43 +0000 Subject: [PATCH 15/19] fix ridomovies search --- src/providers/sources/ridomovies/index.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/providers/sources/ridomovies/index.ts b/src/providers/sources/ridomovies/index.ts index 1fa7659..69fb745 100644 --- a/src/providers/sources/ridomovies/index.ts +++ b/src/providers/sources/ridomovies/index.ts @@ -19,13 +19,19 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => q: ctx.media.title, }, }); - const show = searchResult.data.items[0]; - if (!show) throw new NotFoundError('No watchable item found'); + const mediaData = searchResult.data.items.map((movieEl) => { + const name = movieEl.title; + const year = movieEl.contentable.releaseYear; + const fullSlug = movieEl.fullSlug; + return { name, year, fullSlug }; + }); + const targetMedia = mediaData.find((m) => m.name === ctx.media.title); + if (!targetMedia?.fullSlug) throw new NotFoundError('No watchable item found'); - let iframeSourceUrl = `/${show.fullSlug}/videos`; + let iframeSourceUrl = `/${targetMedia.fullSlug}/videos`; if (ctx.media.type === 'show') { - const showPageResult = await ctx.proxiedFetcher(`/${show.fullSlug}`, { + const showPageResult = await ctx.proxiedFetcher(`/${targetMedia.fullSlug}`, { baseUrl: ridoMoviesBase, }); const fullEpisodeSlug = `season-${ctx.media.season.number}/episode-${ctx.media.episode.number}`; From a6667ade8cac7e26a29d4287edf82a559ec9f92b Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 19:52:43 +0200 Subject: [PATCH 16/19] remove unused flag --- src/providers/embeds/filemoon/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/providers/embeds/filemoon/index.ts b/src/providers/embeds/filemoon/index.ts index e63e2be..fb6ee08 100644 --- a/src/providers/embeds/filemoon/index.ts +++ b/src/providers/embeds/filemoon/index.ts @@ -1,8 +1,6 @@ import { load } from 'cheerio'; import { unpack } from 'unpacker'; -import { flags } from '@/entrypoint/utils/targets'; - import { SubtitleResult } from './types'; import { makeEmbed } from '../../base'; import { Caption, getCaptionTypeFromUrl, labelToLanguageCode } from '../../captions'; From 718eb97c06dbeaf5ef0c900d0c6cbb3e3f48e76f Mon Sep 17 00:00:00 2001 From: TPN Date: Fri, 5 Apr 2024 23:28:49 +0530 Subject: [PATCH 17/19] check year --- src/providers/sources/ridomovies/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/ridomovies/index.ts b/src/providers/sources/ridomovies/index.ts index 69fb745..638ea13 100644 --- a/src/providers/sources/ridomovies/index.ts +++ b/src/providers/sources/ridomovies/index.ts @@ -25,7 +25,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => const fullSlug = movieEl.fullSlug; return { name, year, fullSlug }; }); - const targetMedia = mediaData.find((m) => m.name === ctx.media.title); + const targetMedia = mediaData.find((m) => m.name === ctx.media.title && m.year === ctx.media.releaseYear.toString()); if (!targetMedia?.fullSlug) throw new NotFoundError('No watchable item found'); let iframeSourceUrl = `/${targetMedia.fullSlug}/videos`; From 29d0ea4276f3402ffb9c27121a3e57f5068d1686 Mon Sep 17 00:00:00 2001 From: Jorrin Date: Fri, 5 Apr 2024 20:01:45 +0200 Subject: [PATCH 18/19] add ridomovies search to changelog --- .docs/content/1.get-started/4.changelog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.docs/content/1.get-started/4.changelog.md b/.docs/content/1.get-started/4.changelog.md index 82b33fa..0836b31 100644 --- a/.docs/content/1.get-started/4.changelog.md +++ b/.docs/content/1.get-started/4.changelog.md @@ -6,6 +6,7 @@ title: 'Changelog' - Fixed VidSrcTo (both Vidplay and Filemoon embeds) - Added dropload, filelions and vtube embeds to Primewire - Fixed and enabled Smashystream +- Improved RidoMovies search results # Version 2.2.8 - Fix package exports for CJS and ESM From 8a711265cb7e3b1677ddaaa4bac1e6ff6819eccd Mon Sep 17 00:00:00 2001 From: infvortx <53519839+infvortx@users.noreply.github.com> Date: Sun, 7 Apr 2024 11:48:04 +0300 Subject: [PATCH 19/19] Update insertunit.ts --- src/providers/sources/insertunit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/insertunit.ts b/src/providers/sources/insertunit.ts index b9d5f07..bf70a51 100644 --- a/src/providers/sources/insertunit.ts +++ b/src/providers/sources/insertunit.ts @@ -6,7 +6,7 @@ const insertunitbase = 'https://api.insertunit.ws/'; export const insertunitScraper = makeSourcerer({ id: 'insertunit', - name: 'Insert Unit', + name: 'Insertunit', disabled: false, rank: 60, flags: [flags.CORS_ALLOWED],