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