Browse Source

Add better episode numbering scheme

Godzil 7 years ago
parent
commit
5bd31f9e0b
4 changed files with 34 additions and 17 deletions
  1. 26 9
      src/episode.ts
  2. 2 2
      src/interface/IEpisodePage.d.ts
  3. 1 1
      src/interface/ISeriesEpisode.d.ts
  4. 5 5
      src/series.ts

+ 26 - 9
src/episode.ts

@@ -38,7 +38,8 @@ function complete(message: string, begin: number, done: (err: Error) => void) {
  */
 function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, done: (err: Error) => void) {
   var series = config.series || page.series;
-  var fileName = name(config, page, series);
+  series = series.replace("/","_").replace("'","_");
+  var fileName = name(config, page, series).replace("/","_").replace("'","_");
   var filePath = path.join(config.output || process.cwd(), series, fileName);
   mkdirp(path.dirname(filePath), (err: Error) => {
     if (err) return done(err);
@@ -97,10 +98,12 @@ function downloadVideo(config: IConfig,
  * Names the file based on the config, page, series and tag.
  */
 function name(config: IConfig, page: IEpisodePage, series: string) {
-  var episode = (page.episode < 10 ? '0' : '') + page.episode;
-  var volume = (page.volume < 10 ? '0' : '') + page.volume;
+	var episodeNum = parseInt(page.episode, 10);
+	var volumeNum = parseInt(page.volume, 10);
+  var episode = (episodeNum < 10 ? '0' : '') + page.episode;
+  var volume = (volumeNum < 10 ? '0' : '') + page.volume;
   var tag = config.tag || 'CrunchyRoll';
-  return series + ' ' + volume + 'x' + episode + ' [' + tag + ']';
+  return series + ' ' + volume + 'x' + episode + ' [' + tag + ']';  
 }
 
 /**
@@ -122,15 +125,29 @@ function scrapePage(config: IConfig, address: string, done: (err: Error, page?:
     if (err) return done(err);
     var $ = cheerio.load(result);
     var swf = /^([^?]+)/.exec($('link[rel=video_src]').attr('href'));
-    var regexp = /-\s+(?:Watch\s+)?(.+?)(?:\s+Season\s+([0-9]+))?(?:\s+-)?\s+Episode\s+([0-9]+)/;
-    var data = regexp.exec($('title').text());
-    if (!swf || !data) return done(new Error('Invalid page.'));
+    var regexp = /\s*([^\n\r\t\f]+)\n?\s*[^0-9]*([0-9][0-9.]*)?,?\n?\s\s*[^0-9]*((PV )?[S0-9][P0-9.]*[a-fA-F]?)/;
+    var look = $('#showmedia_about_media').text();
+    var seasonTitle = $('span[itemprop="title"]').text();
+    var data = regexp.exec(look);
+
+    if (!swf || !data)
+    {
+      console.info('Something wrong in the page at '+address+' (data are: '+look+')');
+      console.info('Setting Season to 0 and episode to \’0\’...');
+      done(null, {
+          id: id,
+          episode: "0",
+          series: seasonTitle,
+          swf: swf[1],
+          volume: "0"
+      });
+    }
     done(null, {
       id: id,
-      episode: parseInt(data[3], 10),
+      episode: data[3],
       series: data[1],
       swf: swf[1],
-      volume: parseInt(data[2], 10) || 1
+      volume: data[2] || "1"
     });
   });
 }

+ 2 - 2
src/interface/IEpisodePage.d.ts

@@ -1,7 +1,7 @@
 interface IEpisodePage {
   id: number;
-  episode: number;
+  episode: string;
   series: string;
-  volume: number;
+  volume: string;
   swf: string;
 }

+ 1 - 1
src/interface/ISeriesEpisode.d.ts

@@ -1,5 +1,5 @@
 interface ISeriesEpisode {
   address: string;
-  episode: number;
+  episode: string;
   volume: number;
 }

+ 5 - 5
src/series.ts

@@ -57,8 +57,8 @@ function download(cache: {[address: string]: number},
 function filter(config: IConfig, item: ISeriesEpisode) {
   // Filter on chapter.
   var episodeFilter = config.episode;
-  if (episodeFilter > 0 && item.episode <= episodeFilter) return false;
-  if (episodeFilter < 0 && item.episode >= -episodeFilter) return false;
+  if (episodeFilter > 0 && parseInt(item.episode, 10) <= episodeFilter) return false;
+  if (episodeFilter < 0 && parseInt(item.episode, 10) >= -episodeFilter) return false;
 
   // Filter on volume.
   var volumeFilter = config.volume;
@@ -75,18 +75,18 @@ function page(config: IConfig, address: string, done: (err: Error, result?: ISer
     if (err) return done(err);
     var $ = cheerio.load(result);
     var title = $('span[itemprop=name]').text();
-    if (!title) return done(new Error('Invalid page.'));
+    if (!title) return done(new Error('Invalid page.(' + address + ')'));
     var episodes: ISeriesEpisode[] = [];
     $('.episode').each((i, el) => {
       if ($(el).children('img[src*=coming_soon]').length) return;
       var volume = /([0-9]+)\s*$/.exec($(el).closest('ul').prev('a').text());
-      var regexp = /Episode\s+([0-9]+)\s*$/i;
+      var regexp = /Episode\s+((PV )?[S0-9][P0-9.]*[a-fA-F]?)\s*$/i;
       var episode = regexp.exec($(el).children('.series-title').text());
       var address = $(el).attr('href');
       if (!address || !episode) return;
       episodes.push({
         address: address,
-        episode: parseInt(episode[0], 10),
+        episode: episode[1],
         volume: volume ? parseInt(volume[0], 10) : 1
       });
     });