mirror of
https://github.com/p-stream/providers.git
synced 2026-05-10 23:30:57 +00:00
66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
import { Caption, getCaptionTypeFromUrl, isValidLanguageCode } from '@/providers/captions';
|
|
import { sendRequest } from '@/providers/sources/superstream/sendRequest';
|
|
import { ScrapeContext } from '@/utils/context';
|
|
|
|
import { captionsDomains } from './common';
|
|
|
|
interface CaptionApiResponse {
|
|
data: {
|
|
list: {
|
|
subtitles: {
|
|
order: number;
|
|
lang: string;
|
|
file_path: string;
|
|
}[];
|
|
}[];
|
|
};
|
|
}
|
|
|
|
export async function getSubtitles(
|
|
ctx: ScrapeContext,
|
|
id: string,
|
|
fid: number | undefined,
|
|
type: 'show' | 'movie',
|
|
episodeId?: number,
|
|
seasonId?: number,
|
|
): Promise<Caption[]> {
|
|
const module = type === 'movie' ? 'Movie_srt_list_v2' : 'TV_srt_list_v2';
|
|
const subtitleApiQuery = {
|
|
fid,
|
|
uid: '',
|
|
module,
|
|
mid: type === 'movie' ? id : undefined,
|
|
tid: type !== 'movie' ? id : undefined,
|
|
episode: episodeId?.toString(),
|
|
season: seasonId?.toString(),
|
|
};
|
|
|
|
const subResult = (await sendRequest(ctx, subtitleApiQuery)) as CaptionApiResponse;
|
|
const subtitleList = subResult.data.list;
|
|
const output: Caption[] = [];
|
|
|
|
subtitleList.forEach((sub) => {
|
|
const subtitle = sub.subtitles.sort((a, b) => b.order - a.order)[0];
|
|
if (!subtitle) return;
|
|
const subtitleFilePath = subtitle.file_path
|
|
.replace(captionsDomains[0], captionsDomains[1])
|
|
.replace(/\s/g, '+')
|
|
.replace(/[()]/g, (c) => {
|
|
return `%${c.charCodeAt(0).toString(16)}`;
|
|
});
|
|
const subtitleType = getCaptionTypeFromUrl(subtitleFilePath);
|
|
if (!subtitleType) return;
|
|
|
|
const validCode = isValidLanguageCode(subtitle.lang);
|
|
if (!validCode) return;
|
|
|
|
output.push({
|
|
language: subtitle.lang,
|
|
hasCorsRestrictions: true,
|
|
type: subtitleType,
|
|
url: subtitleFilePath,
|
|
});
|
|
});
|
|
|
|
return output;
|
|
}
|