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",
|
"name": "crunchy",
|
||||||
"version": "1.4.0",
|
"version": "1.4.3",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=5.0"
|
"node": ">=5.0"
|
||||||
},
|
},
|
||||||
"version": "1.4.0",
|
"version": "1.4.3",
|
||||||
"bin": {
|
"bin": {
|
||||||
"crunchy": "./bin/crunchy",
|
"crunchy": "./bin/crunchy",
|
||||||
"crunchy.sh": "./bin/crunchy.sh"
|
"crunchy.sh": "./bin/crunchy.sh"
|
||||||
|
|||||||
11
src/batch.ts
11
src/batch.ts
@@ -252,7 +252,15 @@ function checkURL(address: string): boolean
|
|||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (address.startsWith('http:\/\/'))
|
if (address.startsWith('https:\/\/'))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (address.startsWith('@http:\/\/'))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (address.startsWith('@https:\/\/'))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -341,6 +349,7 @@ function parse(args: string[]): IConfigLine
|
|||||||
// Episode filter
|
// Episode filter
|
||||||
.option('-e, --episodes <s>', 'Episode list. Read documentation on how to use')
|
.option('-e, --episodes <s>', 'Episode list. Read documentation on how to use')
|
||||||
// Settings
|
// 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('-f, --format <s>', 'The subtitle format.', 'ass')
|
||||||
.option('-o, --output <s>', 'The output path.')
|
.option('-o, --output <s>', 'The output path.')
|
||||||
.option('-s, --series <s>', 'The series name override.')
|
.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 */
|
/* Check if the current version is the latest */
|
||||||
log.info('Crunchy version ' + current_version);
|
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) =>
|
(error: Error, response: any, body: any) =>
|
||||||
{
|
{
|
||||||
const onlinepkg = JSON.parse(body);
|
const onlinepkg = JSON.parse(body);
|
||||||
let tmp = current_version.split('.');
|
if (onlinepkg.status === 'ok')
|
||||||
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.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)
|
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;
|
merge?: boolean;
|
||||||
episodes?: string;
|
episodes?: string;
|
||||||
// Settings
|
// Settings
|
||||||
|
crlang?: string;
|
||||||
format?: string;
|
format?: string;
|
||||||
output?: string;
|
output?: string;
|
||||||
series?: 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);
|
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)
|
export function dispEpisode(name: string, status: string, addNL: boolean)
|
||||||
{
|
{
|
||||||
/* Do fancy output */
|
/* Do fancy output */
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import Promise = require('bluebird');
|
|||||||
import uuid = require('uuid');
|
import uuid = require('uuid');
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
import fs = require('fs-extra');
|
import fs = require('fs-extra');
|
||||||
|
import languages = require('./languages');
|
||||||
import log = require('./log');
|
import log = require('./log');
|
||||||
|
|
||||||
import { RequestPromise } from 'request-promise';
|
import { RequestPromise } from 'request-promise';
|
||||||
@@ -111,6 +112,22 @@ function checkIfUserIsAuth(config: IConfig, done: (err: Error) => void): void
|
|||||||
|
|
||||||
const $ = cheerio.load(body);
|
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 */
|
/* Check if auth worked */
|
||||||
const regexps = /ga\('set', 'dimension[5-8]', '([^']*)'\);/g;
|
const regexps = /ga\('set', 'dimension[5-8]', '([^']*)'\);/g;
|
||||||
const dims = regexps.exec($('script').text());
|
const dims = regexps.exec($('script').text());
|
||||||
@@ -173,6 +190,11 @@ export function eatCookies(config: IConfig)
|
|||||||
j = undefined;
|
j = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getUserAgent(): string
|
||||||
|
{
|
||||||
|
return defaultHeaders['User-Agent'];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs a GET request for the resource.
|
* Performs a GET request for the resource.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
import cheerio = require('cheerio');
|
import cheerio = require('cheerio');
|
||||||
import episode from './episode';
|
import episode from './episode';
|
||||||
// import fs = require('fs');
|
|
||||||
import fs = require('fs-extra');
|
import fs = require('fs-extra');
|
||||||
import my_request = require('./my_request');
|
import my_request = require('./my_request');
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
import url = require('url');
|
import url = require('url');
|
||||||
import log = require('./log');
|
import log = require('./log');
|
||||||
|
import languages = require('./languages');
|
||||||
|
|
||||||
const persistent = '.crpersistent';
|
const persistent = '.crpersistent';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -215,9 +216,16 @@ function pageScrape(config: IConfig, task: IConfigTask, done: (err: any, result?
|
|||||||
log.info('Checking availability for ' + title);
|
log.info('Checking availability for ' + title);
|
||||||
const episodes: ISeriesEpisode[] = [];
|
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) => {
|
$('.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 season_name = $(el).closest('ul').prev('a').text();
|
||||||
const volume = /([0-9]+)\s*$/.exec($(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 episode = regexp.exec($(el).children('.series-title').text());
|
||||||
const url = $(el).attr('href');
|
const url = $(el).attr('href');
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import childProcess = require('child_process');
|
|||||||
import os = require('os');
|
import os = require('os');
|
||||||
import path = require('path');
|
import path = require('path');
|
||||||
|
|
||||||
|
import my_request = require('../my_request');
|
||||||
import log = require('../log');
|
import log = require('../log');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,7 +25,8 @@ export default function(rtmpUrl: string, rtmpInputPath: string, swfUrl: string,
|
|||||||
else if (mode === 'HLS')
|
else if (mode === 'HLS')
|
||||||
{
|
{
|
||||||
cmd = command('ffmpeg') + ' ' +
|
cmd = command('ffmpeg') + ' ' +
|
||||||
'-y -xerror ' +
|
'-user_agent "' + my_request.getUserAgent() + '" ' +
|
||||||
|
'-y -xerror -discard none ' +
|
||||||
'-i "' + rtmpInputPath + '" ' +
|
'-i "' + rtmpInputPath + '" ' +
|
||||||
'-c copy -bsf:a aac_adtstoasc ' +
|
'-c copy -bsf:a aac_adtstoasc ' +
|
||||||
'"' + filePath + '.mp4"';
|
'"' + filePath + '.mp4"';
|
||||||
|
|||||||
Reference in New Issue
Block a user