@nger/fk-upload 1.0.201 → 1.0.204
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{templates → controllers}/code.d.ts +0 -0
- package/dist/{templates → controllers}/code.js +2 -1
- package/dist/controllers/relogin.d.ts +8 -0
- package/dist/controllers/relogin.js +42 -0
- package/dist/{templates → controllers}/verify.d.ts +0 -0
- package/dist/{templates → controllers}/verify.js +0 -0
- package/dist/entities/check-task.d.ts +13 -0
- package/dist/entities/check-task.js +221 -0
- package/dist/entities/download-task.d.ts +23 -0
- package/dist/entities/download-task.js +445 -0
- package/dist/entities/effect-task.d.ts +12 -0
- package/dist/entities/effect-task.js +207 -0
- package/dist/entities/fk-account.d.ts +16 -0
- package/dist/entities/fk-account.js +295 -0
- package/dist/entities/fk-jiqun.d.ts +5 -0
- package/dist/entities/fk-jiqun.js +56 -0
- package/dist/entities/upload-task.d.ts +15 -0
- package/dist/entities/upload-task.js +333 -0
- package/dist/entities/w7-account.d.ts +11 -0
- package/dist/entities/w7-account.js +126 -0
- package/dist/entities/w7.d.ts +10 -0
- package/dist/entities/w7.js +107 -0
- package/dist/entities/w7_chat_topic.d.ts +9 -0
- package/dist/entities/w7_chat_topic.js +58 -0
- package/dist/entities/w7_uni_account.d.ts +4 -0
- package/dist/entities/w7_uni_account.js +23 -0
- package/dist/fk-upload.module.d.ts +5 -0
- package/dist/fk-upload.module.js +76 -43
- package/dist/main.d.ts +1 -0
- package/dist/main.js +18 -29
- package/dist/services/check.service.d.ts +6 -0
- package/dist/services/check.service.js +32 -0
- package/dist/services/client.service.d.ts +6 -0
- package/dist/services/client.service.js +29 -0
- package/dist/services/download.service.d.ts +15 -0
- package/dist/services/download.service.js +139 -0
- package/dist/services/effect.service.d.ts +7 -0
- package/dist/services/effect.service.js +34 -0
- package/dist/services/fk.service.d.ts +24 -0
- package/dist/services/fk.service.js +323 -0
- package/dist/services/login.service.d.ts +17 -0
- package/dist/services/login.service.js +95 -0
- package/dist/services/upload.service.d.ts +13 -0
- package/dist/services/upload.service.js +100 -0
- package/dist/tasks/actions.d.ts +28 -0
- package/dist/tasks/actions.js +12 -0
- package/dist/{templates/tasks/schedule-task.d.ts → tasks/check-task.d.ts} +3 -5
- package/dist/tasks/check-task.js +205 -0
- package/dist/tasks/download-continue-task.d.ts +9 -0
- package/dist/tasks/download-continue-task.js +127 -0
- package/dist/{templates/tasks → tasks}/download-task.d.ts +0 -1
- package/dist/tasks/download-task.js +128 -0
- package/dist/{templates/tasks → tasks}/effect-task.d.ts +1 -1
- package/dist/tasks/effect-task.js +111 -0
- package/dist/{templates/tasks → tasks}/providers.d.ts +0 -0
- package/dist/{templates/tasks → tasks}/providers.js +11 -5
- package/dist/tasks/upload-continue-task.d.ts +8 -0
- package/dist/tasks/upload-continue-task.js +114 -0
- package/dist/{templates/tasks → tasks}/upload-task.d.ts +0 -0
- package/dist/tasks/upload-task.js +114 -0
- package/package.json +18 -14
- package/pnpm-lock.yaml +36 -1435
- package/dist/electon.d.ts +0 -3
- package/dist/electon.js +0 -80
- package/dist/entities/fk-download-task.entity.d.ts +0 -18
- package/dist/entities/fk-download-task.entity.js +0 -142
- package/dist/entities/fk-login-cookie.entity.d.ts +0 -7
- package/dist/entities/fk-login-cookie.entity.js +0 -46
- package/dist/entities/fk-login.entity.d.ts +0 -12
- package/dist/entities/fk-login.entity.js +0 -80
- package/dist/entities/index.d.ts +0 -3
- package/dist/entities/index.js +0 -6
- package/dist/login.controller.d.ts +0 -14
- package/dist/login.controller.js +0 -197
- package/dist/mq-runner.d.ts +0 -5
- package/dist/mq-runner.js +0 -19
- package/dist/static/task-manage.d.ts +0 -6
- package/dist/static/task-manage.js +0 -34
- package/dist/templates/add-fk-login.d.ts +0 -12
- package/dist/templates/add-fk-login.js +0 -93
- package/dist/templates/add-task.d.ts +0 -13
- package/dist/templates/add-task.js +0 -78
- package/dist/templates/check-upload.d.ts +0 -38
- package/dist/templates/check-upload.js +0 -195
- package/dist/templates/component.d.ts +0 -10
- package/dist/templates/component.js +0 -39
- package/dist/templates/error.d.ts +0 -4
- package/dist/templates/error.js +0 -27
- package/dist/templates/help.d.ts +0 -7
- package/dist/templates/help.js +0 -52
- package/dist/templates/player.d.ts +0 -4
- package/dist/templates/player.js +0 -23
- package/dist/templates/setting.d.ts +0 -13
- package/dist/templates/setting.js +0 -65
- package/dist/templates/task-manage.d.ts +0 -21
- package/dist/templates/task-manage.js +0 -314
- package/dist/templates/tasks/actions.d.ts +0 -44
- package/dist/templates/tasks/actions.js +0 -9
- package/dist/templates/tasks/check-task.d.ts +0 -8
- package/dist/templates/tasks/check-task.js +0 -89
- package/dist/templates/tasks/download-task.js +0 -130
- package/dist/templates/tasks/effect-task.js +0 -76
- package/dist/templates/tasks/fk.service.d.ts +0 -28
- package/dist/templates/tasks/fk.service.js +0 -254
- package/dist/templates/tasks/schedule-task.js +0 -94
- package/dist/templates/tasks/task.service.d.ts +0 -11
- package/dist/templates/tasks/task.service.js +0 -114
- package/dist/templates/tasks/upload-task.js +0 -97
- package/dist/templates/tasks/yasuo-task.d.ts +0 -0
- package/dist/templates/tasks/yasuo-task.js +0 -0
- package/dist/templates/upload-task.d.ts +0 -9
- package/dist/templates/upload-task.js +0 -141
- package/dist/templates/upload.d.ts +0 -16
- package/dist/templates/upload.js +0 -232
- package/dist/urlSafeBase64Decode.d.ts +0 -3
- package/dist/urlSafeBase64Decode.js +0 -32
- package/electron/.env +0 -32
- package/electron/package.json +0 -31
- package/electron/pnpm-lock.yaml +0 -2878
- package/fk-upload-pc/.vscode/extensions.json +0 -3
- package/fk-upload-pc/README.md +0 -16
- package/fk-upload-pc/index.html +0 -13
- package/fk-upload-pc/package.json +0 -19
- package/fk-upload-pc/pnpm-lock.yaml +0 -489
- package/fk-upload-pc/public/favicon.ico +0 -0
- package/fk-upload-pc/tsconfig.json +0 -18
- package/fk-upload-pc/tsconfig.node.json +0 -8
- package/fk-upload-pc/vite.config.ts +0 -7
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DownloadTask = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const rabbitmq_1 = require("@nger/rabbitmq");
|
|
6
|
-
const core_1 = require("@nger/core");
|
|
7
|
-
const actions_1 = require("./actions");
|
|
8
|
-
const request_1 = require("request");
|
|
9
|
-
const fs_1 = require("fs");
|
|
10
|
-
const fk_service_1 = require("./fk.service");
|
|
11
|
-
const md5_file_1 = tslib_1.__importDefault(require("md5-file"));
|
|
12
|
-
const fs_extra_1 = require("fs-extra");
|
|
13
|
-
const path_1 = require("path");
|
|
14
|
-
const typeorm_1 = require("@nger/typeorm");
|
|
15
|
-
const entities_1 = require("../../entities");
|
|
16
|
-
const rxjs_1 = require("rxjs");
|
|
17
|
-
const operators_1 = require("rxjs/operators");
|
|
18
|
-
const path_2 = require("path");
|
|
19
|
-
/**
|
|
20
|
-
* upload and task
|
|
21
|
-
*/
|
|
22
|
-
class DownloadTask extends rabbitmq_1.Task {
|
|
23
|
-
constructor() {
|
|
24
|
-
super(actions_1.DOWNLOAD_ACTION);
|
|
25
|
-
}
|
|
26
|
-
async handle(injector, next) {
|
|
27
|
-
const db = injector.get(typeorm_1.Db);
|
|
28
|
-
const task = injector.get(rabbitmq_1.DATA);
|
|
29
|
-
const complete = injector.get(rabbitmq_1.COMPLETE);
|
|
30
|
-
const root = injector.get(core_1.APP_ROOT);
|
|
31
|
-
const fail = injector.get(rabbitmq_1.FAIL);
|
|
32
|
-
const download = await db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename: task.filename } });
|
|
33
|
-
if (!download || (download && download.status !== 0)) {
|
|
34
|
-
await complete();
|
|
35
|
-
return next && next();
|
|
36
|
-
}
|
|
37
|
-
const filePath = (0, path_2.join)(root, task.path);
|
|
38
|
-
(0, fs_extra_1.ensureDir)((0, path_1.dirname)(filePath));
|
|
39
|
-
const writeStream = (0, fs_1.createWriteStream)(filePath);
|
|
40
|
-
const manager = injector.get(rabbitmq_1.TaskManager);
|
|
41
|
-
const url = task.url.startsWith('http') ? task.url : `https://${task.url}`;
|
|
42
|
-
const req = (0, request_1.get)(url, {
|
|
43
|
-
headers: {
|
|
44
|
-
'Content-Type': 'application/octet-stream'
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
let total = 0;
|
|
48
|
-
let length = 0;
|
|
49
|
-
const sub = new rxjs_1.Subject();
|
|
50
|
-
sub.pipe((0, operators_1.throttleTime)(1000), (0, operators_1.switchMap)((size) => {
|
|
51
|
-
return db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, { totalSize: total, size });
|
|
52
|
-
})).subscribe({
|
|
53
|
-
next: () => { },
|
|
54
|
-
complete: () => {
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
// get split size
|
|
58
|
-
req.on('data', (buf) => {
|
|
59
|
-
length += buf.length;
|
|
60
|
-
sub.next(length);
|
|
61
|
-
writeStream.write(buf, (err) => {
|
|
62
|
-
if (err)
|
|
63
|
-
fail();
|
|
64
|
-
});
|
|
65
|
-
});
|
|
66
|
-
req.on('end', async () => {
|
|
67
|
-
writeStream.end();
|
|
68
|
-
sub.complete();
|
|
69
|
-
const fileMd5 = await (0, md5_file_1.default)(filePath);
|
|
70
|
-
console.log(`file download success ${task.filename}: ${fileMd5}`);
|
|
71
|
-
await db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, { totalSize: total, fileMd5: fileMd5, status: 1, size: total });
|
|
72
|
-
const fk = injector.get(fk_service_1.FkService);
|
|
73
|
-
const shouldSize = await fk.getSize(task.url);
|
|
74
|
-
const localSize = await fk.getLocalSize(filePath);
|
|
75
|
-
if (shouldSize != localSize) {
|
|
76
|
-
// re download
|
|
77
|
-
await fail();
|
|
78
|
-
return next && next();
|
|
79
|
-
}
|
|
80
|
-
const uploadTask = await this.createUploadTask(task, total, fileMd5, injector);
|
|
81
|
-
await manager.send(uploadTask);
|
|
82
|
-
await complete();
|
|
83
|
-
});
|
|
84
|
-
req.on('error', async () => {
|
|
85
|
-
await fail();
|
|
86
|
-
});
|
|
87
|
-
req.on('response', async (resp) => {
|
|
88
|
-
const headers = resp.headers;
|
|
89
|
-
total = Number(headers["content-length"]);
|
|
90
|
-
console.log(`${task.filename} total is ${total}b`);
|
|
91
|
-
if (total > 1024 * 1024 * 1024) {
|
|
92
|
-
await db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, { isBigFile: true });
|
|
93
|
-
req.destroy();
|
|
94
|
-
await complete();
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
if (next)
|
|
98
|
-
await next();
|
|
99
|
-
}
|
|
100
|
-
async createUploadTask(download, total, md5, injector) {
|
|
101
|
-
const fk = injector.get(fk_service_1.FkService);
|
|
102
|
-
const info = await fk.getUploadInfo(download.loginId, download.filename, md5, total);
|
|
103
|
-
if (info) {
|
|
104
|
-
const totalChunks = Math.ceil(total / info.splitSize) - 1;
|
|
105
|
-
const uploadTask = new rabbitmq_1.TaskEntity();
|
|
106
|
-
uploadTask.topic = actions_1.UPLOAD_ACTION;
|
|
107
|
-
const data = {
|
|
108
|
-
filename: download.filename,
|
|
109
|
-
path: download.path,
|
|
110
|
-
total: total,
|
|
111
|
-
splitSize: info.splitSize,
|
|
112
|
-
totalChunks,
|
|
113
|
-
uploadUrl: info.uploadUrl,
|
|
114
|
-
cookies: info.cookies,
|
|
115
|
-
topicId: download.topicId,
|
|
116
|
-
token: info.token,
|
|
117
|
-
aid: info.aid,
|
|
118
|
-
folderId: info.uploadGroupId,
|
|
119
|
-
fileMd5: md5,
|
|
120
|
-
start: info.uploadedSize,
|
|
121
|
-
loginId: download.loginId,
|
|
122
|
-
index: Math.ceil(info.uploadedSize / info.splitSize)
|
|
123
|
-
};
|
|
124
|
-
uploadTask.data = data;
|
|
125
|
-
return uploadTask;
|
|
126
|
-
}
|
|
127
|
-
throw new Error(`get upload info fail`);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
exports.DownloadTask = DownloadTask;
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EffectTask = void 0;
|
|
4
|
-
const rabbitmq_1 = require("@nger/rabbitmq");
|
|
5
|
-
const core_1 = require("@nger/core");
|
|
6
|
-
const actions_1 = require("./actions");
|
|
7
|
-
const typeorm_1 = require("@nger/typeorm");
|
|
8
|
-
const w7_1 = require("@nger/w7");
|
|
9
|
-
const entities_1 = require("../../entities");
|
|
10
|
-
const fs_extra_1 = require("fs-extra");
|
|
11
|
-
const path_1 = require("path");
|
|
12
|
-
class EffectTask extends rabbitmq_1.Task {
|
|
13
|
-
constructor() {
|
|
14
|
-
super(actions_1.EFFECT_ACTION);
|
|
15
|
-
}
|
|
16
|
-
async handle(injector, next) {
|
|
17
|
-
const db = injector.get(typeorm_1.Db);
|
|
18
|
-
const task = injector.get(rabbitmq_1.DATA);
|
|
19
|
-
const complete = injector.get(rabbitmq_1.COMPLETE);
|
|
20
|
-
const manager = injector.get(rabbitmq_1.TaskManager);
|
|
21
|
-
const root = injector.get(core_1.APP_ROOT);
|
|
22
|
-
console.log(`effect`, task.filename);
|
|
23
|
-
try {
|
|
24
|
-
const item = await db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename: task.filename } });
|
|
25
|
-
if (task.uploadUrl.startsWith('https://site')) {
|
|
26
|
-
// redownload
|
|
27
|
-
if (item) {
|
|
28
|
-
const download = {
|
|
29
|
-
filename: item.filename,
|
|
30
|
-
path: item.path,
|
|
31
|
-
url: item.url,
|
|
32
|
-
topicId: item.topicId,
|
|
33
|
-
loginId: item.loginId
|
|
34
|
-
};
|
|
35
|
-
const downloadTask = new rabbitmq_1.TaskEntity();
|
|
36
|
-
downloadTask.topic = actions_1.DOWNLOAD_ACTION;
|
|
37
|
-
downloadTask.data = download;
|
|
38
|
-
await manager.send(downloadTask);
|
|
39
|
-
}
|
|
40
|
-
await complete();
|
|
41
|
-
return next && next();
|
|
42
|
-
}
|
|
43
|
-
const w7 = injector.get(w7_1.W7DataSource);
|
|
44
|
-
let uploadUrl = task.uploadUrl;
|
|
45
|
-
if (!(uploadUrl && uploadUrl.length > 0)) {
|
|
46
|
-
await complete();
|
|
47
|
-
return next && next();
|
|
48
|
-
}
|
|
49
|
-
if (uploadUrl.includes('s21i.faiusr.com')) {
|
|
50
|
-
uploadUrl = uploadUrl.replace('s21i.faiusr.com', 's21v.faiusr.com');
|
|
51
|
-
}
|
|
52
|
-
if (uploadUrl.includes('s21d.faiusrd.com')) {
|
|
53
|
-
uploadUrl = uploadUrl.replace('s21d.faiusrd.com', 's21v.faiusr.com');
|
|
54
|
-
}
|
|
55
|
-
await db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, { status: 3, uploadUrl });
|
|
56
|
-
if (task.topicId) {
|
|
57
|
-
try {
|
|
58
|
-
const filePath = (0, path_1.join)(root, task.path);
|
|
59
|
-
await (0, fs_extra_1.unlink)(filePath);
|
|
60
|
-
}
|
|
61
|
-
catch (e) { }
|
|
62
|
-
await w7.manager.update(w7_1.W7ChatTopicEntity, task.topicId, { topicStyle: 7, thirdUrl: item.url, foreverUrl: uploadUrl });
|
|
63
|
-
await complete();
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
await complete();
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
catch (e) {
|
|
70
|
-
console.log(`effect error`, e.message);
|
|
71
|
-
}
|
|
72
|
-
if (next)
|
|
73
|
-
await next();
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
exports.EffectTask = EffectTask;
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Db } from "@nger/typeorm";
|
|
2
|
-
import { FkLoginCookieEntity, FkLoginEntity } from "../../entities";
|
|
3
|
-
import { IUploadTask } from "./actions";
|
|
4
|
-
export declare class FkService {
|
|
5
|
-
private db;
|
|
6
|
-
constructor(db: Db);
|
|
7
|
-
getLocalSize(path: string): number;
|
|
8
|
-
getFkLogin(loginId: number): Promise<FkLoginEntity>;
|
|
9
|
-
getFkLoginCookie(loginId: number): Promise<FkLoginCookieEntity[]>;
|
|
10
|
-
createCookieStr(cookies: FkLoginCookieEntity[]): string;
|
|
11
|
-
getCookieStr(loginId: number): Promise<string>;
|
|
12
|
-
getToken(cookie: string): Promise<string>;
|
|
13
|
-
getAccessToken(token: string): Promise<any>;
|
|
14
|
-
private encodeURIComponent;
|
|
15
|
-
getUploadUrl(token: any, forceDirect?: boolean): string;
|
|
16
|
-
getUploadInfo(loginId: number, filename: string, fileMd5: string, totalSize: number): Promise<any>;
|
|
17
|
-
startUploadFile(task: IUploadTask): Promise<IUploadTask>;
|
|
18
|
-
getSize(url: string): Promise<number>;
|
|
19
|
-
uploadFile(task: IUploadTask): Promise<IUploadTask>;
|
|
20
|
-
getBssInfo(): {
|
|
21
|
-
fromSite: boolean;
|
|
22
|
-
siteId: number;
|
|
23
|
-
groupId: number;
|
|
24
|
-
fileSizeLimit: number;
|
|
25
|
-
};
|
|
26
|
-
getUploadInfourl(accessToken: any): string;
|
|
27
|
-
private decode;
|
|
28
|
-
}
|
|
@@ -1,254 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.FkService = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const typeorm_1 = require("@nger/typeorm");
|
|
6
|
-
const entities_1 = require("../../entities");
|
|
7
|
-
const axios_1 = tslib_1.__importDefault(require("axios"));
|
|
8
|
-
const core_1 = require("@nger/core");
|
|
9
|
-
const fs_extra_1 = require("fs-extra");
|
|
10
|
-
const form_data_1 = tslib_1.__importDefault(require("form-data"));
|
|
11
|
-
const request_1 = require("request");
|
|
12
|
-
let FkService = class FkService {
|
|
13
|
-
db;
|
|
14
|
-
constructor(db) {
|
|
15
|
-
this.db = db;
|
|
16
|
-
}
|
|
17
|
-
getLocalSize(path) {
|
|
18
|
-
try {
|
|
19
|
-
const stat = (0, fs_extra_1.statSync)(path);
|
|
20
|
-
return stat.size;
|
|
21
|
-
}
|
|
22
|
-
catch (e) {
|
|
23
|
-
return 0;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async getFkLogin(loginId) {
|
|
27
|
-
return await this.db.manager.findOneOrFail(entities_1.FkLoginEntity, { where: { fkLoginId: loginId } });
|
|
28
|
-
}
|
|
29
|
-
async getFkLoginCookie(loginId) {
|
|
30
|
-
return await this.db.manager.find(entities_1.FkLoginCookieEntity, { where: { fkLoginId: loginId } });
|
|
31
|
-
}
|
|
32
|
-
createCookieStr(cookies) {
|
|
33
|
-
return cookies.map(cookie => `${cookie.key}=${cookie.value}`).join(';');
|
|
34
|
-
}
|
|
35
|
-
async getCookieStr(loginId) {
|
|
36
|
-
const cookies = await this.getFkLoginCookie(loginId);
|
|
37
|
-
const cookie = this.createCookieStr(cookies);
|
|
38
|
-
return cookie;
|
|
39
|
-
}
|
|
40
|
-
async getToken(cookie) {
|
|
41
|
-
const url = `https://i.vip.webportal.top/`;
|
|
42
|
-
const iVipWebPortal = await axios_1.default.get(url, {
|
|
43
|
-
headers: {
|
|
44
|
-
Cookie: cookie
|
|
45
|
-
}
|
|
46
|
-
}).then(res => res.data);
|
|
47
|
-
const items = iVipWebPortal.match(/<meta id='_TOKEN' value='(.*?)'\/>/);
|
|
48
|
-
let token = ``;
|
|
49
|
-
if (items && items.length === 2) {
|
|
50
|
-
token = items[1];
|
|
51
|
-
}
|
|
52
|
-
return token;
|
|
53
|
-
}
|
|
54
|
-
async getAccessToken(token) {
|
|
55
|
-
const url = `https://smr00.vip.webportal.top/cn/api/manage/advanceUpload/genAccessKey?_v=${new Date().getTime()}&_TOKEN=${token}`;
|
|
56
|
-
const accessKey = await axios_1.default.get(url).then(res => res.data);
|
|
57
|
-
if (accessKey.success) {
|
|
58
|
-
const accessTokenString = this.decode(accessKey.accessKey);
|
|
59
|
-
if (accessTokenString) {
|
|
60
|
-
const accessToken = JSON.parse(accessTokenString);
|
|
61
|
-
return accessToken;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
encodeURIComponent(data) {
|
|
66
|
-
if ((0, core_1.isPrimitive)(data)) {
|
|
67
|
-
return encodeURIComponent(data);
|
|
68
|
-
}
|
|
69
|
-
return Object.keys(data).map(key => {
|
|
70
|
-
const value = Reflect.get(data, key);
|
|
71
|
-
return `${key}=${encodeURIComponent(value)}`;
|
|
72
|
-
}).join('&');
|
|
73
|
-
}
|
|
74
|
-
getUploadUrl(token, forceDirect = true) {
|
|
75
|
-
if (forceDirect) {
|
|
76
|
-
return `https://${token.url}/${token.visitType}/${token.app}/upload?cmd=${token.cmd}&token=${token.token}`;
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
return `https://${token.url}/${token.visitType}/${token.app}/advance?cmd=${token.cmd}&token=${token.token}`;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
async getUploadInfo(loginId, filename, fileMd5, totalSize) {
|
|
83
|
-
// TODO: from redis cache
|
|
84
|
-
const login = await this.getFkLogin(loginId);
|
|
85
|
-
const cookies = await this.getCookieStr(loginId);
|
|
86
|
-
const bssInfo = this.getBssInfo();
|
|
87
|
-
const token = await this.getToken(cookies);
|
|
88
|
-
const accessToken = await this.getAccessToken(token);
|
|
89
|
-
const uploadInfoUrl = this.getUploadInfourl(accessToken);
|
|
90
|
-
const uploadUrl = this.getUploadUrl(accessToken, false);
|
|
91
|
-
const info = await axios_1.default.post(uploadInfoUrl, this.encodeURIComponent({
|
|
92
|
-
fileMd5: fileMd5,
|
|
93
|
-
fileSize: totalSize,
|
|
94
|
-
isFreeVer: false,
|
|
95
|
-
aid: login.aid,
|
|
96
|
-
folderId: login.uploadGroupId,
|
|
97
|
-
bssInfo: JSON.stringify(bssInfo),
|
|
98
|
-
fileName: filename
|
|
99
|
-
}), { headers: { cookie: cookies } }).then(res => res.data);
|
|
100
|
-
if (info.code === 200) {
|
|
101
|
-
return { ...info.data, uploadUrl, cookies, token, aid: login.aid, uploadGroupId: login.uploadGroupId };
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
async startUploadFile(task) {
|
|
105
|
-
const info = await this.getUploadInfo(task.loginId, task.filename, task.fileMd5, task.total);
|
|
106
|
-
task.cookies = info.cookies;
|
|
107
|
-
task.splitSize = info.splitSize;
|
|
108
|
-
task.start = info.uploadedSize;
|
|
109
|
-
task.uploadUrl = info.uploadUrl;
|
|
110
|
-
task.index = Math.ceil(info.uploadedSize / info.splitSize);
|
|
111
|
-
return await this.uploadFile(task);
|
|
112
|
-
}
|
|
113
|
-
async getSize(url) {
|
|
114
|
-
const size = (0, core_1.defer)();
|
|
115
|
-
const req = (0, request_1.get)(url, {
|
|
116
|
-
headers: {
|
|
117
|
-
'Content-Type': 'application/octet-stream'
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
req.on('response', async (resp) => {
|
|
121
|
-
const headers = resp.headers;
|
|
122
|
-
size.resolve(Number(headers["content-length"]));
|
|
123
|
-
req.destroy();
|
|
124
|
-
});
|
|
125
|
-
return size;
|
|
126
|
-
}
|
|
127
|
-
async uploadFile(task) {
|
|
128
|
-
const upload = async () => {
|
|
129
|
-
const info = await this.getUploadInfo(task.loginId, task.filename, task.fileMd5, task.total);
|
|
130
|
-
task.cookies = info.cookies;
|
|
131
|
-
task.splitSize = info.splitSize;
|
|
132
|
-
task.start = info.uploadedSize;
|
|
133
|
-
task.uploadUrl = info.uploadUrl;
|
|
134
|
-
task.index = Math.ceil(info.uploadedSize / info.splitSize);
|
|
135
|
-
let complete = false;
|
|
136
|
-
const max = task.total - 1;
|
|
137
|
-
let index = task.index || 0;
|
|
138
|
-
let uploadResult;
|
|
139
|
-
do {
|
|
140
|
-
let start = index * task.splitSize;
|
|
141
|
-
let _end = start + task.splitSize - 1;
|
|
142
|
-
let end = _end > max ? max : _end;
|
|
143
|
-
if (end >= max) {
|
|
144
|
-
complete = true;
|
|
145
|
-
}
|
|
146
|
-
const fileStream = (0, fs_extra_1.createReadStream)(task.path, { start: start, end: end });
|
|
147
|
-
const formdata = new form_data_1.default();
|
|
148
|
-
formdata.append('ctrl', fileStream);
|
|
149
|
-
formdata.append('isFreeVer', this.encodeURIComponent(false));
|
|
150
|
-
formdata.append('aid', this.encodeURIComponent(task.aid));
|
|
151
|
-
formdata.append('folderId', this.encodeURIComponent(task.folderId));
|
|
152
|
-
formdata.append('fileName', task.filename);
|
|
153
|
-
formdata.append(`totalSize`, this.encodeURIComponent(task.total));
|
|
154
|
-
formdata.append(`fileMd5`, task.fileMd5);
|
|
155
|
-
formdata.append('index', this.encodeURIComponent(index));
|
|
156
|
-
formdata.append('chunkSize', this.encodeURIComponent(task.splitSize));
|
|
157
|
-
formdata.append('totalChunks', this.encodeURIComponent(task.totalChunks));
|
|
158
|
-
formdata.append(`complete`, this.encodeURIComponent(complete));
|
|
159
|
-
const bssInfo = {
|
|
160
|
-
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
|
161
|
-
};
|
|
162
|
-
formdata.append('bssInfo', JSON.stringify(bssInfo));
|
|
163
|
-
const headers = formdata.getHeaders();
|
|
164
|
-
uploadResult = await axios_1.default.post(task.uploadUrl, formdata, {
|
|
165
|
-
headers: {
|
|
166
|
-
...headers,
|
|
167
|
-
Cookie: task.cookies
|
|
168
|
-
},
|
|
169
|
-
timeout: 18000
|
|
170
|
-
}).then(res => {
|
|
171
|
-
return res.data;
|
|
172
|
-
}).catch((e) => {
|
|
173
|
-
console.log(`upload error`, e.message);
|
|
174
|
-
return upload();
|
|
175
|
-
});
|
|
176
|
-
if (uploadResult.code !== 200) {
|
|
177
|
-
if (uploadResult.data) {
|
|
178
|
-
const data = uploadResult.data;
|
|
179
|
-
if (data.limit) {
|
|
180
|
-
// to big
|
|
181
|
-
throw new Error(`to big`);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
throw new Error(`${task.filename}--${uploadResult.msg}`);
|
|
185
|
-
}
|
|
186
|
-
console.log(`upload ----- `, { index, max, start, end });
|
|
187
|
-
if (uploadResult) {
|
|
188
|
-
const data = uploadResult.data;
|
|
189
|
-
const downUrl = data.fullDownUrl;
|
|
190
|
-
if (downUrl) {
|
|
191
|
-
if (downUrl.startsWith('https://site-upload')) {
|
|
192
|
-
console.log(`upload fail`);
|
|
193
|
-
throw new Error(`need re bind`);
|
|
194
|
-
}
|
|
195
|
-
const fullUrl = downUrl.startsWith('http') ? downUrl : `https:` + downUrl;
|
|
196
|
-
task.uploadUrl = fullUrl;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
index = index + 1;
|
|
200
|
-
} while (!complete);
|
|
201
|
-
return uploadResult;
|
|
202
|
-
};
|
|
203
|
-
const result = await upload();
|
|
204
|
-
console.log(`upload result: -----> `, result);
|
|
205
|
-
// upload complete
|
|
206
|
-
axios_1.default.post(`https://smr00.vip.webportal.top/ajax/advanceUpload.jsp?cmd=_report&_TOKEN=${task.token}`, this.encodeURIComponent({
|
|
207
|
-
type: 1,
|
|
208
|
-
size: task.total,
|
|
209
|
-
time: NaN,
|
|
210
|
-
flag: true,
|
|
211
|
-
name: task.filename
|
|
212
|
-
}), {
|
|
213
|
-
headers: {
|
|
214
|
-
[`Content-Type`]: `application/x-www-form-urlencoded; charset=UTF-8`,
|
|
215
|
-
Cookie: task.cookies
|
|
216
|
-
}
|
|
217
|
-
});
|
|
218
|
-
return task;
|
|
219
|
-
}
|
|
220
|
-
getBssInfo() {
|
|
221
|
-
return {
|
|
222
|
-
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
getUploadInfourl(accessToken) {
|
|
226
|
-
return `https://${accessToken.url}/${accessToken.visitType}/${accessToken.app}/advance/info?cmd=${accessToken.cmd}&token=${accessToken.token}`;
|
|
227
|
-
}
|
|
228
|
-
decode(base64Str) {
|
|
229
|
-
if (!base64Str)
|
|
230
|
-
return;
|
|
231
|
-
const t = base64Str.replace(/_/g, "/").replace(/-/g, "+");
|
|
232
|
-
const f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
233
|
-
let l = 0;
|
|
234
|
-
let p = 0;
|
|
235
|
-
let h = [];
|
|
236
|
-
do {
|
|
237
|
-
const o = f.indexOf(t.charAt(l++));
|
|
238
|
-
const u = f.indexOf(t.charAt(l++));
|
|
239
|
-
const a = f.indexOf(t.charAt(l++));
|
|
240
|
-
const c = f.indexOf(t.charAt(l++));
|
|
241
|
-
const s = o << 18 | u << 12 | a << 6 | c;
|
|
242
|
-
const e = s >> 16 & 255;
|
|
243
|
-
const r = s >> 8 & 255;
|
|
244
|
-
const n = 255 & s;
|
|
245
|
-
h[p++] = 64 === a ? String.fromCharCode(e) : 64 === c ? String.fromCharCode(e, r) : String.fromCharCode(e, r, n);
|
|
246
|
-
} while (l < t.length);
|
|
247
|
-
return h.join('');
|
|
248
|
-
}
|
|
249
|
-
};
|
|
250
|
-
FkService = tslib_1.__decorate([
|
|
251
|
-
(0, core_1.Injectable)(),
|
|
252
|
-
tslib_1.__metadata("design:paramtypes", [typeorm_1.Db])
|
|
253
|
-
], FkService);
|
|
254
|
-
exports.FkService = FkService;
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ScheduleTask = void 0;
|
|
4
|
-
const rabbitmq_1 = require("@nger/rabbitmq");
|
|
5
|
-
const actions_1 = require("./actions");
|
|
6
|
-
const schedule_1 = require("@nger/schedule");
|
|
7
|
-
const typeorm_1 = require("@nger/typeorm");
|
|
8
|
-
const entities_1 = require("../../entities");
|
|
9
|
-
const w7_1 = require("@nger/w7");
|
|
10
|
-
const typeorm_2 = require("typeorm");
|
|
11
|
-
const task_service_1 = require("./task.service");
|
|
12
|
-
/**
|
|
13
|
-
* finish
|
|
14
|
-
*/
|
|
15
|
-
class ScheduleTask extends rabbitmq_1.Task {
|
|
16
|
-
constructor() {
|
|
17
|
-
super(actions_1.SCHEDULE_ACTION);
|
|
18
|
-
}
|
|
19
|
-
async handle(injector, next) {
|
|
20
|
-
const task = injector.get(rabbitmq_1.DATA);
|
|
21
|
-
const schedule = injector.get(schedule_1.ScheduleService);
|
|
22
|
-
const db = injector.get(typeorm_1.Db);
|
|
23
|
-
const w7 = injector.get(w7_1.W7DataSource);
|
|
24
|
-
const manager = injector.get(rabbitmq_1.TaskManager);
|
|
25
|
-
const taskService = injector.get(task_service_1.TaskService);
|
|
26
|
-
const run = async () => {
|
|
27
|
-
const accounts = await db.manager.find(entities_1.FkLoginEntity, {});
|
|
28
|
-
const w7Usernames = accounts.map(account => account.w7Username);
|
|
29
|
-
const users = await w7.manager.find(w7_1.W7UsersEntity, { where: { username: (0, typeorm_2.In)(w7Usernames) } });
|
|
30
|
-
const uids = users.map(user => user.uid);
|
|
31
|
-
const uniAccounts = await w7.manager.find(w7_1.W7UniAccountEntity, { where: { createUid: (0, typeorm_2.In)(uids) } });
|
|
32
|
-
const uniacids = uniAccounts.map(a => a.uniacid);
|
|
33
|
-
const tasks = await db.manager.find(entities_1.FkDownloadTaskEntity, { select: ['topicId'] });
|
|
34
|
-
const ids = tasks.map(task => task.topicId);
|
|
35
|
-
const now = new Date().getTime() - 1000 * 60 * 60 * 24;
|
|
36
|
-
const nowTime = Math.floor(now / 1000);
|
|
37
|
-
const where = {
|
|
38
|
-
uniacid: (0, typeorm_2.In)(uniacids),
|
|
39
|
-
createTime: (0, typeorm_2.MoreThan)(nowTime)
|
|
40
|
-
};
|
|
41
|
-
if (ids && ids.length > 0) {
|
|
42
|
-
where.id = (0, typeorm_2.Not)((0, typeorm_2.In)(ids));
|
|
43
|
-
}
|
|
44
|
-
const topics = await w7.manager.find(w7_1.W7ChatTopicEntity, { where });
|
|
45
|
-
console.log(`topics`, topics.length);
|
|
46
|
-
topics.filter(it => it.thirdUrl && it.thirdUrl.length > 0 && it.thirdUrl.endsWith('.mp4')).map(async (topic) => {
|
|
47
|
-
if (topic.thirdUrl) {
|
|
48
|
-
const uniacid = topic.uniacid;
|
|
49
|
-
const account = uniAccounts.find(a => a.uniacid === uniacid);
|
|
50
|
-
const user = users.find(u => u.uid === account.createUid);
|
|
51
|
-
const login = accounts.find(a => a.w7Username === user.username);
|
|
52
|
-
const task = await taskService.createDownLoadTask(topic.thirdUrl, login.fkLoginId, topic.id);
|
|
53
|
-
const download = task.data;
|
|
54
|
-
// cha
|
|
55
|
-
const item = await db.manager.findOne(entities_1.FkDownloadTaskEntity, { where: { filename: download.filename } });
|
|
56
|
-
if (!item) {
|
|
57
|
-
const fkdownloadTask = new entities_1.FkDownloadTaskEntity();
|
|
58
|
-
fkdownloadTask.filename = download.filename;
|
|
59
|
-
fkdownloadTask.loginId = download.loginId;
|
|
60
|
-
fkdownloadTask.path = download.path;
|
|
61
|
-
fkdownloadTask.url = download.url;
|
|
62
|
-
fkdownloadTask.topicId = download.topicId;
|
|
63
|
-
fkdownloadTask.topicName = topic.topicName;
|
|
64
|
-
await db.manager.save(entities_1.FkDownloadTaskEntity, fkdownloadTask);
|
|
65
|
-
await manager.send(task);
|
|
66
|
-
}
|
|
67
|
-
else {
|
|
68
|
-
if (item.status === 0) {
|
|
69
|
-
}
|
|
70
|
-
else if (item.status === 1) {
|
|
71
|
-
}
|
|
72
|
-
else if (item.status === 2) {
|
|
73
|
-
}
|
|
74
|
-
else if (item.status === 3) {
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
// check status = 1
|
|
80
|
-
const waitUploadTask = await db.manager.find(entities_1.FkDownloadTaskEntity, { where: { status: 1 } });
|
|
81
|
-
// waitUploadTask.map(task => {
|
|
82
|
-
// taskService.createUploadTask()
|
|
83
|
-
// })
|
|
84
|
-
};
|
|
85
|
-
await run();
|
|
86
|
-
schedule.scheduleJob(task.name, task.rule, async (time) => {
|
|
87
|
-
console.log(`schedule run at ${time}`);
|
|
88
|
-
await run();
|
|
89
|
-
});
|
|
90
|
-
if (next)
|
|
91
|
-
await next();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
exports.ScheduleTask = ScheduleTask;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Injector } from "@nger/core";
|
|
2
|
-
import { IDownloadTask, IUploadTask } from "./actions";
|
|
3
|
-
import { TaskEntity } from "@nger/rabbitmq";
|
|
4
|
-
export declare class TaskService {
|
|
5
|
-
private injector;
|
|
6
|
-
constructor(injector: Injector);
|
|
7
|
-
createEffectTask(filename: string, uploadUrl: string, topicId: number, path: string): Promise<TaskEntity<any>>;
|
|
8
|
-
createScheduleTask(name: string, rule: string, id?: number): Promise<TaskEntity<any>>;
|
|
9
|
-
createUploadTask(download: IDownloadTask, total: number, md5: string, injector: Injector): Promise<TaskEntity<IUploadTask>>;
|
|
10
|
-
createDownLoadTask(url: string, loginId: number, topicId: number): Promise<TaskEntity<IDownloadTask>>;
|
|
11
|
-
}
|