Merge branch 'dev' into fix-febbox-dupe-subs
This commit is contained in:
commit
db17675ebe
|
@ -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,
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue