Browse Source

Add a new episode filter and completely remove some dependencies on the config object.

Godzil 5 years ago
parent
commit
6765b517ec
5 changed files with 85 additions and 8 deletions
  1. 22 3
      README.md
  2. 52 4
      src/batch.ts
  3. 1 0
      src/interface/IConfig.d.ts
  4. 2 1
      src/interface/IConfigTask.d.ts
  5. 8 0
      src/series.ts

+ 22 - 3
README.md

@@ -71,6 +71,7 @@ The [command-line interface](http://en.wikipedia.org/wiki/Command-line_interface
        -u, --user <s>        The e-mail address or username.
        -c, --cache           Disables the cache.
        -m, --merge           Disables merging subtitles and videos.
+       -e, --episodes <s>    Episode list. Read documentation on how to use
        -f, --format <s>      The subtitle format. (Default: ass)
        -o, --output <s>      The output path.
        -s, --series <s>      The series override.
@@ -85,7 +86,7 @@ The [command-line interface](http://en.wikipedia.org/wiki/Command-line_interface
 
 #### Batch-mode
 
-When no sequence of series addresses is provided, the batch-mode source file will be read (which is *CrunchyRoll.txt* in the current work directory. Each line in this file is processed as a seperate command-line statement. This makes it ideal to manage a large sequence of series addresses with variating command-line options or incremental episode updates.
+When no sequence of series addresses is provided, the batch-mode source file will be read (which is *CrunchyRoll.txt* in the current work directory. Each line in this file is processed contain the URL of a series and can support some of the command line paramter (like *-e*). This makes it ideal to manage a large sequence of series addresses.
 
 #### Examples
 
@@ -100,12 +101,29 @@ Download *Fairy Tail* to the current work directory:
 Download *Fairy Tail* to `C:\Anime`:
 
     crunchy --output C:\Anime http://www.crunchyroll.com/fairy-tail
-    
+
 Download episode 42 of *Fairy Tail* to `C:\Anime`:
 
     crunchy --output C:\Anime @http://www.crunchyroll.com/fairy-tail/episode-46-the-silver-labyrinth-662721
 
-  Notice the '@' in front of the URL, it is there to tell Crunchy that the URL is an episode URL and not a series URL.
+  *Notice the '@' in front of the URL, it is there to tell Crunchy that the URL is an episode URL and not a series URL.*
+
+ or 
+    crunchy --output C:\Anime http://www.crunchyroll.com/fairy-tail -e 42
+
+Download episode 10 to 42 (both included) of *Fairy Tail*:
+
+    crunchy http://www.crunchyroll.com/fairy-tail -e 10-42
+
+Download episode up to 42 (included) of *Fairy Tail*:
+
+    crunchy http://www.crunchyroll.com/fairy-tail -e -42
+
+Download episodes starting from 42 to the last available of *Fairy Tail*:
+
+    crunchy http://www.crunchyroll.com/fairy-tail -e 42-
+
+
 
 #### Command line parameters
 
@@ -123,6 +141,7 @@ Download episode 42 of *Fairy Tail* to `C:\Anime`:
 
 ##### Settings
 
+* `-e or --episodes <s>` set an episode
 * `-f or --format <s>` sets the subtitle format. (Default: ass)
 * `-o or --output <s>` sets the output path.
 * `-s or --series <s>` sets the series override.

+ 52 - 4
src/batch.ts

@@ -149,6 +149,52 @@ function split(value: string): string[]
   return pieces;
 }
 
+function get_min_filter(filter: string): number
+{
+  if (filter !== undefined)
+  {
+    const tok = filter.split('-');
+
+    if (tok.length > 2)
+    {
+      log.error('Invalid episode filter \'' + filter + '\'');
+      process.exit(-1);
+    }
+
+    if (tok[0] !== '')
+    {
+      return parseInt(tok[0], 10);
+    }
+  }
+  return 0;
+}
+
+function get_max_filter(filter: string): number
+{
+  if (filter !== undefined)
+  {
+    const tok = filter.split('-');
+
+    if (tok.length > 2)
+    {
+      log.error('Invalid episode filter \'' + filter + '\'');
+      process.exit(-1);
+    }
+
+    if ((tok.length > 1) && (tok[1] !== ''))
+    {
+      /* We have a max value */
+      return parseInt(tok[1], 10);
+    }
+    else if ((tok.length === 1) && (tok[0] !== ''))
+    {
+      /* A single episode has been requested */
+      return parseInt(tok[0], 10);
+    }
+  }
+  return +Infinity;
+}
+
 /**
  * Parses the configuration or reads the batch-mode file for tasks.
  */
@@ -156,11 +202,10 @@ function tasks(config: IConfigLine, batchPath: string, done: (err: Error, tasks?
 {
   if (config.args.length)
   {
-    const configIn = config;
-
     return done(null, config.args.map((addressIn) =>
     {
-      return {address: addressIn, config: configIn, retry: config.retry};
+      return {address: addressIn, retry: config.retry,
+              episode_min: get_min_filter(config.episodes), episode_max: get_max_filter(config.episodes)};
     }));
   }
 
@@ -196,7 +241,8 @@ function tasks(config: IConfigLine, batchPath: string, done: (err: Error, tasks?
             return;
           }
 
-          map.push({address: addressIn, config: lineConfig, retry: config.retry});
+          map.push({address: addressIn, retry: lineConfig.retry,
+                    episode_min: get_min_filter(lineConfig.episodes), episode_max: get_max_filter(lineConfig.episodes)});
         });
       });
       done(null, map);
@@ -216,6 +262,8 @@ function parse(args: string[]): IConfigLine
     // Disables
     .option('-c, --cache', 'Disables the cache.')
     .option('-m, --merge', 'Disables merging subtitles and videos.')
+    // Episode filter
+    .option('-e, --episodes <s>', 'Episode list. Read documentation on how to use')
     // Settings
     .option('-f, --format <s>', 'The subtitle format. (Default: ass)')
     .option('-o, --output <s>', 'The output path.')

+ 1 - 0
src/interface/IConfig.d.ts

@@ -5,6 +5,7 @@ interface IConfig {
   // Disables
   cache?: boolean;
   merge?: boolean;
+  episodes?: string;
   // Settings
   format?: string;
   output?: string;

+ 2 - 1
src/interface/IConfigTask.d.ts

@@ -1,5 +1,6 @@
 interface IConfigTask {
   address: string;
-  config: IConfigLine;
   retry: number;
+  episode_min: number;
+  episode_max: number;
 }

+ 8 - 0
src/series.ts

@@ -124,6 +124,14 @@ function download(cache: {[address: string]: number}, config: IConfig,
                   task: IConfigTask, item: ISeriesEpisode,
                   done: (err: Error, ign: boolean) => void)
 {
+  const episodeNumber = parseInt(item.episode, 10);
+
+  if ( (episodeNumber < task.episode_min) ||
+       (episodeNumber > task.episode_max) )
+  {
+    return done(null, false);
+  }
+
   const address = url.resolve(task.address, item.address);
 
   if (cache[address])