From ad8b9c9bf7d11073c7fdcc1056f6e72ff83adbfa Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Wed, 13 Sep 2023 21:54:45 +0900 Subject: [PATCH] fix: resolves #958 --- config/defaults.ts | 2 +- package-lock.json | 31 ++++++++++++------------------- package.json | 4 ++-- plugins/downloader/back.ts | 35 +++++++++++++++++++++++++---------- 4 files changed, 40 insertions(+), 32 deletions(-) diff --git a/config/defaults.ts b/config/defaults.ts index 42bc976a..8aeb13cb 100644 --- a/config/defaults.ts +++ b/config/defaults.ts @@ -96,7 +96,7 @@ const defaultConfig = { }, 'downloader': { enabled: false, - ffmpegArgs: [], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s + ffmpegArgs: ['-b:a', '256k'], // E.g. ["-b:a", "192k"] for an audio bitrate of 192kb/s downloadFolder: undefined as string | undefined, // Custom download folder (absolute path) preset: 'mp3', skipExisting: false, diff --git a/package-lock.json b/package-lock.json index ebe45a2b..8b7d8617 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,8 @@ "license": "MIT", "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.11.0", - "@ffmpeg/ffmpeg": "0.11.6", + "@ffmpeg.wasm/core-mt": "0.12.0", + "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", @@ -671,20 +671,19 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@ffmpeg/core": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.11.0.tgz", - "integrity": "sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA==" + "node_modules/@ffmpeg.wasm/core-mt": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@ffmpeg.wasm/core-mt/-/core-mt-0.12.0.tgz", + "integrity": "sha512-M9pjL7JQX4AYl3WI8vGcPGPTz/O7JmhW8ac/fHA3oXTxoRAPwYSY/OsY1N9C0XahIM0+fxa1QSLN9Ekz8sBM/Q==" }, - "node_modules/@ffmpeg/ffmpeg": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.11.6.tgz", - "integrity": "sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==", + "node_modules/@ffmpeg.wasm/main": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@ffmpeg.wasm/main/-/main-0.12.0.tgz", + "integrity": "sha512-LILAKTrU3Rga2iXLsF9jeFxe2hNQFjWlrKuXPWSdCFeQ7Kg69fO4WwjNJ0CzjOyO6qtndRQMNKqf//N4fLYUBA==", "dependencies": { "is-url": "^1.2.4", - "node-fetch": "^2.6.1", - "regenerator-runtime": "^0.13.7", - "resolve-url": "^0.2.1" + "node-fetch": "^2.6.9", + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=12.16.1" @@ -7860,12 +7859,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated" - }, "node_modules/responselike": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", diff --git a/package.json b/package.json index 1de00ef6..a3cb0fc5 100644 --- a/package.json +++ b/package.json @@ -133,8 +133,8 @@ }, "dependencies": { "@cliqz/adblocker-electron": "1.26.6", - "@ffmpeg/core": "0.11.0", - "@ffmpeg/ffmpeg": "0.11.6", + "@ffmpeg.wasm/core-mt": "0.12.0", + "@ffmpeg.wasm/main": "0.12.0", "@foobar404/wave": "2.0.4", "@xhayper/discord-rpc": "1.0.22", "async-mutex": "0.4.0", diff --git a/plugins/downloader/back.ts b/plugins/downloader/back.ts index 706e8430..83f27b8a 100644 --- a/plugins/downloader/back.ts +++ b/plugins/downloader/back.ts @@ -9,7 +9,7 @@ import ytpl from 'ytpl'; // REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid import filenamify from 'filenamify'; import { Mutex } from 'async-mutex'; -import { createFFmpeg } from '@ffmpeg/ffmpeg'; +import { createFFmpeg } from '@ffmpeg.wasm/main'; import NodeID3, { TagConstants } from 'node-id3'; @@ -208,7 +208,9 @@ async function downloadSongUnsafe( mkdirSync(dir); } - if (presetSetting) { + const ffmpegArgs = config.get('ffmpegArgs'); + + if (presetSetting && presetSetting?.extension !== 'mp3') { const file = createWriteStream(filePath); let downloaded = 0; const total: number = format.content_length ?? 1; @@ -226,12 +228,14 @@ async function downloadSongUnsafe( filePath, metadata, presetSetting.ffmpegArgs, + ffmpegArgs, ); sendFeedback(null, -1); } else { const fileBuffer = await iterableStreamToMP3( iterableStream, metadata, + ffmpegArgs, format.content_length ?? 0, sendFeedback, increasePlaylistProgress, @@ -251,6 +255,7 @@ async function downloadSongUnsafe( async function iterableStreamToMP3( stream: AsyncGenerator, metadata: CustomSongInfo, + ffmpegArgs: string[], contentLength: number, sendFeedback: (str: string, value?: number) => void, increasePlaylistProgress: (value: number) => void = () => { @@ -290,16 +295,25 @@ async function iterableStreamToMP3( increasePlaylistProgress(0.15 + (ratio * 0.85)); }); - await ffmpeg.run( - '-i', - safeVideoName, - ...getFFmpegMetadataArgs(metadata), - `${safeVideoName}.mp3`, - ); + try { + await ffmpeg.run( + '-i', + safeVideoName, + ...ffmpegArgs, + ...getFFmpegMetadataArgs(metadata), + `${safeVideoName}.mp3`, + ); + } finally { + ffmpeg.FS('unlink', safeVideoName); + } sendFeedback('Saving…'); - return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); + try { + return ffmpeg.FS('readFile', `${safeVideoName}.mp3`); + } finally { + ffmpeg.FS('unlink', `${safeVideoName}.mp3`); + } } catch (error: unknown) { sendError(error as Error, safeVideoName); } finally { @@ -475,7 +489,7 @@ export async function downloadPlaylist(givenUrl?: string | URL) { } } -async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpegArgs: string[] = []) { +async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, presetFFmpegArgs: string[] = [], ffmpegArgs: string[] = []) { const releaseFFmpegMutex = await ffmpegMutex.acquire(); try { @@ -487,6 +501,7 @@ async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpe '-i', filePath, ...getFFmpegMetadataArgs(metadata), + ...presetFFmpegArgs, ...ffmpegArgs, filePath, );