Bilibili-Evolved/registry/lib/components/video/download/inputs/bangumi/batch.ts
2023-08-02 08:26:00 +08:00

70 lines
2.7 KiB
TypeScript

import { getJson } from '@/core/ajax'
import { getGeneralSettings } from '@/core/settings'
import { formatNumber } from '@/core/utils/formatters'
import { logError } from '@/core/utils/log'
import { formatTitle } from '@/core/utils/title'
import { bangumiUrls } from '@/core/utils/urls'
import { DownloadVideoInput } from '../../types'
import { createEpisodesPicker, EpisodeItem } from '../episode-item'
export const bangumiBatchInput: DownloadVideoInput = {
name: 'bangumi.batch',
displayName: '当前番剧 (多P)',
match: bangumiUrls,
batch: true,
getInputs: async instance => instance?.checkedInputItems ?? [],
component: async () =>
createEpisodesPicker(async instance => {
const metadata = dq('script[type="application/ld+json"]')
if (!metadata) {
logError('获取番剧数据失败: 无法找到 Metadata')
return []
}
const metadataJson = JSON.parse(metadata.innerHTML.trim())
const metaUrl: string = lodash.get(metadataJson, 'itemListElement.0.url', null)
if (metaUrl === null) {
logError('获取番剧数据失败: 无法找到 metaUrl')
return []
}
const seasonId = metaUrl.match(/play\/ss(\d+)/)?.[1]
if (seasonId === undefined) {
logError('获取番剧数据失败: 无法解析 Season ID')
return []
}
const json = await getJson(
`https://api.bilibili.com/pgc/web/season/section?season_id=${seasonId}`,
)
if (json.code !== 0) {
logError(`获取番剧数据失败: 无法获取番剧集数列表, message=${json.message}`)
return []
}
const mapEpisodeItem = (totalLength: number) => {
return (it: any, index: number) => {
const nText: string = it.long_title ? it.title : (index + 1).toString()
const title: string = it.long_title ? it.long_title : it.title
return {
key: it.cid,
title: `${nText} - ${title}`,
isChecked: index < instance.maxCheckedItems,
inputItem: {
aid: it.aid,
cid: it.cid,
title: formatTitle(getGeneralSettings().batchFilenameFormat, false, {
ep: title,
cid: it.cid,
aid: it.aid,
n: formatNumber(parseFloat(nText), totalLength) ?? nText,
}),
allowQualityDrop: true,
},
} as EpisodeItem
}
}
const items: any[] = json.result.main_section.episodes
const subItems: any[] =
json.result.section?.flatMap((subSection: any) => subSection.episodes) ?? []
const allItems = [...items, ...subItems]
return allItems.map(mapEpisodeItem(allItems.length))
}),
}