@gamestdio/audiosprite
Version:
Concat small audio files into single file and export in many formats.
162 lines (161 loc) • 5.35 kB
JavaScript
#!/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);
}
});
})();