返回 AiToEarn
KwaiPubListener.ts
根目录 / project / aitoearn-electron / electron / main / plat / platforms / Kwai / KwaiPubListener.ts
1 import { kwaiPub } from '../../../../plat/Kwai';
2 import { EtEvent } from '../../../../global/event';
3 import windowOperate from '../../../../util/windowOperate';
4 import { SendChannelEnum } from '../../../../../commont/UtilsEnum';
5 import { sleep } from '../../../../../commont/utils';
6 import { VideoModel } from '../../../../db/models/video';
7 import { AccountModel } from '../../../../db/models/account';
8 import { PubStatus } from '../../../../../commont/publish/PublishEnum';
9
10 /**
11 * 快手发布监听器
12 * 快手发布视频后会调用这个静态类的方法监听该条发布的视频是否完成,如果完成那么不会再监听
13 */
14 export default class KwaiPubListener {
15 private constructor() {}
16
17 // 是否已经开始启动,防止重复启动
18 static started = false;
19 // key=cookie,val=侦听的id
20 static listenMap: Map<string, number[]> = new Map();
21
22 // 处理逻辑
23 static async handle(cookie: string) {
24 const ids = KwaiPubListener.listenMap.get(cookie)!;
25 const works = await kwaiPub.refreshWorks(JSON.parse(cookie), ids);
26 works.data.data.list.find((v) => {
27 if (v.workId) {
28 const previewVideoLink = `https://www.kuaishou.com/short-video/${v.workId}`;
29 EtEvent.emit('ET_PUBLISH_UPDATE_VIDEO_PUL_BY_DATAID', {
30 previewVideoLink,
31 status: PubStatus.RELEASED,
32 dataId: `${v.id}`,
33 });
34 windowOperate.sendRenderMsg(SendChannelEnum.VideoAuditFinish, {
35 previewVideoLink,
36 dataId: v.id,
37 });
38 const newIds = ids.filter((id) => id != v.id);
39 if (newIds.length === 0) {
40 KwaiPubListener.listenMap.delete(cookie);
41 } else {
42 KwaiPubListener.listenMap.set(cookie, newIds);
43 }
44 }
45 });
46 }
47
48 static async getVideoRecord() {
49 return new Promise<VideoModel[]>((resolve) => {
50 EtEvent.emit('ET_PUBLISH_VIDEO_AUDIT_LIST', (list: VideoModel[]) => {
51 resolve(list);
52 });
53 });
54 }
55
56 static async getAccountById(ids: number[]) {
57 return new Promise<AccountModel[]>((resolve) => {
58 EtEvent.emit(
59 'ET_ACCOUNT_GET_LIST_BY_IDS',
60 ids,
61 (list: AccountModel[]) => {
62 resolve(list);
63 },
64 );
65 });
66 }
67
68 /**
69 * 开始监听
70 */
71 static async start(cookie?: string, id?: number) {
72 if (cookie) {
73 if (!KwaiPubListener.listenMap.has(cookie)) {
74 KwaiPubListener.listenMap.set(cookie, []);
75 }
76 KwaiPubListener.listenMap.get(cookie)?.push(id!);
77 } else {
78 const videoModels: VideoModel[] = await KwaiPubListener.getVideoRecord();
79 if (videoModels && videoModels.length === 0) return;
80 const accountIds = videoModels.map((v) => {
81 return v.accountId;
82 });
83 if (accountIds.length === 0) return;
84 const accounts: AccountModel[] =
85 await KwaiPubListener.getAccountById(accountIds);
86 if (accounts.length === 0) return;
87
88 accounts.map((v) => {
89 const cookie = v.loginCookie;
90 if (!KwaiPubListener.listenMap.has(cookie)) {
91 KwaiPubListener.listenMap.set(
92 cookie,
93 videoModels
94 .filter((k) => k.accountId === v.id)
95 .map((v) => {
96 return parseInt(<string>v.dataId);
97 }),
98 );
99 }
100 });
101 }
102 if (KwaiPubListener.started) return;
103
104 KwaiPubListener.started = true;
105 while (true) {
106 if (KwaiPubListener.listenMap.size === 0) {
107 break;
108 }
109 try {
110 const tasks: Promise<void>[] = [];
111 for (const [cookie] of KwaiPubListener.listenMap) {
112 tasks.push(this.handle(cookie));
113 }
114 await Promise.all(tasks);
115 } catch (e) {
116 console.error('快手审核作品查询错误:', e);
117 break;
118 }
119 await sleep(3000);
120 }
121 KwaiPubListener.started = false;
122 }
123 }
124
124 lines TYPESCRIPT