gulp-audiosprite
Version:
Gulp wrapper for audiosprite, which is ffmpeg wrapper that will take in multiple audio files and combines them into a single file
132 lines (104 loc) • 2.79 kB
JavaScript
;
var audioSprite = require('audiosprite');
var fs = require('fs');
var os = require('os');
var path = require('path');
var through2 = require('through2');
var Vinyl = require('vinyl');
module.exports = gulpAudioSprite;
function gulpAudioSprite(options) {
var files = [];
options = setDefaults(options);
return through2.obj(transform, flush);
function transform(file, enc, callback) {
if (file.isNull()) {
return callback(null, file);
}
if (file.isStream()) {
this.emit(
'error',
new Error('gulp-audiosprite: Streaming not supported')
);
return callback();
}
files.push(file.path);
callback();
}
function flush(callback) {
var stream = this;
audioSprite(files, options, function (err, result) {
if (err) {
err.message = 'gulp-audiosprite: ' + err.message;
stream.emit('error', err);
return callback();
}
result = convertData(result, options, stream);
var jsonName = (options.output || 'output') + '.json';
stream.push(new Vinyl({
base: path.dirname(jsonName),
path: jsonName,
contents: Buffer.from(JSON.stringify(result, null, 2), 'binary')
}));
callback();
});
}
}
function convertData(data, options, stream) {
var urls = data.urls || data.resources || (data.src ? [data.src] : []) || [];
urls.forEach(function (url) {
stream.push(new Vinyl({
base: path.dirname(url),
path: url,
contents: fs.createReadStream(url)
}));
});
urls = urls.map(function (url) {
var base = path.basename(url);
return options._path ? options._path + '/' + base : base;
});
switch (options.format) {
case 'howler': {
// for old versions
data.urls = urls;
data.src = urls;
break;
}
case 'createjs': {
data.src = urls[0];
break;
}
default: {
data.resources = urls;
}
}
return data;
}
function setDefaults(options) {
options = options || {};
options.output = path.join(os.tmpdir(), options.output || 'sprite');
if (options.path) {
options._path = options.path;
delete options.path;
}
setLogger(options);
return options;
}
function setLogger(options) {
var DEBUG = 'debug';
var INFO = 'info';
var NOTICE = 'notice';
var levels = [DEBUG, INFO, NOTICE];
function log(level, text, data) {
var userLevel = levels.indexOf(options.log || 'info');
var logLevel = levels.indexOf(level);
if (logLevel < userLevel) {
return;
}
console.log(text, data);
}
options.logger = {
debug: log.bind(null, DEBUG),
info: log.bind(null, INFO),
log: log.bind(null, NOTICE)
};
}