diff options
author | RaindropsSys <raindrops@equestria.dev> | 2023-10-24 17:43:37 +0200 |
---|---|---|
committer | RaindropsSys <raindrops@equestria.dev> | 2023-10-24 17:43:37 +0200 |
commit | ae187b6d75c8079da0be1dc288613bad8466fe61 (patch) | |
tree | 5ea0d34185a2270f29ffaa65e1f5258028d7d5d0 /includes/process.js | |
download | mist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.gz mist-ae187b6d75c8079da0be1dc288613bad8466fe61.tar.bz2 mist-ae187b6d75c8079da0be1dc288613bad8466fe61.zip |
Initial commit
Diffstat (limited to 'includes/process.js')
-rw-r--r-- | includes/process.js | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/includes/process.js b/includes/process.js new file mode 100644 index 0000000..0a1798f --- /dev/null +++ b/includes/process.js @@ -0,0 +1,111 @@ +const fs = require('fs'); +const cp = require('child_process'); +const path = require('path'); +const uuid = require('crypto').randomUUID; + +const substitutes = [ + ["illenium", "ILLENIUM"] +]; + +const songs = require('../assets/content/songs.json'); +const albums = require('../assets/content/albums.json'); + +function scandir(dir) { + return new Promise((res, rej) => { + const walk = (dir, done) => { + let results = []; + fs.readdir(dir, function(err, list) { + if (err) return done(err); + let pending = list.length; + + if (!pending) return done(null, results); + list.forEach(function(file) { + file = path.resolve(dir, file); + fs.stat(file, function(err, stat) { + if (stat && stat.isDirectory()) { + walk(file, function(err, res) { + results = results.concat(res); + if (!--pending) done(null, results); + }); + } else { + results.push(file); + if (!--pending) done(null, results); + } + }); + }); + }); + } + + walk(dir, (err, data) => { + if (err) { + rej(err); + } else { + res(data); + } + }) + }); +} + +function substitute(text) { + for (let sub of substitutes) { + if (text.trim() === sub[0].trim()) { + return sub[1].trim(); + } + } +} + +(async () => { + for (let file of (await scandir("../assets/content/_")).filter(i => i.endsWith(".flac"))) { + let id = uuid(); + let metadata = JSON.parse(cp.execFileSync("ffprobe", ["-v", "quiet", "-print_format", "json", "-show_format", "-show_streams", file]).toString()); + + songs[id] = { + title: substitute(metadata['format']['tags']['TITLE'] ?? path.basename(file, ".flac")), + length: parseInt(metadata['format']['duration']), + album: substitute(metadata['format']['tags']['ALBUM'] ?? "Unknown album"), + artist: substitute(metadata['format']['tags']['ARTIST'] ?? "Unknown artist"), + albumArtist: substitute(metadata['format']['tags']['album_artist'] ?? metadata['format']['tags']['ARTIST'] ?? "Unknown artist"), + date: parseInt(metadata['format']['tags']['DATE']) ?? 0, + track: parseInt(metadata['format']['tags']['track']) ?? 0, + size: parseInt(metadata['format']['size']), + bitRate: parseInt(metadata['format']['bit_rate']), + bitDepth: parseInt(metadata['streams'][0]['bits_per_raw_sample']), + sampleRate: parseInt(metadata['streams'][0]['sample_rate']), + hiRes: parseInt(metadata['streams'][0]['sample_rate']) > 44100 || parseInt(metadata['streams'][0]['bits_per_raw_sample']) > 16, + channels: parseInt(metadata['streams'][0]['channels']), + } + + fs.writeFileSync("../assets/content/songs.json", JSON.stringify(songs)); + cp.execFileSync("ffmpeg", ["-i", file, "-map", "0", "-map", "-0:v?", "-b:a", "256k", "../assets/content/" + id + ".m4a"]); + cp.execFileSync("ffmpeg", ["-i", file, "-map", "0", "-map", "-0:v?", "../assets/content/" + id + ".flac"]); + cp.execFileSync("ffmpeg", ["-i", file, "-an", "../assets/content/" + id + ".jpg"]); + fs.unlinkSync(file); + } + + for (let song of Object.keys(songs)) { + if (Object.values(albums).filter(i => i.title === songs[song].album).length > 0) { + Object.values(albums).filter(i => i.title === songs[song].album)[0].tracks.push(song); + Object.values(albums).filter(i => i.title === songs[song].album)[0].hiRes = Object.values(albums).filter(i => i.title === songs[song].album)[0].hiRes || songs[song].hiRes; + } else { + let albumID = uuid(); + fs.copyFileSync("../assets/content/" + song + ".jpg", "../assets/content/" + albumID + ".jpg") + + albums[albumID] = { + title: songs[song].album, + artist: songs[song].albumArtist, + date: songs[song].date, + hiRes: songs[song].hiRes, + tracks: [song] + } + } + } + + for (let albumID of Object.keys(albums)) { + let album = albums[albumID]; + album["tracks"] = album["tracks"].sort((a, b) => { + return songs[a]['track'] - songs[b]['track']; + }); + } + + fs.writeFileSync("../assets/content/albums.json", JSON.stringify(albums)); +})()
\ No newline at end of file |