mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
74 lines
2.0 KiB
TypeScript
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),
|
|
}
|