mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-14 03:41:46 +00:00
fix: resolves #958
This commit is contained in:
@ -96,7 +96,7 @@ const defaultConfig = {
|
|||||||
},
|
},
|
||||||
'downloader': {
|
'downloader': {
|
||||||
enabled: false,
|
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)
|
downloadFolder: undefined as string | undefined, // Custom download folder (absolute path)
|
||||||
preset: 'mp3',
|
preset: 'mp3',
|
||||||
skipExisting: false,
|
skipExisting: false,
|
||||||
|
|||||||
31
package-lock.json
generated
31
package-lock.json
generated
@ -11,8 +11,8 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cliqz/adblocker-electron": "1.26.6",
|
"@cliqz/adblocker-electron": "1.26.6",
|
||||||
"@ffmpeg/core": "0.11.0",
|
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||||
"@ffmpeg/ffmpeg": "0.11.6",
|
"@ffmpeg.wasm/main": "0.12.0",
|
||||||
"@foobar404/wave": "2.0.4",
|
"@foobar404/wave": "2.0.4",
|
||||||
"@xhayper/discord-rpc": "1.0.22",
|
"@xhayper/discord-rpc": "1.0.22",
|
||||||
"async-mutex": "0.4.0",
|
"async-mutex": "0.4.0",
|
||||||
@ -671,20 +671,19 @@
|
|||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ffmpeg/core": {
|
"node_modules/@ffmpeg.wasm/core-mt": {
|
||||||
"version": "0.11.0",
|
"version": "0.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/@ffmpeg/core/-/core-0.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/@ffmpeg.wasm/core-mt/-/core-mt-0.12.0.tgz",
|
||||||
"integrity": "sha512-9Tt/+2PMpkGPXUK8n6He9G8Y+qR6qmCPSCw9iEKZxHHOvJ9BE/r0Fccj+YgDZTlyu6rXxc9x6EqCaFBIt7qzjA=="
|
"integrity": "sha512-M9pjL7JQX4AYl3WI8vGcPGPTz/O7JmhW8ac/fHA3oXTxoRAPwYSY/OsY1N9C0XahIM0+fxa1QSLN9Ekz8sBM/Q=="
|
||||||
},
|
},
|
||||||
"node_modules/@ffmpeg/ffmpeg": {
|
"node_modules/@ffmpeg.wasm/main": {
|
||||||
"version": "0.11.6",
|
"version": "0.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/@ffmpeg/ffmpeg/-/ffmpeg-0.11.6.tgz",
|
"resolved": "https://registry.npmjs.org/@ffmpeg.wasm/main/-/main-0.12.0.tgz",
|
||||||
"integrity": "sha512-uN8J8KDjADEavPhNva6tYO9Fj0lWs9z82swF3YXnTxWMBoFLGq3LZ6FLlIldRKEzhOBKnkVfA8UnFJuvGvNxcA==",
|
"integrity": "sha512-LILAKTrU3Rga2iXLsF9jeFxe2hNQFjWlrKuXPWSdCFeQ7Kg69fO4WwjNJ0CzjOyO6qtndRQMNKqf//N4fLYUBA==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"is-url": "^1.2.4",
|
"is-url": "^1.2.4",
|
||||||
"node-fetch": "^2.6.1",
|
"node-fetch": "^2.6.9",
|
||||||
"regenerator-runtime": "^0.13.7",
|
"regenerator-runtime": "^0.13.11"
|
||||||
"resolve-url": "^0.2.1"
|
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12.16.1"
|
"node": ">=12.16.1"
|
||||||
@ -7860,12 +7859,6 @@
|
|||||||
"node": ">=4"
|
"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": {
|
"node_modules/responselike": {
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
|
||||||
|
|||||||
@ -133,8 +133,8 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@cliqz/adblocker-electron": "1.26.6",
|
"@cliqz/adblocker-electron": "1.26.6",
|
||||||
"@ffmpeg/core": "0.11.0",
|
"@ffmpeg.wasm/core-mt": "0.12.0",
|
||||||
"@ffmpeg/ffmpeg": "0.11.6",
|
"@ffmpeg.wasm/main": "0.12.0",
|
||||||
"@foobar404/wave": "2.0.4",
|
"@foobar404/wave": "2.0.4",
|
||||||
"@xhayper/discord-rpc": "1.0.22",
|
"@xhayper/discord-rpc": "1.0.22",
|
||||||
"async-mutex": "0.4.0",
|
"async-mutex": "0.4.0",
|
||||||
|
|||||||
@ -9,7 +9,7 @@ import ytpl from 'ytpl';
|
|||||||
// REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid
|
// REPLACE with youtubei getplaylist https://github.com/LuanRT/YouTube.js#getplaylistid
|
||||||
import filenamify from 'filenamify';
|
import filenamify from 'filenamify';
|
||||||
import { Mutex } from 'async-mutex';
|
import { Mutex } from 'async-mutex';
|
||||||
import { createFFmpeg } from '@ffmpeg/ffmpeg';
|
import { createFFmpeg } from '@ffmpeg.wasm/main';
|
||||||
|
|
||||||
import NodeID3, { TagConstants } from 'node-id3';
|
import NodeID3, { TagConstants } from 'node-id3';
|
||||||
|
|
||||||
@ -208,7 +208,9 @@ async function downloadSongUnsafe(
|
|||||||
mkdirSync(dir);
|
mkdirSync(dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (presetSetting) {
|
const ffmpegArgs = config.get('ffmpegArgs');
|
||||||
|
|
||||||
|
if (presetSetting && presetSetting?.extension !== 'mp3') {
|
||||||
const file = createWriteStream(filePath);
|
const file = createWriteStream(filePath);
|
||||||
let downloaded = 0;
|
let downloaded = 0;
|
||||||
const total: number = format.content_length ?? 1;
|
const total: number = format.content_length ?? 1;
|
||||||
@ -226,12 +228,14 @@ async function downloadSongUnsafe(
|
|||||||
filePath,
|
filePath,
|
||||||
metadata,
|
metadata,
|
||||||
presetSetting.ffmpegArgs,
|
presetSetting.ffmpegArgs,
|
||||||
|
ffmpegArgs,
|
||||||
);
|
);
|
||||||
sendFeedback(null, -1);
|
sendFeedback(null, -1);
|
||||||
} else {
|
} else {
|
||||||
const fileBuffer = await iterableStreamToMP3(
|
const fileBuffer = await iterableStreamToMP3(
|
||||||
iterableStream,
|
iterableStream,
|
||||||
metadata,
|
metadata,
|
||||||
|
ffmpegArgs,
|
||||||
format.content_length ?? 0,
|
format.content_length ?? 0,
|
||||||
sendFeedback,
|
sendFeedback,
|
||||||
increasePlaylistProgress,
|
increasePlaylistProgress,
|
||||||
@ -251,6 +255,7 @@ async function downloadSongUnsafe(
|
|||||||
async function iterableStreamToMP3(
|
async function iterableStreamToMP3(
|
||||||
stream: AsyncGenerator<Uint8Array, void>,
|
stream: AsyncGenerator<Uint8Array, void>,
|
||||||
metadata: CustomSongInfo,
|
metadata: CustomSongInfo,
|
||||||
|
ffmpegArgs: string[],
|
||||||
contentLength: number,
|
contentLength: number,
|
||||||
sendFeedback: (str: string, value?: number) => void,
|
sendFeedback: (str: string, value?: number) => void,
|
||||||
increasePlaylistProgress: (value: number) => void = () => {
|
increasePlaylistProgress: (value: number) => void = () => {
|
||||||
@ -290,16 +295,25 @@ async function iterableStreamToMP3(
|
|||||||
increasePlaylistProgress(0.15 + (ratio * 0.85));
|
increasePlaylistProgress(0.15 + (ratio * 0.85));
|
||||||
});
|
});
|
||||||
|
|
||||||
await ffmpeg.run(
|
try {
|
||||||
'-i',
|
await ffmpeg.run(
|
||||||
safeVideoName,
|
'-i',
|
||||||
...getFFmpegMetadataArgs(metadata),
|
safeVideoName,
|
||||||
`${safeVideoName}.mp3`,
|
...ffmpegArgs,
|
||||||
);
|
...getFFmpegMetadataArgs(metadata),
|
||||||
|
`${safeVideoName}.mp3`,
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
ffmpeg.FS('unlink', safeVideoName);
|
||||||
|
}
|
||||||
|
|
||||||
sendFeedback('Saving…');
|
sendFeedback('Saving…');
|
||||||
|
|
||||||
return ffmpeg.FS('readFile', `${safeVideoName}.mp3`);
|
try {
|
||||||
|
return ffmpeg.FS('readFile', `${safeVideoName}.mp3`);
|
||||||
|
} finally {
|
||||||
|
ffmpeg.FS('unlink', `${safeVideoName}.mp3`);
|
||||||
|
}
|
||||||
} catch (error: unknown) {
|
} catch (error: unknown) {
|
||||||
sendError(error as Error, safeVideoName);
|
sendError(error as Error, safeVideoName);
|
||||||
} finally {
|
} 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();
|
const releaseFFmpegMutex = await ffmpegMutex.acquire();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -487,6 +501,7 @@ async function ffmpegWriteTags(filePath: string, metadata: CustomSongInfo, ffmpe
|
|||||||
'-i',
|
'-i',
|
||||||
filePath,
|
filePath,
|
||||||
...getFFmpegMetadataArgs(metadata),
|
...getFFmpegMetadataArgs(metadata),
|
||||||
|
...presetFFmpegArgs,
|
||||||
...ffmpegArgs,
|
...ffmpegArgs,
|
||||||
filePath,
|
filePath,
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user