From ec6107138d1beb670ea9a4a6373da78185fe226f Mon Sep 17 00:00:00 2001 From: Araxeus <78568641+Araxeus@users.noreply.github.com> Date: Sat, 4 Mar 2023 00:42:39 +0200 Subject: [PATCH] remove `node-id3` --- package.json | 3 - plugins/downloader/back-downloader.js | 71 ++++++++++++++-------- plugins/downloader/back.js | 10 +--- yarn.lock | 84 +-------------------------- 4 files changed, 51 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 1c1eaf3b..6fa8f076 100644 --- a/package.json +++ b/package.json @@ -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": { diff --git a/plugins/downloader/back-downloader.js b/plugins/downloader/back-downloader.js index d96182be..9cf89c96 100644 --- a/plugins/downloader/back-downloader.js +++ b/plugins/downloader/back-downloader.js @@ -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 { diff --git a/plugins/downloader/back.js b/plugins/downloader/back.js index c10a812f..379d6271 100644 --- a/plugins/downloader/back.js +++ b/plugins/downloader/back.js @@ -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"], diff --git a/yarn.lock b/yarn.lock index 93a342b9..929d11d3 100644 --- a/yarn.lock +++ b/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"