Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8ef27066f6 | ||
|
|
621df26b58 | ||
|
|
8060b1b73b | ||
|
|
11f6b3feff | ||
|
|
537639f2a8 | ||
|
|
813f8a997d | ||
|
|
48544020a1 | ||
|
|
cc68d21107 | ||
|
|
acd91e2679 | ||
|
|
53f0a9462a | ||
|
|
10d71944d9 | ||
|
|
b5bbde7cdd | ||
|
|
c406bc70ee |
@@ -3,9 +3,11 @@ sudo: false
|
|||||||
node_js:
|
node_js:
|
||||||
- 5
|
- 5
|
||||||
- 6
|
- 6
|
||||||
|
- 7
|
||||||
|
- 8
|
||||||
|
- 9
|
||||||
before_install:
|
before_install:
|
||||||
- npm install --dev
|
- npm install --only=dev
|
||||||
script:
|
script:
|
||||||
- npm run types
|
- npm run build
|
||||||
- npm run compile
|
|
||||||
- npm test
|
- npm test
|
||||||
|
|||||||
0
bin/crunchy
Normal file → Executable file
0
bin/crunchy
Normal file → Executable file
4726
package-lock.json
generated
Normal file
4726
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
22
package.json
22
package.json
@@ -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.21",
|
||||||
"bin": {
|
"bin": {
|
||||||
"crunchy": "./bin/crunchy"
|
"crunchy": "./bin/crunchy"
|
||||||
},
|
},
|
||||||
@@ -20,23 +23,24 @@
|
|||||||
"big-integer": "^1.4.4",
|
"big-integer": "^1.4.4",
|
||||||
"cheerio": "^0.22.0",
|
"cheerio": "^0.22.0",
|
||||||
"cloudscraper": "^1.4.1",
|
"cloudscraper": "^1.4.1",
|
||||||
"commander": "^2.6.0",
|
"commander": "^2.12.2",
|
||||||
"fs-extra": "^2.0.0",
|
"fs-extra": "^5.0.0",
|
||||||
"mkdirp": "^0.5.0",
|
"mkdirp": "^0.5.0",
|
||||||
"request": "^2.74.0",
|
"request": "^2.74.0",
|
||||||
"xml2js": "^0.4.5"
|
"xml2js": "^0.4.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/cheerio": "^0.22.6",
|
||||||
|
"@types/mkdirp": "^0.5.2",
|
||||||
|
"@types/request": "^2.0.9",
|
||||||
|
"@types/xml2js": "^0.4.2",
|
||||||
"tsconfig-lint": "^0.12.0",
|
"tsconfig-lint": "^0.12.0",
|
||||||
"tslint": "^4.4.2",
|
"tslint": "^5.8.0",
|
||||||
"typescript": "^2.2.0",
|
"typescript": "^2.6.2"
|
||||||
"typings": "^2.1.0"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prepublish": "npm run types && tsc",
|
"build": "tsc",
|
||||||
"compile": "tsc",
|
|
||||||
"test": "tslint -c ./tslint.json --project ./tsconfig.json ./src/**/*.ts",
|
"test": "tslint -c ./tslint.json --project ./tsconfig.json ./src/**/*.ts",
|
||||||
"types": "typings install",
|
|
||||||
"start": "node ./bin/crunchy"
|
"start": "node ./bin/crunchy"
|
||||||
},
|
},
|
||||||
"bugs": {
|
"bugs": {
|
||||||
|
|||||||
@@ -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) =>
|
||||||
|
|||||||
@@ -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('');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 =>
|
||||||
{
|
{
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
/* tslint:disable:no-bitwise false */
|
/* tslint:disable:no-bitwise false */
|
||||||
'use strict';
|
'use strict';
|
||||||
import crypto = require('crypto');
|
|
||||||
import bigInt = require('big-integer');
|
import bigInt = require('big-integer');
|
||||||
|
import crypto = require('crypto');
|
||||||
import zlib = require('zlib');
|
import zlib = require('zlib');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decodes the data.
|
* Decodes the data.
|
||||||
*/
|
*/
|
||||||
export default function(id: number, iv: Buffer|string, data: Buffer|string,
|
export default function(id: number, iv: Buffer|string, data: Buffer|string,
|
||||||
done: (err?: Error, result?: Buffer) => void)
|
done: (err?: Error, result?: Buffer) => void)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
import childProcess = require('child_process');
|
import childProcess = require('child_process');
|
||||||
import fs = require('fs');
|
import fs = require('fs');
|
||||||
import path = require('path');
|
|
||||||
import os = require('os');
|
import os = require('os');
|
||||||
|
import path = require('path');
|
||||||
|
|
||||||
import subtitle from '../subtitle/index';
|
import subtitle from '../subtitle/index';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Merges the subtitle and video files into a Matroska Multimedia Container.
|
* Merges the subtitle and video files into a Matroska Multimedia Container.
|
||||||
*/
|
*/
|
||||||
export default function(config: IConfig, isSubtitled: boolean, rtmpInputPath: string, filePath: string,
|
export default function(config: IConfig, isSubtitled: boolean, rtmpInputPath: string, filePath: string,
|
||||||
streamMode: string, done: (err: Error) => void)
|
streamMode: string, done: (err: Error) => void)
|
||||||
{
|
{
|
||||||
const subtitlePath = filePath + '.' + (subtitle.formats[config.format] ? config.format : 'ass');
|
const subtitlePath = filePath + '.' + (subtitle.formats[config.format] ? config.format : 'ass');
|
||||||
let videoPath = filePath;
|
let videoPath = filePath;
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
import childProcess = require('child_process');
|
import childProcess = require('child_process');
|
||||||
import path = require('path');
|
|
||||||
import os = require('os');
|
import os = require('os');
|
||||||
|
import path = require('path');
|
||||||
|
|
||||||
import log = require('../log');
|
import log = require('../log');
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,46 +1,10 @@
|
|||||||
{
|
{
|
||||||
"version": "1.5.1-beta",
|
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"declaration": true,
|
"declaration": true,
|
||||||
"noImplicitAny": true,
|
"noImplicitAny": true,
|
||||||
"removeComments": false,
|
"removeComments": false,
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"outDir": "dist",
|
"outDir": "dist",
|
||||||
"sourceMap": true,
|
"sourceMap": true
|
||||||
"target": "es5"
|
}
|
||||||
},
|
|
||||||
"filesGlob": [
|
|
||||||
"src/**/*.ts",
|
|
||||||
"typings/**/*.ts"
|
|
||||||
],
|
|
||||||
"files": [
|
|
||||||
"src/batch.ts",
|
|
||||||
"src/cli.ts",
|
|
||||||
"src/episode.ts",
|
|
||||||
"src/index.ts",
|
|
||||||
"src/log.ts",
|
|
||||||
"src/interface/IConfig.d.ts",
|
|
||||||
"src/interface/IConfigLine.d.ts",
|
|
||||||
"src/interface/IConfigTask.d.ts",
|
|
||||||
"src/interface/IEpisodePage.d.ts",
|
|
||||||
"src/interface/IEpisodePlayer.d.ts",
|
|
||||||
"src/interface/IEpisodePlayerConfig.d.ts",
|
|
||||||
"src/interface/IFormatterTable.d.ts",
|
|
||||||
"src/interface/ISeries.d.ts",
|
|
||||||
"src/interface/ISeriesEpisode.d.ts",
|
|
||||||
"src/interface/ISubtitle.d.ts",
|
|
||||||
"src/interface/ISubtitleEvent.d.ts",
|
|
||||||
"src/interface/ISubtitleStyle.d.ts",
|
|
||||||
"src/request.ts",
|
|
||||||
"src/series.ts",
|
|
||||||
"src/subtitle/decode.ts",
|
|
||||||
"src/subtitle/formats/ass.ts",
|
|
||||||
"src/subtitle/formats/index.ts",
|
|
||||||
"src/subtitle/formats/srt.ts",
|
|
||||||
"src/subtitle/index.ts",
|
|
||||||
"src/video/index.ts",
|
|
||||||
"src/video/merge.ts",
|
|
||||||
"src/video/stream.ts",
|
|
||||||
"typings/index.d.ts"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
13
typings.json
13
typings.json
@@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "crunchy",
|
|
||||||
"globalDependencies": {
|
|
||||||
"node": "github:DefinitelyTyped/DefinitelyTyped/node/node.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"commander": "github:DefinitelyTyped/DefinitelyTyped/commander/commander.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"xml2js": "github:DefinitelyTyped/DefinitelyTyped/xml2js/xml2js.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"cheerio": "github:DefinitelyTyped/DefinitelyTyped/cheerio/cheerio.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"mkdirp": "github:DefinitelyTyped/DefinitelyTyped/mkdirp/mkdirp.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"request": "github:DefinitelyTyped/DefinitelyTyped/request/request.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"big-integer": "github:DefinitelyTyped/DefinitelyTyped/big-integer/big-integer.d.ts#3882d337bb0808cde9fe4c08012508a48c135482",
|
|
||||||
"form-data": "github:DefinitelyTyped/DefinitelyTyped/form-data/form-data.d.ts#3882d337bb0808cde9fe4c08012508a48c135482"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user