pstreams-providers/src/providers/embeds/febbox/subtitles.ts

66 lines
1.8 KiB
TypeScript

import { Caption, getCaptionTypeFromUrl, isValidLanguageCode } from '@/providers/captions';
import { captionsDomains } from '@/providers/sources/showbox/common';
import { sendRequest } from '@/providers/sources/showbox/sendRequest';
import { ScrapeContext } from '@/utils/context';
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({
id: subtitleFilePath,
language: subtitle.lang,
hasCorsRestrictions: true,
type: subtitleType,
url: subtitleFilePath,
});
});
return output;
}