7 Commits

Author SHA1 Message Date
Godzil
48544020a1 1.1.20 2017-09-16 22:58:27 +01:00
Godzil
cc68d21107 correct permissions 2017-09-16 22:54:49 +01:00
Godzil
acd91e2679 Add (unless) node minimum version in packages.json 2017-09-16 22:54:27 +01:00
Godzil
53f0a9462a Better filename forbidden character handling
Logs are a bit better
2017-09-16 22:51:49 +01:00
Godzil
10d71944d9 Fix lint error 2017-08-21 16:08:58 +02:00
Manoël Trapier
b5bbde7cdd Change to make travis npm happy 2017-08-21 14:24:23 +01:00
Manoël Trapier
c406bc70ee Sanitise more characters from filenames 2017-05-17 16:17:26 +01:00
9 changed files with 1680 additions and 15 deletions

View File

@@ -4,7 +4,7 @@ node_js:
- 5 - 5
- 6 - 6
before_install: before_install:
- npm install --dev - npm install --only=dev
script: script:
- npm run types - npm run types
- npm run compile - npm run compile

0
bin/crunchy Normal file → Executable file
View File

1655
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -12,7 +12,10 @@
"type": "git", "type": "git",
"url": "git://github.com/Godzil/crunchyroll.js.git" "url": "git://github.com/Godzil/crunchyroll.js.git"
}, },
"version": "1.1.19", "engines": {
"node": ">=5.0"
},
"version": "1.1.20",
"bin": { "bin": {
"crunchy": "./bin/crunchy" "crunchy": "./bin/crunchy"
}, },

View File

