From 03874e8e247dca6747c55ac75dfdcd28b98aa217 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 3 Apr 2024 10:51:02 +0000 Subject: [PATCH 1/3] 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 2/3] 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 0382438fe189bb0485bb0f9946213884aa931180 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 3 Apr 2024 23:26:54 +0530 Subject: [PATCH 3/3] 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, },