aboutsummaryrefslogtreecommitdiff
path: root/elac-play
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-06-14 12:27:20 +0200
committerMinteck <contact@minteck.org>2022-06-14 12:27:20 +0200
commita6eabecc147b17aae29c9dcfe2bfded153a0f548 (patch)
treee9d9c7d9aa2b7ee1828340f5a32a6e626e9a1aa2 /elac-play
parentecb92e72778bb12b8875145650610617624c6530 (diff)
downloadelac-a6eabecc147b17aae29c9dcfe2bfded153a0f548.tar.gz
elac-a6eabecc147b17aae29c9dcfe2bfded153a0f548.tar.bz2
elac-a6eabecc147b17aae29c9dcfe2bfded153a0f548.zip
Update
Diffstat (limited to 'elac-play')
-rwxr-xr-xelac-play98
1 files changed, 98 insertions, 0 deletions
diff --git a/elac-play b/elac-play
new file mode 100755
index 0000000..b0b9a9a
--- /dev/null
+++ b/elac-play
@@ -0,0 +1,98 @@
+#!/usr/local/bin/node
+global.fs = require('fs');
+global.os = require('os');
+global.path = require('path');
+global.zlib = require('zlib');
+global.child_process = require('child_process');
+
+global.version = "1.1";
+
+global.argv = process.argv;
+argv.shift(); argv.shift();
+
+console.log("Equestria Lossless Audio Codec");
+console.log(" (c) Copyright, Equestria.dev");
+console.log("ELAC Player");
+console.log(" (c) Copyright, Equestria.dev");
+console.log("version " + version);
+console.log("");
+
+try {
+ child_process.execSync("ffmpeg -version");
+ child_process.execSync("ffprobe -version");
+ child_process.execSync("ffplay -version");
+} catch (e) {
+ console.error("Unable to start the ELAC Player:\n ffmpeg was not found or is incomplete");
+ process.exit(2);
+}
+
+if (argv.length < 1) {
+ console.error("Unable to start the ELAC Player:\n No input file has been specified");
+ process.exit(2);
+}
+
+global.inputFile = argv[0].trim();
+global.file = path.basename(inputFile);
+
+if (!fs.existsSync(inputFile)) {
+ console.error("Unable to play \"" + file + "\":\n \"" + inputFile + "\": no such file or directory");
+ process.exit(2);
+}
+
+console.log("Reading Equestria Lossless Audio Codec data...");
+try {
+ global.data = JSON.parse(zlib.inflateSync(fs.readFileSync(inputFile), {
+ level: -1,
+ strategy: 0,
+ memLevel: 9
+ }).toString());
+} catch (e) {
+ console.error("Unable to play \"" + file + "\":\n \"" + inputFile + "\": unable to decode file");
+ process.exit(2);
+}
+
+if (!data._eqmc) {
+ console.error("Unable to play \"" + file + "\":\n \"" + inputFile + "\": not a valid ELAC file");
+ process.exit(2);
+}
+
+global.inputs = data.files;
+
+for (let input of inputs) {
+ console.log("\n" + input._id + ":\n " + Object.keys(input.tags).map(i => { return i + ": " + input.tags[i]; }).join("\n ") + "\n");
+
+ try {
+ if (fs.existsSync(os.tmpdir() + "/elac-play-temp")) {
+ fs.rmSync(os.tmpdir() + "/elac-play-temp", { recursive: true });
+ }
+ fs.mkdirSync(os.tmpdir() + "/elac-play-temp", { recursive: true });
+ } catch (e) {
+ console.error("Unable to decode \"" + file + "\":\n Cannot create temporary working directory");
+ process.exit(2);
+ }
+
+ console.log("Decoding \"" + inputFile + ":/" + input._id + "\"...");
+
+ let outFile = os.tmpdir() + "/elac-play-temp/" + input._id + ".opus";
+ if (input.lossless) {
+ outFile = os.tmpdir() + "/elac-play-temp/" + input._id + ".flac";
+ }
+
+ fs.writeFileSync(outFile, zlib.inflateSync(Buffer.from(input.data, "base64"), {
+ level: -1,
+ strategy: 0,
+ memLevel: 9
+ }));
+
+ console.log("Playing \"" + inputFile + ":/" + input._id + "\"...");
+ child_process.spawnSync("ffplay", [ "-hide_banner", "-autoexit", "-nodisp", "--", outFile ], { stdio: "inherit" });
+
+ try {
+ fs.rmSync(os.tmpdir() + "/elac-play-temp", { recursive: true });
+ } catch (e) {
+ console.error("Unable to encode \"" + file + "\":\n Cannot clear temporary working directory");
+ process.exit(2);
+ }
+}
+
+console.log("Done!"); \ No newline at end of file