@nger/fk-upload 1.0.32 → 1.0.35
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/entities/fk-download-task.entity.js +9 -3
- package/dist/fk-upload.module.js +8 -4
- package/dist/main.js +2 -1
- package/dist/mq-runner.js +5 -7
- package/dist/templates/add-task.d.ts +4 -2
- package/dist/templates/add-task.js +8 -4
- package/dist/templates/create-download-task.d.ts +0 -0
- package/dist/templates/create-download-task.js +1 -0
- package/dist/templates/player.d.ts +3 -0
- package/dist/templates/player.js +34 -0
- package/dist/templates/receive-shedule-task.d.ts +14 -0
- package/dist/templates/receive-shedule-task.js +64 -0
- package/dist/templates/setting.d.ts +5 -3
- package/dist/templates/setting.js +10 -11
- package/dist/templates/task-manage.d.ts +2 -5
- package/dist/templates/task-manage.js +10 -23
- package/dist/templates/task-types.d.ts +34 -0
- package/dist/templates/task-types.js +2 -0
- package/dist/templates/task.service.d.ts +0 -68
- package/dist/templates/task.service.js +406 -482
- package/dist/templates/tasks/actions.d.ts +38 -0
- package/dist/templates/tasks/actions.js +7 -0
- package/dist/templates/tasks/create-download-task.d.ts +12 -0
- package/dist/templates/tasks/create-download-task.js +65 -0
- package/dist/templates/tasks/download-task.d.ts +10 -0
- package/dist/templates/tasks/download-task.js +98 -0
- package/dist/templates/tasks/effect-task.d.ts +6 -0
- package/dist/templates/tasks/effect-task.js +30 -0
- package/dist/templates/tasks/fk.service.d.ts +26 -0
- package/dist/templates/tasks/fk.service.js +228 -0
- package/dist/templates/tasks/index.d.ts +0 -0
- package/dist/templates/tasks/index.js +1 -0
- package/dist/templates/tasks/providers.d.ts +2 -0
- package/dist/templates/tasks/providers.js +25 -0
- package/dist/templates/tasks/receive-shedule-task.d.ts +16 -0
- package/dist/templates/tasks/receive-shedule-task.js +66 -0
- package/dist/templates/tasks/schedule-task.d.ts +9 -0
- package/dist/templates/tasks/schedule-task.js +63 -0
- package/dist/templates/tasks/task.service.d.ts +10 -0
- package/dist/templates/tasks/task.service.js +77 -0
- package/dist/templates/tasks/upload-task.d.ts +6 -0
- package/dist/templates/tasks/upload-task.js +32 -0
- package/dist/templates/upload.service.d.ts +0 -12
- package/dist/templates/upload.service.js +0 -49
- package/package.json +1 -1
@@ -0,0 +1,38 @@
|
|
1
|
+
import { StringToken } from "@nger/core";
|
2
|
+
export interface IDownloadTask {
|
3
|
+
filename: string;
|
4
|
+
path: string;
|
5
|
+
url: string;
|
6
|
+
topicId: number;
|
7
|
+
loginId: number;
|
8
|
+
}
|
9
|
+
export declare const DOWNLOAD_ACTION: StringToken<IDownloadTask>;
|
10
|
+
export interface IScheduleTask {
|
11
|
+
name: string;
|
12
|
+
rule: string;
|
13
|
+
}
|
14
|
+
export declare const SCHEDULE_ACTION: StringToken<IScheduleTask>;
|
15
|
+
export interface IUploadTask {
|
16
|
+
filename: string;
|
17
|
+
path: string;
|
18
|
+
uploadUrl: string;
|
19
|
+
total: number;
|
20
|
+
cookies: string;
|
21
|
+
aid: number;
|
22
|
+
folderId: number;
|
23
|
+
fileMd5: string;
|
24
|
+
splitSize: number;
|
25
|
+
totalChunks: number;
|
26
|
+
topicId: number;
|
27
|
+
token: string;
|
28
|
+
start: number;
|
29
|
+
loginId: number;
|
30
|
+
index: number;
|
31
|
+
}
|
32
|
+
export declare const UPLOAD_ACTION: StringToken<IUploadTask>;
|
33
|
+
export interface IEffectTask {
|
34
|
+
filename: string;
|
35
|
+
uploadUrl: string;
|
36
|
+
topicId: number;
|
37
|
+
}
|
38
|
+
export declare const EFFECT_ACTION: StringToken<IEffectTask>;
|
@@ -0,0 +1,7 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.EFFECT_ACTION = exports.UPLOAD_ACTION = exports.SCHEDULE_ACTION = exports.DOWNLOAD_ACTION = void 0;
|
4
|
+
exports.DOWNLOAD_ACTION = `@nger/fk-upload/download-task`;
|
5
|
+
exports.SCHEDULE_ACTION = `@nger/fk-upload/schedule-task`;
|
6
|
+
exports.UPLOAD_ACTION = `@nger/fk-upload/upload-task`;
|
7
|
+
exports.EFFECT_ACTION = `@nger/fk-upload/effect-task`;
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { Injector } from '@nger/core';
|
2
|
+
import { Db } from '@nger/typeorm';
|
3
|
+
import { DownloadTask } from '../task-types';
|
4
|
+
import { RabbitMqService } from '@nger/rabbitmq';
|
5
|
+
export declare class CreateDownloadTask {
|
6
|
+
private injector;
|
7
|
+
private db;
|
8
|
+
private rabbit;
|
9
|
+
constructor(injector: Injector, db: Db, rabbit: RabbitMqService);
|
10
|
+
createDownLoadTask(url: string, fkLoginId: number, topicId: number): Promise<void>;
|
11
|
+
addDownloadTask(task: DownloadTask): Promise<void>;
|
12
|
+
}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.CreateDownloadTask = void 0;
|
16
|
+
const core_1 = require("@nger/core");
|
17
|
+
const cids_1 = __importDefault(require("cids"));
|
18
|
+
const fs_extra_1 = require("fs-extra");
|
19
|
+
const multihashing_async_1 = __importDefault(require("multihashing-async"));
|
20
|
+
const path_1 = require("path");
|
21
|
+
const entities_1 = require("../../entities");
|
22
|
+
const typeorm_1 = require("@nger/typeorm");
|
23
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
24
|
+
let CreateDownloadTask = class CreateDownloadTask {
|
25
|
+
injector;
|
26
|
+
db;
|
27
|
+
rabbit;
|
28
|
+
constructor(injector, db, rabbit) {
|
29
|
+
this.injector = injector;
|
30
|
+
this.db = db;
|
31
|
+
this.rabbit = rabbit;
|
32
|
+
}
|
33
|
+
async createDownLoadTask(url, fkLoginId, topicId) {
|
34
|
+
const hash = await (0, multihashing_async_1.default)(Buffer.from(url), 'sha1', 16);
|
35
|
+
const cid = new cids_1.default(1, 'raw', hash, 'base64');
|
36
|
+
let filename = encodeURIComponent(cid.toString('base64'));
|
37
|
+
const _url = new URL(url);
|
38
|
+
const filePath = _url.pathname;
|
39
|
+
let ext = (0, path_1.extname)(filePath);
|
40
|
+
filename += ext === '.' ? '.mp4' : ext;
|
41
|
+
const task = new entities_1.FkDownloadTaskEntity();
|
42
|
+
const root = this.injector.get(core_1.APP_ROOT);
|
43
|
+
(0, fs_extra_1.ensureDirSync)((0, path_1.join)(root, 'attachments/fk-upload'));
|
44
|
+
const path = (0, path_1.join)(root, 'attachments/fk-upload', filename);
|
45
|
+
task.filename = filename;
|
46
|
+
task.url = url;
|
47
|
+
task.loginId = fkLoginId;
|
48
|
+
task.totalSize = 0;
|
49
|
+
task.path = path;
|
50
|
+
task.status = 0;
|
51
|
+
task.size = 0;
|
52
|
+
task.topicId = topicId;
|
53
|
+
await this.db.manager.save(task);
|
54
|
+
return this.addDownloadTask(task);
|
55
|
+
}
|
56
|
+
async addDownloadTask(task) {
|
57
|
+
const content = Buffer.from(JSON.stringify(task));
|
58
|
+
await this.rabbit.send('@nger/fk-upload/download-task', content);
|
59
|
+
}
|
60
|
+
};
|
61
|
+
CreateDownloadTask = __decorate([
|
62
|
+
(0, core_1.Injectable)(),
|
63
|
+
__metadata("design:paramtypes", [core_1.Injector, typeorm_1.Db, rabbitmq_1.RabbitMqService])
|
64
|
+
], CreateDownloadTask);
|
65
|
+
exports.CreateDownloadTask = CreateDownloadTask;
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { Task } from "@nger/rabbitmq";
|
2
|
+
import { Injector, Next } from "@nger/core";
|
3
|
+
/**
|
4
|
+
* upload and task
|
5
|
+
*/
|
6
|
+
export declare class DownloadTask extends Task {
|
7
|
+
constructor();
|
8
|
+
handle(injector: Injector, next?: Next): Promise<void>;
|
9
|
+
private createUploadTask;
|
10
|
+
}
|
@@ -0,0 +1,98 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
|
+
};
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
+
exports.DownloadTask = void 0;
|
7
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
8
|
+
const actions_1 = require("./actions");
|
9
|
+
const request_1 = require("request");
|
10
|
+
const fs_1 = require("fs");
|
11
|
+
const fk_service_1 = require("./fk.service");
|
12
|
+
const md5_file_1 = __importDefault(require("md5-file"));
|
13
|
+
const fs_extra_1 = require("fs-extra");
|
14
|
+
const path_1 = require("path");
|
15
|
+
const typeorm_1 = require("@nger/typeorm");
|
16
|
+
const entities_1 = require("../../entities");
|
17
|
+
/**
|
18
|
+
* upload and task
|
19
|
+
*/
|
20
|
+
class DownloadTask extends rabbitmq_1.Task {
|
21
|
+
constructor() {
|
22
|
+
super(actions_1.DOWNLOAD_ACTION);
|
23
|
+
}
|
24
|
+
async handle(injector, next) {
|
25
|
+
const task = injector.get(rabbitmq_1.DATA);
|
26
|
+
const complete = injector.get(rabbitmq_1.COMPLETE);
|
27
|
+
const fail = injector.get(rabbitmq_1.FAIL);
|
28
|
+
(0, fs_extra_1.ensureDir)((0, path_1.dirname)(task.path));
|
29
|
+
const writeStream = (0, fs_1.createWriteStream)(task.path);
|
30
|
+
const manager = injector.get(rabbitmq_1.TaskManager);
|
31
|
+
const url = task.url.startsWith('http') ? task.url : `https://${task.url}`;
|
32
|
+
const req = (0, request_1.get)(url, {
|
33
|
+
headers: {
|
34
|
+
'Content-Type': 'application/octet-stream'
|
35
|
+
}
|
36
|
+
});
|
37
|
+
let length = 0;
|
38
|
+
let total = 0;
|
39
|
+
let md5 = ``;
|
40
|
+
// get split size
|
41
|
+
req.on('data', (buf) => {
|
42
|
+
length += buf.length;
|
43
|
+
writeStream.write(buf, (err) => {
|
44
|
+
if (err)
|
45
|
+
fail();
|
46
|
+
});
|
47
|
+
});
|
48
|
+
req.on('end', async () => {
|
49
|
+
writeStream.end();
|
50
|
+
const fileMd5 = await (0, md5_file_1.default)(task.path);
|
51
|
+
const isEqual = md5 === fileMd5;
|
52
|
+
console.log(`file download success ${task.filename}, check result is ${isEqual}`);
|
53
|
+
const uploadTask = await this.createUploadTask(task, total, fileMd5, injector);
|
54
|
+
await manager.send(uploadTask);
|
55
|
+
complete();
|
56
|
+
});
|
57
|
+
req.on('response', async (resp) => {
|
58
|
+
const headers = resp.headers;
|
59
|
+
total = Number(headers["content-length"]);
|
60
|
+
md5 = headers.etag;
|
61
|
+
md5 = md5.replaceAll('"', '');
|
62
|
+
});
|
63
|
+
if (next)
|
64
|
+
await next();
|
65
|
+
}
|
66
|
+
async createUploadTask(download, total, md5, injector) {
|
67
|
+
const db = injector.get(typeorm_1.Db);
|
68
|
+
await db.manager.update(entities_1.FkDownloadTaskEntity, download.filename, { status: 1, size: total });
|
69
|
+
const fk = injector.get(fk_service_1.FkService);
|
70
|
+
const info = await fk.getUploadInfo(download.loginId, download.filename, md5, total);
|
71
|
+
if (info) {
|
72
|
+
const totalChunks = Math.ceil(total / info.splitSize) - 1;
|
73
|
+
const uploadTask = new rabbitmq_1.TaskEntity();
|
74
|
+
uploadTask.topic = actions_1.UPLOAD_ACTION;
|
75
|
+
const data = {
|
76
|
+
filename: download.filename,
|
77
|
+
path: download.path,
|
78
|
+
total: total,
|
79
|
+
splitSize: info.splitSize,
|
80
|
+
totalChunks,
|
81
|
+
uploadUrl: info.uploadUrl,
|
82
|
+
cookies: info.cookies,
|
83
|
+
topicId: download.topicId,
|
84
|
+
token: info.token,
|
85
|
+
aid: info.aid,
|
86
|
+
folderId: info.uploadGroupId,
|
87
|
+
fileMd5: md5,
|
88
|
+
start: info.uploadedSize,
|
89
|
+
loginId: download.loginId,
|
90
|
+
index: Math.ceil(info.uploadedSize / info.splitSize)
|
91
|
+
};
|
92
|
+
uploadTask.data = data;
|
93
|
+
return uploadTask;
|
94
|
+
}
|
95
|
+
throw new Error(`get upload info fail`);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
exports.DownloadTask = DownloadTask;
|
@@ -0,0 +1,30 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.EffectTask = void 0;
|
4
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
5
|
+
const actions_1 = require("./actions");
|
6
|
+
const typeorm_1 = require("@nger/typeorm");
|
7
|
+
const w7_1 = require("@nger/w7");
|
8
|
+
const entities_1 = require("../../entities");
|
9
|
+
class EffectTask extends rabbitmq_1.Task {
|
10
|
+
constructor() {
|
11
|
+
super(actions_1.EFFECT_ACTION);
|
12
|
+
}
|
13
|
+
async handle(injector, next) {
|
14
|
+
const task = injector.get(rabbitmq_1.DATA);
|
15
|
+
const complete = injector.get(rabbitmq_1.COMPLETE);
|
16
|
+
const fail = injector.get(rabbitmq_1.FAIL);
|
17
|
+
const w7 = injector.get(w7_1.W7DataSource);
|
18
|
+
const db = injector.get(typeorm_1.Db);
|
19
|
+
if (task.topicId) {
|
20
|
+
await db.manager.update(entities_1.FkDownloadTaskEntity, task.filename, { status: 3, uploadUrl: task.uploadUrl });
|
21
|
+
await w7.manager.update(w7_1.W7ChatTopicEntity, task.topicId, { thirdUrl: task.uploadUrl }).then(() => complete()).catch(() => fail());
|
22
|
+
}
|
23
|
+
else {
|
24
|
+
complete();
|
25
|
+
}
|
26
|
+
if (next)
|
27
|
+
await next();
|
28
|
+
}
|
29
|
+
}
|
30
|
+
exports.EffectTask = EffectTask;
|
@@ -0,0 +1,26 @@
|
|
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
|
+
getFkLogin(loginId: number): Promise<FkLoginEntity>;
|
8
|
+
getFkLoginCookie(loginId: number): Promise<FkLoginCookieEntity[]>;
|
9
|
+
createCookieStr(cookies: FkLoginCookieEntity[]): string;
|
10
|
+
getCookieStr(loginId: number): Promise<string>;
|
11
|
+
getToken(cookie: string): Promise<string>;
|
12
|
+
getAccessToken(token: string): Promise<any>;
|
13
|
+
private encodeURIComponent;
|
14
|
+
getUploadUrl(token: any, forceDirect?: boolean): string;
|
15
|
+
getUploadInfo(loginId: number, filename: string, fileMd5: string, totalSize: number): Promise<any>;
|
16
|
+
startUploadFile(task: IUploadTask): Promise<IUploadTask>;
|
17
|
+
uploadFile(task: IUploadTask): Promise<IUploadTask>;
|
18
|
+
getBssInfo(): {
|
19
|
+
fromSite: boolean;
|
20
|
+
siteId: number;
|
21
|
+
groupId: number;
|
22
|
+
fileSizeLimit: number;
|
23
|
+
};
|
24
|
+
getUploadInfourl(accessToken: any): string;
|
25
|
+
private decode;
|
26
|
+
}
|
@@ -0,0 +1,228 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.FkService = void 0;
|
16
|
+
const typeorm_1 = require("@nger/typeorm");
|
17
|
+
const entities_1 = require("../../entities");
|
18
|
+
const axios_1 = __importDefault(require("axios"));
|
19
|
+
const core_1 = require("@nger/core");
|
20
|
+
const fs_extra_1 = require("fs-extra");
|
21
|
+
const form_data_1 = __importDefault(require("form-data"));
|
22
|
+
let FkService = class FkService {
|
23
|
+
db;
|
24
|
+
constructor(db) {
|
25
|
+
this.db = db;
|
26
|
+
}
|
27
|
+
async getFkLogin(loginId) {
|
28
|
+
return await this.db.manager.findOneOrFail(entities_1.FkLoginEntity, { where: { fkLoginId: loginId } });
|
29
|
+
}
|
30
|
+
async getFkLoginCookie(loginId) {
|
31
|
+
return await this.db.manager.find(entities_1.FkLoginCookieEntity, { where: { fkLoginId: loginId } });
|
32
|
+
}
|
33
|
+
createCookieStr(cookies) {
|
34
|
+
return cookies.map(cookie => `${cookie.key}=${cookie.value}`).join(';');
|
35
|
+
}
|
36
|
+
async getCookieStr(loginId) {
|
37
|
+
const cookies = await this.getFkLoginCookie(loginId);
|
38
|
+
const cookie = this.createCookieStr(cookies);
|
39
|
+
return cookie;
|
40
|
+
}
|
41
|
+
async getToken(cookie) {
|
42
|
+
const url = `https://i.vip.webportal.top/`;
|
43
|
+
const iVipWebPortal = await axios_1.default.get(url, {
|
44
|
+
headers: {
|
45
|
+
Cookie: cookie
|
46
|
+
}
|
47
|
+
}).then(res => res.data);
|
48
|
+
const items = iVipWebPortal.match(/<meta id='_TOKEN' value='(.*?)'\/>/);
|
49
|
+
let token = ``;
|
50
|
+
if (items && items.length === 2) {
|
51
|
+
token = items[1];
|
52
|
+
}
|
53
|
+
return token;
|
54
|
+
}
|
55
|
+
async getAccessToken(token) {
|
56
|
+
const url = `https://smr00.vip.webportal.top/cn/api/manage/advanceUpload/genAccessKey?_v=${new Date().getTime()}&_TOKEN=${token}`;
|
57
|
+
const accessKey = await axios_1.default.get(url).then(res => res.data);
|
58
|
+
if (accessKey.success) {
|
59
|
+
const accessTokenString = this.decode(accessKey.accessKey);
|
60
|
+
if (accessTokenString) {
|
61
|
+
const accessToken = JSON.parse(accessTokenString);
|
62
|
+
return accessToken;
|
63
|
+
}
|
64
|
+
}
|
65
|
+
}
|
66
|
+
encodeURIComponent(data) {
|
67
|
+
if ((0, core_1.isPrimitive)(data)) {
|
68
|
+
return encodeURIComponent(data);
|
69
|
+
}
|
70
|
+
return Object.keys(data).map(key => {
|
71
|
+
const value = Reflect.get(data, key);
|
72
|
+
return `${key}=${encodeURIComponent(value)}`;
|
73
|
+
}).join('&');
|
74
|
+
}
|
75
|
+
getUploadUrl(token, forceDirect = true) {
|
76
|
+
if (forceDirect) {
|
77
|
+
return `https://${token.url}/${token.visitType}/${token.app}/upload?cmd=${token.cmd}&token=${token.token}`;
|
78
|
+
}
|
79
|
+
else {
|
80
|
+
return `https://${token.url}/${token.visitType}/${token.app}/advance?cmd=${token.cmd}&token=${token.token}`;
|
81
|
+
}
|
82
|
+
}
|
83
|
+
async getUploadInfo(loginId, filename, fileMd5, totalSize) {
|
84
|
+
// TODO: from redis cache
|
85
|
+
const login = await this.getFkLogin(loginId);
|
86
|
+
const cookies = await this.getCookieStr(loginId);
|
87
|
+
const bssInfo = this.getBssInfo();
|
88
|
+
const token = await this.getToken(cookies);
|
89
|
+
const accessToken = await this.getAccessToken(token);
|
90
|
+
const uploadInfoUrl = this.getUploadInfourl(accessToken);
|
91
|
+
const uploadUrl = this.getUploadUrl(accessToken, false);
|
92
|
+
const info = await axios_1.default.post(uploadInfoUrl, this.encodeURIComponent({
|
93
|
+
fileMd5: fileMd5,
|
94
|
+
fileSize: totalSize,
|
95
|
+
isFreeVer: false,
|
96
|
+
aid: login.aid,
|
97
|
+
folderId: login.uploadGroupId,
|
98
|
+
bssInfo: JSON.stringify(bssInfo),
|
99
|
+
fileName: filename
|
100
|
+
}), { headers: { cookie: cookies } }).then(res => res.data);
|
101
|
+
if (info.code === 200) {
|
102
|
+
return { ...info.data, uploadUrl, cookies, token, aid: login.aid, uploadGroupId: login.uploadGroupId };
|
103
|
+
}
|
104
|
+
}
|
105
|
+
async startUploadFile(task) {
|
106
|
+
const info = await this.getUploadInfo(task.loginId, task.filename, task.fileMd5, task.total);
|
107
|
+
task.cookies = info.cookies;
|
108
|
+
task.splitSize = info.splitSize;
|
109
|
+
task.start = info.uploadedSize;
|
110
|
+
task.uploadUrl = info.uploadUrl;
|
111
|
+
task.index = Math.ceil(info.uploadedSize / info.splitSize);
|
112
|
+
return await this.uploadFile(task);
|
113
|
+
}
|
114
|
+
async uploadFile(task) {
|
115
|
+
let complete = false;
|
116
|
+
const max = task.total - 1;
|
117
|
+
let index = task.index || 0;
|
118
|
+
do {
|
119
|
+
let start = index * task.splitSize;
|
120
|
+
if (start >= max) {
|
121
|
+
break;
|
122
|
+
}
|
123
|
+
let _end = start + task.splitSize - 1;
|
124
|
+
let end = _end > max ? max : _end;
|
125
|
+
if (end >= max) {
|
126
|
+
complete = true;
|
127
|
+
}
|
128
|
+
const fileStream = (0, fs_extra_1.createReadStream)(task.path, { start: start, end: end });
|
129
|
+
const formdata = new form_data_1.default();
|
130
|
+
formdata.append('ctrl', fileStream);
|
131
|
+
formdata.append('isFreeVer', this.encodeURIComponent(false));
|
132
|
+
formdata.append('aid', this.encodeURIComponent(task.aid));
|
133
|
+
formdata.append('folderId', this.encodeURIComponent(task.folderId));
|
134
|
+
formdata.append('fileName', task.filename);
|
135
|
+
formdata.append(`totalSize`, this.encodeURIComponent(task.total));
|
136
|
+
formdata.append(`fileMd5`, task.fileMd5);
|
137
|
+
formdata.append('index', this.encodeURIComponent(index));
|
138
|
+
formdata.append('chunkSize', this.encodeURIComponent(task.splitSize));
|
139
|
+
formdata.append('totalChunks', this.encodeURIComponent(task.totalChunks));
|
140
|
+
formdata.append(`complete`, this.encodeURIComponent(complete));
|
141
|
+
const bssInfo = {
|
142
|
+
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
143
|
+
};
|
144
|
+
formdata.append('bssInfo', JSON.stringify(bssInfo));
|
145
|
+
const headers = formdata.getHeaders();
|
146
|
+
const uploadResult = await axios_1.default.post(task.uploadUrl, formdata, {
|
147
|
+
headers: {
|
148
|
+
...headers,
|
149
|
+
Cookie: task.cookies
|
150
|
+
},
|
151
|
+
timeout: 8000
|
152
|
+
}).then(res => {
|
153
|
+
// console.log(`upload success`, { data: res.data, start, end, index, total: task.totalChunks })
|
154
|
+
return res.data;
|
155
|
+
}).catch(async (e) => {
|
156
|
+
const info = await this.getUploadInfo(task.loginId, task.filename, task.fileMd5, task.total);
|
157
|
+
task.cookies = info.cookies;
|
158
|
+
task.splitSize = info.splitSize;
|
159
|
+
task.start = info.uploadedSize;
|
160
|
+
task.uploadUrl = info.uploadUrl;
|
161
|
+
task.index = Math.ceil(info.uploadedSize / info.splitSize);
|
162
|
+
await this.uploadFile(task);
|
163
|
+
return;
|
164
|
+
});
|
165
|
+
if (!uploadResult) {
|
166
|
+
complete = true;
|
167
|
+
break;
|
168
|
+
}
|
169
|
+
if (uploadResult) {
|
170
|
+
const data = uploadResult.data;
|
171
|
+
const downUrl = data.path;
|
172
|
+
if (downUrl) {
|
173
|
+
const fullUrl = downUrl.startsWith('http') ? downUrl : `https:` + downUrl;
|
174
|
+
task.uploadUrl = fullUrl;
|
175
|
+
}
|
176
|
+
}
|
177
|
+
index = index + 1;
|
178
|
+
} while (!complete);
|
179
|
+
// upload complete
|
180
|
+
axios_1.default.post(`https://smr00.vip.webportal.top/ajax/advanceUpload.jsp?cmd=_report&_TOKEN=${task.token}`, this.encodeURIComponent({
|
181
|
+
type: 1,
|
182
|
+
size: task.total,
|
183
|
+
time: NaN,
|
184
|
+
flag: true,
|
185
|
+
name: task.filename
|
186
|
+
}), {
|
187
|
+
headers: {
|
188
|
+
[`Content-Type`]: `application/x-www-form-urlencoded; charset=UTF-8`,
|
189
|
+
Cookie: task.cookies
|
190
|
+
}
|
191
|
+
});
|
192
|
+
return task;
|
193
|
+
}
|
194
|
+
getBssInfo() {
|
195
|
+
return {
|
196
|
+
fromSite: true, siteId: 0, groupId: 0, fileSizeLimit: 1024
|
197
|
+
};
|
198
|
+
}
|
199
|
+
getUploadInfourl(accessToken) {
|
200
|
+
return `https://${accessToken.url}/${accessToken.visitType}/${accessToken.app}/advance/info?cmd=${accessToken.cmd}&token=${accessToken.token}`;
|
201
|
+
}
|
202
|
+
decode(base64Str) {
|
203
|
+
if (!base64Str)
|
204
|
+
return;
|
205
|
+
const t = base64Str.replace(/_/g, "/").replace(/-/g, "+");
|
206
|
+
const f = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
207
|
+
let l = 0;
|
208
|
+
let p = 0;
|
209
|
+
let h = [];
|
210
|
+
do {
|
211
|
+
const o = f.indexOf(t.charAt(l++));
|
212
|
+
const u = f.indexOf(t.charAt(l++));
|
213
|
+
const a = f.indexOf(t.charAt(l++));
|
214
|
+
const c = f.indexOf(t.charAt(l++));
|
215
|
+
const s = o << 18 | u << 12 | a << 6 | c;
|
216
|
+
const e = s >> 16 & 255;
|
217
|
+
const r = s >> 8 & 255;
|
218
|
+
const n = 255 & s;
|
219
|
+
h[p++] = 64 === a ? String.fromCharCode(e) : 64 === c ? String.fromCharCode(e, r) : String.fromCharCode(e, r, n);
|
220
|
+
} while (l < t.length);
|
221
|
+
return h.join('');
|
222
|
+
}
|
223
|
+
};
|
224
|
+
FkService = __decorate([
|
225
|
+
(0, core_1.Injectable)(),
|
226
|
+
__metadata("design:paramtypes", [typeorm_1.Db])
|
227
|
+
], FkService);
|
228
|
+
exports.FkService = FkService;
|
File without changes
|
@@ -0,0 +1 @@
|
|
1
|
+
"use strict";
|
@@ -0,0 +1,25 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.tasksProviders = void 0;
|
4
|
+
const rabbitmq_1 = require("@nger/rabbitmq");
|
5
|
+
const download_task_1 = require("./download-task");
|
6
|
+
const effect_task_1 = require("./effect-task");
|
7
|
+
const schedule_task_1 = require("./schedule-task");
|
8
|
+
const upload_task_1 = require("./upload-task");
|
9
|
+
exports.tasksProviders = [{
|
10
|
+
provide: rabbitmq_1.Task,
|
11
|
+
useFactory: () => new download_task_1.DownloadTask(),
|
12
|
+
multi: true
|
13
|
+
}, {
|
14
|
+
provide: rabbitmq_1.Task,
|
15
|
+
useFactory: () => new schedule_task_1.ScheduleTask(),
|
16
|
+
multi: true
|
17
|
+
}, {
|
18
|
+
provide: rabbitmq_1.Task,
|
19
|
+
useFactory: () => new upload_task_1.UploadTask(),
|
20
|
+
multi: true
|
21
|
+
}, {
|
22
|
+
provide: rabbitmq_1.Task,
|
23
|
+
useFactory: () => new effect_task_1.EffectTask(),
|
24
|
+
multi: true
|
25
|
+
}];
|
@@ -0,0 +1,16 @@
|
|
1
|
+
import { RabbitMqService } from "@nger/rabbitmq";
|
2
|
+
import { RedisService } from "@nger/redis";
|
3
|
+
import { ScheduleService } from "@nger/schedule";
|
4
|
+
import { Db } from "@nger/typeorm";
|
5
|
+
import { W7DataSource } from "@nger/w7";
|
6
|
+
import { CreateDownloadTask } from "./create-download-task";
|
7
|
+
export declare class ReceiveScheduleTask {
|
8
|
+
private rabbit;
|
9
|
+
private redis;
|
10
|
+
private schedule;
|
11
|
+
private db;
|
12
|
+
private w7;
|
13
|
+
private createDownloadTask;
|
14
|
+
constructor(rabbit: RabbitMqService, redis: RedisService, schedule: ScheduleService, db: Db, w7: W7DataSource, createDownloadTask: CreateDownloadTask);
|
15
|
+
receiveScheduleTask(runner: Function): Promise<void>;
|
16
|
+
}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.ReceiveScheduleTask = void 0;
|
4
|
+
const w7_1 = require("@nger/w7");
|
5
|
+
const entities_1 = require("../../entities");
|
6
|
+
const typeorm_1 = require("typeorm");
|
7
|
+
class ReceiveScheduleTask {
|
8
|
+
rabbit;
|
9
|
+
redis;
|
10
|
+
schedule;
|
11
|
+
db;
|
12
|
+
w7;
|
13
|
+
createDownloadTask;
|
14
|
+
constructor(rabbit, redis, schedule, db, w7, createDownloadTask) {
|
15
|
+
this.rabbit = rabbit;
|
16
|
+
this.redis = redis;
|
17
|
+
this.schedule = schedule;
|
18
|
+
this.db = db;
|
19
|
+
this.w7 = w7;
|
20
|
+
this.createDownloadTask = createDownloadTask;
|
21
|
+
}
|
22
|
+
async receiveScheduleTask(runner) {
|
23
|
+
const obs = await this.rabbit.receive(`@nger/fk-upload/schedule-task`);
|
24
|
+
obs.subscribe({
|
25
|
+
next: async ([data, complete, fail]) => {
|
26
|
+
try {
|
27
|
+
const task = JSON.parse(data);
|
28
|
+
const setting = await this.redis.get(`setting`);
|
29
|
+
if (!setting) {
|
30
|
+
return complete();
|
31
|
+
}
|
32
|
+
if (task.name === setting.name) {
|
33
|
+
console.log(`shedule job regist ${task.name}`);
|
34
|
+
this.schedule.scheduleJob(task.name, task.rule, async (time) => {
|
35
|
+
const accounts = await this.db.manager.find(entities_1.FkLoginEntity, {});
|
36
|
+
const w7Usernames = accounts.map(account => account.w7Username);
|
37
|
+
const users = await this.w7.manager.find(w7_1.W7UsersEntity, { where: { username: (0, typeorm_1.In)(w7Usernames) } });
|
38
|
+
const uids = users.map(user => user.uid);
|
39
|
+
const uniAccounts = await this.w7.manager.find(w7_1.W7UniAccountEntity, { where: { createUid: (0, typeorm_1.In)(uids) } });
|
40
|
+
const uniacids = uniAccounts.map(a => a.uniacid);
|
41
|
+
const tasks = await this.db.manager.find(entities_1.FkDownloadTaskEntity, { select: ['topicId'] });
|
42
|
+
const ids = tasks.map(task => task.topicId);
|
43
|
+
const topics = await this.w7.manager.find(w7_1.W7ChatTopicEntity, { where: { uniacid: (0, typeorm_1.In)(uniacids), id: (0, typeorm_1.Not)((0, typeorm_1.In)(ids)) } });
|
44
|
+
topics.map(topic => {
|
45
|
+
if (topic.thirdUrl) {
|
46
|
+
const uniacid = topic.uniacid;
|
47
|
+
const account = uniAccounts.find(a => a.uniacid === uniacid);
|
48
|
+
const user = users.find(u => u.uid === account.createUid);
|
49
|
+
const login = accounts.find(a => a.w7Username === user.username);
|
50
|
+
this.createDownloadTask.createDownLoadTask(topic.thirdUrl, login.fkLoginId, topic.id);
|
51
|
+
}
|
52
|
+
});
|
53
|
+
});
|
54
|
+
}
|
55
|
+
else {
|
56
|
+
complete();
|
57
|
+
}
|
58
|
+
}
|
59
|
+
catch (e) {
|
60
|
+
fail();
|
61
|
+
}
|
62
|
+
}
|
63
|
+
});
|
64
|
+
}
|
65
|
+
}
|
66
|
+
exports.ReceiveScheduleTask = ReceiveScheduleTask;
|