Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2aa71832b3 | ||
|
|
876def4392 | ||
|
|
0ba51b7270 | ||
|
|
7da4289097 | ||
|
|
ce5038cf08 | ||
|
|
1b0f53a88c | ||
|
|
d19992f0d3 | ||
|
|
a44d1ae668 | ||
|
|
14fd18479e | ||
|
|
1106a28288 | ||
|
|
f1a5d1b6a8 | ||
|
|
4193643306 |
2
package-lock.json
generated
2
package-lock.json
generated
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "crunchy",
|
||||
"version": "1.4.0",
|
||||
"version": "1.4.3",
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
|
||||
@@ -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"
|
||||
|
||||
11
src/batch.ts
11
src/batch.ts
@@ -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.')
|
||||
|
||||
17
src/cli.ts
17
src/cli.ts
@@ -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!');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ function fileExist(path: string)
|
||||
|
||||
function sanitiseFileName(str: string)
|
||||
{
|
||||
return str.replace(/[\/':\?\*"<>\.]/g, '_');
|
||||
return str.replace(/[\/':\?\*"<>\\\.]/g, '_');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
1
src/interface/IConfig.d.ts
vendored
1
src/interface/IConfig.d.ts
vendored
@@ -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
47
src/languages.ts
Normal 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;
|
||||
}
|
||||
@@ -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 */
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
|
||||
@@ -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');
|
||||
|
||||
|
||||
@@ -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"';
|
||||
|
||||
Reference in New Issue
Block a user