mirror of
https://github.com/th-ch/youtube-music.git
synced 2026-01-11 18:41:47 +00:00
remove node-id3
This commit is contained in:
@ -125,7 +125,6 @@
|
||||
"electron-store": "^8.1.0",
|
||||
"electron-unhandled": "^4.0.1",
|
||||
"electron-updater": "^5.3.0",
|
||||
"file-type": "^18.2.1",
|
||||
"filenamify": "^4.3.0",
|
||||
"howler": "^2.2.3",
|
||||
"html-to-text": "^9.0.3",
|
||||
@ -134,12 +133,10 @@
|
||||
"md5": "^2.3.0",
|
||||
"mpris-service": "^2.1.2",
|
||||
"node-fetch": "^2.6.8",
|
||||
"node-id3": "^0.2.6",
|
||||
"node-notifier": "^10.0.1",
|
||||
"simple-youtube-age-restriction-bypass": "https://gitpkg.now.sh/api/pkg.tgz?url=zerodytrash/Simple-YouTube-Age-Restriction-Bypass&commit=v2.5.4",
|
||||
"vudio": "^2.1.1",
|
||||
"youtubei.js": "^3.1.1",
|
||||
"ytdl-core": "^4.11.1",
|
||||
"ytpl": "^2.3.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
@ -4,12 +4,16 @@ const { join } = require("path");
|
||||
|
||||
const { Innertube, UniversalCache, Utils } = require('youtubei.js');
|
||||
const filenamify = require("filenamify");
|
||||
const id3 = require('node-id3').Promise;
|
||||
const ID3Writer = require("browser-id3-writer");
|
||||
|
||||
const { fetchFromGenius } = require("../lyrics-genius/back");
|
||||
const { isEnabled } = require("../../config/plugins");
|
||||
const { getImage } = require("../../providers/song-info");
|
||||
const { cropMaxWidth } = require("./utils");
|
||||
|
||||
const { sendError } = require("./back");
|
||||
const { presets } = require('./utils');
|
||||
|
||||
ffmpegWriteTags
|
||||
/** @type {Innertube} */
|
||||
let yt;
|
||||
let options;
|
||||
@ -49,16 +53,17 @@ async function downloadSong(url, playlistFolder = undefined) {
|
||||
}
|
||||
|
||||
if (!presets[options.preset]) {
|
||||
await toMP3(iterableStream, filePath, metadata);
|
||||
const fileBuffer = await toMP3(iterableStream, filePath, metadata);
|
||||
console.info('writing id3 tags...'); // DELETE
|
||||
await writeID3(filePath, metadata).then(() => console.info('done writing id3 tags!')); // DELETE
|
||||
writeFileSync(filePath, await writeID3(fileBuffer, metadata));
|
||||
console.info('done writing id3 tags!'); // DELETE
|
||||
} else {
|
||||
const file = createWriteStream(filePath);
|
||||
//stream.pipeTo(file);
|
||||
for await (const chunk of iterableStream) {
|
||||
file.write(chunk);
|
||||
}
|
||||
ffmpegWriteTags(filePath, metadata, presets[options.preset]?.ffmpegArgs);
|
||||
await ffmpegWriteTags(filePath, metadata, presets[options.preset]?.ffmpegArgs);
|
||||
}
|
||||
|
||||
console.info(`${filePath} - Done!`, '\n');
|
||||
@ -84,29 +89,45 @@ async function getMetadata(url) {
|
||||
};
|
||||
}
|
||||
|
||||
const { getImage } = require("../../providers/song-info");
|
||||
const { cropMaxWidth } = require("./utils");
|
||||
async function writeID3(buffer, metadata) {
|
||||
try {
|
||||
const nativeImage = cropMaxWidth(await getImage(metadata.image));
|
||||
const coverBuffer = nativeImage && !nativeImage.isEmpty() ?
|
||||
nativeImage.toPNG() : null;
|
||||
|
||||
async function writeID3(filePath, metadata) {
|
||||
const tags = {
|
||||
title: metadata.title,
|
||||
artist: metadata.artist,
|
||||
album: metadata.album,
|
||||
image: {
|
||||
mime: "image/png",
|
||||
type: {
|
||||
id: 3,
|
||||
name: "front cover"
|
||||
},
|
||||
description: "",
|
||||
imageBuffer: cropMaxWidth(await getImage(metadata.image))?.toPNG(),
|
||||
const writer = new ID3Writer(buffer);
|
||||
|
||||
// Create the metadata tags
|
||||
writer
|
||||
.setFrame("TIT2", metadata.title)
|
||||
.setFrame("TPE1", [metadata.artist]);
|
||||
if (metadata.album) {
|
||||
writer.setFrame("TALB", metadata.album);
|
||||
}
|
||||
// TODO: lyrics
|
||||
};
|
||||
|
||||
await id3.write(tags, filePath);
|
||||
if (coverBuffer) {
|
||||
writer.setFrame("APIC", {
|
||||
type: 3,
|
||||
data: coverBuffer,
|
||||
description: "",
|
||||
});
|
||||
}
|
||||
if (isEnabled("lyrics-genius")) {
|
||||
const lyrics = await fetchFromGenius(metadata);
|
||||
if (lyrics) {
|
||||
writer.setFrame("USLT", {
|
||||
description: '',
|
||||
lyrics: lyrics,
|
||||
});
|
||||
}
|
||||
}
|
||||
writer.addTag();
|
||||
return Buffer.from(writer.arrayBuffer);
|
||||
} catch (e) {
|
||||
sendError(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const { randomBytes } = require("crypto");
|
||||
const Mutex = require("async-mutex").Mutex;
|
||||
const ffmpeg = require("@ffmpeg/ffmpeg").createFFmpeg({
|
||||
@ -150,7 +171,7 @@ async function toMP3(stream, filePath, metadata, extension = "mp3") {
|
||||
|
||||
// sendFeedback("Saving…");
|
||||
|
||||
writeFileSync(filePath, fileBuffer);
|
||||
return fileBuffer;
|
||||
} catch (e) {
|
||||
sendError(e);
|
||||
} finally {
|
||||
|
||||
@ -1,21 +1,17 @@
|
||||
const { writeFileSync } = require("fs");
|
||||
const { join } = require("path");
|
||||
|
||||
const ID3Writer = require("browser-id3-writer");
|
||||
const { dialog, ipcMain } = require("electron");
|
||||
const { dialog } = require("electron");
|
||||
|
||||
const registerCallback = require("../../providers/song-info");
|
||||
const { injectCSS, listenAction } = require("../utils");
|
||||
const { cropMaxWidth } = require("./utils");
|
||||
const { ACTIONS, CHANNEL } = require("./actions.js");
|
||||
const { isEnabled } = require("../../config/plugins");
|
||||
const { getImage } = require("../../providers/song-info");
|
||||
const { fetchFromGenius } = require("../lyrics-genius/back");
|
||||
|
||||
let win = {};
|
||||
|
||||
const sendError = (error) => {
|
||||
win.setProgressBar(-1); // close progress bar
|
||||
|
||||
console.error(error);
|
||||
dialog.showMessageBox({
|
||||
type: "info",
|
||||
buttons: ["OK"],
|
||||
|
||||
84
yarn.lock
84
yarn.lock
@ -3853,17 +3853,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"file-type@npm:^18.2.1":
|
||||
version: 18.2.1
|
||||
resolution: "file-type@npm:18.2.1"
|
||||
dependencies:
|
||||
readable-web-to-node-stream: ^3.0.2
|
||||
strtok3: ^7.0.0
|
||||
token-types: ^5.0.1
|
||||
checksum: bbc9381292e96a72ecd892f9f5e1a9a8d3f9717955841346e55891acfe099135bfa149f7dad51f35ee52b5e7e0a1a02d7375061b2800758011682c2e9d96953e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"file-uri-to-path@npm:1.0.0":
|
||||
version: 1.0.0
|
||||
resolution: "file-uri-to-path@npm:1.0.0"
|
||||
@ -4713,15 +4702,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"iconv-lite@npm:0.6.2":
|
||||
version: 0.6.2
|
||||
resolution: "iconv-lite@npm:0.6.2"
|
||||
dependencies:
|
||||
safer-buffer: ">= 2.1.2 < 3.0.0"
|
||||
checksum: 03e03eb9fc003bc94f7956849f747258e57c162760259d76d1e67483058cad854a4b681b635e21e3ec41f4bd15ceed1b4a350f890565d680343442c5b139fa8a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"iconv-lite@npm:^0.6.2":
|
||||
version: 0.6.3
|
||||
resolution: "iconv-lite@npm:0.6.3"
|
||||
@ -5833,16 +5813,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"m3u8stream@npm:^0.8.6":
|
||||
version: 0.8.6
|
||||
resolution: "m3u8stream@npm:0.8.6"
|
||||
dependencies:
|
||||
miniget: ^4.2.2
|
||||
sax: ^1.2.4
|
||||
checksum: b8f61c1101dd3ad873ff2f3d0e9e6a5139ad17e20990b89ae67f2585043bc2b727151ed85f3e58aabc8a1a95af28e1ee26f69af6ac9e8841ff68129eae2f5ac5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"make-fetch-happen@npm:^10.0.3":
|
||||
version: 10.2.1
|
||||
resolution: "make-fetch-happen@npm:10.2.1"
|
||||
@ -6332,15 +6302,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"node-id3@npm:^0.2.6":
|
||||
version: 0.2.6
|
||||
resolution: "node-id3@npm:0.2.6"
|
||||
dependencies:
|
||||
iconv-lite: 0.6.2
|
||||
checksum: 9f3ba9d42f4d52348bb2f88dbcdd63ee8fd513dc7c01481d6b10082b83d0f1ce696f920c9bff0e3f2b00486c25fe49c3f93a56d54813809b7edc9ab14b1383d6
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"node-notifier@npm:^10.0.1":
|
||||
version: 10.0.1
|
||||
resolution: "node-notifier@npm:10.0.1"
|
||||
@ -6859,13 +6820,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"peek-readable@npm:^5.0.0":
|
||||
version: 5.0.0
|
||||
resolution: "peek-readable@npm:5.0.0"
|
||||
checksum: bef5ceb50586eb42e14efba274ac57ffe97f0ed272df9239ce029f688f495d9bf74b2886fa27847c706a9db33acda4b7d23bbd09a2d21eb4c2a54da915117414
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"pend@npm:~1.2.0":
|
||||
version: 1.2.0
|
||||
resolution: "pend@npm:1.2.0"
|
||||
@ -7306,7 +7260,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-web-to-node-stream@npm:^3.0.0, readable-web-to-node-stream@npm:^3.0.2":
|
||||
"readable-web-to-node-stream@npm:^3.0.0":
|
||||
version: 3.0.2
|
||||
resolution: "readable-web-to-node-stream@npm:3.0.2"
|
||||
dependencies:
|
||||
@ -7603,7 +7557,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"sax@npm:>=0.6.0, sax@npm:^1.1.3, sax@npm:^1.2.4":
|
||||
"sax@npm:>=0.6.0, sax@npm:^1.2.4":
|
||||
version: 1.2.4
|
||||
resolution: "sax@npm:1.2.4"
|
||||
checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe
|
||||
@ -8080,16 +8034,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"strtok3@npm:^7.0.0":
|
||||
version: 7.0.0
|
||||
resolution: "strtok3@npm:7.0.0"
|
||||
dependencies:
|
||||
"@tokenizer/token": ^0.3.0
|
||||
peek-readable: ^5.0.0
|
||||
checksum: 2ebe7ad8f2aea611dec6742cf6a42e82764892a362907f7ce493faf334501bf981ce21c828dcc300457e6d460dc9c34d644ededb3b01dcb9e37559203cf1748c
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"sumchecker@npm:^3.0.1":
|
||||
version: 3.0.1
|
||||
resolution: "sumchecker@npm:3.0.1"
|
||||
@ -8277,16 +8221,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"token-types@npm:^5.0.1":
|
||||
version: 5.0.1
|
||||
resolution: "token-types@npm:5.0.1"
|
||||
dependencies:
|
||||
"@tokenizer/token": ^0.3.0
|
||||
ieee754: ^1.2.1
|
||||
checksum: 32780123bc6ce8b6a2231d860445c994a02a720abf38df5583ea957aa6626873cd1c4dd8af62314da4cf16ede00c379a765707a3b06f04b8808c38efdae1c785
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"tough-cookie@npm:~2.5.0":
|
||||
version: 2.5.0
|
||||
resolution: "tough-cookie@npm:2.5.0"
|
||||
@ -9072,7 +9006,6 @@ __metadata:
|
||||
electron-store: ^8.1.0
|
||||
electron-unhandled: ^4.0.1
|
||||
electron-updater: ^5.3.0
|
||||
file-type: ^18.2.1
|
||||
filenamify: ^4.3.0
|
||||
howler: ^2.2.3
|
||||
html-to-text: ^9.0.3
|
||||
@ -9082,14 +9015,12 @@ __metadata:
|
||||
mpris-service: ^2.1.2
|
||||
node-fetch: ^2.6.8
|
||||
node-gyp: ^9.3.1
|
||||
node-id3: ^0.2.6
|
||||
node-notifier: ^10.0.1
|
||||
playwright: ^1.29.2
|
||||
simple-youtube-age-restriction-bypass: "https://gitpkg.now.sh/api/pkg.tgz?url=zerodytrash/Simple-YouTube-Age-Restriction-Bypass&commit=v2.5.4"
|
||||
vudio: ^2.1.1
|
||||
xo: ^0.53.1
|
||||
youtubei.js: ^3.1.1
|
||||
ytdl-core: ^4.11.1
|
||||
ytpl: ^2.3.0
|
||||
languageName: unknown
|
||||
linkType: soft
|
||||
@ -9105,17 +9036,6 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ytdl-core@npm:^4.11.1":
|
||||
version: 4.11.2
|
||||
resolution: "ytdl-core@npm:4.11.2"
|
||||
dependencies:
|
||||
m3u8stream: ^0.8.6
|
||||
miniget: ^4.2.2
|
||||
sax: ^1.1.3
|
||||
checksum: 57df38b5b1e4955db0e0c0be8d185f34de9eaee102ad1281d69de91628230cc84e8d46d278409eafa68c4aab4085a0f9fe8de30e9ea8644e011e20cae7f37c0e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"ytpl@npm:^2.3.0":
|
||||
version: 2.3.0
|
||||
resolution: "ytpl@npm:2.3.0"
|
||||
|
||||
Reference in New Issue
Block a user