From 75379be76c7c17a86980da0772e4e84a48648c7b Mon Sep 17 00:00:00 2001 From: Pas <74743263+Pasithea0@users.noreply.github.com> Date: Sun, 23 Feb 2025 13:02:02 -0700 Subject: [PATCH] add uira.live --- src/providers/all.ts | 24 +++++++ src/providers/embeds/uiralive.ts | 101 ++++++++++++++++++++++++++++++ src/providers/sources/uiralive.ts | 39 ++++++++++++ 3 files changed, 164 insertions(+) create mode 100644 src/providers/embeds/uiralive.ts create mode 100644 src/providers/sources/uiralive.ts diff --git a/src/providers/all.ts b/src/providers/all.ts index ab3e4e1..20b03ec 100644 --- a/src/providers/all.ts +++ b/src/providers/all.ts @@ -57,6 +57,18 @@ import { smashyStreamOScraper } from './embeds/smashystream/opstream'; import { smashyStreamFScraper } from './embeds/smashystream/video1'; import { streamtapeScraper } from './embeds/streamtape'; import { streamvidScraper } from './embeds/streamvid'; +import { + uiraFlixhqScraper, + uiraGhostScraper, + uiraGuruScraper, + uiraHydraxScraper, + uiraMegaScraper, + uiraNinjaScraper, + uiraOrionScraper, + uiraRabbitScraper, + uiraVidapiScraper, + uiraVidsrcvipScraper, +} from './embeds/uiralive'; import { vidCloudScraper } from './embeds/vidcloud'; import { vidplayScraper } from './embeds/vidplay'; import { @@ -95,6 +107,7 @@ import { ridooMoviesScraper } from './sources/ridomovies'; import { slidemoviesScraper } from './sources/slidemovies'; import { smashyStreamScraper } from './sources/smashystream'; import { soaperTvScraper } from './sources/soapertv'; +import { uiraliveScraper } from './sources/uiralive'; import { vidlinkScraper } from './sources/vidlink'; import { vidSrcToScraper } from './sources/vidsrcto'; import { warezcdnScraper } from './sources/warezcdn'; @@ -142,6 +155,7 @@ export function gatherAllSources(): Array { slidemoviesScraper, iosmirrorScraper, iosmirrorPVScraper, + uiraliveScraper, ]; } @@ -211,5 +225,15 @@ export function gatherAllEmbeds(): Array { webtor720Scraper, webtor480Scraper, viperScraper, + uiraMegaScraper, + uiraOrionScraper, + uiraRabbitScraper, + uiraNinjaScraper, + uiraGuruScraper, + uiraVidsrcvipScraper, + uiraVidapiScraper, + uiraFlixhqScraper, + uiraGhostScraper, + uiraHydraxScraper, ]; } diff --git a/src/providers/embeds/uiralive.ts b/src/providers/embeds/uiralive.ts new file mode 100644 index 0000000..4a5014c --- /dev/null +++ b/src/providers/embeds/uiralive.ts @@ -0,0 +1,101 @@ +import { flags } from '@/entrypoint/utils/targets'; +import { makeEmbed } from '@/providers/base'; + +const providers = [ + { + id: 'uira-mega', + rank: 310, + }, + { + id: 'uira-orion', + rank: 309, + }, + { + id: 'uira-rabbit', + rank: 308, + }, + { + id: 'uira-ninja', + rank: 307, + }, + { + id: 'uira-guru', + rank: 306, + }, + { + id: 'uira-vidsrcvip', + rank: 305, + }, + { + id: 'uira-vidapi', + rank: 304, + }, + { + id: 'uira-flixhq', + rank: 303, + }, + { + id: 'uira-ghost', + rank: 302, + }, + { + id: 'uira-hydrax', + rank: 301, + }, + { + id: 'uira-g1', + rank: 300, + }, + { + id: 'uira-g2', + rank: 299, + }, + { + id: 'uira-soapertv', + rank: 298, + }, + { + id: 'uira-flicky', + rank: 297, + }, +]; + +function embed(provider: { id: string; rank: number; name?: string; disabled?: boolean }) { + return makeEmbed({ + id: provider.id, + name: + provider.name || + provider.id + .split('-') + .map((word) => word[0].toUpperCase() + word.slice(1)) + .join(' '), + disabled: provider.disabled, + rank: provider.rank, + async scrape(ctx) { + return { + stream: [ + { + id: 'primary', + type: 'hls', + playlist: ctx.url, + flags: [flags.CORS_ALLOWED], + captions: [], + }, + ], + }; + }, + }); +} + +export const [ + uiraMegaScraper, + uiraOrionScraper, + uiraRabbitScraper, + uiraNinjaScraper, + uiraGuruScraper, + uiraVidsrcvipScraper, + uiraVidapiScraper, + uiraFlixhqScraper, + uiraGhostScraper, + uiraHydraxScraper, +] = providers.map(embed); diff --git a/src/providers/sources/uiralive.ts b/src/providers/sources/uiralive.ts new file mode 100644 index 0000000..3d9dc8e --- /dev/null +++ b/src/providers/sources/uiralive.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'; + +const baseUrl = 'https://xj4h5qk3tf7v2mlr9s.uira.live/'; + +async function comboScraper(ctx: ShowScrapeContext | MovieScrapeContext): Promise { + const result = await ctx.fetcher( + `${baseUrl}all/${ctx.media.tmdbId}${ + ctx.media.type === 'movie' ? '' : `?s=${ctx.media.season.number}&e=${ctx.media.episode.number}` + }`, + ); + + if (!result?.sources?.length) { + throw new NotFoundError('No sources found'); + } + + const embeds: SourcererEmbed[] = result.sources.map((source: { source: any; url: any }) => ({ + embedId: `uira-${source.source}`, + url: source.url, + })); + + ctx.progress(90); + + return { + embeds, + }; +} + +export const uiraliveScraper = makeSourcerer({ + id: 'uiralive', + name: 'uira.live', + rank: 155, + disabled: false, + flags: [flags.CORS_ALLOWED], + scrapeMovie: comboScraper, + scrapeShow: comboScraper, +});