#!/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.0"; global.argv = process.argv; argv.shift(); argv.shift(); console.log("Equestria Media Codec"); console.log(" (c) Copyright, Equestria.dev"); console.log("Eqmc 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 Eqmc Player:\n ffmpeg was not found or is incomplete"); process.exit(2); } if (argv.length < 1) { console.error("Unable to start the Eqmc 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 Media Codec data..."); try { global.data = JSON.parse(zlib.inflateRawSync(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 EQMC 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() + "/eqmc-play-temp")) { fs.rmSync(os.tmpdir() + "/eqmc-play-temp", { recursive: true }); } fs.mkdirSync(os.tmpdir() + "/eqmc-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() + "/eqmc-play-temp/" + input._id + ".wav"; fs.writeFileSync(outFile, zlib.inflateRawSync(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" }); console.log(outFile); try { fs.rmSync(os.tmpdir() + "/eqmc-play-temp", { recursive: true }); } catch (e) { console.error("Unable to encode \"" + file + "\":\n Cannot clear temporary working directory"); process.exit(2); } } console.log("Done!");