UNPKG

@gamestdio/audiosprite

Version:

Concat small audio files into single file and export in many formats.

162 lines (161 loc) 5.35 kB
#!/usr/bin/env node "use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const underscore_1 = __importDefault(require("underscore")); const winston_1 = __importDefault(require("winston")); const audiosprite_1 = __importDefault(require("./audiosprite")); const optimist = require('optimist') .options('output', { alias: 'o', 'default': 'output', describe: 'Name for the output files.' }) .options('path', { alias: 'u', 'default': '', describe: 'Path for files to be used on final JSON.' }) .options('export', { alias: 'e', 'default': 'ogg,m4a,mp3,ac3', describe: 'Limit exported file types. Comma separated extension list.' }) .options('format', { alias: 'f', 'default': 'jukebox', describe: 'Format of the output JSON file (jukebox, howler, howler2, createjs).' }) .options('log', { alias: 'l', 'default': 'info', describe: 'Log level (debug, info, notice, warning, error).' }) .options('autoplay', { alias: 'a', 'default': null, describe: 'Autoplay sprite name.' }) .options('loop', { 'default': null, describe: 'Loop sprite name, can be passed multiple times.' }) .options('silence', { alias: 's', 'default': 0, describe: 'Add special "silence" track with specified duration.' }) .options('gap', { alias: 'g', 'default': 1, describe: 'Silence gap between sounds (in seconds).' }) .options('minlength', { alias: 'm', 'default': 0, describe: 'Minimum sound duration (in seconds).' }) .options('bitrate', { alias: 'b', 'default': 128, describe: 'Bit rate. Works for: ac3, mp3, mp4, m4a, ogg.' }) .options('vbr', { alias: 'v', 'default': -1, describe: 'VBR [0-9]. Works for: mp3. -1 disables VBR.' }) .options('vbr:vorbis', { alias: 'q', 'default': -1, describe: 'qscale [0-10 is highest quality]. Works for: webm. -1 disables qscale.' }) .options('samplerate', { alias: 'r', 'default': 44100, describe: 'Sample rate.' }) .options('channels', { alias: 'c', 'default': 1, describe: 'Number of channels (1=mono, 2=stereo).' }) .options('rawparts', { alias: 'p', 'default': '', describe: 'Include raw slices(for Web Audio API) in specified formats.' }) .options('ignorerounding', { alias: 'i', 'default': 0, describe: 'Bypass sound placement on whole second boundaries (0=round,1=bypass).' }) .options('help', { alias: 'h', describe: 'Show this help message.' }); var argv = optimist.argv; var opts = underscore_1.default.extend({}, argv); winston_1.default.remove(winston_1.default.transports.Console); winston_1.default.add(winston_1.default.transports.Console, { colorize: true, level: argv.log, handleExceptions: false }); winston_1.default.debug('Parsed arguments', argv); opts.logger = winston_1.default; opts.bitrate = parseInt(argv.bitrate, 10); opts.samplerate = parseInt(argv.samplerate, 10); opts.channels = parseInt(argv.channels, 10); opts.gap = parseFloat(argv.gap); opts.minlength = parseFloat(argv.minlength); opts.vbr = parseInt(argv.vbr, 10); opts['vbr:vorbis'] = parseInt(argv['vbr:vorbis'], 10); opts.loop = argv.loop ? [].concat(argv.loop) : []; opts.ignorerounding = parseInt(argv.ignorerounding, 0); var files = underscore_1.default.uniq(argv._); if (process.platform == 'win32') { var glob = require('glob'); function flatten(arr) { return [].concat.apply([], arr); } function getNames(fname) { return (glob.hasMagic(fname)) ? glob.sync(fname) : [fname]; } files = flatten(files.map(getNames)); } if (argv.help || !files.length) { if (!argv.help) { winston_1.default.error('No input files specified.'); } winston_1.default.info('Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav'); winston_1.default.info(optimist.help()); process.exit(1); } (function () { return __awaiter(this, void 0, void 0, function* () { try { const obj = yield (0, audiosprite_1.default)(files, opts); var jsonfile = opts.output + '.json'; fs_1.default.writeFileSync(jsonfile, JSON.stringify(obj, null, 2)); winston_1.default.info('Exported json OK', { file: jsonfile }); winston_1.default.info('All done'); } catch (err) { winston_1.default.error(err); process.exit(1); } }); })();