1.0.4: Breaking; read and use volumes at all times

This commit is contained in:
Roel van Uden 2015-01-25 19:39:04 +01:00
parent 1e54078e39
commit 9cebd0d156
4 changed files with 52 additions and 32 deletions

View File

@ -8,7 +8,7 @@
],
"name": "crunchyroll",
"repository": "git://github.com/Deathspike/crunchyroll.js.git",
"version": "1.0.3",
"version": "1.0.4",
"bin": {
"crunchyroll": "./bin/crunchyroll"
},

View File

@ -88,19 +88,19 @@ function _tasks(config, batchPath, done) {
*/
function _parse(args) {
return new Command().version(require('../package').version)
// Authentication
.option('-p, --pass <s>', 'The password.')
.option('-u, --user <s>', 'The e-mail address or username.')
// Disables
.option('-c, --cache', 'Disables the cache.')
.option('-m, --merge', 'Disables merging subtitles and videos.')
// Filters
.option('-e, --episode <i>', 'The episode filter.')
// Authentication
.option('-p, --pass <s>', 'The password.')
.option('-u, --user <s>', 'The e-mail address or username.')
.option('-v, --volume <i>', 'The volume filter.')
// Settings
.option('-f, --format <s>', 'The subtitle format. (Default: ass)')
.option('-o, --output <s>', 'The output path.')
.option('-s, --series <s>', 'The series override.')
.option('-t, --tag <s>', 'The subgroup. (Default: CrunchyRoll)')
.option('-v, --volume <i>', 'The volume.')
.parse(args);
}

View File

@ -49,9 +49,8 @@ function _complete(message, begin, done) {
* @param {function(Error)} done
*/
function _download(config, page, player, done) {
var tag = config.tag || 'CrunchyRoll';
var series = config.series || page.series;
var fileName = _name(config, page, series, tag);
var fileName = _name(config, page, series);
var filePath = path.join(config.output || process.cwd(), series, fileName);
mkdirp(path.dirname(filePath), function(err) {
if (err) return done(err);
@ -77,13 +76,13 @@ function _download(config, page, player, done) {
* @param {Object} config
* @param {Object} page
* @param {string} series
* @param {string} tag
* @returns {string}
*/
function _name(config, page, series, tag) {
var v = config.volume ? (config.volume < 10 ? '0' : '') + config.volume : '';
var e = (page.episode < 10 ? '0' : '') + page.episode;
return series + ' ' + (v ? v + 'x' : '') + e + ' [' + tag + ']';
function _name(config, page, series) {
var episode = (page.episode < 10 ? '0' : '') + page.episode;
var volume = (page.volume < 10 ? '0' : '') + page.volume;
var tag = config.tag || 'CrunchyRoll';
return series + ' ' + volume + 'x' + episode + ' [' + tag + ']';
}
/**
@ -100,13 +99,15 @@ function _page(config, address, done) {
if (err) return done(err);
var $ = cheerio.load(body);
var swf = /^([^?]+)/.exec($('link[rel=video_src]').attr('href'));
var title = /Watch ([\w\W]+) Episode ([0-9]+)/.exec($('title').text());
if (!swf || !title) return done(new Error('Invalid page.'));
var regexp = /Watch\s+(.+?)(?:\s+Season\s+([0-9]+))?\s+Episode\s+([0-9]+)/;
var data = regexp.exec($('title').text());
if (!swf || !data) return done(new Error('Invalid page.'));
done(undefined, {
id: id,
episode: parseInt(title[2], 10),
series: title[1],
swf: swf[1]
episode: parseInt(data[3], 10),
series: data[1],
swf: swf[1],
volume: parseInt(data[2], 10) || 1
});
});
}

View File

@ -15,8 +15,8 @@ var url = require('url');
*/
module.exports = function(config, address, done) {
var persistentPath = path.join(config.output || process.cwd(), persistent);
fs.readFile(persistentPath, 'utf8', function(err, data) {
var cache = config.cache ? {} : JSON.parse(data || '{}');
fs.readFile(persistentPath, 'utf8', function(err, contents) {
var cache = config.cache ? {} : JSON.parse(contents || '{}');
_page(config, address, function(err, page) {
if (err) return done(err);
var i = 0;
@ -42,16 +42,12 @@ module.exports = function(config, address, done) {
* @param {Object.<string, string>} cache
* @param {Object} config
* @param {string} baseAddress
* @param {Object} data
* @param {Object} item
* @param {function(Error)} done
*/
function _download(cache, config, baseAddress, data, done) {
if (typeof config.episode !== 'undefined') {
var filter = parseInt(config.episode, 10);
if (filter > 0 && data.number <= filter) return done();
if (filter < 0 && data.number >= Math.abs(filter)) return done();
}
var address = url.resolve(baseAddress, data.address);
function _download(cache, config, baseAddress, item, done) {
if (!_filter(config, item)) return done();
var address = url.resolve(baseAddress, item.address);
if (cache[address]) return done();
episode(config, address, function(err) {
if (err) return done(err);
@ -61,7 +57,26 @@ function _download(cache, config, baseAddress, data, done) {
}
/**
* Requests the page data and scrapes the episodes and series.
* Filters the item based on the configuration.
* @param {Object} config
* @param {Object} item
* @returns {boolean}
*/
function _filter(config, item) {
// Filter on chapter.
var episodeFilter = parseInt(config.episode, 10);
if (episodeFilter > 0 && item.episode <= episodeFilter) return false;
if (episodeFilter < 0 && item.episode >= -episodeFilter) return false;
// Filter on volume.
var volumeFilter = parseInt(config.volume, 10);
if (volumeFilter > 0 && item.volume <= volumeFilter) return false;
if (volumeFilter < 0 && item.volume >= -volumeFilter) return false;
return true;
}
/**
* Requests the page and scrapes the episodes and series.
* @private
* @param {Object} config
* @param {string} address
@ -77,10 +92,14 @@ function _page(config, address, done) {
$('.episode').each(function(i, el) {
if ($(el).children('img[src*=coming_soon]').length) return;
var address = $(el).attr('href');
var title = ($(el).children('.series-title').text() || '').trim();
var match = /([0-9]+)$/.exec(title);
if (!address || !match) return;
episodes.push({address: address, number: parseInt(match[0], 10)});
var episode = /([0-9]+)\s*$/.exec($(el).children('.series-title').text());
var volume = /([0-9]+)\s*$/.exec($(el).closest('ul').prev('a').text());
if (!address || !episode) return;
episodes.push({
address: address,
episode: parseInt(episode[0], 10),
volume: volume ? parseInt(volume[0], 10) : 1
});
});
done(undefined, {episodes: episodes.reverse(), series: title});
});