Bilibili-Evolved/registry/lib/components/video/download/apis/flv.ts
2022-01-26 23:50:48 +08:00

74 lines
2.0 KiB
TypeScript

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),
}