From 423c07cc56d82f5856cc33f64b06dd9897f4047f Mon Sep 17 00:00:00 2001 From: TPN Date: Mon, 15 Apr 2024 19:24:08 +0530 Subject: [PATCH 1/9] add tugaflix --- src/providers/all.ts | 2 + src/providers/sources/tugaflix/common.ts | 19 ++++ src/providers/sources/tugaflix/index.ts | 114 +++++++++++++++++++++++ 3 files changed, 135 insertions(+) create mode 100644 src/providers/sources/tugaflix/common.ts create mode 100644 src/providers/sources/tugaflix/index.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 9cb3585..2056faa 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -19,6 +19,7 @@ import { kissAsianScraper } from '@/providers/sources/kissasian/index'; import { lookmovieScraper } from '@/providers/sources/lookmovie'; import { remotestreamScraper } from '@/providers/sources/remotestream'; import { showboxScraper } from '@/providers/sources/showbox/index'; +import { tugaflixScraper } from '@/providers/sources/tugaflix'; import { vidsrcScraper } from '@/providers/sources/vidsrc/index'; import { zoechipScraper } from '@/providers/sources/zoechip'; @@ -66,6 +67,7 @@ export function gatherAllSources(): Array { warezcdnScraper, insertunitScraper, soaperTvScraper, + tugaflixScraper, ]; } diff --git a/src/providers/sources/tugaflix/common.ts b/src/providers/sources/tugaflix/common.ts new file mode 100644 index 0000000..d7f58f7 --- /dev/null +++ b/src/providers/sources/tugaflix/common.ts @@ -0,0 +1,19 @@ +import { load } from 'cheerio'; + +export const baseUrl = 'https://tugaflix.best/'; + +export function parseSearch(page: string): { title: string; year?: number; url: string }[] { + const results: { title: string; year?: number; url: string }[] = []; + const $ = load(page); + + $('.items .poster').each((_, element) => { + const $link = $(element).find('a'); + const url = $link.attr('href'); + const [, title, year] = $link.attr('title')?.match(/^(.*?)\s*(?:\((\d{4})\))?\s*$/) || []; + if (!title || !url) return; + + results.push({ title, year: year ? parseInt(year, 10) : undefined, url }); + }); + + return results; +} diff --git a/src/providers/sources/tugaflix/index.ts b/src/providers/sources/tugaflix/index.ts new file mode 100644 index 0000000..ee7242f --- /dev/null +++ b/src/providers/sources/tugaflix/index.ts @@ -0,0 +1,114 @@ +import { load } from 'cheerio'; + +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererEmbed, makeSourcerer } from '@/providers/base'; +import { compareMedia } from '@/utils/compare'; +import { NotFoundError } from '@/utils/errors'; + +import { baseUrl, parseSearch } from './common'; + +export const tugaflixScraper = makeSourcerer({ + id: 'tugaflix', + name: 'Tugaflix', + rank: 112, + flags: [flags.IP_LOCKED], + scrapeMovie: async (ctx) => { + const searchResults = parseSearch( + await ctx.proxiedFetcher('/filmes/', { + baseUrl, + query: { + s: ctx.media.title, + }, + }), + ); + if (searchResults.length === 0) throw new NotFoundError('No watchable item found'); + + const url = searchResults.find((x) => x && compareMedia(ctx.media, x.title, x.year))?.url; + if (!url) throw new NotFoundError('No watchable item found'); + + const videoPage = await ctx.proxiedFetcher(url, { + method: 'POST', + body: new URLSearchParams({ play: '' }), + }); + const $ = load(videoPage); + + const embeds: SourcererEmbed[] = []; + + for (const element of $('.play a')) { + const embedUrl = $(element).attr('href'); + if (!embedUrl) continue; + + const embedPage = await ctx.proxiedFetcher.full( + embedUrl.startsWith('https://') ? embedUrl : `https://${embedUrl}`, + ); + + const finalUrl = load(embedPage.body)('a:contains("Download Filme")').attr('href'); + if (!finalUrl) continue; + + if (finalUrl.includes('streamtape')) { + embeds.push({ + embedId: 'streamtape', + url: finalUrl, + }); + } else if (finalUrl.includes('dood')) { + embeds.push({ + embedId: 'dood', + url: finalUrl, + }); + } + } + + return { + embeds, + }; + }, + scrapeShow: async (ctx) => { + const searchResults = parseSearch( + await ctx.proxiedFetcher('/series/', { + baseUrl, + query: { + s: ctx.media.title, + }, + }), + ); + if (searchResults.length === 0) throw new NotFoundError('No watchable item found'); + + const url = searchResults.find((x) => x && compareMedia(ctx.media, x.title, x.year))?.url; + if (!url) throw new NotFoundError('No watchable item found'); + + const s = ctx.media.season.number < 10 ? `0${ctx.media.season.number}` : ctx.media.season.number.toString(); + const e = ctx.media.episode.number < 10 ? `0${ctx.media.episode.number}` : ctx.media.episode.number.toString(); + const videoPage = await ctx.proxiedFetcher(url, { + method: 'POST', + body: new URLSearchParams({ [`S${s}E${e}`]: '' }), + }); + + const embedUrl = load(videoPage)('iframe[name="player"]').attr('src'); + if (!embedUrl) throw new Error('Failed to find taprUrl'); + + const playerPage = await ctx.proxiedFetcher(embedUrl.startsWith('https:') ? embedUrl : `https:${embedUrl}`, { + method: 'POST', + body: new URLSearchParams({ submit: '' }), + }); + + const embeds: SourcererEmbed[] = []; + + const finalUrl = load(playerPage)('a:contains("Download Episodio")').attr('href'); + + if (finalUrl?.includes('streamtape')) { + embeds.push({ + embedId: 'streamtape', + url: finalUrl, + }); + } else if (finalUrl?.includes('dood')) { + embeds.push({ + embedId: 'dood', + url: finalUrl, + }); + } + + return { + embeds, + }; + }, +}); From c8b2ea3e811667f26bcdd56d8c1faff71b178550 Mon Sep 17 00:00:00 2001 From: TPN Date: Mon, 15 Apr 2024 19:25:05 +0530 Subject: [PATCH 2/9] change rank and add comments --- src/providers/sources/tugaflix/common.ts | 2 ++ src/providers/sources/tugaflix/index.ts | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/providers/sources/tugaflix/common.ts b/src/providers/sources/tugaflix/common.ts index d7f58f7..b20063b 100644 --- a/src/providers/sources/tugaflix/common.ts +++ b/src/providers/sources/tugaflix/common.ts @@ -9,9 +9,11 @@ export function parseSearch(page: string): { title: string; year?: number; url: $('.items .poster').each((_, element) => { const $link = $(element).find('a'); const url = $link.attr('href'); + // ex title: Home Alone (1990) const [, title, year] = $link.attr('title')?.match(/^(.*?)\s*(?:\((\d{4})\))?\s*$/) || []; if (!title || !url) return; + // tiles dont always have the year results.push({ title, year: year ? parseInt(year, 10) : undefined, url }); }); diff --git a/src/providers/sources/tugaflix/index.ts b/src/providers/sources/tugaflix/index.ts index ee7242f..eda8042 100644 --- a/src/providers/sources/tugaflix/index.ts +++ b/src/providers/sources/tugaflix/index.ts @@ -10,7 +10,7 @@ import { baseUrl, parseSearch } from './common'; export const tugaflixScraper = makeSourcerer({ id: 'tugaflix', name: 'Tugaflix', - rank: 112, + rank: 73, flags: [flags.IP_LOCKED], scrapeMovie: async (ctx) => { const searchResults = parseSearch( @@ -50,6 +50,8 @@ export const tugaflixScraper = makeSourcerer({ embedId: 'streamtape', url: finalUrl, }); + // found doodstream on a few shows, maybe movies use it too? + // the player 2 is just streamtape in a custom player } else if (finalUrl.includes('dood')) { embeds.push({ embedId: 'dood', @@ -84,7 +86,7 @@ export const tugaflixScraper = makeSourcerer({ }); const embedUrl = load(videoPage)('iframe[name="player"]').attr('src'); - if (!embedUrl) throw new Error('Failed to find taprUrl'); + if (!embedUrl) throw new Error('Failed to find iframe'); const playerPage = await ctx.proxiedFetcher(embedUrl.startsWith('https:') ? embedUrl : `https:${embedUrl}`, { method: 'POST', From af22162bfd5eef85d2084ab5227f6f162ae92a68 Mon Sep 17 00:00:00 2001 From: TPN Date: Tue, 16 Apr 2024 20:33:06 +0530 Subject: [PATCH 3/9] add source nites and embed bflix --- src/providers/all.ts | 4 ++ src/providers/embeds/bflix.ts | 42 ++++++++++++++++++ src/providers/sources/nites.ts | 79 ++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+) create mode 100644 src/providers/embeds/bflix.ts create mode 100644 src/providers/sources/nites.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 9cb3585..58046bc 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -22,6 +22,7 @@ import { showboxScraper } from '@/providers/sources/showbox/index'; import { vidsrcScraper } from '@/providers/sources/vidsrc/index'; import { zoechipScraper } from '@/providers/sources/zoechip'; +import { bflixScraper } from './embeds/bflix'; import { closeLoadScraper } from './embeds/closeload'; import { fileMoonScraper } from './embeds/filemoon'; import { ridooScraper } from './embeds/ridoo'; @@ -38,6 +39,7 @@ import { wootlyScraper } from './embeds/wootly'; import { goojaraScraper } from './sources/goojara'; import { hdRezkaScraper } from './sources/hdrezka'; import { nepuScraper } from './sources/nepu'; +import { nitesScraper } from './sources/nites'; import { primewireScraper } from './sources/primewire'; import { ridooMoviesScraper } from './sources/ridomovies'; import { smashyStreamScraper } from './sources/smashystream'; @@ -65,6 +67,7 @@ export function gatherAllSources(): Array { primewireScraper, warezcdnScraper, insertunitScraper, + nitesScraper, soaperTvScraper, ]; } @@ -98,5 +101,6 @@ export function gatherAllEmbeds(): Array { vTubeScraper, warezcdnembedHlsScraper, warezcdnembedMp4Scraper, + bflixScraper, ]; } diff --git a/src/providers/embeds/bflix.ts b/src/providers/embeds/bflix.ts new file mode 100644 index 0000000..092bc2a --- /dev/null +++ b/src/providers/embeds/bflix.ts @@ -0,0 +1,42 @@ +import { unpack } from 'unpacker'; + +import { makeEmbed } from '@/providers/base'; + +const evalCodeRegex = /eval\((.*)\)/g; +const mp4Regex = /https?:\/\/.*\.mp4/; + +export const bflixScraper = makeEmbed({ + id: 'bflix', + name: 'bFlix', + rank: 113, + scrape: async (ctx) => { + const mainPage = await ctx.proxiedFetcher(ctx.url); + + const evalCode = mainPage.match(evalCodeRegex); + if (!evalCode) throw new Error('Failed to find eval code'); + const unpacked = unpack(evalCode[0]); + + const file = unpacked.match(mp4Regex); + if (!file?.[0]) throw new Error('Failed to find file'); + + return { + stream: [ + { + id: 'primary', + type: 'file', + flags: [], + captions: [], + qualities: { + unknown: { + type: 'mp4', + url: file[0], + }, + }, + headers: { + Referer: 'https://bflix.gs/', + }, + }, + ], + }; + }, +}); diff --git a/src/providers/sources/nites.ts b/src/providers/sources/nites.ts new file mode 100644 index 0000000..ba017b5 --- /dev/null +++ b/src/providers/sources/nites.ts @@ -0,0 +1,79 @@ +import { load } from 'cheerio'; + +import { SourcererOutput, makeSourcerer } from '@/providers/base'; +import { compareMedia } from '@/utils/compare'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; + +const baseUrl = 'https://w1.nites.is'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const searchPage = await ctx.proxiedFetcher('/wp-admin/admin-ajax.php', { + baseUrl, + method: 'POST', + body: new URLSearchParams({ + action: 'ajax_pagination', + query_vars: 'mixed', + search: ctx.media.title, + }), + }); + + const $search = load(searchPage); + const searchResults: { title: string; year: number; url: string }[] = []; + + $search('li').each((_, element) => { + const title = $search(element).find('.entry-title').first().text().trim(); + const year = parseInt($search(element).find('.year').first().text().trim(), 10); + const url = $search(element).find('.lnk-blk').attr('href'); + if (!title || !year || !url) return; + + searchResults.push({ title, year, url }); + }); + + let watchPageUrl = searchResults.find((x) => x && compareMedia(ctx.media, x.title, x.year))?.url; + if (!watchPageUrl) throw new NotFoundError('No watchable item found'); + + if (ctx.media.type === 'show') { + const match = watchPageUrl.match(/\/series\/([^/]+)\/?/); + if (!match) throw new Error('Failed to parse watch page url'); + watchPageUrl = watchPageUrl.replace( + `/series/${match[1]}`, + `/episode/${match[1]}-${ctx.media.season.number}x${ctx.media.episode.number}`, + ); + } + + const watchPage = load(await ctx.proxiedFetcher(watchPageUrl)); + + // it embeds vidsrc when it bflix does not has the stream + // i think all shows embed vidsrc, not sure + const embedUrl = watchPage('ul.bx-lst li a:contains("- Bflix")') + .closest('aside') + .next('div.video-options') + .find('iframe') + .attr('data-lazy-src'); + + if (!embedUrl) throw new Error('Failed to find embed url'); + + const embedPage = load(await ctx.proxiedFetcher(embedUrl)); + + const url = embedPage('iframe').attr('src'); + if (!url) throw new Error('Failed to find embed url'); + + return { + embeds: [ + { + embedId: 'bflix', + url, + }, + ], + }; +} + +export const nitesScraper = makeSourcerer({ + id: 'nites', + name: 'Nites', + rank: 113, + flags: [], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +}); From 3a9c687d56380921904c32b2474575be16b451b8 Mon Sep 17 00:00:00 2001 From: TPN Date: Tue, 16 Apr 2024 22:02:57 +0530 Subject: [PATCH 4/9] adjust ranks --- src/providers/sources/nites.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/nites.ts b/src/providers/sources/nites.ts index ba017b5..4a3570a 100644 --- a/src/providers/sources/nites.ts +++ b/src/providers/sources/nites.ts @@ -72,7 +72,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const nitesScraper = makeSourcerer({ id: 'nites', name: 'Nites', - rank: 113, + rank: 90, flags: [], scrapeMovie: comboScraper, scrapeShow: comboScraper, From f34580978b9caf73516a343a357f422aa567e12c Mon Sep 17 00:00:00 2001 From: Exodus-MW Date: Wed, 17 Apr 2024 19:31:20 +0530 Subject: [PATCH 5/9] Per Joost's request, added Filemoon MP4 --- src/providers/all.ts | 2 ++ src/providers/embeds/filemoon/mp4.ts | 37 +++++++++++++++++++++++++ src/providers/sources/vidsrcto/index.ts | 14 +++++++--- 3 files changed, 49 insertions(+), 4 deletions(-) create mode 100644 src/providers/embeds/filemoon/mp4.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index f86a554..7b3ffdc 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -26,6 +26,7 @@ import { zoechipScraper } from '@/providers/sources/zoechip'; import { bflixScraper } from './embeds/bflix'; import { closeLoadScraper } from './embeds/closeload'; import { fileMoonScraper } from './embeds/filemoon'; +import { fileMoonMp4Scraper } from './embeds/filemoon/mp4'; import { ridooScraper } from './embeds/ridoo'; import { smashyStreamOScraper } from './embeds/smashystream/opstream'; import { smashyStreamFScraper } from './embeds/smashystream/video1'; @@ -92,6 +93,7 @@ export function gatherAllEmbeds(): Array { ridooScraper, closeLoadScraper, fileMoonScraper, + fileMoonMp4Scraper, vidplayScraper, wootlyScraper, doodScraper, diff --git a/src/providers/embeds/filemoon/mp4.ts b/src/providers/embeds/filemoon/mp4.ts new file mode 100644 index 0000000..64cd663 --- /dev/null +++ b/src/providers/embeds/filemoon/mp4.ts @@ -0,0 +1,37 @@ +import { NotFoundError } from '@/utils/errors'; + +import { makeEmbed } from '../../base'; + +import { fileMoonScraper } from './index'; + +export const fileMoonMp4Scraper = makeEmbed({ + id: 'filemoon-mp4', + name: 'Filemoon MP4', + rank: 500, + scrape: async (ctx) => { + const result = await fileMoonScraper.scrape(ctx); + + if (!result.stream) throw new NotFoundError('Failed to find result'); + + if (result.stream[0].type !== 'hls') throw new NotFoundError('Failed to find hls stream'); + + const url = result.stream[0].playlist.replace(/\/hls2\//, '/download/').replace(/\.m3u8/, '.mp4'); + + return { + stream: [ + { + id: 'primary', + type: 'file', + qualities: { + unknown: { + type: 'mp4', + url, + }, + }, + flags: [], + captions: result.stream[0].captions, + }, + ], + }; + }, +}); diff --git a/src/providers/sources/vidsrcto/index.ts b/src/providers/sources/vidsrcto/index.ts index 0f99b4e..3bb7b92 100644 --- a/src/providers/sources/vidsrcto/index.ts +++ b/src/providers/sources/vidsrcto/index.ts @@ -60,10 +60,16 @@ const universalScraper = async (ctx: ShowScrapeContext | MovieScrapeContext): Pr const urlWithSubtitles = embedArr.find((v) => v.source === 'Vidplay' && v.url.includes('sub.info'))?.url; const subtitleUrl = urlWithSubtitles ? new URL(urlWithSubtitles).searchParams.get('sub.info') : null; if (subtitleUrl) fullUrl.searchParams.set('sub.info', subtitleUrl); - embeds.push({ - embedId: 'filemoon', - url: fullUrl.toString(), - }); + embeds.push( + { + embedId: 'filemoon', + url: fullUrl.toString(), + }, + { + embedId: 'filemoon-mp4', + url: fullUrl.toString(), + }, + ); } } From 394d740fa01f89e3505f663d38a28ff842e70dd4 Mon Sep 17 00:00:00 2001 From: Exodus-MW Date: Wed, 17 Apr 2024 19:46:28 +0530 Subject: [PATCH 6/9] fix ranking --- src/providers/embeds/filemoon/index.ts | 2 +- src/providers/embeds/filemoon/mp4.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/embeds/filemoon/index.ts b/src/providers/embeds/filemoon/index.ts index fb6ee08..be1d9d3 100644 --- a/src/providers/embeds/filemoon/index.ts +++ b/src/providers/embeds/filemoon/index.ts @@ -11,7 +11,7 @@ const fileRegex = /file:"(.*?)"/g; export const fileMoonScraper = makeEmbed({ id: 'filemoon', name: 'Filemoon', - rank: 400, + rank: 300, scrape: async (ctx) => { const embedRes = await ctx.proxiedFetcher(ctx.url, { headers: { diff --git a/src/providers/embeds/filemoon/mp4.ts b/src/providers/embeds/filemoon/mp4.ts index 64cd663..181453b 100644 --- a/src/providers/embeds/filemoon/mp4.ts +++ b/src/providers/embeds/filemoon/mp4.ts @@ -7,7 +7,7 @@ import { fileMoonScraper } from './index'; export const fileMoonMp4Scraper = makeEmbed({ id: 'filemoon-mp4', name: 'Filemoon MP4', - rank: 500, + rank: 400, scrape: async (ctx) => { const result = await fileMoonScraper.scrape(ctx); From 30511f11e8bc3f8b26be356d0db59acc100cf92e Mon Sep 17 00:00:00 2001 From: Exodus-MW Date: Sun, 28 Apr 2024 13:59:17 +0530 Subject: [PATCH 7/9] Added NSBX --- src/providers/all.ts | 4 +++ src/providers/embeds/nsbx/delta.ts | 14 +++++++++++ src/providers/sources/nsbx.ts | 39 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 src/providers/embeds/nsbx/delta.ts create mode 100644 src/providers/sources/nsbx.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index 7b3ffdc..6652bfd 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -17,6 +17,7 @@ import { goMoviesScraper } from '@/providers/sources/gomovies/index'; import { insertunitScraper } from '@/providers/sources/insertunit'; import { kissAsianScraper } from '@/providers/sources/kissasian/index'; import { lookmovieScraper } from '@/providers/sources/lookmovie'; +import { nsbxScraper } from '@/providers/sources/nsbx'; import { remotestreamScraper } from '@/providers/sources/remotestream'; import { showboxScraper } from '@/providers/sources/showbox/index'; import { tugaflixScraper } from '@/providers/sources/tugaflix'; @@ -27,6 +28,7 @@ import { bflixScraper } from './embeds/bflix'; import { closeLoadScraper } from './embeds/closeload'; import { fileMoonScraper } from './embeds/filemoon'; import { fileMoonMp4Scraper } from './embeds/filemoon/mp4'; +import { deltaScraper } from './embeds/nsbx/delta'; import { ridooScraper } from './embeds/ridoo'; import { smashyStreamOScraper } from './embeds/smashystream/opstream'; import { smashyStreamFScraper } from './embeds/smashystream/video1'; @@ -60,6 +62,7 @@ export function gatherAllSources(): Array { zoechipScraper, vidsrcScraper, lookmovieScraper, + nsbxScraper, smashyStreamScraper, ridooMoviesScraper, vidSrcToScraper, @@ -94,6 +97,7 @@ export function gatherAllEmbeds(): Array { closeLoadScraper, fileMoonScraper, fileMoonMp4Scraper, + deltaScraper, vidplayScraper, wootlyScraper, doodScraper, diff --git a/src/providers/embeds/nsbx/delta.ts b/src/providers/embeds/nsbx/delta.ts new file mode 100644 index 0000000..deb751d --- /dev/null +++ b/src/providers/embeds/nsbx/delta.ts @@ -0,0 +1,14 @@ +import { EmbedOutput, makeEmbed } from '@/providers/base'; + +export const deltaScraper = makeEmbed({ + id: 'delta', + name: 'Delta', + rank: 200, + disabled: false, + async scrape(ctx) { + const url = `https://api.nsbx.ru/provider?resourceId=${encodeURIComponent(ctx.url)}&provider=delta`; + const result = await ctx.fetcher(url); + + return result as EmbedOutput; + }, +}); diff --git a/src/providers/sources/nsbx.ts b/src/providers/sources/nsbx.ts new file mode 100644 index 0000000..f2a29f4 --- /dev/null +++ b/src/providers/sources/nsbx.ts @@ -0,0 +1,39 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base'; +import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; +import { NotFoundError } from '@/utils/errors'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const query = { + title: ctx.media.title, + releaseYear: ctx.media.releaseYear, + tmdbId: ctx.media.tmdbId, + imdbId: ctx.media.imdbId, + type: ctx.media.type, + season: '', + episode: '', + }; + + if (ctx.media.type === 'show') { + query.season = ctx.media.season.number.toString(); + query.episode = ctx.media.episode.number.toString(); + } + + const result = await ctx.fetcher(`https://api.nsbx.ru/search?query=${encodeURIComponent(JSON.stringify(query))}`); + + if (result.embeds.length === 0) throw new NotFoundError('No watchable item found'); + + return { + embeds: result.embeds as SourcererEmbed[], + }; +} + +export const nsbxScraper = makeSourcerer({ + id: 'nsbx', + name: 'NSBX', + rank: 150, + flags: [flags.CORS_ALLOWED], + disabled: false, + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +}); From ead928c5d09cad1c23aeab58687d3fae7f426dba Mon Sep 17 00:00:00 2001 From: Exodus-MW Date: Mon, 29 Apr 2024 23:02:13 +0530 Subject: [PATCH 8/9] Fix nsbx, now works with ext on all instances --- src/providers/embeds/nsbx/delta.ts | 5 ++++- src/providers/sources/nsbx.ts | 9 ++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/providers/embeds/nsbx/delta.ts b/src/providers/embeds/nsbx/delta.ts index deb751d..95f354f 100644 --- a/src/providers/embeds/nsbx/delta.ts +++ b/src/providers/embeds/nsbx/delta.ts @@ -1,4 +1,5 @@ import { EmbedOutput, makeEmbed } from '@/providers/base'; +import { headers } from '@/providers/sources/nsbx'; export const deltaScraper = makeEmbed({ id: 'delta', @@ -7,7 +8,9 @@ export const deltaScraper = makeEmbed({ disabled: false, async scrape(ctx) { const url = `https://api.nsbx.ru/provider?resourceId=${encodeURIComponent(ctx.url)}&provider=delta`; - const result = await ctx.fetcher(url); + const result = await ctx.fetcher(url, { + headers, + }); return result as EmbedOutput; }, diff --git a/src/providers/sources/nsbx.ts b/src/providers/sources/nsbx.ts index f2a29f4..6082e96 100644 --- a/src/providers/sources/nsbx.ts +++ b/src/providers/sources/nsbx.ts @@ -3,6 +3,11 @@ import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; import { NotFoundError } from '@/utils/errors'; +export const headers = { + Origin: 'https://extension.works.again.with.nsbx', + Referer: 'https://extension.works.again.with.nsbx', +}; + async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { const query = { title: ctx.media.title, @@ -19,7 +24,9 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis query.episode = ctx.media.episode.number.toString(); } - const result = await ctx.fetcher(`https://api.nsbx.ru/search?query=${encodeURIComponent(JSON.stringify(query))}`); + const result = await ctx.fetcher(`https://api.nsbx.ru/search?query=${encodeURIComponent(JSON.stringify(query))}`, { + headers, + }); if (result.embeds.length === 0) throw new NotFoundError('No watchable item found'); From ff3ceecc37f874967950574b0a3d3a922016cbd4 Mon Sep 17 00:00:00 2001 From: Captain Jack Sparrow <163903675+sussy-code@users.noreply.github.com> Date: Thu, 2 May 2024 21:58:38 -0400 Subject: [PATCH 9/9] Delete src/dev-cli/browser directory --- src/dev-cli/browser/.gitignore | 1 - src/dev-cli/browser/index.html | 11 ----------- src/dev-cli/browser/index.ts | 17 ----------------- 3 files changed, 29 deletions(-) delete mode 100644 src/dev-cli/browser/.gitignore delete mode 100644 src/dev-cli/browser/index.html delete mode 100644 src/dev-cli/browser/index.ts diff --git a/src/dev-cli/browser/.gitignore b/src/dev-cli/browser/.gitignore deleted file mode 100644 index 1521c8b..0000000 --- a/src/dev-cli/browser/.gitignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/src/dev-cli/browser/index.html b/src/dev-cli/browser/index.html deleted file mode 100644 index 7709f4b..0000000 --- a/src/dev-cli/browser/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Scraper CLI - - - - - diff --git a/src/dev-cli/browser/index.ts b/src/dev-cli/browser/index.ts deleted file mode 100644 index d1f6494..0000000 --- a/src/dev-cli/browser/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { makeProviders, makeSimpleProxyFetcher, makeStandardFetcher, targets } from '../../../lib'; - -(window as any).scrape = (proxyUrl: string, type: 'source' | 'embed', input: any) => { - const providers = makeProviders({ - fetcher: makeStandardFetcher(fetch), - target: targets.BROWSER, - proxiedFetcher: makeSimpleProxyFetcher(proxyUrl, fetch), - }); - if (type === 'source') { - return providers.runSourceScraper(input); - } - if (type === 'embed') { - return providers.runEmbedScraper(input); - } - - throw new Error('Input input type'); -};