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