Add functionality to ignore (instead of stopping) if an episode is not available yet

This commit is contained in:
Godzil 2016-09-07 21:51:36 +01:00
parent 5bd31f9e0b
commit 8314d91bd7
2 changed files with 44 additions and 28 deletions

View File

@ -11,11 +11,11 @@ import xml2js = require('xml2js');
/**
* Streams the episode to disk.
*/
export default function(config: IConfig, address: string, done: (err: Error) => void) {
export default function(config: IConfig, address: string, done: (err: Error, ign: boolean) => void) {
scrapePage(config, address, (err, page) => {
if (err) return done(err);
if (err) return done(err, false);
scrapePlayer(config, address, page.id, (err, player) => {
if (err) return done(err);
if (err) return done(err, false);
download(config, page, player, done);
});
});
@ -24,38 +24,46 @@ export default function(config: IConfig, address: string, done: (err: Error) =>
/**
* Completes a download and writes the message with an elapsed time.
*/
function complete(message: string, begin: number, done: (err: Error) => void) {
function complete(message: string, begin: number, done: (err: Error, ign: boolean) => void) {
var timeInMs = Date.now() - begin;
var seconds = prefix(Math.floor(timeInMs / 1000) % 60, 2);
var minutes = prefix(Math.floor(timeInMs / 1000 / 60) % 60, 2);
var hours = prefix(Math.floor(timeInMs / 1000 / 60 / 60), 2);
console.log(message + ' (' + hours + ':' + minutes + ':' + seconds + ')');
done(null);
done(null, false);
}
/**
* Downloads the subtitle and video.
*/
function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, done: (err: Error) => void) {
function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, done: (err: Error, ign: boolean) => void) {
var series = config.series || 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);
if (err) return done(err, false);
downloadSubtitle(config, player, filePath, err => {
if (err) return done(err);
if (err) return done(err, false);
var now = Date.now();
console.log('Fetching ' + fileName);
downloadVideo(config, page, player, filePath, err => {
if (err) return done(err);
if (config.merge) return complete('Finished ' + fileName, now, done);
var isSubtited = Boolean(player.subtitle);
video.merge(config, isSubtited, player.video.file, filePath, player.video.mode, err => {
if (err) return done(err);
complete('Finished ' + fileName, now, done);
if (player.video.file != undefined)
{
console.log('Fetching ' + fileName);
downloadVideo(config, page, player, filePath, err => {
if (err) return done(err, false);
if (config.merge) return complete('Finished ' + fileName, now, done);
var isSubtited = Boolean(player.subtitle);
video.merge(config, isSubtited, player.video.file, filePath, player.video.mode, err => {
if (err) return done(err, false);
complete('Finished ' + fileName, now, done);
});
});
});
}
else
{
console.log('Ignoring ' + fileName + ': not released yet');
done(null, true);
}
});
});
}

View File

@ -19,14 +19,22 @@ export default function(config: IConfig, address: string, done: (err: Error) =>
var i = 0;
(function next() {
if (i >= page.episodes.length) return done(null);
download(cache, config, address, page.episodes[i], err => {
download(cache, config, address, page.episodes[i], (err, ignored) => {
if (err) return done(err);
var newCache = JSON.stringify(cache, null, ' ');
fs.writeFile(persistentPath, newCache, err => {
if (err) return done(err);
if ((ignored == false) || (ignored == undefined))
{
var newCache = JSON.stringify(cache, null, ' ');
fs.writeFile(persistentPath, newCache, err => {
if (err) return done(err);
i += 1;
next();
});
}
else
{
i += 1;
next();
});
}
});
})();
});
@ -40,14 +48,14 @@ function download(cache: {[address: string]: number},
config: IConfig,
baseAddress: string,
item: ISeriesEpisode,
done: (err: Error) => void) {
if (!filter(config, item)) return done(null);
done: (err: Error, ign: boolean) => void) {
if (!filter(config, item)) return done(null, false);
var address = url.resolve(baseAddress, item.address);
if (cache[address]) return done(null);
episode(config, address, err => {
if (err) return done(err);
if (cache[address]) return done(null, false);
episode(config, address, (err, ignored) => {
if (err) return done(err, false);
cache[address] = Date.now();
done(null);
done(null, ignored);
});
}