mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
feat: wasm plugin supports ffmetadata
This commit is contained in:
parent
be7881782c
commit
0638dbdb24
@ -1,6 +1,7 @@
|
||||
import { defineComponentMetadata } from '@/components/define'
|
||||
import { PackageEntry } from '@/core/download'
|
||||
import { hasVideo } from '@/core/spin-query'
|
||||
import { Toast } from '@/core/toast'
|
||||
import { videoUrls } from '@/core/utils/urls'
|
||||
import { DownloadVideoAssets } from '../download/types'
|
||||
import { generateByType, MetadataType } from './metadata'
|
||||
@ -48,6 +49,7 @@ export const component = defineComponentMetadata({
|
||||
) => {
|
||||
const { type, enabled } = instance
|
||||
if (enabled) {
|
||||
const toast = Toast.info('获取视频元数据中...', title)
|
||||
const result: PackageEntry[] = []
|
||||
for (const info of infos) {
|
||||
result.push({
|
||||
@ -56,6 +58,8 @@ export const component = defineComponentMetadata({
|
||||
options: {},
|
||||
})
|
||||
}
|
||||
toast.message = '完成!'
|
||||
toast.duration = 1000
|
||||
return result
|
||||
}
|
||||
return []
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
import { DownloadPackage } from '@/core/download'
|
||||
import { DownloadPackage, PackageEntry } from '@/core/download'
|
||||
import { meta } from '@/core/meta'
|
||||
import { getComponentSettings } from '@/core/settings'
|
||||
import { Toast } from '@/core/toast'
|
||||
@ -46,7 +46,8 @@ async function single(
|
||||
name: string,
|
||||
videoUrl: string,
|
||||
audioUrl: string,
|
||||
isFlac: boolean,
|
||||
ffmetadata: string,
|
||||
outputMkv: boolean,
|
||||
pageIndex = 1,
|
||||
totalPages = 1,
|
||||
) {
|
||||
@ -55,32 +56,35 @@ async function single(
|
||||
ffmpeg.writeFile('video', await httpGet(videoUrl, toastProgress(toast, '正在下载视频流')))
|
||||
ffmpeg.writeFile('audio', await httpGet(audioUrl, toastProgress(toast, '正在下载音频流')))
|
||||
|
||||
toast.message = '混流中……'
|
||||
const outputExt = isFlac ? 'mkv' : 'mp4'
|
||||
name = name.replace(/.[^/.]+$/, `.${outputExt}`)
|
||||
await ffmpeg.exec([
|
||||
'-i',
|
||||
'video',
|
||||
'-i',
|
||||
'audio',
|
||||
'-c:v',
|
||||
'copy',
|
||||
'-c:a',
|
||||
'copy',
|
||||
'-f',
|
||||
isFlac ? 'matroska' : 'mp4',
|
||||
`output.${outputExt}`,
|
||||
])
|
||||
const args = ['-i', 'video', '-i', 'audio']
|
||||
|
||||
const output = await ffmpeg.readFile(`output.${outputExt}`)
|
||||
if (ffmetadata) {
|
||||
ffmpeg.writeFile('ffmetadata', new TextEncoder().encode(ffmetadata))
|
||||
args.push('-i', 'ffmetadata', '-map_metadata', '2')
|
||||
if (!outputMkv) {
|
||||
args.push('-movflags', '+use_metadata_tags')
|
||||
}
|
||||
}
|
||||
|
||||
args.push('-codec', 'copy', '-f', outputMkv ? 'matroska' : 'mp4', 'output')
|
||||
|
||||
console.debug('FFmpeg commandline args:', args.join(' '))
|
||||
|
||||
toast.message = '混流中……'
|
||||
await ffmpeg.exec(args)
|
||||
|
||||
const output = await ffmpeg.readFile('output')
|
||||
const outputBlob = new Blob([output], {
|
||||
type: isFlac ? 'video/x-matroska' : 'video/mp4',
|
||||
type: outputMkv ? 'video/x-matroska' : 'video/mp4',
|
||||
})
|
||||
|
||||
toast.message = '完成!'
|
||||
toast.duration = 1000
|
||||
|
||||
await DownloadPackage.single(name, outputBlob)
|
||||
await DownloadPackage.single(
|
||||
name.replace(/.[^/.]+$/, `.${outputMkv ? 'mkv' : 'mp4'}`),
|
||||
outputBlob,
|
||||
)
|
||||
}
|
||||
|
||||
export async function run(action: DownloadVideoAction) {
|
||||
@ -88,10 +92,22 @@ export async function run(action: DownloadVideoAction) {
|
||||
await loadFFmpeg()
|
||||
}
|
||||
|
||||
const { infos: pages, extraAssets } = action
|
||||
|
||||
let ffmetadata: PackageEntry[]
|
||||
const extraAssetsForBrowser = []
|
||||
for (const { asset, instance } of extraAssets) {
|
||||
if (!ffmetadata && asset.name === 'saveVideoMetadata' && instance.type === 'ffmetadata') {
|
||||
ffmetadata = await asset.getAssets(pages, instance)
|
||||
} else {
|
||||
extraAssetsForBrowser.push({ asset, instance })
|
||||
}
|
||||
}
|
||||
action.extraAssets = extraAssetsForBrowser
|
||||
|
||||
const { dashAudioExtension, dashFlacAudioExtension, dashVideoExtension } =
|
||||
getComponentSettings<Options>('downloadVideo').options
|
||||
|
||||
const pages = action.infos
|
||||
for (let i = 0; i < pages.length; i++) {
|
||||
const page = pages[i]
|
||||
const [video, audio] = page.titledFragments
|
||||
@ -109,6 +125,7 @@ export async function run(action: DownloadVideoAction) {
|
||||
video.title,
|
||||
video.url,
|
||||
audio.url,
|
||||
<string>ffmetadata?.[i]?.data,
|
||||
audio.extension === dashFlacAudioExtension,
|
||||
i + 1,
|
||||
pages.length,
|
||||
|
||||
Loading…
Reference in New Issue
Block a user