UNPKG

@gamestdio/audiosprite

Version:

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

159 lines (144 loc) 3.94 kB
#!/usr/bin/env node import fs from 'fs'; import _ from 'underscore'; import winston from 'winston'; import audiosprite from './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 = _.extend({}, argv) winston.remove(winston.transports.Console) winston.add(winston.transports.Console, { colorize: true , level: argv.log , handleExceptions: false }) winston.debug('Parsed arguments', argv) opts.logger = winston 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 = _.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.error('No input files specified.') } winston.info('Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav') winston.info(optimist.help()) process.exit(1) } (async function() { try { const obj = await audiosprite(files, opts); var jsonfile = opts.output + '.json' fs.writeFileSync(jsonfile, JSON.stringify(obj, null, 2)) winston.info('Exported json OK', { file: jsonfile }) winston.info('All done') } catch (err) { winston.error(err) process.exit(1) } })();