From 4021fe8aa61f2e48358ed70988525e1d53a82659 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:09:16 -0700 Subject: [PATCH 01/16] Fix catflix --- src/providers/sources/catflix.ts | 81 ++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/src/providers/sources/catflix.ts b/src/providers/sources/catflix.ts index 03c9456..9e599d8 100644 --- a/src/providers/sources/catflix.ts +++ b/src/providers/sources/catflix.ts @@ -1,56 +1,64 @@ 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://catflix.su'; +function decodeBase64(encodedString: string): string { + const decodedString = atob(encodedString); + return decodedString; +} + async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { - const searchPage = await ctx.proxiedFetcher('/', { - baseUrl, - query: { - s: ctx.media.title, - }, - }); + const movieId = ctx.media.tmdbId; + const mediaTitle = ctx.media.title.replace(/ /g, '-').replace(/[():]/g, '').toLowerCase(); + let watchPageUrl: string | undefined; - ctx.progress(40); + if (ctx.media.type === 'movie') { + watchPageUrl = `${baseUrl}/movie/${mediaTitle}-${movieId}`; + } else if (ctx.media.type === 'show') { + const seasonNumber = ctx.media.season.number; + const episodeNumber = ctx.media.episode.number; + const episodeId = ctx.media.episode.tmdbId; - const $search = load(searchPage); - const searchResults: { title: string; year?: number | undefined; url: string }[] = []; + if (!episodeId) { + throw new Error('Missing episode ID for show'); + } - $search('li').each((_, element) => { - const title = $search(element).find('h2').first().text().trim(); - // the year is always present, but I sitll decided to make it nullable since the impl isn't as future-proof - const year = Number($search(element).find('.text-xs > span').eq(1).text().trim()) || undefined; - const url = $search(element).find('a').attr('href'); - - if (!title || !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'); + watchPageUrl = `${baseUrl}/episode/${mediaTitle}-season-${seasonNumber}-episode-${episodeNumber}/eid-${episodeId}`; + } + if (!watchPageUrl) { + throw new Error('Failed to generate watch page URL'); + } ctx.progress(60); - 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 = await ctx.proxiedFetcher(watchPageUrl); + const $WatchPage = load(WatchPage); + + const scriptContent = $WatchPage('script') + .toArray() + .find((script) => { + return ( + script.children[0] && script.children[0].type === 'text' && script.children[0].data.includes('main_origin =') + ); + }); + + if (!scriptContent) { + throw new Error('Script containing main_origin not found'); } - const watchPage = load(await ctx.proxiedFetcher(watchPageUrl)); + const mainOriginScript = scriptContent.children[0].type === 'text' ? scriptContent.children[0].data : ''; + const mainOriginMatch = mainOriginScript.match(/main_origin = "(.*?)";/); - ctx.progress(80); + if (!mainOriginMatch) { + throw new Error('Unable to extract main_origin value'); + } - const url = watchPage('iframe').first().attr('src'); // I couldn't think of a better way - if (!url) throw new Error('Failed to find embed url'); + const Catflix1 = mainOriginMatch[1]; + + const decodedUrl = decodeBase64(Catflix1); ctx.progress(90); @@ -58,7 +66,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis embeds: [ { embedId: 'turbovid', - url, + url: decodedUrl, }, ], }; @@ -69,6 +77,7 @@ export const catflixScraper = makeSourcerer({ name: 'Catflix', rank: 122, flags: [], + disabled: false, scrapeMovie: comboScraper, scrapeShow: comboScraper, }); From 71dfb5b12b3ce5f34da88c19fca753a04d842ce0 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:09:28 -0700 Subject: [PATCH 02/16] reenable autoembed --- src/providers/sources/autoembed.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts index e4d9a2e..092f645 100644 --- a/src/providers/sources/autoembed.ts +++ b/src/providers/sources/autoembed.ts @@ -38,8 +38,8 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const autoembedScraper = makeSourcerer({ id: 'autoembed', name: 'Autoembed', - rank: 10, - disabled: true, + rank: 92, + disabled: false, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, scrapeShow: comboScraper, From f2ff86e884712fb5af3eab8cf4fa5b18fcd46b87 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:09:40 -0700 Subject: [PATCH 03/16] bombtheirish stopped working --- src/providers/sources/bombtheirish.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/providers/sources/bombtheirish.ts b/src/providers/sources/bombtheirish.ts index 946ecef..450b7a1 100644 --- a/src/providers/sources/bombtheirish.ts +++ b/src/providers/sources/bombtheirish.ts @@ -26,6 +26,7 @@ export const bombtheirishScraper = makeSourcerer({ id: 'bombtheirish', name: 'bombthe.irish', rank: 50, + disabled: true, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, scrapeShow: comboScraper, From d34b02e23a74022b7f11587e983052293df0f872 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:10:11 -0700 Subject: [PATCH 04/16] disable insertunit due to error Failed to verify humanity --- src/providers/sources/insertunit/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/providers/sources/insertunit/index.ts b/src/providers/sources/insertunit/index.ts index 2eb02b3..263eae6 100644 --- a/src/providers/sources/insertunit/index.ts +++ b/src/providers/sources/insertunit/index.ts @@ -12,6 +12,7 @@ export const insertunitScraper = makeSourcerer({ id: 'insertunit', name: 'Insertunit', rank: 60, + disabled: true, flags: [flags.CORS_ALLOWED], async scrapeShow(ctx) { const playerData = await ctx.fetcher(`/embed/imdb/${ctx.media.imdbId}`, { From 45109e5d91956a32045b6d880291663918ec6c0f Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:12:37 -0700 Subject: [PATCH 05/16] update source order and ext requirements --- src/providers/sources/ee3/index.ts | 2 +- src/providers/sources/ridomovies/index.ts | 3 +-- src/providers/sources/tugaflix/index.ts | 2 +- src/providers/sources/warezcdn/index.ts | 4 ++-- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/providers/sources/ee3/index.ts b/src/providers/sources/ee3/index.ts index 4424386..f881c41 100644 --- a/src/providers/sources/ee3/index.ts +++ b/src/providers/sources/ee3/index.ts @@ -91,7 +91,7 @@ async function comboScraper(ctx: MovieScrapeContext): Promise { export const ee3Scraper = makeSourcerer({ id: 'ee3', name: 'EE3', - rank: 111, + rank: 80, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, }); diff --git a/src/providers/sources/ridomovies/index.ts b/src/providers/sources/ridomovies/index.ts index 638ea13..b8d0328 100644 --- a/src/providers/sources/ridomovies/index.ts +++ b/src/providers/sources/ridomovies/index.ts @@ -1,6 +1,5 @@ import { load } from 'cheerio'; -import { flags } from '@/entrypoint/utils/targets'; import { SourcererEmbed, makeSourcerer } from '@/providers/base'; import { closeLoadScraper } from '@/providers/embeds/closeload'; import { ridooScraper } from '@/providers/embeds/ridoo'; @@ -75,7 +74,7 @@ export const ridooMoviesScraper = makeSourcerer({ id: 'ridomovies', name: 'RidoMovies', rank: 100, - flags: [flags.CORS_ALLOWED], + flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, }); diff --git a/src/providers/sources/tugaflix/index.ts b/src/providers/sources/tugaflix/index.ts index eda8042..f55e3fc 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: 73, + rank: 90, flags: [flags.IP_LOCKED], scrapeMovie: async (ctx) => { const searchResults = parseSearch( diff --git a/src/providers/sources/warezcdn/index.ts b/src/providers/sources/warezcdn/index.ts index fbfc31c..87660c0 100644 --- a/src/providers/sources/warezcdn/index.ts +++ b/src/providers/sources/warezcdn/index.ts @@ -48,8 +48,8 @@ async function getEmbeds(id: string, servers: string, ctx: ScrapeContext): Promi export const warezcdnScraper = makeSourcerer({ id: 'warezcdn', name: 'WarezCDN', - rank: 81, - flags: [flags.CORS_ALLOWED], + rank: 101, + flags: [], scrapeMovie: async (ctx) => { if (!ctx.media.imdbId) throw new NotFoundError('This source requires IMDB id.'); const serversPage = await ctx.proxiedFetcher(`/filme/${ctx.media.imdbId}`, { From 355d86ce1906adce2c9b4e1edc147a14b4f48a97 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:15:45 -0700 Subject: [PATCH 06/16] disable m4ufree MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit updated source ID rules to fix cli, but still won't load in player 🤷‍♂️ --- src/providers/sources/m4ufree.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/providers/sources/m4ufree.ts b/src/providers/sources/m4ufree.ts index 5ee841e..f1ac0ce 100644 --- a/src/providers/sources/m4ufree.ts +++ b/src/providers/sources/m4ufree.ts @@ -113,11 +113,16 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => for (const source of sources) { let embedId; - if (source.name === 'm') - embedId = 'playm4u-m'; // TODO - else if (source.name === 'nm') embedId = 'playm4u-nm'; - else if (source.name === 'h') embedId = 'hydrax'; - else continue; + + if (source.name === 'm') { + embedId = 'playm4u-m'; + } else if (source.name === 'nm') { + continue; + } else if (source.name === 'h') { + embedId = 'playm4u-nm'; + } else { + continue; + } const iframePage$ = load( await ctx.proxiedFetcher('/ajax', { @@ -149,7 +154,8 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => export const m4uScraper = makeSourcerer({ id: 'm4ufree', name: 'M4UFree', - rank: 125, + rank: 60, + disabled: true, flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, From 22322c7069efa89694ea6f1b52cd31ae1facded7 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:28:45 -0700 Subject: [PATCH 07/16] remove flags in warezcdn --- src/providers/sources/warezcdn/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/providers/sources/warezcdn/index.ts b/src/providers/sources/warezcdn/index.ts index 87660c0..348dc03 100644 --- a/src/providers/sources/warezcdn/index.ts +++ b/src/providers/sources/warezcdn/index.ts @@ -1,4 +1,3 @@ -import { flags } from '@/entrypoint/utils/targets'; import { SourcererEmbed, SourcererOutput, makeSourcerer } from '@/providers/base'; import { mixdropScraper } from '@/providers/embeds/mixdrop'; import { warezcdnembedHlsScraper } from '@/providers/embeds/warezcdn/hls'; From 4a0416fa4dd3031f68061bb8f87e111e4eb6b8bd Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 11:31:04 -0700 Subject: [PATCH 08/16] im a little slow --- src/providers/sources/catflix.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/providers/sources/catflix.ts b/src/providers/sources/catflix.ts index 9e599d8..02a4d71 100644 --- a/src/providers/sources/catflix.ts +++ b/src/providers/sources/catflix.ts @@ -5,11 +5,6 @@ import { MovieScrapeContext, ShowScrapeContext } from '@/utils/context'; const baseUrl = 'https://catflix.su'; -function decodeBase64(encodedString: string): string { - const decodedString = atob(encodedString); - return decodedString; -} - async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { const movieId = ctx.media.tmdbId; const mediaTitle = ctx.media.title.replace(/ /g, '-').replace(/[():]/g, '').toLowerCase(); @@ -58,7 +53,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis const Catflix1 = mainOriginMatch[1]; - const decodedUrl = decodeBase64(Catflix1); + const decodedUrl = atob(Catflix1); ctx.progress(90); From 393abf66f38521347ddde2c1adf890a949fb72bb Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 13:01:53 -0700 Subject: [PATCH 09/16] Update all ranks --- src/providers/sources/autoembed.ts | 2 +- src/providers/sources/bombtheirish.ts | 2 +- src/providers/sources/catflix.ts | 2 +- src/providers/sources/ee3/index.ts | 2 +- src/providers/sources/flixhq/index.ts | 2 +- src/providers/sources/fsharetv.ts | 2 +- src/providers/sources/gomovies/index.ts | 2 +- src/providers/sources/goojara/index.ts | 2 +- src/providers/sources/hdrezka/index.ts | 2 +- src/providers/sources/insertunit/index.ts | 2 +- src/providers/sources/lookmovie/index.ts | 2 +- src/providers/sources/m4ufree.ts | 2 +- src/providers/sources/nepu/index.ts | 2 +- src/providers/sources/nites.ts | 2 +- src/providers/sources/nsbx.ts | 2 +- src/providers/sources/primewire/index.ts | 2 +- src/providers/sources/redstar.ts | 2 +- src/providers/sources/remotestream.ts | 2 +- src/providers/sources/ridomovies/index.ts | 2 +- src/providers/sources/showbox/index.ts | 2 +- src/providers/sources/smashystream/index.ts | 2 +- src/providers/sources/soapertv/index.ts | 2 +- src/providers/sources/tugaflix/index.ts | 2 +- src/providers/sources/vidsrcto/index.ts | 2 +- src/providers/sources/warezcdn/index.ts | 2 +- src/providers/sources/whvx.ts | 2 +- src/providers/sources/zoechip/index.ts | 2 +- 27 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts index 092f645..40861d8 100644 --- a/src/providers/sources/autoembed.ts +++ b/src/providers/sources/autoembed.ts @@ -38,7 +38,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const autoembedScraper = makeSourcerer({ id: 'autoembed', name: 'Autoembed', - rank: 92, + rank: 100, disabled: false, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, diff --git a/src/providers/sources/bombtheirish.ts b/src/providers/sources/bombtheirish.ts index 450b7a1..63456a0 100644 --- a/src/providers/sources/bombtheirish.ts +++ b/src/providers/sources/bombtheirish.ts @@ -25,7 +25,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const bombtheirishScraper = makeSourcerer({ id: 'bombtheirish', name: 'bombthe.irish', - rank: 50, + rank: 110, disabled: true, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, diff --git a/src/providers/sources/catflix.ts b/src/providers/sources/catflix.ts index 02a4d71..8e825ad 100644 --- a/src/providers/sources/catflix.ts +++ b/src/providers/sources/catflix.ts @@ -70,7 +70,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const catflixScraper = makeSourcerer({ id: 'catflix', name: 'Catflix', - rank: 122, + rank: 170, flags: [], disabled: false, scrapeMovie: comboScraper, diff --git a/src/providers/sources/ee3/index.ts b/src/providers/sources/ee3/index.ts index f881c41..93c9d9c 100644 --- a/src/providers/sources/ee3/index.ts +++ b/src/providers/sources/ee3/index.ts @@ -91,7 +91,7 @@ async function comboScraper(ctx: MovieScrapeContext): Promise { export const ee3Scraper = makeSourcerer({ id: 'ee3', name: 'EE3', - rank: 80, + rank: 150, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, }); diff --git a/src/providers/sources/flixhq/index.ts b/src/providers/sources/flixhq/index.ts index d0a2898..2f03bc2 100644 --- a/src/providers/sources/flixhq/index.ts +++ b/src/providers/sources/flixhq/index.ts @@ -9,7 +9,7 @@ import { NotFoundError } from '@/utils/errors'; export const flixhqScraper = makeSourcerer({ id: 'flixhq', name: 'FlixHQ', - rank: 61, + rank: 230, flags: [flags.CORS_ALLOWED], disabled: true, async scrapeMovie(ctx) { diff --git a/src/providers/sources/fsharetv.ts b/src/providers/sources/fsharetv.ts index 6193607..d921331 100644 --- a/src/providers/sources/fsharetv.ts +++ b/src/providers/sources/fsharetv.ts @@ -88,7 +88,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const fsharetvScraper = makeSourcerer({ id: 'fsharetv', name: 'FshareTV', - rank: 93, + rank: 220, flags: [], scrapeMovie: comboScraper, }); diff --git a/src/providers/sources/gomovies/index.ts b/src/providers/sources/gomovies/index.ts index 419efba..b9c9232 100644 --- a/src/providers/sources/gomovies/index.ts +++ b/src/providers/sources/gomovies/index.ts @@ -17,7 +17,7 @@ export const gomoviesBase = `https://gomovies.sx`; export const goMoviesScraper = makeSourcerer({ id: 'gomovies', name: 'GOmovies', - rank: 60, + rank: 50, disabled: true, flags: [flags.CORS_ALLOWED], async scrapeShow(ctx) { diff --git a/src/providers/sources/goojara/index.ts b/src/providers/sources/goojara/index.ts index 7e2955a..0cc0749 100644 --- a/src/providers/sources/goojara/index.ts +++ b/src/providers/sources/goojara/index.ts @@ -22,7 +22,7 @@ async function universalScraper(ctx: ShowScrapeContext | MovieScrapeContext): Pr export const goojaraScraper = makeSourcerer({ id: 'goojara', name: 'Goojara', - rank: 70, + rank: 180, flags: [], disabled: true, scrapeShow: universalScraper, diff --git a/src/providers/sources/hdrezka/index.ts b/src/providers/sources/hdrezka/index.ts index f21c7b6..8ddb32f 100644 --- a/src/providers/sources/hdrezka/index.ts +++ b/src/providers/sources/hdrezka/index.ts @@ -120,7 +120,7 @@ const universalScraper = async (ctx: ShowScrapeContext | MovieScrapeContext): Pr export const hdRezkaScraper = makeSourcerer({ id: 'hdrezka', name: 'HDRezka', - rank: 120, + rank: 190, flags: [flags.CORS_ALLOWED, flags.IP_LOCKED], scrapeShow: universalScraper, scrapeMovie: universalScraper, diff --git a/src/providers/sources/insertunit/index.ts b/src/providers/sources/insertunit/index.ts index 263eae6..17041d8 100644 --- a/src/providers/sources/insertunit/index.ts +++ b/src/providers/sources/insertunit/index.ts @@ -11,7 +11,7 @@ const insertUnitBase = 'https://api.insertunit.ws/'; export const insertunitScraper = makeSourcerer({ id: 'insertunit', name: 'Insertunit', - rank: 60, + rank: 120, disabled: true, flags: [flags.CORS_ALLOWED], async scrapeShow(ctx) { diff --git a/src/providers/sources/lookmovie/index.ts b/src/providers/sources/lookmovie/index.ts index 80f816d..4bffc1f 100644 --- a/src/providers/sources/lookmovie/index.ts +++ b/src/providers/sources/lookmovie/index.ts @@ -33,7 +33,7 @@ export const lookmovieScraper = makeSourcerer({ id: 'lookmovie', name: 'LookMovie', disabled: true, - rank: 50, + rank: 60, flags: [flags.IP_LOCKED], scrapeShow: universalScraper, scrapeMovie: universalScraper, diff --git a/src/providers/sources/m4ufree.ts b/src/providers/sources/m4ufree.ts index f1ac0ce..b77ff73 100644 --- a/src/providers/sources/m4ufree.ts +++ b/src/providers/sources/m4ufree.ts @@ -154,7 +154,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => export const m4uScraper = makeSourcerer({ id: 'm4ufree', name: 'M4UFree', - rank: 60, + rank: 200, disabled: true, flags: [], scrapeMovie: universalScraper, diff --git a/src/providers/sources/nepu/index.ts b/src/providers/sources/nepu/index.ts index 8f3a094..d8d136d 100644 --- a/src/providers/sources/nepu/index.ts +++ b/src/providers/sources/nepu/index.ts @@ -76,7 +76,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => export const nepuScraper = makeSourcerer({ id: 'nepu', name: 'Nepu', - rank: 80, + rank: 210, disabled: true, flags: [], scrapeMovie: universalScraper, diff --git a/src/providers/sources/nites.ts b/src/providers/sources/nites.ts index 573a2e3..89289dd 100644 --- a/src/providers/sources/nites.ts +++ b/src/providers/sources/nites.ts @@ -73,7 +73,7 @@ export const nitesScraper = makeSourcerer({ id: 'nites', name: 'Nites', disabled: true, - rank: 90, + rank: 80, flags: [], scrapeMovie: comboScraper, scrapeShow: comboScraper, diff --git a/src/providers/sources/nsbx.ts b/src/providers/sources/nsbx.ts index 79d08c3..d4a29c7 100644 --- a/src/providers/sources/nsbx.ts +++ b/src/providers/sources/nsbx.ts @@ -36,7 +36,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const nsbxScraper = makeSourcerer({ id: 'nsbx', name: 'NSBX', - rank: 129, + rank: 290, flags: [flags.CORS_ALLOWED], disabled: true, externalSource: true, diff --git a/src/providers/sources/primewire/index.ts b/src/providers/sources/primewire/index.ts index 1019bf8..2ca8ed0 100644 --- a/src/providers/sources/primewire/index.ts +++ b/src/providers/sources/primewire/index.ts @@ -80,7 +80,7 @@ async function getStreams(title: string) { export const primewireScraper = makeSourcerer({ id: 'primewire', name: 'Primewire', - rank: 1, + rank: 10, disabled: true, flags: [flags.CORS_ALLOWED], async scrapeMovie(ctx) { diff --git a/src/providers/sources/redstar.ts b/src/providers/sources/redstar.ts index 4b29840..52c9281 100644 --- a/src/providers/sources/redstar.ts +++ b/src/providers/sources/redstar.ts @@ -37,7 +37,7 @@ export const redStarScraper = makeSourcerer({ name: 'redStar', disabled: true, externalSource: true, - rank: 131, + rank: 280, flags: [flags.CORS_ALLOWED], scrapeMovie: universalScraper, scrapeShow: universalScraper, diff --git a/src/providers/sources/remotestream.ts b/src/providers/sources/remotestream.ts index 15b07df..a964faf 100644 --- a/src/providers/sources/remotestream.ts +++ b/src/providers/sources/remotestream.ts @@ -11,7 +11,7 @@ export const remotestreamScraper = makeSourcerer({ id: 'remotestream', name: 'Remote Stream', disabled: true, - rank: 20, + rank: 30, flags: [flags.CORS_ALLOWED], async scrapeShow(ctx) { const seasonNumber = ctx.media.season.number; diff --git a/src/providers/sources/ridomovies/index.ts b/src/providers/sources/ridomovies/index.ts index b8d0328..1c411ac 100644 --- a/src/providers/sources/ridomovies/index.ts +++ b/src/providers/sources/ridomovies/index.ts @@ -73,7 +73,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => export const ridooMoviesScraper = makeSourcerer({ id: 'ridomovies', name: 'RidoMovies', - rank: 100, + rank: 130, flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, diff --git a/src/providers/sources/showbox/index.ts b/src/providers/sources/showbox/index.ts index 9901a52..178710b 100644 --- a/src/providers/sources/showbox/index.ts +++ b/src/providers/sources/showbox/index.ts @@ -41,7 +41,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const showboxScraper = makeSourcerer({ id: 'showbox', name: 'Showbox', - rank: 150, + rank: 250, disabled: true, flags: [flags.CORS_ALLOWED, flags.CF_BLOCKED], scrapeShow: comboScraper, diff --git a/src/providers/sources/smashystream/index.ts b/src/providers/sources/smashystream/index.ts index cc91cef..16ead35 100644 --- a/src/providers/sources/smashystream/index.ts +++ b/src/providers/sources/smashystream/index.ts @@ -30,7 +30,7 @@ const universalScraper = async (ctx: ShowScrapeContext | MovieScrapeContext): Pr export const smashyStreamScraper = makeSourcerer({ id: 'smashystream', name: 'SmashyStream', - rank: 30, + rank: 20, disabled: true, flags: [flags.CORS_ALLOWED], scrapeMovie: universalScraper, diff --git a/src/providers/sources/soapertv/index.ts b/src/providers/sources/soapertv/index.ts index 506ae53..c9878d9 100644 --- a/src/providers/sources/soapertv/index.ts +++ b/src/providers/sources/soapertv/index.ts @@ -115,7 +115,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext): Pr export const soaperTvScraper = makeSourcerer({ id: 'soapertv', name: 'SoaperTV', - rank: 126, + rank: 160, flags: [flags.CORS_ALLOWED], scrapeMovie: universalScraper, scrapeShow: universalScraper, diff --git a/src/providers/sources/tugaflix/index.ts b/src/providers/sources/tugaflix/index.ts index f55e3fc..a2ef3ef 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: 90, + rank: 70, flags: [flags.IP_LOCKED], scrapeMovie: async (ctx) => { const searchResults = parseSearch( diff --git a/src/providers/sources/vidsrcto/index.ts b/src/providers/sources/vidsrcto/index.ts index d048b69..593a41a 100644 --- a/src/providers/sources/vidsrcto/index.ts +++ b/src/providers/sources/vidsrcto/index.ts @@ -86,5 +86,5 @@ export const vidSrcToScraper = makeSourcerer({ scrapeMovie: universalScraper, scrapeShow: universalScraper, flags: [flags.PROXY_BLOCKED], - rank: 130, + rank: 260, }); diff --git a/src/providers/sources/warezcdn/index.ts b/src/providers/sources/warezcdn/index.ts index 348dc03..7946ae3 100644 --- a/src/providers/sources/warezcdn/index.ts +++ b/src/providers/sources/warezcdn/index.ts @@ -47,7 +47,7 @@ async function getEmbeds(id: string, servers: string, ctx: ScrapeContext): Promi export const warezcdnScraper = makeSourcerer({ id: 'warezcdn', name: 'WarezCDN', - rank: 101, + rank: 140, flags: [], scrapeMovie: async (ctx) => { if (!ctx.media.imdbId) throw new NotFoundError('This source requires IMDB id.'); diff --git a/src/providers/sources/whvx.ts b/src/providers/sources/whvx.ts index 71a1620..65ce417 100644 --- a/src/providers/sources/whvx.ts +++ b/src/providers/sources/whvx.ts @@ -37,7 +37,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const whvxScraper = makeSourcerer({ id: 'whvx', name: 'VidBinge', - rank: 128, + rank: 270, disabled: true, externalSource: true, flags: [flags.CORS_ALLOWED], diff --git a/src/providers/sources/zoechip/index.ts b/src/providers/sources/zoechip/index.ts index 6a991a0..a52d511 100644 --- a/src/providers/sources/zoechip/index.ts +++ b/src/providers/sources/zoechip/index.ts @@ -6,7 +6,7 @@ import { scrapeShow } from '@/providers/sources/zoechip/scrape-show'; export const zoechipScraper = makeSourcerer({ id: 'zoechip', name: 'ZoeChip', - rank: 62, + rank: 240, flags: [flags.CORS_ALLOWED], disabled: true, scrapeMovie, From d69bd0fb9dd4baaf17d70f28911a6794a2e6858e Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 17:30:02 -0700 Subject: [PATCH 10/16] make autoembed only return english embeds --- src/providers/sources/autoembed.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts index 40861d8..0859fc0 100644 --- a/src/providers/sources/autoembed.ts +++ b/src/providers/sources/autoembed.ts @@ -27,7 +27,11 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis for (const stream of fileData) { const url = stream.file; if (!url) continue; - embeds.push({ embedId: `autoembed-${stream.title.toLowerCase().trim()}`, url }); + const lang = stream.title.toLowerCase().trim(); + // only return english + if (lang.includes('english') && url) { + embeds.push({ embedId: `autoembed-${lang}`, url }); + } } return { From 546cef05d1bdb2ba061c4dd4da433519514402f3 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Thu, 2 Jan 2025 22:45:14 -0700 Subject: [PATCH 11/16] move vidsrc higher --- src/providers/sources/autoembed.ts | 2 +- src/providers/sources/bombtheirish.ts | 2 +- src/providers/sources/insertunit/index.ts | 2 +- src/providers/sources/ridomovies/index.ts | 2 +- src/providers/sources/vidsrc/index.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts index 0859fc0..fa461f3 100644 --- a/src/providers/sources/autoembed.ts +++ b/src/providers/sources/autoembed.ts @@ -42,7 +42,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const autoembedScraper = makeSourcerer({ id: 'autoembed', name: 'Autoembed', - rank: 100, + rank: 90, disabled: false, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, diff --git a/src/providers/sources/bombtheirish.ts b/src/providers/sources/bombtheirish.ts index 63456a0..970f3db 100644 --- a/src/providers/sources/bombtheirish.ts +++ b/src/providers/sources/bombtheirish.ts @@ -25,7 +25,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis export const bombtheirishScraper = makeSourcerer({ id: 'bombtheirish', name: 'bombthe.irish', - rank: 110, + rank: 100, disabled: true, flags: [flags.CORS_ALLOWED], scrapeMovie: comboScraper, diff --git a/src/providers/sources/insertunit/index.ts b/src/providers/sources/insertunit/index.ts index 17041d8..3b9714d 100644 --- a/src/providers/sources/insertunit/index.ts +++ b/src/providers/sources/insertunit/index.ts @@ -11,7 +11,7 @@ const insertUnitBase = 'https://api.insertunit.ws/'; export const insertunitScraper = makeSourcerer({ id: 'insertunit', name: 'Insertunit', - rank: 120, + rank: 110, disabled: true, flags: [flags.CORS_ALLOWED], async scrapeShow(ctx) { diff --git a/src/providers/sources/ridomovies/index.ts b/src/providers/sources/ridomovies/index.ts index 1c411ac..e028e22 100644 --- a/src/providers/sources/ridomovies/index.ts +++ b/src/providers/sources/ridomovies/index.ts @@ -73,7 +73,7 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => export const ridooMoviesScraper = makeSourcerer({ id: 'ridomovies', name: 'RidoMovies', - rank: 130, + rank: 120, flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, diff --git a/src/providers/sources/vidsrc/index.ts b/src/providers/sources/vidsrc/index.ts index d4df2f7..1a466e5 100644 --- a/src/providers/sources/vidsrc/index.ts +++ b/src/providers/sources/vidsrc/index.ts @@ -5,7 +5,7 @@ import { scrapeShow } from '@/providers/sources/vidsrc/scrape-show'; export const vidsrcScraper = makeSourcerer({ id: 'vidsrc', name: 'VidSrc', - rank: 90, + rank: 130, disabled: true, flags: [], scrapeMovie, From 3c3edbbacec223d7ebee3764e9f05f9f43b404c7 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Fri, 3 Jan 2025 10:46:01 -0700 Subject: [PATCH 12/16] revert Catflix changes (keep rank) --- src/providers/sources/catflix.ts | 76 +++++++++++++++----------------- 1 file changed, 36 insertions(+), 40 deletions(-) diff --git a/src/providers/sources/catflix.ts b/src/providers/sources/catflix.ts index 8e825ad..11c98b4 100644 --- a/src/providers/sources/catflix.ts +++ b/src/providers/sources/catflix.ts @@ -1,59 +1,56 @@ 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://catflix.su'; async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { - const movieId = ctx.media.tmdbId; - const mediaTitle = ctx.media.title.replace(/ /g, '-').replace(/[():]/g, '').toLowerCase(); - let watchPageUrl: string | undefined; + const searchPage = await ctx.proxiedFetcher('/', { + baseUrl, + query: { + s: ctx.media.title, + }, + }); - if (ctx.media.type === 'movie') { - watchPageUrl = `${baseUrl}/movie/${mediaTitle}-${movieId}`; - } else if (ctx.media.type === 'show') { - const seasonNumber = ctx.media.season.number; - const episodeNumber = ctx.media.episode.number; - const episodeId = ctx.media.episode.tmdbId; + ctx.progress(40); - if (!episodeId) { - throw new Error('Missing episode ID for show'); - } + const $search = load(searchPage); + const searchResults: { title: string; year?: number | undefined; url: string }[] = []; - watchPageUrl = `${baseUrl}/episode/${mediaTitle}-season-${seasonNumber}-episode-${episodeNumber}/eid-${episodeId}`; - } - if (!watchPageUrl) { - throw new Error('Failed to generate watch page URL'); - } + $search('li').each((_, element) => { + const title = $search(element).find('h2').first().text().trim(); + // the year is always present, but I sitll decided to make it nullable since the impl isn't as future-proof + const year = Number($search(element).find('.text-xs > span').eq(1).text().trim()) || undefined; + const url = $search(element).find('a').attr('href'); + + if (!title || !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'); ctx.progress(60); - const WatchPage = await ctx.proxiedFetcher(watchPageUrl); - const $WatchPage = load(WatchPage); - - const scriptContent = $WatchPage('script') - .toArray() - .find((script) => { - return ( - script.children[0] && script.children[0].type === 'text' && script.children[0].data.includes('main_origin =') - ); - }); - - if (!scriptContent) { - throw new Error('Script containing main_origin not 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 mainOriginScript = scriptContent.children[0].type === 'text' ? scriptContent.children[0].data : ''; - const mainOriginMatch = mainOriginScript.match(/main_origin = "(.*?)";/); + const watchPage = load(await ctx.proxiedFetcher(watchPageUrl)); - if (!mainOriginMatch) { - throw new Error('Unable to extract main_origin value'); - } + ctx.progress(80); - const Catflix1 = mainOriginMatch[1]; - - const decodedUrl = atob(Catflix1); + const url = watchPage('iframe').first().attr('src'); // I couldn't think of a better way + if (!url) throw new Error('Failed to find embed url'); ctx.progress(90); @@ -61,7 +58,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis embeds: [ { embedId: 'turbovid', - url: decodedUrl, + url, }, ], }; @@ -72,7 +69,6 @@ export const catflixScraper = makeSourcerer({ name: 'Catflix', rank: 170, flags: [], - disabled: false, scrapeMovie: comboScraper, scrapeShow: comboScraper, }); From 1604dd3d1397b6647bcee7a81c7daa8c99e0c0f0 Mon Sep 17 00:00:00 2001 From: Ivan Evans <74743263+Pasithea0@users.noreply.github.com> Date: Fri, 3 Jan 2025 11:02:00 -0700 Subject: [PATCH 13/16] revert m4ufree embed test sloppy sloppy --- src/providers/sources/m4ufree.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/providers/sources/m4ufree.ts b/src/providers/sources/m4ufree.ts index b77ff73..d7cc952 100644 --- a/src/providers/sources/m4ufree.ts +++ b/src/providers/sources/m4ufree.ts @@ -114,15 +114,11 @@ const universalScraper = async (ctx: MovieScrapeContext | ShowScrapeContext) => for (const source of sources) { let embedId; - if (source.name === 'm') { - embedId = 'playm4u-m'; - } else if (source.name === 'nm') { - continue; - } else if (source.name === 'h') { - embedId = 'playm4u-nm'; - } else { - continue; - } + if (source.name === 'm') + embedId = 'playm4u-m'; // TODO + else if (source.name === 'nm') embedId = 'playm4u-nm'; + else if (source.name === 'h') embedId = 'hydrax'; + else continue; const iframePage$ = load( await ctx.proxiedFetcher('/ajax', { @@ -155,7 +151,7 @@ export const m4uScraper = makeSourcerer({ id: 'm4ufree', name: 'M4UFree', rank: 200, - disabled: true, + disabled: false, flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, From 1b0eafcca7b59ada061e5177cfa95a159b5898fc Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Tue, 7 Jan 2025 17:49:13 -0700 Subject: [PATCH 14/16] disable m4ufree --- src/providers/sources/m4ufree.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/sources/m4ufree.ts b/src/providers/sources/m4ufree.ts index d7cc952..8494f6d 100644 --- a/src/providers/sources/m4ufree.ts +++ b/src/providers/sources/m4ufree.ts @@ -151,7 +151,7 @@ export const m4uScraper = makeSourcerer({ id: 'm4ufree', name: 'M4UFree', rank: 200, - disabled: false, + disabled: true, flags: [], scrapeMovie: universalScraper, scrapeShow: universalScraper, From bba6699de32fb22b88d282e968cea25f8438ec2b Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 8 Jan 2025 16:40:48 +0530 Subject: [PATCH 15/16] Enable Autoembed English embed only --- src/providers/embeds/autoembed.ts | 9 +++++++-- src/providers/sources/autoembed.ts | 6 +----- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/providers/embeds/autoembed.ts b/src/providers/embeds/autoembed.ts index 50d153a..b7e166b 100644 --- a/src/providers/embeds/autoembed.ts +++ b/src/providers/embeds/autoembed.ts @@ -9,25 +9,30 @@ const providers = [ { id: 'autoembed-hindi', rank: 9, + disabled: true, }, { id: 'autoembed-tamil', rank: 8, + disabled: true, }, { id: 'autoembed-telugu', rank: 7, + disabled: true, }, { id: 'autoembed-bengali', rank: 6, + disabled: true, }, ]; -function embed(provider: { id: string; rank: number }) { +function embed(provider: { id: string; rank: number; disabled?: boolean }) { return makeEmbed({ id: provider.id, - name: provider.id.charAt(0).toUpperCase() + provider.id.slice(1), + name: provider.id.split('-').map(word => word[0].toUpperCase() + word.slice(1)).join(' '), + disabled: provider.disabled, rank: provider.rank, async scrape(ctx) { return { diff --git a/src/providers/sources/autoembed.ts b/src/providers/sources/autoembed.ts index fa461f3..549be58 100644 --- a/src/providers/sources/autoembed.ts +++ b/src/providers/sources/autoembed.ts @@ -27,11 +27,7 @@ async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promis for (const stream of fileData) { const url = stream.file; if (!url) continue; - const lang = stream.title.toLowerCase().trim(); - // only return english - if (lang.includes('english') && url) { - embeds.push({ embedId: `autoembed-${lang}`, url }); - } + embeds.push({ embedId: `autoembed-${stream.title.toLowerCase().trim()}`, url }); } return { From 42385bb217bbf8693fe12390a6f875c0380a3a79 Mon Sep 17 00:00:00 2001 From: TPN Date: Wed, 8 Jan 2025 16:48:21 +0530 Subject: [PATCH 16/16] lint gods are unhappy --- src/providers/embeds/autoembed.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/providers/embeds/autoembed.ts b/src/providers/embeds/autoembed.ts index b7e166b..dc54e96 100644 --- a/src/providers/embeds/autoembed.ts +++ b/src/providers/embeds/autoembed.ts @@ -31,7 +31,10 @@ const providers = [ function embed(provider: { id: string; rank: number; disabled?: boolean }) { return makeEmbed({ id: provider.id, - name: provider.id.split('-').map(word => word[0].toUpperCase() + word.slice(1)).join(' '), + name: provider.id + .split('-') + .map((word) => word[0].toUpperCase() + word.slice(1)) + .join(' '), disabled: provider.disabled, rank: provider.rank, async scrape(ctx) {