scsync
Version:
SoundCloud incoming tracks downloader.
85 lines (84 loc) • 2.61 kB
JavaScript
var v = require('valentine');
var resolveStream = require('./resolve');
var fs = require('fs');
var evaluate = require('./evaluate');
var a = require('async');
var api = require('./api');
var extractNewFiles = function(found, now, opts, cb) {
var process = function(files) {
v.each(files, function(file) {
var vars = {
a : file.artist,
t : file.title,
y : file.date.getFullYear().toString(),
m : file.date.getMonth() + 1,
d : file.date.getDate()
};
vars.m = vars.m < 10 ? '0' + vars.m : vars.m.toString();
vars.d = vars.d < 10 ? '0' + vars.d : vars.d.toString();
file.filename = opts.directory + '/' + evaluate(vars, opts.format);
});
files = v.filter(files, function(file) {
if(typeof found[file.filename] === 'undefined') {
found[file.filename] = true;
return true;
}
return false;
});
if(opts.debug) {
console.log('found new tracks in page: ' + files.length);
}
a.mapSeries(files, function(file, cb) {
resolveStream(opts.debug, file, function(err, resolvedFile) {
if(err) {
console.log('Failed to resolve ' + file.filename + ': ' + err.stack);
cb(null, null);
} else {
cb(null, resolvedFile);
}
});
}, function(err, files) {
if(err) {
cb(err, null);
return;
}
a.reject(files, function(file, cb) {
if(file === null) {
cb(true);
} else {
fs.exists(file.filename, cb);
}
}, function(files) {
if(opts.debug) {
console.log('found not downloaded tracks in page: ' + files.length);
}
cb(null, files);
});
});
};
api.clientId(function(err, id) {
if(err) {
cb(err);
return;
}
api.artistId(opts.artist, id, function(err, artistId) {
if(err) {
cb(err);
return;
}
api.artistTracks(artistId, id, opts.streamed, function(err, artistTracks) {
if(err) {
cb(err);
return;
}
process(artistTracks);
});
});
});
};
module.exports = function(now, opts, cb) {
var foundFilenames = {};
extractNewFiles(foundFilenames, now, opts, function(err, currentFiles) {
cb(err, currentFiles, null);
});
};