fix: resolves #958

This commit is contained in:
JellyBrick
2023-09-13 21:54:45 +09:00
parent f2b532d8fa
commit ad8b9c9bf7
4 changed files with 40 additions and 32 deletions

View File

@ -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,

31
package-lock.json generated
View File

@ -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",

View File

@ -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",

View File

@ -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<Uint8Array, void>,
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,
);