12 Commits

Author SHA1 Message Date
Godzil
2aa71832b3 1.4.3 2018-08-11 20:50:02 +01:00
Godzil
876def4392 Add code to check what langage CR is serving the page, and try to adapt
some regexp to that. The langage can be forced by the user

Fix #1 and Fix #76
2018-08-11 20:42:12 +01:00
Godzil
0ba51b7270 1.4.2 2018-08-05 11:01:03 +01:00
Godzil
7da4289097 1.4.2-0 2018-08-05 10:57:09 +01:00
Godzil
ce5038cf08 @ URL was broken since 1.3.7 doh! 2018-08-05 10:46:27 +01:00
Godzil
1b0f53a88c 1.4.1 2018-08-05 10:34:00 +01:00
Godzil
d19992f0d3 Make linter happy (and fix a mistake) 2018-08-05 10:30:22 +01:00
Godzil
a44d1ae668 Use a more stable and futur proof URL to get current version information 2018-08-05 09:30:14 +01:00
Godzil
14fd18479e Try to tweak ffmpeg setting, but there are still some stalling issues.. 2018-08-05 09:29:39 +01:00
Godzil
1106a28288 Make possible georestrictions messages more clear 2018-08-05 09:28:53 +01:00
Godzil
f1a5d1b6a8 Add a new warning type (more "strong" but still a warning) 2018-08-05 09:28:28 +01:00
Godzil
4193643306 Fix a missing invalid char for filename for windows ('\') 2018-08-05 09:27:46 +01:00
11 changed files with 114 additions and 16 deletions

2
package-lock.json generated
View File

@@ -1,6 +1,6 @@
{
"name": "crunchy",
"version": "1.4.0",
"version": "1.4.3",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

View File

@@ -15,7 +15,7 @@
"engines": {
"node": ">=5.0"
},
"version": "1.4.0",
"version": "1.4.3",
"bin": {
"crunchy": "./bin/crunchy",
"crunchy.sh": "./bin/crunchy.sh"

View File

@@ -252,7 +252,15 @@ function checkURL(address: string): boolean
{
return true;
}
if (address.startsWith('http:\/\/'))
if (address.startsWith('https:\/\/'))
{
return true;
}
if (address.startsWith('@http:\/\/'))
{
return true;
}
if (address.startsWith('@https:\/\/'))
{
return true;
}
@@ -341,6 +349,7 @@ function parse(args: string[]): IConfigLine
// Episode filter
.option('-e, --episodes <s>', 'Episode list. Read documentation on how to use')
// Settings
.option('-l, --crlang <s>', 'CR page language (valid: en, fr, es, it, pt, de, ru).')
.option('-f, --format <s>', 'The subtitle format.', 'ass')
.option('-o, --output <s>', 'The output path.')
.option('-s, --series <s>', 'The series name override.')

View File

@@ -8,17 +8,20 @@ const current_version = pjson.version;
/* Check if the current version is the latest */
log.info('Crunchy version ' + current_version);
request.get({ uri: 'https://raw.githubusercontent.com/Godzil/Crunchy/master/package.json' },
request.get({ uri: 'https://box.godzil.net/getVersion.php?tool=crunchy&v=' + current_version },
(error: Error, response: any, body: any) =>
{
const onlinepkg = JSON.parse(body);
let tmp = current_version.split('.');
const cur = (Number(tmp[0]) * 10000) + (Number(tmp[1]) * 100) + Number(tmp[2]);
tmp = onlinepkg.version.split('.');
const dist = (Number(tmp[0]) * 10000) + (Number(tmp[1]) * 100) + Number(tmp[2]);
if (dist > cur)
if (onlinepkg.status === 'ok')
{
log.warn('There is a newer version of crunchy (v' + onlinepkg.version + '), you should update!');
let tmp = current_version.split('.');
const cur = (Number(tmp[0]) * 10000) + (Number(tmp[1]) * 100) + Number(tmp[2]);
tmp = onlinepkg.version.split('.');
const dist = (Number(tmp[0]) * 10000) + (Number(tmp[1]) * 100) + Number(tmp[2]);
if (dist > cur)
{
log.warnMore('There is a newer version of crunchy (v' + onlinepkg.version + '), you should update!');
}
}
});

View File

@@ -66,7 +66,7 @@ function fileExist(path: string)
function sanitiseFileName(str: string)
{
return str.replace(/[\/':\?\*"<>\.]/g, '_');
return str.replace(/[\/':\?\*"<>\\\.]/g, '_');
}
/**

View File

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

47
src/languages.ts Normal file
View File

@@ -0,0 +1,47 @@
'use strict';
const localeCC: { [id: string]: string; } =
{
enUS: 'en', enGB: 'en',
esLA: 'es', esES: 'es',
ptPT: 'pt', ptBR: 'pt',
frFR: 'fr',
deDE: 'de',
itIT: 'it',
ruRU: 'ru',
};
export function localeToCC(locale: string): string
{
let ret = localeCC.enGB;
if (locale in localeCC)
{
ret = localeCC[locale];
}
return ret;
}
const episodes_regexp: { [id: string]: RegExp; } =
{
en: /Episode\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
fr: /Épisode\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
de: /Folge\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
es: /Episodio\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
it: /Episodio\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
pt: /Episódio\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
ru: /Серия\s+((OVA)|(PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i,
};
export function get_epregexp(config: IConfig): RegExp
{
let ret = episodes_regexp.en;
if (config.crlang in episodes_regexp)
{
ret = episodes_regexp[config.crlang];
}
return ret;
}

View File

@@ -26,6 +26,12 @@ export function warn(str: string)
console.log(' \x1B[1;33m* WARN \x1B[0m: ' + str);
}
export function warnMore(str: string)
{
/* Do fancy output */
console.log(' \x1B[1;38;5;166m* WARN \x1B[0m: ' + str);
}
export function dispEpisode(name: string, status: string, addNL: boolean)
{
/* Do fancy output */

View File

@@ -6,6 +6,7 @@ import Promise = require('bluebird');
import uuid = require('uuid');
import path = require('path');
import fs = require('fs-extra');
import languages = require('./languages');
import log = require('./log');
import { RequestPromise } from 'request-promise';
@@ -111,6 +112,22 @@ function checkIfUserIsAuth(config: IConfig, done: (err: Error) => void): void
const $ = cheerio.load(body);
/* As we are here, try to detect which locale CR tell us */
const localeRE = /LOCALE = "([a-zA-Z]+)",/g;
const locale = localeRE.exec($('script').text())[1];
const countryCode = languages.localeToCC(locale);
if (config.crlang === undefined)
{
log.info('No locale set. Setting to the one reported by CR: "' + countryCode + '"');
config.crlang = countryCode;
}
else if (config.crlang !== countryCode)
{
log.warn('Crunchy is configured for locale "' + config.crlang + '" but CR report "' + countryCode + '" (LOCALE = ' + locale + ')');
log.warn('Check if it is correct or rerun (once) with "-l ' + countryCode + '" to correct.');
}
/* Check if auth worked */
const regexps = /ga\('set', 'dimension[5-8]', '([^']*)'\);/g;
const dims = regexps.exec($('script').text());
@@ -173,6 +190,11 @@ export function eatCookies(config: IConfig)
j = undefined;
}
export function getUserAgent(): string
{
return defaultHeaders['User-Agent'];
}
/**
* Performs a GET request for the resource.
*/

View File

@@ -1,12 +1,13 @@
'use strict';
import cheerio = require('cheerio');
import episode from './episode';
// import fs = require('fs');
import fs = require('fs-extra');
import my_request = require('./my_request');
import path = require('path');
import url = require('url');
import log = require('./log');
import languages = require('./languages');
const persistent = '.crpersistent';
/**
@@ -215,9 +216,16 @@ function pageScrape(config: IConfig, task: IConfigTask, done: (err: any, result?
log.info('Checking availability for ' + title);
const episodes: ISeriesEpisode[] = [];
if ($('.availability-notes-low').length || $('.availability-notes-high').length)
if ($('.availability-notes-low').length)
{
log.warn('This serie may have georestriction and some missings episode.');
log.warn('This serie may have georestriction and some missings episode (like some dubs)' +
' [Message: ' + $('.availability-notes-low').text() + '].');
}
if ($('.availability-notes-high').length)
{
log.warnMore('This serie probably have georestriction and will miss some episodes' +
' [Message: ' + $('.availability-notes-high').text() + '].');
}
$('.episode').each((i, el) => {
@@ -227,7 +235,7 @@ function pageScrape(config: IConfig, task: IConfigTask, done: (err: any, result?
const season_name = $(el).closest('ul').prev('a').text();
const volume = /([0-9]+)\s*$/.exec($(el).closest('ul').prev('a').text());
const regexp = /Episode\s+((PV )?[S0-9][\-P0-9.]*[a-fA-F]?)\s*$/i;
const regexp = languages.get_epregexp(config);
const episode = regexp.exec($(el).children('.series-title').text());
const url = $(el).attr('href');

View File

@@ -3,6 +3,7 @@ import childProcess = require('child_process');
import os = require('os');
import path = require('path');
import my_request = require('../my_request');
import log = require('../log');
/**
@@ -24,7 +25,8 @@ export default function(rtmpUrl: string, rtmpInputPath: string, swfUrl: string,
else if (mode === 'HLS')
{
cmd = command('ffmpeg') + ' ' +
'-y -xerror ' +
'-user_agent "' + my_request.getUserAgent() + '" ' +
'-y -xerror -discard none ' +
'-i "' + rtmpInputPath + '" ' +
'-c copy -bsf:a aac_adtstoasc ' +
'"' + filePath + '.mp4"';