Parcourir la source

Add an episode filter.

Roel van Uden il y a 9 ans
Parent
commit
4b0c993969
3 fichiers modifiés avec 13 ajouts et 7 suppressions
  1. 1 1
      README.md
  2. 2 0
      src/batch.js
  3. 10 6
      src/series.js

+ 1 - 1
README.md

@@ -3,7 +3,7 @@
 *CrunchyRoll.js* is capable of saving *anime* episodes from the popular *CrunchyRoll*
 streaming service. An episode is stored in the original video format (often
 H.264 in a MP4 container) and the configured subtitle format (ASS or SRT). The
-two output files are optionally muxed into a single MKV file.
+two output files are then merged into a single MKV file.
 
 ## Motivation
 

+ 2 - 0
src/batch.js

@@ -67,6 +67,8 @@ function _parse(args) {
     // Disables
     .option('-c, --cache', 'Disables the cache.')
     .option('-m, --merge', 'Disables merging subtitles and videos.')
+    // Filters
+    .option('-e, --episode <i>', 'The episode filter.')
     // Settings
     .option('-f, --format <s>', 'The subtitle format. (Default: ass)')
     .option('-o, --output <s>', 'The output path.')

+ 10 - 6
src/series.js

@@ -22,9 +22,7 @@ module.exports = function (config, address, done) {
       var i = 0;
       (function next() {
         if (i >= page.episodes.length) return done();
-        var episode = page.episodes[i];
-        var episodeAddress = url.resolve(address, episode.address);
-        _download(cache, config, episodeAddress, function(err) {
+        _download(cache, config, address, page.episodes[i], function(err) {
           if (err) return done(err);
           var newCache = JSON.stringify(cache, null, '  ');
           fs.writeFile(persistentPath, newCache, function(err) {
@@ -42,10 +40,16 @@ module.exports = function (config, address, done) {
  * Downloads the episode.
  * @param {Object.<string, string>} cache
  * @param {Object} config
- * @param {string} address
+ * @param {string} baseAddress
+ * @param {Object} data
  * @param {function(Error)} done
  */
-function _download(cache, config, address, done) {
+function _download(cache, config, baseAddress, data, done) {
+  if (typeof config.episode === 'number') {
+    if (config.episode > 0 && data.number < config.episode) return done();
+    if (config.episode < 0 && -config.episode < data.number) return done();
+  }
+  var address = url.resolve(baseAddress, data.address);
   if (cache[address]) return done();
   episode(config, address, function(err) {
     if (err) return done(err);
@@ -73,7 +77,7 @@ function _page(address, done) {
       var title = ($(el).children('.series-title').text() || '').trim();
       var match = /([0-9]+)$/.exec(title);
       if (!address || !match) return;
-      episodes.push({address: address, episode: parseInt(match[0], 10)});
+      episodes.push({address: address, number: parseInt(match[0], 10)});
     });
     done(undefined, {episodes: episodes.reverse(), series: title});
   });