Merge branch 'dev' into fix-febbox-dupe-subs

This commit is contained in:
mrjvs 2024-01-01 18:53:15 +01:00 committed by GitHub
commit db17675ebe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 39 additions and 15 deletions

View File

@ -10,8 +10,8 @@ async function universalScraper(ctx: MovieScrapeContext | ShowScrapeContext): Pr
if (!lookmovieData) throw new NotFoundError('Media not found'); if (!lookmovieData) throw new NotFoundError('Media not found');
ctx.progress(30); ctx.progress(30);
const videoUrl = await scrape(ctx, ctx.media, lookmovieData); const video = await scrape(ctx, ctx.media, lookmovieData);
if (!videoUrl) throw new NotFoundError('No video found'); if (!video.playlist) throw new NotFoundError('No video found');
ctx.progress(60); ctx.progress(60);
@ -20,10 +20,10 @@ async function universalScraper(ctx: MovieScrapeContext | ShowScrapeContext): Pr
stream: [ stream: [
{ {
id: 'primary', id: 'primary',
playlist: videoUrl, playlist: video.playlist,
type: 'hls', type: 'hls',
flags: [flags.IP_LOCKED], flags: [flags.IP_LOCKED],
captions: [], captions: video.captions,
}, },
], ],
}; };

View File

@ -39,8 +39,17 @@ interface VideoSources {
[key: string]: string; [key: string]: string;
} }
interface VideoSubtitles {
id?: number;
id_movie?: number;
url: string;
language: string;
shard?: string;
}
export interface StreamsDataResult { export interface StreamsDataResult {
streams: VideoSources; streams: VideoSources;
subtitles: VideoSubtitles[];
} }
export interface ResultItem { export interface ResultItem {

View File

@ -4,7 +4,9 @@ import { ScrapeContext } from '@/utils/context';
import { NotFoundError } from '@/utils/errors'; import { NotFoundError } from '@/utils/errors';
import { Result, ResultItem, ShowDataResult, episodeObj } from './type'; import { Result, ResultItem, ShowDataResult, episodeObj } from './type';
import { getVideoUrl } from './video'; import { getVideo } from './video';
export const baseUrl = 'https://lmscript.xyz';
export async function searchAndFindMedia( export async function searchAndFindMedia(
ctx: ScrapeContext, ctx: ScrapeContext,
@ -12,7 +14,7 @@ export async function searchAndFindMedia(
): Promise<ResultItem | undefined> { ): Promise<ResultItem | undefined> {
if (media.type === 'show') { if (media.type === 'show') {
const searchRes = await ctx.fetcher<Result>(`/v1/shows`, { const searchRes = await ctx.fetcher<Result>(`/v1/shows`, {
baseUrl: 'https://lmscript.xyz', baseUrl,
query: { 'filters[q]': media.title }, query: { 'filters[q]': media.title },
}); });
@ -23,7 +25,7 @@ export async function searchAndFindMedia(
} }
if (media.type === 'movie') { if (media.type === 'movie') {
const searchRes = await ctx.fetcher<Result>(`/v1/movies`, { const searchRes = await ctx.fetcher<Result>(`/v1/movies`, {
baseUrl: 'https://lmscript.xyz', baseUrl,
query: { 'filters[q]': media.title }, query: { 'filters[q]': media.title },
}); });
@ -40,7 +42,7 @@ export async function scrape(ctx: ScrapeContext, media: MovieMedia | ShowMedia,
id = result.id_movie; id = result.id_movie;
} else if (media.type === 'show') { } else if (media.type === 'show') {
const data = await ctx.fetcher<ShowDataResult>(`/v1/shows`, { const data = await ctx.fetcher<ShowDataResult>(`/v1/shows`, {
baseUrl: 'https://lmscript.xyz', baseUrl,
query: { expand: 'episodes', id: result.id_show }, query: { expand: 'episodes', id: result.id_show },
}); });
@ -54,6 +56,6 @@ export async function scrape(ctx: ScrapeContext, media: MovieMedia | ShowMedia,
// Check ID // Check ID
if (id === null) throw new NotFoundError('Not found'); if (id === null) throw new NotFoundError('Not found');
const videoUrl = await getVideoUrl(ctx, id, media); const video = await getVideo(ctx, id, media);
return videoUrl; return video;
} }

View File

@ -1,7 +1,9 @@
import { MovieMedia, ShowMedia } from '@/entrypoint/utils/media'; import { MovieMedia, ShowMedia } from '@/entrypoint/utils/media';
import { Caption } from '@/providers/captions';
import { ScrapeContext } from '@/utils/context'; import { ScrapeContext } from '@/utils/context';
import { StreamsDataResult } from './type'; import { StreamsDataResult } from './type';
import { baseUrl } from './util';
export async function getVideoSources( export async function getVideoSources(
ctx: ScrapeContext, ctx: ScrapeContext,
@ -17,17 +19,17 @@ export async function getVideoSources(
path = `/v1/movies/view`; path = `/v1/movies/view`;
} }
const data = await ctx.fetcher<StreamsDataResult>(path, { const data = await ctx.fetcher<StreamsDataResult>(path, {
baseUrl: 'https://lmscript.xyz', baseUrl,
query: { expand: 'streams', id }, query: { expand: 'streams,subtitles', id },
}); });
return data; return data;
} }
export async function getVideoUrl( export async function getVideo(
ctx: ScrapeContext, ctx: ScrapeContext,
id: string, id: string,
media: MovieMedia | ShowMedia, media: MovieMedia | ShowMedia,
): Promise<string | null> { ): Promise<{ playlist: string | null; captions: Caption[] }> {
// Get sources // Get sources
const data = await getVideoSources(ctx, id, media); const data = await getVideoSources(ctx, id, media);
const videoSources = data.streams; const videoSources = data.streams;
@ -42,5 +44,16 @@ export async function getVideoUrl(
} }
} }
return videoUrl; const captions: Caption[] = data.subtitles.map((sub) => ({
id: sub.url,
type: 'vtt',
url: `${baseUrl}${sub.url}`,
hasCorsRestrictions: false,
language: sub.language,
}));
return {
playlist: videoUrl,
captions,
};
} }