@@ -2,7 +2,7 @@
import cheerio = require('cheerio'); import cheerio = require('cheerio');
import fs = require('fs'); import fs = require('fs');
import mkdirp = require('mkdirp'); import mkdirp = require('mkdirp');
import request = require('./request'); import my_request = require('./my_request');
import path = require('path'); import path = require('path');
import subtitle from './subtitle/index'; import subtitle from './subtitle/index';
import video from './video/index'; import video from './video/index';
@@ -63,6 +63,11 @@ function fileExist(path: string)
} }
} }
function sanitiseFileName(str: string)
{
return str.replace(/[\/':\?\*"<>\.]/g, '_');
}
/** /**
* Downloads the subtitle and video. * Downloads the subtitle and video.
*/ */
@@ -70,8 +75,8 @@ function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, d
{ {
let series = config.series || page.series; let series = config.series || page.series;
series = series.replace('/', '_').replace('\'', '_').replace(':', '_'); series = sanitiseFileName(series);
let fileName = name(config, page, series, '').replace('/', '_').replace('\'', '_').replace(':', '_'); let fileName = sanitiseFileName(name(config, page, series, ''));
let filePath = path.join(config.output || process.cwd(), series, fileName); let filePath = path.join(config.output || process.cwd(), series, fileName);
if (fileExist(filePath + '.mkv')) if (fileExist(filePath + '.mkv'))
@@ -82,7 +87,7 @@ function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, d
do do
{ {
count = count + 1; count = count + 1;
fileName = name(config, page, series, '-' + count).replace('/', '_').replace('\'', '_').replace(':', '_'); fileName = sanitiseFileName(name(config, page, series, '-' + count));
filePath = path.join(config.output || process.cwd(), series, fileName); filePath = path.join(config.output || process.cwd(), series, fileName);
} while (fileExist(filePath + '.mkv')); } while (fileExist(filePath + '.mkv'));
@@ -96,6 +101,7 @@ function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, d
return done(errM, false); return done(errM, false);
} }
log.dispEpisode(fileName, 'Fetching...', false);
downloadSubtitle(config, player, filePath, (errDS) => downloadSubtitle(config, player, filePath, (errDS) =>
{ {
if (errDS) if (errDS)
@@ -106,7 +112,7 @@ function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, d
const now = Date.now(); const now = Date.now();
if (player.video.file !== undefined) if (player.video.file !== undefined)
{ {
log.dispEpisode(fileName, 'Fetching...', false); log.dispEpisode(fileName, 'Fetching video...', false);
downloadVideo(config, page, player, filePath, (errDV) => downloadVideo(config, page, player, filePath, (errDV) =>
{ {
if (errDV) if (errDV)
@@ -121,6 +127,7 @@ function download(config: IConfig, page: IEpisodePage, player: IEpisodePlayer, d
const isSubtited = Boolean(player.subtitle); const isSubtited = Boolean(player.subtitle);
log.dispEpisode(fileName, 'Merging...', false);
video.merge(config, isSubtited, player.video.file, filePath, player.video.mode, (errVM) => video.merge(config, isSubtited, player.video.file, filePath, player.video.mode, (errVM) =>
{ {
if (errVM) if (errVM)
@@ -239,7 +246,7 @@ function scrapePage(config: IConfig, address: string, done: (err: Error, page?:
return done(new Error('Invalid address.')); return done(new Error('Invalid address.'));
} }
request.get(config, address, (err, result) => my_request.get(config, address, (err, result) =>
{ {
if (err) if (err)
{ {
@@ -295,7 +302,7 @@ function scrapePlayer(config: IConfig, address: string, id: number, done: (err:
return done(new Error('Invalid address.')); return done(new Error('Invalid address.'));
} }
request.post(config, { my_request.post(config, {
form: {current_page: address}, form: {current_page: address},
url: url[1] + '/xml/?req=RpcApiVideoPlayer_GetStandardConfig&media_id=' + id, url: url[1] + '/xml/?req=RpcApiVideoPlayer_GetStandardConfig&media_id=' + id,
}, (err, result) => }, (err, result) =>

View File

@@ -28,10 +28,10 @@ export function warn(str: string)
export function dispEpisode(name: string, status: string, addNL: boolean) export function dispEpisode(name: string, status: string, addNL: boolean)
{ {
/* Do fancy output */ /* Do fancy output */
process.stdout.write(' \x1B[1;33m> \x1B[37m' + name + '\x1B[0m : \x1B[33m' + status + '\x1B[0m\x1B[0G'); process.stdout.write('\x1B[K \x1B[1;33m> \x1B[37m' + name + '\x1B[0m : \x1B[33m' + status + '\x1B[0m\x1B[0G');
if (addNL) if (addNL)
{ {
console.log(''); console.log('');
} }
} }

View File

@@ -16,7 +16,7 @@ const defaultHeaders: request.Headers =
/** /**
* Performs a GET request for the resource. * Performs a GET request for the resource.
*/ */
export function get(config: IConfig, options: request.Options, done: (err: Error, result?: string) => void) export function get(config: IConfig, options: string|request.Options, done: (err: Error, result?: string) => void)
{ {
authenticate(config, err => authenticate(config, err =>
{ {

View File

@@ -3,7 +3,7 @@ import cheerio = require('cheerio');
import episode from './episode'; import episode from './episode';
import fs = require('fs'); import fs = require('fs');
const fse = require('fs-extra'); const fse = require('fs-extra');
import request = require('./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');
@@ -158,7 +158,7 @@ function page(config: IConfig, address: string, done: (err: Error, result?: ISer
else else
{ {
let episodeCount = 0; let episodeCount = 0;
request.get(config, address, (err, result) => { my_request.get(config, address, (err, result) => {
if (err) { if (err) {
return done(err); return done(err);
} }

View File

@@ -31,7 +31,7 @@
"src/interface/ISubtitle.d.ts", "src/interface/ISubtitle.d.ts",
"src/interface/ISubtitleEvent.d.ts", "src/interface/ISubtitleEvent.d.ts",
"src/interface/ISubtitleStyle.d.ts", "src/interface/ISubtitleStyle.d.ts",
"src/request.ts", "src/my_request.ts",
"src/series.ts", "src/series.ts",
"src/subtitle/decode.ts", "src/subtitle/decode.ts",
"src/subtitle/formats/ass.ts", "src/subtitle/formats/ass.ts",