refactored code

This commit is contained in:
Daniel Sommer 2017-03-24 22:05:51 +01:00
parent 079fea6bd0
commit 02d21aa23a
4 changed files with 124 additions and 116 deletions

View file

@ -8,14 +8,15 @@ const fse = require('fs-extra');
const async = require('async'); const async = require('async');
const commander = require('commander'); const commander = require('commander');
const recursive = require('recursive-readdir'); const recursive = require('recursive-readdir');
const metadata = require('musicmetadata');
const progress = require('progress');
const app = require('./package.json'); const app = require('./package.json');
const audio = require('./lib/audio');
const util = require('./lib/util');
// generate timestamp // generate timestamp
const start = process.hrtime(); const start = process.hrtime();
printLogo(); util.printLogo();
// general options // general options
commander commander
@ -56,7 +57,7 @@ function sort(input, output, options) {
function (files, asyncCallback) { function (files, asyncCallback) {
console.log(files.length + ' \'' + options.format + '\' files found'); console.log(files.length + ' \'' + options.format + '\' files found');
// display progressbar // display progressbar
const bar = createProgressBar(files.length); const bar = util.createProgressBar(files.length);
// handle each file // handle each file
async.eachLimit(files, concurrency, function (file, eachCallback) { async.eachLimit(files, concurrency, function (file, eachCallback) {
processFile(output, file, function (err) { processFile(output, file, function (err) {
@ -74,7 +75,7 @@ function sort(input, output, options) {
}); });
} }
], function (err, result) { ], function (err, result) {
exit(err); util.exit(err, start);
}); });
function ignoreFilter(file, stats) { function ignoreFilter(file, stats) {
@ -86,13 +87,13 @@ function sort(input, output, options) {
function processFile(output, sourceFile, callback) { function processFile(output, sourceFile, callback) {
async.waterfall([ async.waterfall([
function (asyncCallback) { function (asyncCallback) {
extractMetadata(sourceFile, asyncCallback) audio.extractMetadata(sourceFile, asyncCallback)
}, },
function (sourceFile, metadata, asyncCallback) { function (sourceFile, metadata, asyncCallback) {
pathFromMetadata(sourceFile, output, metadata, asyncCallback); util.pathFromMetadata(sourceFile, output, metadata, asyncCallback);
}, },
function (targetFile, asyncCallback) { function (targetFile, asyncCallback) {
moveFile(sourceFile, targetFile, asyncCallback); util.moveFile(sourceFile, targetFile, asyncCallback);
} }
], function (err, results) { ], function (err, results) {
if (err) { if (err) {
@ -102,112 +103,5 @@ function processFile(output, sourceFile, callback) {
}); });
} }
// extract metadata for further processing
function extractMetadata(sourceFile, callback) {
const stream = fs.createReadStream(sourceFile);
metadata(stream, function (err, metadata) {
if (err) {
return callback(err);
}
stream.close();
callback(null, sourceFile, metadata)
});
}
// create path for target file
function pathFromMetadata(file, output, metadata, callback) {
// define directory
let filePath = path.normalize(output);
if (metadata.albumartist && metadata.albumartist.length > 0) {
let tmp;
const artistCount = metadata.albumartist.length;
for (let counter = 0; counter < artistCount; counter++) {
if (counter > 0) {
tmp += ' - ' + metadata.albumartist[counter];
} else {
tmp = metadata.albumartist[counter];
}
}
filePath = path.join(filePath, tmp);
} else {
filePath = path.join(filePath, metadata.artist[0]);
}
if (metadata.album) {
filePath = path.join(filePath, metadata.album);
}
// define filename
let fileName = '';
if (metadata.disk.no) {
fileName += frontFill(metadata.disk.no, '0', 2);
}
if (metadata.track.no) {
if (fileName) {
fileName += '-' + frontFill(metadata.track.no, '0', 2) + ' ';
} else {
fileName += frontFill(metadata.track.no, '0', 2) + ' ';
}
}
if (metadata.artist) {
fileName += metadata.artist[0] + ' - ';
}
if (metadata.title) {
fileName += metadata.title;
}
// append extension
fileName += path.extname(file);
// join directory and name
callback(null, path.join(filePath, fileName));
}
// create a ascii progressbar
function createProgressBar(total) {
return new progress(':bar | progress: :current/:total (:percent) | elapsed: :elapseds | eta: :etas', {
total: total,
width: 32
});
}
// create target directory and move the file
function moveFile(source, target, callback) {
async.series([
function (asyncCallback) {
fse.mkdirs(path.dirname(target), asyncCallback);
},
function (asyncCallback) {
fse.move(source, target, asyncCallback);
}
], function (err, results) {
if (err) {
return callback(err);
}
callback();
});
}
// fill a string beginning from the front
function frontFill(string, fill, length) {
while (string.toString().length < length) {
string = fill + string;
}
return string;
}
// print logo
function printLogo() {
console.log(' _ _ _ __ __ ');
console.log(' | |__ __ _ __| |__ _ ___ _ _ /_\\ | \\/ |');
console.log(' | \'_ \\\/ _` \/ _` \/ _` / -_) \'_\/ _ \\| |\\/| |');
console.log(' |_.__\/\\__,_\\__,_\\__, \\___|_|\/_\/ \\_\\_| |_|');
console.log(' |___/ ');
}
// shutdown
function exit(err) {
if (err) {
console.error(err);
process.exit(1);
}
const diff = process.hrtime(start);
console.log('exiting after ' + ((diff[0] + (diff[1] / 1000000)) / 1000).toFixed(2) + ' seconds');
process.exit(0);
}

14
lib/audio.js Normal file
View file

@ -0,0 +1,14 @@
// requirements
const metadata = require('musicmetadata');
// extract metadata for further processing
exports.extractMetadata = function extractMetadata(sourceFile, callback) {
const stream = fs.createReadStream(sourceFile);
metadata(stream, function (err, metadata) {
if (err) {
return callback(err);
}
stream.close();
callback(null, sourceFile, metadata)
});
};

100
lib/util.js Normal file
View file

@ -0,0 +1,100 @@
// requirements
const progress = require('progress');
// print logo
exports.printLogo = function printLogo() {
console.log(' _ _ _ __ __ ');
console.log(' | |__ __ _ __| |__ _ ___ _ _ /_\\ | \\/ |');
console.log(' | \'_ \\\/ _` \/ _` \/ _` / -_) \'_\/ _ \\| |\\/| |');
console.log(' |_.__\/\\__,_\\__,_\\__, \\___|_|\/_\/ \\_\\_| |_|');
console.log(' |___/ ');
};
// create path for target file
exports.pathFromMetadata = function pathFromMetadata(file, output, metadata, callback) {
// define directory
let filePath = path.normalize(output);
if (metadata.albumartist && metadata.albumartist.length > 0) {
let tmp;
const artistCount = metadata.albumartist.length;
for (let counter = 0; counter < artistCount; counter++) {
if (counter > 0) {
tmp += ' - ' + metadata.albumartist[counter];
} else {
tmp = metadata.albumartist[counter];
}
}
filePath = path.join(filePath, tmp);
} else {
filePath = path.join(filePath, metadata.artist[0]);
}
if (metadata.album) {
filePath = path.join(filePath, metadata.album);
}
// define filename
let fileName = '';
if (metadata.disk.no) {
fileName += frontFill(metadata.disk.no, '0', 2);
}
if (metadata.track.no) {
if (fileName) {
fileName += '-' + frontFill(metadata.track.no, '0', 2) + ' ';
} else {
fileName += frontFill(metadata.track.no, '0', 2) + ' ';
}
}
if (metadata.artist) {
fileName += metadata.artist[0] + ' - ';
}
if (metadata.title) {
fileName += metadata.title;
}
// append extension
fileName += path.extname(file);
// join directory and name
callback(null, path.join(filePath, fileName));
};
// create target directory and move the file
exports.moveFile = function moveFile(source, target, callback) {
async.series([
function (asyncCallback) {
fse.mkdirs(path.dirname(target), asyncCallback);
},
function (asyncCallback) {
fse.move(source, target, asyncCallback);
}
], function (err, results) {
if (err) {
return callback(err);
}
callback();
});
}
// fill a string beginning from the front
exports.frontfill = function frontFill(string, fill, length) {
while (string.toString().length < length) {
string = fill + string;
}
return string;
};
// create a ascii progressbar
exports.createProgressBar = function createProgressBar(total) {
return new progress(':bar | progress: :current/:total (:percent) | elapsed: :elapseds | eta: :etas', {
total: total,
width: 32
});
};
// shutdown
exports.exit = function exit(err, start) {
if (err) {
console.error(err);
process.exit(1);
}
const diff = process.hrtime(start);
console.log('exiting after ' + ((diff[0] + (diff[1] / 1000000)) / 1000).toFixed(2) + ' seconds');
process.exit(0);
};

View file

@ -1,6 +1,6 @@
{ {
"name": "badger-am", "name": "badger-am",
"version": "0.2.0", "version": "0.2.1",
"license": "MIT", "license": "MIT",
"description": "audio manager", "description": "audio manager",
"author": "Daniel Sommer <daniel.sommer@velvettear.de>", "author": "Daniel Sommer <daniel.sommer@velvettear.de>",