import { bilibiliApi, getJsonWithCredentials } from '@/core/ajax' import { formData, matchUrlPattern } from '@/core/utils' import { allQualities } from '@/components/video/video-quality' import { bangumiUrls } from '@/core/utils/urls' import { compareQuality } from '../error' import { DownloadVideoApi, DownloadVideoFragment, DownloadVideoInfo, DownloadVideoInputItem, } from '../types' import { bangumiApi, videoApi } from './url' const parseInfoFromJson = (data: any, extensions: string[]) => { const getExtension = (index: number) => { if (extensions.length > index) { return extensions[index] } return extensions[extensions.length - 1] } const fragments = data.durl.map((it: any, index: number) => ({ length: it.length, size: it.size, url: it.url, backupUrls: it.backup_url, extension: getExtension(index), } as DownloadVideoFragment)) const qualities = (data.accept_quality as number[]) .map(qn => allQualities.find(q => q.value === qn)) .filter(q => q !== undefined) const currentQuality = allQualities.find(q => q.value === data.quality) return { fragments, qualities, currentQuality, } } /* spell-checker: disable */ const downloadFlv = async ( input: DownloadVideoInputItem, ) => { const { aid, cid, quality } = input const params = { avid: aid, cid, qn: quality?.value ?? '', otype: 'json', fourk: 1, fnver: 0, fnval: 0, } const isBanugmi = bangumiUrls.some(url => matchUrlPattern(url)) const api = isBanugmi ? bangumiApi(formData(params)) : videoApi(formData(params)) const data = await bilibiliApi( getJsonWithCredentials(api), '获取视频链接失败', ) const info = new DownloadVideoInfo({ input, jsonData: data, ...parseInfoFromJson(data, ['.flv']), }) compareQuality(input, info) return info } export const videoFlv: DownloadVideoApi = { name: 'video.flv', displayName: 'flv', description: '使用 flv 格式下载, 兼容 H.264 编码.', downloadVideoInfo: input => downloadFlv(input), }