badger-am/lib/audio.js

72 lines
2.2 KiB
JavaScript
Raw Normal View History

2017-03-24 22:05:51 +01:00
// requirements
2017-03-24 22:11:22 +01:00
const fs = require('fs');
2017-03-24 22:56:05 +01:00
const path = require('path');
const async = require('async');
2017-03-24 22:05:51 +01:00
const metadata = require('musicmetadata');
2017-03-24 22:56:05 +01:00
const ffmpeg = require('fluent-ffmpeg');
const fse = require('fs-extra');
2017-03-24 23:36:41 +01:00
const util = require('./util');
2017-03-24 22:56:05 +01:00
// convert file to mp3 at specified bitrate
2017-03-24 23:36:41 +01:00
function convert(input, output, bitrate, callback) {
2017-03-24 22:56:05 +01:00
output = path.join(path.dirname(output), path.basename(output, path.extname(output)) + '.mp3');
async.series([
function (asyncCallback) {
fse.mkdirs(path.dirname(output), asyncCallback);
},
function (asyncCallback) {
ffmpeg(path.normalize(input)).audioCodec('libmp3lame').audioBitrate(bitrate).save(output)
.on('error', function (err) {
return asyncCallback(err);
})
.on('end', function () {
asyncCallback();
});
}
], function (err, results) {
if (err) {
return callback(err);
}
callback();
});
2017-03-24 23:36:41 +01:00
}
// extract cover artwork
function extractArtwork(sourceFile, callback) {
async.waterfall([
function (asyncCallback) {
extractMetadata(sourceFile, asyncCallback);
},
function (metadata, asyncCallback) {
metadata.picture.forEach(function (picture) {
const pic = path.join(path.dirname(sourceFile), path.basename(sourceFile, path.extname(sourceFile)) + '.' + picture.format);
const stream = fs.createWriteStream(pic);
stream.write(picture.data);
stream.end();
asyncCallback();
});
}
], function (err, result) {
if (err) {
return callback(err);
}
callback();
});
}
2017-03-24 22:05:51 +01:00
// extract metadata for further processing
2017-03-24 23:36:41 +01:00
function extractMetadata(sourceFile, callback) {
2017-03-24 22:05:51 +01:00
const stream = fs.createReadStream(sourceFile);
metadata(stream, function (err, metadata) {
if (err) {
return callback(err);
}
stream.close();
2017-03-24 23:36:41 +01:00
callback(null, metadata);
2017-03-24 22:05:51 +01:00
});
2017-03-24 23:36:41 +01:00
}
// api
exports.convert = convert;
exports.extractArtwork = extractArtwork;
exports.extractMetadata = extractMetadata;