aboutsummaryrefslogtreecommitdiff
path: root/index.js
diff options
context:
space:
mode:
Diffstat (limited to 'index.js')
-rw-r--r--index.js33
1 files changed, 29 insertions, 4 deletions
diff --git a/index.js b/index.js
index 657f471..cddace2 100644
--- a/index.js
+++ b/index.js
@@ -18,6 +18,9 @@
const fs = require('fs');
const axios = require('axios');
+ const Genius = require("genius-lyrics");
+ const g = new Genius.Client();
+
if (process.argv[2] !== undefined) {
global.id = process.argv[2];
if (!id.isBase64() || id.length !== 34) {
@@ -44,20 +47,41 @@
for (let song of songs) {
if (!fs.existsSync("./_youtoo/Result/" + song + ".mp3")) {
console.log("[" + song + "] Gathering metadata...");
- let metadata = JSON.parse(exec("yt-dlp", [ "--skip-download", "-j", "https://www.youtube.com/watch?v=" + song ]).toString());
+ exec("yt-dlp", [ "-o", "./_youtoo/_audio", "--skip-download", "--write-info-json", "https://www.youtube.com/watch?v=" + song ], { stdio: "inherit" })
+ let metadata = JSON.parse(fs.readFileSync("./_youtoo/_audio.info.json").toString());
fs.writeFileSync("./_youtoo/Dumps/MetadataRaw" + song + ".json", JSON.stringify(metadata, null, 4));
console.log("[" + song + "] Parsing metadata...");
let partists = (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-(.*)/gm, "$1") !== (metadata.track ?? metadata.alt_title ?? metadata.title) ? (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-(.*)/gm, "$1") : "";
let partists2 = (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$5") !== (metadata.track ?? metadata.alt_title ?? metadata.title) ? (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$5") : "";
+ let artistsList = Array.from(new Set([...(metadata.artist ?? metadata.creator ?? metadata.uploader).replace(/(, |,|and |And |&)/gm, "|").split("|").map(i => i.trim()), ...partists.replace(/(, |,|and |And |&)/gm, "|").split("|").map(i => i.trim()), ...partists2.replace(/(, |,|and |And |&)/gm, "|").split("|").map(i => i.trim())])).filter(i => i.trim() !== "");
+ let songTitle = (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-( |)(.*)(\[(.*)\]|)/gm, "$3").replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").replace(/(.*)\[(.*)\](.*)/gm, "$1").replace(/(.*)\((from|in|by)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").trim();
+ console.log("[" + song + "] Gathering lyrics...");
+ let lyricsComplete = false;
+ let lyrics = "";
+ try {
+ let geniusSearchArtist = artistsList[0];
+ let geniusSong = (await g.songs.search(geniusSearchArtist + " - " + songTitle))[0];
+ let geniusTitle = geniusSong.title.replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-( |)(.*)(\[(.*)\]|)/gm, "$3").replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").replace(/(.*)\[(.*)\](.*)/gm, "$1").replace(/(.*)\((from|in|by)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").trim();
+ console.log(geniusTitle.toLowerCase() + " <-> " + songTitle.toLowerCase(), geniusTitle.toLowerCase() === songTitle.toLowerCase());
+ if (geniusTitle.toLowerCase() === songTitle.toLowerCase() && geniusSong.raw.lyrics_state === "complete") {
+ lyricsComplete = true;
+ lyrics = (await geniusSong.lyrics()).trim()
+ }
+ } catch (e) {
+ console.error(e);
+ lyrics = "";
+ }
let rmeta = {
video: metadata.title,
- title: (metadata.track ?? metadata.alt_title ?? metadata.title).replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-( |)(.*)(\[(.*)\]|)/gm, "$3").replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").replace(/(.*)\[(.*)\](.*)/gm, "$1").replace(/(.*)\((from|in|by)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").trim(),
+ title: songTitle,
date: metadata.release_year ?? (metadata.upload_date.substring(0, 4) - 1 +1),
album: metadata.album ?? ((metadata.track ?? metadata.alt_title ?? metadata.title).replace(/^([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)-( |)(.*)(\[(.*)\]|)/gm, "$3").replace(/(.*)\((feat|ft|with)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").replace(/(.*)\[(.*)\](.*)/gm, "$1").replace(/(.*)\((from|in|by)(\.|:| |)(| |)([:\"'a-zA-Z0-9 .\-*\_\/\\,&]*)\)(.*)/gmi, "$1").trim()),
potentialArtists: partists,
potentialArtists2: partists2,
- artists: Array.from(new Set([...(metadata.artist ?? metadata.creator ?? metadata.uploader).replace(/(, |,|and|And|&)/gm, "|").split("|").map(i => i.trim()), ...partists.replace(/(, |,|and|And|&)/gm, "|").split("|").map(i => i.trim()), ...partists2.replace(/(, |,|and|And|&)/gm, "|").split("|").map(i => i.trim())])).filter(i => i.trim() !== ""),
+ artists: artistsList,
+ lyrics,
+ complete: lyricsComplete
}
fs.writeFileSync("./_youtoo/Metadata/" + song + ".json", JSON.stringify(rmeta, null, 4));
console.log("[" + song + "] Downloading audio...");
@@ -67,7 +91,7 @@
console.log("[" + song + "] Processing thumbnail...");
exec("magick", [ "-define", "jpeg:size=1024x1024", "./_youtoo/_audio.webp", "-thumbnail", "512x512^", "-gravity", "center", "-extent", "512x512", "./_youtoo/_audio.jpg" ]);
console.log("[" + song + "] Processing audio...");
- exec("ffmpeg", [ "-y", "-i", "./_youtoo/_audio.m4a", "-metadata", "artist=" + rmeta.artists.join(", ") + "", "-metadata", "title=" + rmeta.title, "-metadata", "album=" + rmeta.album, "-metadata", "publisher=YouTube", "-metadata", "copyright=© " + rmeta.date.toString() + " " + rmeta.artists[0], "-metadata", "date=" + rmeta.date.toString(), "-metadata", "encoded_by=" + require('./package.json').name + "/" + require('./package.json').version, "./_youtoo/_audio.1.mp3" ], { stdio: "inherit" });
+ exec("ffmpeg", [ "-y", "-i", "./_youtoo/_audio.m4a", "-metadata", "artist=" + rmeta.artists.join(", ") + "", "-metadata", "title=" + rmeta.title, "-metadata", "album=" + rmeta.album, "-metadata", "publisher=YouTube", "-metadata", "copyright=© " + rmeta.date.toString() + " " + rmeta.artists[0], "-metadata", "date=" + rmeta.date.toString(), "-metadata", "lyrics=" + lyrics, "-metadata", "encoded_by=" + require('./package.json').name + "/" + require('./package.json').version, "./_youtoo/_audio.1.mp3" ], { stdio: "inherit" });
exec("ffmpeg", [ "-y", "-i", "./_youtoo/_audio.1.mp3", "-i", "./_youtoo/_audio.jpg", "-map", "0:0", "-map", "1:0", "-c", "copy", "-id3v2_version", "3", "-metadata:s:v", "title=Album cover", "-metadata:s:v", "comment=Cover (front)", "./_youtoo/_audio.mp3" ], { stdio: "inherit" });
fs.renameSync("./_youtoo/_audio.mp3", "./_youtoo/Result/" + song + ".mp3");
fs.renameSync("./_youtoo/_audio.jpg", "./_youtoo/AlbumArts/" + song + ".jpg");
@@ -76,6 +100,7 @@
if (fs.existsSync("./_youtoo/_audio.jpg")) { fs.rmSync("./_youtoo/_audio.jpg"); }
if (fs.existsSync("./_youtoo/_audio.webp")) { fs.rmSync("./_youtoo/_audio.webp"); }
if (fs.existsSync("./_youtoo/_audio.m4a")) { fs.rmSync("./_youtoo/_audio.m4a"); }
+ if (fs.existsSync("./_youtoo/_audio.info.json")) { fs.rmSync("./_youtoo/_audio.info.json"); }
} else {
console.log("[" + song + "] Song already in destination");
}