diff --git a/src/providers/all.ts b/src/providers/all.ts index 33af334..cdc5402 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -12,6 +12,7 @@ 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 { autoembedScraper } from '@/providers/sources/autoembed'; import { flixhqScraper } from '@/providers/sources/flixhq/index'; import { goMoviesScraper } from '@/providers/sources/gomovies/index'; import { insertunitScraper } from '@/providers/sources/insertunit'; @@ -24,6 +25,11 @@ import { tugaflixScraper } from '@/providers/sources/tugaflix'; import { vidsrcScraper } from '@/providers/sources/vidsrc/index'; import { zoechipScraper } from '@/providers/sources/zoechip'; +import { autoembedBenagaliScraper } from './embeds/autoembed/bengali'; +import { autoembedEnglishScraper } from './embeds/autoembed/english'; +import { autoembedHindiScraper } from './embeds/autoembed/hindi'; +import { autoembedTamilScraper } from './embeds/autoembed/tamil'; +import { autoembedTeluguScraper } from './embeds/autoembed/telugu'; import { bflixScraper } from './embeds/bflix'; import { closeLoadScraper } from './embeds/closeload'; import { fileMoonScraper } from './embeds/filemoon'; @@ -78,6 +84,7 @@ export function gatherAllSources(): Array { insertunitScraper, nitesScraper, soaperTvScraper, + autoembedScraper, tugaflixScraper, ]; } @@ -117,5 +124,10 @@ export function gatherAllEmbeds(): Array { bflixScraper, playm4uNMScraper, hydraxScraper, + autoembedEnglishScraper, + autoembedHindiScraper, + autoembedBenagaliScraper, + autoembedTamilScraper, + autoembedTeluguScraper, ]; } diff --git a/src/providers/embeds/autoembed/bengali.ts b/src/providers/embeds/autoembed/bengali.ts new file mode 100644 index 0000000..50e5376 --- /dev/null +++ b/src/providers/embeds/autoembed/bengali.ts @@ -0,0 +1,15 @@ +import { makeEmbed } from '@/providers/base'; + +import { autoembedEnglishScraper } from './english'; + +export const autoembedBenagaliScraper = makeEmbed({ + id: 'autoembed-bengali', + name: 'Bengali', + rank: 7, + async scrape(ctx) { + const result = await autoembedEnglishScraper.scrape(ctx); + return { + stream: result.stream, + }; + }, +}); diff --git a/src/providers/embeds/autoembed/english.ts b/src/providers/embeds/autoembed/english.ts new file mode 100644 index 0000000..168ae0d --- /dev/null +++ b/src/providers/embeds/autoembed/english.ts @@ -0,0 +1,21 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { makeEmbed } from '@/providers/base'; + +export const autoembedEnglishScraper = makeEmbed({ + id: 'autoembed-english', + name: 'English', + rank: 10, + scrape: async (ctx) => { + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist: ctx.url, + flags: [flags.CORS_ALLOWED], + captions: [], + }, + ], + }; + }, +}); diff --git a/src/providers/embeds/autoembed/hindi.ts b/src/providers/embeds/autoembed/hindi.ts new file mode 100644 index 0000000..2532d47 --- /dev/null +++ b/src/providers/embeds/autoembed/hindi.ts @@ -0,0 +1,15 @@ +import { makeEmbed } from '@/providers/base'; + +import { autoembedEnglishScraper } from './english'; + +export const autoembedHindiScraper = makeEmbed({ + id: 'autoembed-hindi', + name: 'Hindi', + rank: 9, + async scrape(ctx) { + const result = await autoembedEnglishScraper.scrape(ctx); + return { + stream: result.stream, + }; + }, +}); diff --git a/src/providers/embeds/autoembed/tamil.ts b/src/providers/embeds/autoembed/tamil.ts new file mode 100644 index 0000000..c395b8e --- /dev/null +++ b/src/providers/embeds/autoembed/tamil.ts @@ -0,0 +1,15 @@ +import { makeEmbed } from '@/providers/base'; + +import { autoembedEnglishScraper } from './english'; + +export const autoembedTamilScraper = makeEmbed({ + id: 'autoembed-tamil', + name: 'Tamil', + rank: 8, + async scrape(ctx) { + const result = await autoembedEnglishScraper.scrape(ctx); + return { + stream: result.stream, + }; + }, +}); diff --git a/src/providers/embeds/autoembed/telugu.ts b/src/providers/embeds/autoembed/telugu.ts new file mode 100644 index 0000000..52dc608 --- /dev/null +++ b/src/providers/embeds/autoembed/telugu.ts @@ -0,0 +1,15 @@ +import { makeEmbed } from '@/providers/base'; + +import { autoembedEnglishScraper } from './english'; + +export const autoembedTeluguScraper = makeEmbed({ + id: 'autoembed-telugu', + name: 'Telugu', + rank: 6, + async scrape(ctx) { + const result = await autoembedEnglishScraper.scrape(ctx); + return { + stream: result.stream, + }; + }, +}); diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts new file mode 100644 index 0000000..1aa4796 --- /dev/null +++ b/src/providers/sources/autoembed.ts @@ -0,0 +1,45 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; + +const baseUrl = 'https://autoembed.cc/'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const playerPage = await ctx.proxiedFetcher(`/embed/player.php`, { + baseUrl, + query: { + id: ctx.media.tmdbId, + ...(ctx.media.type === 'show' && { + s: ctx.media.season.number.toString(), + e: ctx.media.episode.number.toString(), + }), + }, + }); + + const fileDataMatch = playerPage.match(/"file": (\[.*?\])/s); + if (!fileDataMatch[1]) throw new NotFoundError('No data found'); + + const fileData: { title: string; file: string }[] = JSON.parse(fileDataMatch[1].replace(/,\s*\]$/, ']')); + + const embeds: SourcererEmbed[] = []; + + for (const stream of fileData) { + const url = stream.file; + if (!url) continue; + embeds.push({ embedId: `autoembed-${stream.title.toLowerCase().trim()}`, url }); + } + + return { + embeds, + }; +} + +export const autoembedScraper = makeSourcerer({ + id: 'autoembed', + name: 'Autoembed', + rank: 10, + flags: [flags.CORS_ALLOWED], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +});