From 5bd31f9e0bfa5c180a472d390166734525bd4587 Mon Sep 17 00:00:00 2001 From: Godzil Date: Wed, 7 Sep 2016 21:34:29 +0100 Subject: [PATCH] Add better episode numbering scheme --- src/episode.ts | 35 +++++++++++++++++++++++-------- src/interface/IEpisodePage.d.ts | 4 ++-- src/interface/ISeriesEpisode.d.ts | 2 +- src/series.ts | 10 ++++----- 4 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/episode.ts b/src/episode.ts index c60489e..4486792 100644 --- a/src/episode.ts +++ b/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" }); }); } diff --git a/src/interface/IEpisodePage.d.ts b/src/interface/IEpisodePage.d.ts index f3618dc..6481cdb 100644 --- a/src/interface/IEpisodePage.d.ts +++ b/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; } diff --git a/src/interface/ISeriesEpisode.d.ts b/src/interface/ISeriesEpisode.d.ts index 521167e..bb38ac8 100644 --- a/src/interface/ISeriesEpisode.d.ts +++ b/src/interface/ISeriesEpisode.d.ts @@ -1,5 +1,5 @@ interface ISeriesEpisode { address: string; - episode: number; + episode: string; volume: number; } diff --git a/src/series.ts b/src/series.ts index 65d2994..684ddba 100644 --- a/src/series.ts +++ b/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 }); });