mirror of
https://github.com/the1812/Bilibili-Evolved.git
synced 2025-11-04 21:22:45 +08:00
Merge branch 'preview-features' of https://github.com/the1812/Bilibili-Evolved into preview-fixes
This commit is contained in:
parent
080b46003d
commit
0d9eaeb367
@ -131,4 +131,4 @@ const builtInItems: CheckInItem[] = [
|
|||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
|
||||||
export const [checkInItems] = registerAndGetData('checkInCenter.items', builtInItems)
|
export const [checkInItems] = registerAndGetData('deleteFeeds.items', builtInItems)
|
||||||
|
|||||||
@ -41,6 +41,7 @@ const entry = async () => {
|
|||||||
'bili-rich-text-topic',
|
'bili-rich-text-topic',
|
||||||
'bili-rich-text-module',
|
'bili-rich-text-module',
|
||||||
'bili-rich-text-link',
|
'bili-rich-text-link',
|
||||||
|
'bili-rich-text-viewpic',
|
||||||
].some(className => target.classList.contains(className))
|
].some(className => target.classList.contains(className))
|
||||||
) {
|
) {
|
||||||
return
|
return
|
||||||
|
|||||||
@ -33,7 +33,7 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
saveOptions() {
|
saveOptions() {
|
||||||
options.muxWithMetadata = this.muxExtraAssets
|
options.muxWithMetadata = this.muxWithMetadata
|
||||||
Object.assign(storedOptions, options)
|
Object.assign(storedOptions, options)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@ -17,7 +17,9 @@ enum FFMessageType {
|
|||||||
EXEC = 'EXEC',
|
EXEC = 'EXEC',
|
||||||
WRITE_FILE = 'WRITE_FILE',
|
WRITE_FILE = 'WRITE_FILE',
|
||||||
READ_FILE = 'READ_FILE',
|
READ_FILE = 'READ_FILE',
|
||||||
|
DELETE_FILE = 'DELETE_FILE',
|
||||||
ERROR = 'ERROR',
|
ERROR = 'ERROR',
|
||||||
|
PROGRESS = 'PROGRESS',
|
||||||
}
|
}
|
||||||
|
|
||||||
export class FFmpeg {
|
export class FFmpeg {
|
||||||
@ -25,6 +27,8 @@ export class FFmpeg {
|
|||||||
#resolves: Callbacks = {}
|
#resolves: Callbacks = {}
|
||||||
#rejects: Callbacks = {}
|
#rejects: Callbacks = {}
|
||||||
|
|
||||||
|
#progressEventCallback: (event: ProgressEvent) => void
|
||||||
|
|
||||||
public loaded = false
|
public loaded = false
|
||||||
|
|
||||||
#registerHandlers = () => {
|
#registerHandlers = () => {
|
||||||
@ -38,8 +42,14 @@ export class FFmpeg {
|
|||||||
case FFMessageType.EXEC:
|
case FFMessageType.EXEC:
|
||||||
case FFMessageType.WRITE_FILE:
|
case FFMessageType.WRITE_FILE:
|
||||||
case FFMessageType.READ_FILE:
|
case FFMessageType.READ_FILE:
|
||||||
|
case FFMessageType.DELETE_FILE:
|
||||||
this.#resolves[id](data)
|
this.#resolves[id](data)
|
||||||
break
|
break
|
||||||
|
case FFMessageType.PROGRESS:
|
||||||
|
if (this.#progressEventCallback) {
|
||||||
|
this.#progressEventCallback(<ProgressEvent>data)
|
||||||
|
}
|
||||||
|
break
|
||||||
case FFMessageType.ERROR:
|
case FFMessageType.ERROR:
|
||||||
this.#rejects[id](data)
|
this.#rejects[id](data)
|
||||||
break
|
break
|
||||||
@ -140,6 +150,20 @@ export class FFmpeg {
|
|||||||
undefined,
|
undefined,
|
||||||
signal,
|
signal,
|
||||||
) as Promise<Uint8Array>
|
) as Promise<Uint8Array>
|
||||||
|
|
||||||
|
public deleteFile = (path: string, signal?: AbortSignal) =>
|
||||||
|
this.#send(
|
||||||
|
{
|
||||||
|
type: FFMessageType.DELETE_FILE,
|
||||||
|
data: { path },
|
||||||
|
},
|
||||||
|
undefined,
|
||||||
|
signal,
|
||||||
|
) as Promise<boolean>
|
||||||
|
|
||||||
|
public onProgress(callback: (event: ProgressEvent) => void): void {
|
||||||
|
this.#progressEventCallback = callback
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ========================================================================== //
|
// ========================================================================== //
|
||||||
@ -165,18 +189,28 @@ interface FFMessageReadFileData {
|
|||||||
encoding: string
|
encoding: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface FFMessageDeleteFileData {
|
||||||
|
path: string
|
||||||
|
}
|
||||||
|
|
||||||
type FFMessageData =
|
type FFMessageData =
|
||||||
| FFMessageLoadConfig
|
| FFMessageLoadConfig
|
||||||
| FFMessageExecData
|
| FFMessageExecData
|
||||||
| FFMessageWriteFileData
|
| FFMessageWriteFileData
|
||||||
| FFMessageReadFileData
|
| FFMessageReadFileData
|
||||||
|
| FFMessageDeleteFileData
|
||||||
|
|
||||||
interface Message {
|
interface Message {
|
||||||
type: string
|
type: string
|
||||||
data?: FFMessageData
|
data?: FFMessageData
|
||||||
}
|
}
|
||||||
|
|
||||||
type CallbackData = Uint8Array | string | boolean | Error | undefined
|
interface ProgressEvent {
|
||||||
|
progress: number
|
||||||
|
time: number
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallbackData = Uint8Array | string | boolean | Error | ProgressEvent | undefined
|
||||||
|
|
||||||
interface Callbacks {
|
interface Callbacks {
|
||||||
[id: number | string]: (data: CallbackData) => void
|
[id: number | string]: (data: CallbackData) => void
|
||||||
|
|||||||
@ -2,6 +2,7 @@ import { DownloadPackage, PackageEntry } from '@/core/download'
|
|||||||
import { meta } from '@/core/meta'
|
import { meta } from '@/core/meta'
|
||||||
import { getComponentSettings } from '@/core/settings'
|
import { getComponentSettings } from '@/core/settings'
|
||||||
import { Toast } from '@/core/toast'
|
import { Toast } from '@/core/toast'
|
||||||
|
import { formatPercent } from '@/core/utils/formatters'
|
||||||
import { title as pluginTitle } from '.'
|
import { title as pluginTitle } from '.'
|
||||||
import type { Options } from '../../../../components/video/download'
|
import type { Options } from '../../../../components/video/download'
|
||||||
import { DownloadVideoAction } from '../../../../components/video/download/types'
|
import { DownloadVideoAction } from '../../../../components/video/download/types'
|
||||||
@ -59,13 +60,13 @@ async function single(
|
|||||||
httpGet(audioUrl, progress(1, '正在下载音频流')),
|
httpGet(audioUrl, progress(1, '正在下载音频流')),
|
||||||
])
|
])
|
||||||
|
|
||||||
ffmpeg.writeFile('video', video)
|
await ffmpeg.writeFile('video', video)
|
||||||
ffmpeg.writeFile('audio', audio)
|
await ffmpeg.writeFile('audio', audio)
|
||||||
|
|
||||||
const args = ['-i', 'video', '-i', 'audio']
|
const args = ['-i', 'video', '-i', 'audio']
|
||||||
|
|
||||||
if (ffmetadata) {
|
if (ffmetadata) {
|
||||||
ffmpeg.writeFile('ffmetadata', new TextEncoder().encode(ffmetadata))
|
await ffmpeg.writeFile('ffmetadata', new TextEncoder().encode(ffmetadata))
|
||||||
args.push('-i', 'ffmetadata', '-map_metadata', '2')
|
args.push('-i', 'ffmetadata', '-map_metadata', '2')
|
||||||
if (!outputMkv) {
|
if (!outputMkv) {
|
||||||
args.push('-movflags', '+use_metadata_tags')
|
args.push('-movflags', '+use_metadata_tags')
|
||||||
@ -76,7 +77,9 @@ async function single(
|
|||||||
|
|
||||||
console.debug('FFmpeg commandline args:', args.join(' '))
|
console.debug('FFmpeg commandline args:', args.join(' '))
|
||||||
|
|
||||||
toast.message = '混流中……'
|
ffmpeg.onProgress(event => {
|
||||||
|
toast.message = `混流中: ${formatPercent(event.progress)}`
|
||||||
|
})
|
||||||
await ffmpeg.exec(args)
|
await ffmpeg.exec(args)
|
||||||
|
|
||||||
const output = await ffmpeg.readFile('output')
|
const output = await ffmpeg.readFile('output')
|
||||||
@ -87,6 +90,13 @@ async function single(
|
|||||||
toast.message = '完成!'
|
toast.message = '完成!'
|
||||||
toast.duration = 1000
|
toast.duration = 1000
|
||||||
|
|
||||||
|
await Promise.all([
|
||||||
|
ffmpeg.deleteFile('video'),
|
||||||
|
ffmpeg.deleteFile('audio'),
|
||||||
|
ffmpeg.deleteFile('output'),
|
||||||
|
ffmetadata ? ffmpeg.deleteFile('ffmetadata') : Promise.resolve(),
|
||||||
|
])
|
||||||
|
|
||||||
await DownloadPackage.single(
|
await DownloadPackage.single(
|
||||||
name.replace(/.[^/.]+$/, `.${outputMkv ? 'mkv' : 'mp4'}`),
|
name.replace(/.[^/.]+$/, `.${outputMkv ? 'mkv' : 'mp4'}`),
|
||||||
outputBlob,
|
outputBlob,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user