@bililive-tools/manager 1.0.0 → 1.1.0

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/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  # 安装
8
8
 
9
+ **建议所有录制器和manager包都升级到最新版,我不会对兼容性做过多考虑**
10
+
9
11
  `npm i @bililive-tools/manager`
10
12
 
11
13
  ## 支持的平台
@@ -44,8 +46,46 @@ manager.addRecorder({
44
46
  manager.startCheckLoop();
45
47
  ```
46
48
 
49
+ ### 函数
50
+
51
+ ### addRecorder
52
+
53
+ 添加录制器,具体参数见各录制插件
54
+
55
+ ### removeRecorder
56
+
57
+ 移除录制器
58
+
59
+ ### startCheckLoop
60
+
61
+ 开启自动监听
62
+
63
+ ### stopCheckLoop
64
+
65
+ 停止自动监听
66
+
67
+ ### startRecord
68
+
69
+ 手动开启录制
70
+
71
+ ### stopRecord
72
+
73
+ 手动开启录制
74
+
75
+ ### setFFMPEGPath
76
+
77
+ 设置ffmpeg可执行路径
78
+
79
+ ```ts
80
+ import { setFFMPEGPath } from "@bililive-tools/manager";
81
+
82
+ setFFMPEGPath("ffmpeg.exe");
83
+ ```
84
+
47
85
  ## savePathRule 占位符参数
48
86
 
87
+ 默认值为 `{platform}/{owner}/{year}-{month}-{date} {hour}-{min}-{sec} {title}`
88
+
49
89
  | 值 | 标签 |
50
90
  | ----------- | ------ |
51
91
  | {platform} | 平台 |
@@ -86,6 +126,14 @@ manager.startCheckLoop();
86
126
 
87
127
  录制文件结束
88
128
 
129
+ ### RecorderProgress
130
+
131
+ ffmpeg录制相关数据
132
+
133
+ ### RecoderLiveStart
134
+
135
+ 直播开始,**并非录制开始,同一场直播不会重复触发**
136
+
89
137
  # 协议
90
138
 
91
139
  与原项目保存一致为 LGPL
@@ -0,0 +1,36 @@
1
+ import EventEmitter from "node:events";
2
+ export declare class FFMPEGRecorder extends EventEmitter {
3
+ private onEnd;
4
+ private command;
5
+ private streamManager;
6
+ private timeoutChecker;
7
+ hasSegment: boolean;
8
+ getSavePath: (data: {
9
+ startTime: number;
10
+ }) => string;
11
+ segment: number;
12
+ ffmpegOutputOptions: string[];
13
+ inputOptions: string[];
14
+ isHls: boolean;
15
+ disableDanma: boolean;
16
+ url: string;
17
+ constructor(opts: {
18
+ url: string;
19
+ getSavePath: (data: {
20
+ startTime: number;
21
+ }) => string;
22
+ segment: number;
23
+ outputOptions: string[];
24
+ inputOptions?: string[];
25
+ isHls?: boolean;
26
+ disableDanma?: boolean;
27
+ }, onEnd: (...args: unknown[]) => void);
28
+ private createCommand;
29
+ formatLine(line: string): {
30
+ time: string | null;
31
+ } | null;
32
+ run(): void;
33
+ getArguments(): string[];
34
+ stop(): Promise<void>;
35
+ getExtraDataController(): import("./record_extra_data_controller.js").RecordExtraDataController | null;
36
+ }
@@ -0,0 +1,108 @@
1
+ import EventEmitter from "node:events";
2
+ import { createFFMPEGBuilder, StreamManager, utils } from "./index.js";
3
+ import { createInvalidStreamChecker, assert } from "./utils.js";
4
+ export class FFMPEGRecorder extends EventEmitter {
5
+ onEnd;
6
+ command;
7
+ streamManager;
8
+ timeoutChecker;
9
+ hasSegment;
10
+ getSavePath;
11
+ segment;
12
+ ffmpegOutputOptions = [];
13
+ inputOptions = [];
14
+ isHls = false;
15
+ disableDanma = false;
16
+ url;
17
+ constructor(opts, onEnd) {
18
+ super();
19
+ this.onEnd = onEnd;
20
+ const hasSegment = !!opts.segment;
21
+ this.disableDanma = opts.disableDanma ?? false;
22
+ this.streamManager = new StreamManager(opts.getSavePath, hasSegment, this.disableDanma);
23
+ this.timeoutChecker = utils.createTimeoutChecker(() => this.onEnd("ffmpeg timeout"), 3 * 10e3);
24
+ this.hasSegment = hasSegment;
25
+ this.getSavePath = opts.getSavePath;
26
+ this.ffmpegOutputOptions = opts.outputOptions;
27
+ this.inputOptions = opts.inputOptions ?? [];
28
+ this.url = opts.url;
29
+ this.segment = opts.segment;
30
+ this.isHls = opts.isHls ?? false;
31
+ this.command = this.createCommand();
32
+ this.streamManager.on("videoFileCreated", ({ filename }) => {
33
+ this.emit("videoFileCreated", { filename });
34
+ });
35
+ this.streamManager.on("videoFileCompleted", ({ filename }) => {
36
+ this.emit("videoFileCompleted", { filename });
37
+ });
38
+ this.streamManager.on("DebugLog", (data) => {
39
+ this.emit("DebugLog", data);
40
+ });
41
+ }
42
+ createCommand() {
43
+ const invalidCount = this.isHls ? 35 : 15;
44
+ const isInvalidStream = createInvalidStreamChecker(invalidCount);
45
+ const command = createFFMPEGBuilder()
46
+ .input(this.url)
47
+ .inputOptions([
48
+ ...this.inputOptions,
49
+ "-user_agent",
50
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36",
51
+ ])
52
+ .outputOptions(this.ffmpegOutputOptions)
53
+ .output(this.streamManager.videoFilePath)
54
+ .on("error", this.onEnd)
55
+ .on("end", () => this.onEnd("finished"))
56
+ .on("stderr", async (stderrLine) => {
57
+ assert(typeof stderrLine === "string");
58
+ await this.streamManager.handleVideoStarted(stderrLine);
59
+ // TODO:解析时间
60
+ this.emit("DebugLog", { type: "ffmpeg", text: stderrLine });
61
+ const info = this.formatLine(stderrLine);
62
+ if (info) {
63
+ this.emit("progress", info);
64
+ }
65
+ if (isInvalidStream(stderrLine)) {
66
+ this.onEnd("invalid stream");
67
+ }
68
+ })
69
+ .on("stderr", this.timeoutChecker.update);
70
+ if (this.hasSegment) {
71
+ command.outputOptions("-f", "segment", "-segment_time", String(this.segment * 60), "-reset_timestamps", "1");
72
+ }
73
+ return command;
74
+ }
75
+ formatLine(line) {
76
+ if (!line.includes("time=")) {
77
+ return null;
78
+ }
79
+ let time = null;
80
+ const timeMatch = line.match(/time=([0-9:.]+)/);
81
+ if (timeMatch) {
82
+ time = timeMatch[1];
83
+ }
84
+ return {
85
+ time,
86
+ };
87
+ }
88
+ run() {
89
+ this.command.run();
90
+ }
91
+ getArguments() {
92
+ return this.command._getArguments();
93
+ }
94
+ async stop() {
95
+ this.timeoutChecker.stop();
96
+ try {
97
+ // @ts-ignore
98
+ this.command.ffmpegProc?.stdin?.write("q");
99
+ await this.streamManager.handleVideoCompleted();
100
+ }
101
+ catch (err) {
102
+ this.emit("DebugLog", { type: "common", text: String(err) });
103
+ }
104
+ }
105
+ getExtraDataController() {
106
+ return this.streamManager?.getExtraDataController();
107
+ }
108
+ }
package/lib/api.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function getBiliStatusInfoByUIDs<UID extends number>(userIds: UID[]): Promise<Record<string, boolean>>;
1
+ export declare function getBiliStatusInfoByRoomIds<RoomId extends number>(RoomIds: RoomId[]): Promise<Record<string, boolean>>;
package/lib/api.js CHANGED
@@ -6,16 +6,19 @@ const requester = axios.create({
6
6
  // 但会导致请求报错 "Client network socket disconnected before secure TLS connection was established"。
7
7
  proxy: false,
8
8
  });
9
- export async function getBiliStatusInfoByUIDs(userIds) {
10
- const res = await requester.get("http://api.live.bilibili.com/room/v1/Room/get_status_info_by_uids", {
11
- params: { uids: userIds },
12
- });
9
+ export async function getBiliStatusInfoByRoomIds(RoomIds) {
10
+ const roomParams = `${RoomIds.map((id) => `room_ids=${id}`).join("&")}`;
11
+ const res = await requester.get(`https://api.live.bilibili.com/xlive/web-room/v1/index/getRoomBaseInfo?${roomParams}&req_biz=web_room_componet`);
13
12
  assert(res.data.code === 0, `Unexpected resp, code ${res.data.code}, msg ${res.data.message}`);
14
13
  const obj = {};
15
- for (const uid of userIds) {
16
- const data = res.data.data?.[uid];
17
- obj[uid] = data?.live_status === 1;
14
+ for (const roomId of RoomIds) {
15
+ try {
16
+ const data = res.data.data.by_room_ids[roomId];
17
+ obj[roomId] = data?.live_status === 1;
18
+ }
19
+ catch (e) {
20
+ continue;
21
+ }
18
22
  }
19
23
  return obj;
20
24
  }
21
- //# sourceMappingURL=api.js.map
package/lib/common.d.ts CHANGED
@@ -3,7 +3,9 @@ export type ChannelId = string;
3
3
  export declare const Qualities: readonly ["lowest", "low", "medium", "high", "highest"];
4
4
  export declare const BiliQualities: readonly [30000, 20000, 10000, 400, 250, 150, 80];
5
5
  export declare const DouyuQualities: readonly [0, 2, 3, 4, 8];
6
- export type Quality = (typeof Qualities)[number] | (typeof BiliQualities)[number] | (typeof DouyuQualities)[number];
6
+ export declare const HuYaQualities: readonly [0, 20000, 14100, 14000, 10000, 8000, 4200, 4000, 2000, 500];
7
+ export declare const DouYinQualities: readonly ["origin", "uhd", "hd", "sd", "ld", "ao"];
8
+ export type Quality = (typeof Qualities)[number] | (typeof BiliQualities)[number] | (typeof DouyuQualities)[number] | (typeof HuYaQualities)[number] | (typeof DouYinQualities)[number];
7
9
  export interface MessageSender<E extends AnyObject = UnknownObject> {
8
10
  uid?: string;
9
11
  name: string;
package/lib/common.js CHANGED
@@ -1,4 +1,6 @@
1
1
  export const Qualities = ["lowest", "low", "medium", "high", "highest"];
2
2
  export const BiliQualities = [30000, 20000, 10000, 400, 250, 150, 80];
3
3
  export const DouyuQualities = [0, 2, 3, 4, 8];
4
- //# sourceMappingURL=common.js.map
4
+ // 14100: 2K HDR;14000:2K;4200:HDR(10M);0:原画;8000:蓝光8M;4000:蓝光4M;2000:超清;500:流畅
5
+ export const HuYaQualities = [0, 20000, 14100, 14000, 10000, 8000, 4200, 4000, 2000, 500];
6
+ export const DouYinQualities = ["origin", "uhd", "hd", "sd", "ld", "ao"];
package/lib/index.d.ts CHANGED
@@ -7,6 +7,7 @@ export * from "./common.js";
7
7
  export * from "./recorder.js";
8
8
  export * from "./manager.js";
9
9
  export * from "./record_extra_data_controller.js";
10
+ export * from "./FFMPEGRecorder.js";
10
11
  export { utils };
11
12
  /**
12
13
  * 提供一些 utils
package/lib/index.js CHANGED
@@ -1,12 +1,12 @@
1
1
  // forked from https://github.com/WhiteMinds/LiveAutoRecord
2
2
  import ffmpeg from "@renmu/fluent-ffmpeg";
3
3
  import { omit, pick } from "lodash-es";
4
- import { v4 as uuid } from "uuid";
5
4
  import utils from "./utils.js";
6
5
  export * from "./common.js";
7
6
  export * from "./recorder.js";
8
7
  export * from "./manager.js";
9
8
  export * from "./record_extra_data_controller.js";
9
+ export * from "./FFMPEGRecorder.js";
10
10
  export { utils };
11
11
  /**
12
12
  * 提供一些 utils
@@ -35,16 +35,17 @@ export function defaultToJSON(provider, recorder) {
35
35
  "disableProvideCommentsWhenRecording",
36
36
  "liveInfo",
37
37
  "uid",
38
+ "titleKeywords",
38
39
  ]),
39
40
  };
40
41
  }
41
42
  // 目前是假设使用环境的规模都比较小,不太容易遇到性能问题,所以用 string uuid 作为 id 来简化开发的复杂度。
42
43
  // 后面如果需要再高一些的规模,可以优化成分布式 id 生成器,或者其他的异步生成 id 的方案。
43
44
  export function genRecorderUUID() {
44
- return uuid();
45
+ return utils.uuid();
45
46
  }
46
47
  export function genRecordUUID() {
47
- return uuid();
48
+ return utils.uuid();
48
49
  }
49
50
  let ffmpegPath = "ffmpeg";
50
51
  export function setFFMPEGPath(newPath) {
@@ -55,7 +56,5 @@ export const createFFMPEGBuilder = (...args) => {
55
56
  return ffmpeg(...args);
56
57
  };
57
58
  export function getDataFolderPath(provider) {
58
- // TODO: 改成 AppData 之类的目录
59
59
  return "./" + provider.id;
60
60
  }
61
- //# sourceMappingURL=index.js.map
package/lib/manager.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { Emitter } from "mitt";
2
2
  import { ChannelId, Message } from "./common.js";
3
- import { RecorderCreateOpts, Recorder, SerializedRecorder, RecordHandle, DebugLog } from "./recorder.js";
3
+ import { RecorderCreateOpts, Recorder, SerializedRecorder, RecordHandle, DebugLog, Progress } from "./recorder.js";
4
4
  import { AnyObject, UnknownObject } from "./utils.js";
5
5
  import { StreamManager } from "./streamManager.js";
6
6
  export interface RecorderProvider<E extends AnyObject> {
@@ -18,7 +18,7 @@ export interface RecorderProvider<E extends AnyObject> {
18
18
  fromJSON: <T extends SerializedRecorder<E>>(this: RecorderProvider<E>, json: T) => Recorder<E>;
19
19
  setFFMPEGOutputArgs: (this: RecorderProvider<E>, args: string[]) => void;
20
20
  }
21
- declare const configurableProps: readonly ["savePathRule", "autoRemoveSystemReservedChars", "autoCheckLiveStatusAndRecord", "autoCheckInterval", "ffmpegOutputArgs", "biliBatchQuery"];
21
+ declare const configurableProps: readonly ["savePathRule", "autoRemoveSystemReservedChars", "autoCheckInterval", "ffmpegOutputArgs", "biliBatchQuery"];
22
22
  type ConfigurableProp = (typeof configurableProps)[number];
23
23
  export interface RecorderManager<ME extends UnknownObject, P extends RecorderProvider<AnyObject> = RecorderProvider<UnknownObject>, PE extends AnyObject = GetProviderExtra<P>, E extends AnyObject = ME & PE> extends Emitter<{
24
24
  error: {
@@ -41,6 +41,13 @@ export interface RecorderManager<ME extends UnknownObject, P extends RecorderPro
41
41
  recorder: Recorder<E>;
42
42
  filename: string;
43
43
  };
44
+ RecorderProgress: {
45
+ recorder: Recorder<E>;
46
+ progress: Progress;
47
+ };
48
+ RecoderLiveStart: {
49
+ recorder: Recorder<E>;
50
+ };
44
51
  RecordStop: {
45
52
  recorder: Recorder<E>;
46
53
  recordHandle: RecordHandle;
@@ -68,7 +75,6 @@ export interface RecorderManager<ME extends UnknownObject, P extends RecorderPro
68
75
  removeRecorder: (this: RecorderManager<ME, P, PE, E>, recorder: Recorder<E>) => void;
69
76
  startRecord: (this: RecorderManager<ME, P, PE, E>, id: string) => Promise<Recorder<E> | undefined>;
70
77
  stopRecord: (this: RecorderManager<ME, P, PE, E>, id: string) => Promise<Recorder<E> | undefined>;
71
- autoCheckLiveStatusAndRecord: boolean;
72
78
  autoCheckInterval: number;
73
79
  isCheckLoopRunning: boolean;
74
80
  startCheckLoop: (this: RecorderManager<ME, P, PE, E>) => void;
package/lib/manager.js CHANGED
@@ -2,13 +2,12 @@ import path from "node:path";
2
2
  import mitt from "mitt";
3
3
  import { omit, range } from "lodash-es";
4
4
  import { parseArgsStringToArgv } from "string-argv";
5
- import { getBiliStatusInfoByUIDs } from "./api.js";
6
- import { formatDate, removeSystemReservedChars, formatTemplate, } from "./utils.js";
5
+ import { getBiliStatusInfoByRoomIds } from "./api.js";
6
+ import { formatDate, removeSystemReservedChars, formatTemplate, replaceExtName, downloadImage, } from "./utils.js";
7
7
  import { StreamManager } from "./streamManager.js";
8
8
  const configurableProps = [
9
9
  "savePathRule",
10
10
  "autoRemoveSystemReservedChars",
11
- "autoCheckLiveStatusAndRecord",
12
11
  "autoCheckInterval",
13
12
  "ffmpegOutputArgs",
14
13
  "biliBatchQuery",
@@ -21,11 +20,12 @@ export function createRecorderManager(opts) {
21
20
  let checkLoopTimer;
22
21
  const multiThreadCheck = async (manager) => {
23
22
  const handleBatchQuery = async (obj) => {
24
- for (const recorder of recorders) {
25
- if (recorder.extra.recorderUid == null)
26
- continue;
27
- const isLive = obj[recorder.extra.recorderUid];
28
- if (isLive) {
23
+ for (const recorder of recorders
24
+ .filter((r) => !r.disableAutoCheck)
25
+ .filter((r) => r.providerId === "Bilibili")) {
26
+ const isLive = obj[recorder.channelId];
27
+ // 如果是undefined,说明这个接口查不到相关信息,使用录制器内的再查一次
28
+ if (isLive === true || isLive === undefined) {
29
29
  await recorder.checkLiveStatusAndRecord({
30
30
  getSavePath(data) {
31
31
  return genSavePathFromRule(manager, recorder, data);
@@ -41,25 +41,19 @@ export function createRecorderManager(opts) {
41
41
  let needCheckRecorders = recorders.filter((r) => !r.disableAutoCheck);
42
42
  let threads = [];
43
43
  if (manager.biliBatchQuery) {
44
- const biliNeedCheckRecorders = needCheckRecorders.filter((r) => r.providerId === "Bilibili" && r.extra?.recorderUid);
45
- needCheckRecorders = needCheckRecorders.filter((r) => {
46
- if (r.providerId !== "Bilibili")
47
- return true;
48
- if (r.providerId === "Bilibili" && !r.extra?.recorderUid)
49
- return true;
50
- return false;
51
- });
52
- const uids = biliNeedCheckRecorders.map((r) => r.extra?.recorderUid);
53
- // console.log("uids", uids);
44
+ const biliNeedCheckRecorders = needCheckRecorders
45
+ .filter((r) => r.providerId === "Bilibili")
46
+ .filter((r) => r.recordHandle == null);
47
+ needCheckRecorders = needCheckRecorders.filter((r) => r.providerId !== "Bilibili");
48
+ const roomIds = biliNeedCheckRecorders.map((r) => r.channelId).map(Number);
54
49
  try {
55
- if (uids.length !== 0) {
56
- const biliStatus = await getBiliStatusInfoByUIDs(uids);
57
- // console.log("biliStatus", biliStatus);
50
+ if (roomIds.length !== 0) {
51
+ const biliStatus = await getBiliStatusInfoByRoomIds(roomIds);
58
52
  threads.push(handleBatchQuery(biliStatus));
59
53
  }
60
54
  }
61
55
  catch (err) {
62
- manager.emit("error", { source: "getBiliStatusInfoByUIDs", err });
56
+ manager.emit("error", { source: "getBiliStatusInfoByRoomIds", err });
63
57
  }
64
58
  }
65
59
  const checkOnce = async () => {
@@ -88,6 +82,8 @@ export function createRecorderManager(opts) {
88
82
  };
89
83
  // 用于记录暂时被 ban 掉的直播间
90
84
  const tempBanObj = {};
85
+ // 用于是否触发LiveStart事件,不要重复触发
86
+ const liveStartObj = {};
91
87
  const manager = {
92
88
  // @ts-ignore
93
89
  ...mitt(),
@@ -106,12 +102,28 @@ export function createRecorderManager(opts) {
106
102
  this.recorders.push(recorder);
107
103
  recorder.on("RecordStart", (recordHandle) => this.emit("RecordStart", { recorder, recordHandle }));
108
104
  recorder.on("RecordSegment", (recordHandle) => this.emit("RecordSegment", { recorder, recordHandle }));
109
- recorder.on("videoFileCreated", ({ filename }) => this.emit("videoFileCreated", { recorder, filename }));
105
+ recorder.on("videoFileCreated", ({ filename }) => {
106
+ if (recorder.saveCover && recorder?.liveInfo?.cover) {
107
+ const coverPath = replaceExtName(filename, ".jpg");
108
+ downloadImage(recorder?.liveInfo?.cover, coverPath);
109
+ }
110
+ this.emit("videoFileCreated", { recorder, filename });
111
+ });
110
112
  recorder.on("videoFileCompleted", ({ filename }) => this.emit("videoFileCompleted", { recorder, filename }));
111
113
  recorder.on("RecordStop", ({ recordHandle, reason }) => this.emit("RecordStop", { recorder, recordHandle, reason }));
112
114
  recorder.on("Message", (message) => this.emit("Message", { recorder, message }));
113
115
  recorder.on("Updated", (keys) => this.emit("RecorderUpdated", { recorder, keys }));
114
116
  recorder.on("DebugLog", (log) => this.emit("RecorderDebugLog", { recorder, ...log }));
117
+ recorder.on("progress", (progress) => {
118
+ this.emit("RecorderProgress", { recorder, progress });
119
+ });
120
+ recorder.on("LiveStart", ({ liveId }) => {
121
+ const key = `${recorder.channelId}-${liveId}`;
122
+ if (liveStartObj[key])
123
+ return;
124
+ liveStartObj[key] = true;
125
+ this.emit("RecoderLiveStart", { recorder });
126
+ });
115
127
  this.emit("RecorderAdded", recorder);
116
128
  return recorder;
117
129
  },
@@ -134,7 +146,7 @@ export function createRecorderManager(opts) {
134
146
  getSavePath(data) {
135
147
  return genSavePathFromRule(manager, recorder, data);
136
148
  },
137
- qualityRetry: 0,
149
+ isManualStart: true,
138
150
  });
139
151
  delete tempBanObj[recorder.channelId];
140
152
  recorder.tempStopIntervalCheck = false;
@@ -154,7 +166,6 @@ export function createRecorderManager(opts) {
154
166
  }
155
167
  return recorder;
156
168
  },
157
- autoCheckLiveStatusAndRecord: opts.autoCheckLiveStatusAndRecord ?? true,
158
169
  autoCheckInterval: opts.autoCheckInterval ?? 1000,
159
170
  isCheckLoopRunning: false,
160
171
  startCheckLoop() {
@@ -188,7 +199,7 @@ export function createRecorderManager(opts) {
188
199
  clearTimeout(checkLoopTimer);
189
200
  },
190
201
  savePathRule: opts.savePathRule ??
191
- path.join(process.cwd(), "{platform}/{owner}/{year}-{month}-{date} {hour}-{min}-{sec} {title}.mp4"),
202
+ path.join(process.cwd(), "{platform}/{owner}/{year}-{month}-{date} {hour}-{min}-{sec} {title}"),
192
203
  autoRemoveSystemReservedChars: opts.autoRemoveSystemReservedChars ?? true,
193
204
  biliBatchQuery: opts.biliBatchQuery ?? false,
194
205
  ffmpegOutputArgs: opts.ffmpegOutputArgs ??
@@ -253,4 +264,3 @@ export function genSavePathFromRule(manager, recorder, extData) {
253
264
  return formatTemplate(manager.savePathRule, params);
254
265
  }
255
266
  export { StreamManager };
256
- //# sourceMappingURL=manager.js.map
@@ -154,4 +154,3 @@ export function convert2Xml(data) {
154
154
  return `<?xml version="1.0" encoding="utf-8"?>
155
155
  ${xmlContent}`;
156
156
  }
157
- //# sourceMappingURL=record_extra_data_controller.js.map
package/lib/recorder.d.ts CHANGED
@@ -14,6 +14,7 @@ export interface RecorderCreateOpts<E extends AnyObject = UnknownObject> {
14
14
  quality: Quality;
15
15
  streamPriorities: string[];
16
16
  sourcePriorities: string[];
17
+ formatPriorities?: string[];
17
18
  segment?: number;
18
19
  saveGiftDanma?: boolean;
19
20
  saveSCDanma?: boolean;
@@ -33,16 +34,24 @@ export interface RecorderCreateOpts<E extends AnyObject = UnknownObject> {
33
34
  formatName?: FormatName;
34
35
  /** 流编码 */
35
36
  codecName?: CodecName;
37
+ /** 选择使用的api,虎牙支持 */
38
+ api?: "auto" | "web" | "mp";
39
+ /** 标题关键词,如果直播间标题包含这些关键词,则不会自动录制(仅对斗鱼有效),多个关键词用英文逗号分隔 */
40
+ titleKeywords?: string;
36
41
  extra?: Partial<E>;
37
42
  }
38
43
  export type SerializedRecorder<E extends AnyObject> = PickRequired<RecorderCreateOpts<E>, "id">;
39
44
  export type RecorderState = "idle" | "recording" | "stopping-record";
45
+ export type Progress = {
46
+ time: string | null;
47
+ };
40
48
  export interface RecordHandle {
41
49
  id: string;
42
50
  stream: string;
43
51
  source: string;
44
52
  url: string;
45
53
  ffmpegArgs?: string[];
54
+ progress?: Progress;
46
55
  savePath: string;
47
56
  stop: (this: RecordHandle, reason?: string, tempStopIntervalCheck?: boolean) => Promise<void>;
48
57
  }
@@ -64,6 +73,10 @@ export interface Recorder<E extends AnyObject = UnknownObject> extends Emitter<{
64
73
  videoFileCompleted: {
65
74
  filename: string;
66
75
  };
76
+ progress: Progress;
77
+ LiveStart: {
78
+ liveId: string;
79
+ };
67
80
  RecordStop: {
68
81
  recordHandle: RecordHandle;
69
82
  reason?: string;
@@ -95,8 +108,8 @@ export interface Recorder<E extends AnyObject = UnknownObject> extends Emitter<{
95
108
  getChannelURL: (this: Recorder<E>) => string;
96
109
  checkLiveStatusAndRecord: (this: Recorder<E>, opts: {
97
110
  getSavePath: GetSavePath;
98
- qualityRetry?: number;
99
111
  banLiveId?: string;
112
+ isManualStart?: boolean;
100
113
  }) => Promise<RecordHandle | null>;
101
114
  recordHandle?: RecordHandle;
102
115
  toJSON: (this: Recorder<E>) => SerializedRecorder<E>;
package/lib/recorder.js CHANGED
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=recorder.js.map
@@ -1,29 +1,28 @@
1
+ import EventEmitter from "node:events";
1
2
  import { createRecordExtraDataController } from "./record_extra_data_controller.js";
2
- import type { Recorder, GetSavePath } from "./recorder.js";
3
- export declare class Segment {
3
+ export type GetSavePath = (data: {
4
+ startTime: number;
5
+ }) => string;
6
+ export declare class Segment extends EventEmitter {
4
7
  extraDataController: ReturnType<typeof createRecordExtraDataController> | null;
5
8
  init: boolean;
6
9
  getSavePath: GetSavePath;
7
- owner: string;
8
- title: string;
9
- recorder: Recorder;
10
10
  /** 原始的ffmpeg文件名,用于重命名 */
11
11
  rawRecordingVideoPath: string;
12
12
  /** 输出文件名名,不包含拓展名 */
13
13
  outputVideoFilePath: string;
14
- constructor(recorder: Recorder, getSavePath: GetSavePath, owner: string, title: string);
14
+ disableDanma: boolean;
15
+ constructor(getSavePath: GetSavePath, disableDanma: boolean);
15
16
  handleSegmentEnd(): Promise<void>;
16
17
  onSegmentStart(stderrLine: string): Promise<void>;
17
18
  }
18
- export declare class StreamManager {
19
- private segmentManager;
19
+ export declare class StreamManager extends EventEmitter {
20
+ private segment;
20
21
  private extraDataController;
21
- recorder: Recorder;
22
- owner: string;
23
- title: string;
24
22
  recordSavePath: string;
25
- constructor(recorder: Recorder, getSavePath: GetSavePath, owner: string, title: string, recordSavePath: string, hasSegment: boolean);
26
- handleVideoStarted(stderrLine?: string): Promise<void>;
23
+ recordStartTime?: number;
24
+ constructor(getSavePath: GetSavePath, hasSegment: boolean, disableDanma: boolean);
25
+ handleVideoStarted(stderrLine: string): Promise<void>;
27
26
  handleVideoCompleted(): Promise<void>;
28
27
  getExtraDataController(): import("./record_extra_data_controller.js").RecordExtraDataController | null;
29
28
  get videoFilePath(): string;
@@ -1,41 +1,38 @@
1
+ import EventEmitter from "node:events";
1
2
  import fs from "fs-extra";
2
3
  import { createRecordExtraDataController } from "./record_extra_data_controller.js";
3
- import { replaceExtName, ensureFolderExist } from "./utils.js";
4
- export class Segment {
4
+ import { replaceExtName, ensureFolderExist, isFfmpegStartSegment, isFfmpegStart } from "./utils.js";
5
+ export class Segment extends EventEmitter {
5
6
  extraDataController = null;
6
7
  init = true;
7
8
  getSavePath;
8
- owner;
9
- title;
10
- recorder;
11
9
  /** 原始的ffmpeg文件名,用于重命名 */
12
10
  rawRecordingVideoPath;
13
11
  /** 输出文件名名,不包含拓展名 */
14
12
  outputVideoFilePath;
15
- constructor(recorder, getSavePath, owner, title) {
13
+ disableDanma;
14
+ constructor(getSavePath, disableDanma) {
15
+ super();
16
16
  this.getSavePath = getSavePath;
17
- this.owner = owner;
18
- this.title = title;
19
- this.recorder = recorder;
17
+ this.disableDanma = disableDanma;
20
18
  }
21
19
  async handleSegmentEnd() {
22
20
  if (!this.outputVideoFilePath) {
23
- this.recorder.emit("DebugLog", {
21
+ this.emit("DebugLog", {
24
22
  type: "common",
25
23
  text: "Should call onSegmentStart first",
26
24
  });
27
25
  return;
28
26
  }
29
- this.extraDataController?.setMeta({ recordStopTimestamp: Date.now() });
30
27
  try {
31
28
  await Promise.all([
32
29
  fs.rename(this.rawRecordingVideoPath, `${this.outputVideoFilePath}.ts`),
33
30
  this.extraDataController?.flush(),
34
31
  ]);
35
- this.recorder.emit("videoFileCompleted", { filename: `${this.outputVideoFilePath}.ts` });
32
+ this.emit("videoFileCompleted", { filename: `${this.outputVideoFilePath}.ts` });
36
33
  }
37
34
  catch (err) {
38
- this.recorder.emit("DebugLog", {
35
+ this.emit("DebugLog", {
39
36
  type: "common",
40
37
  text: "videoFileCompleted error " + String(err),
41
38
  });
@@ -48,72 +45,83 @@ export class Segment {
48
45
  this.init = false;
49
46
  const startTime = Date.now();
50
47
  this.outputVideoFilePath = this.getSavePath({
51
- owner: this.owner,
52
- title: this.title,
53
48
  startTime: startTime,
54
49
  });
55
50
  ensureFolderExist(this.outputVideoFilePath);
56
- this.extraDataController = createRecordExtraDataController(`${this.outputVideoFilePath}.json`);
57
- this.extraDataController.setMeta({ title: this.title, user_name: this.owner });
51
+ if (!this.disableDanma) {
52
+ this.extraDataController = createRecordExtraDataController(`${this.outputVideoFilePath}.json`);
53
+ }
58
54
  const regex = /'([^']+)'/;
59
55
  const match = stderrLine.match(regex);
60
56
  if (match) {
61
57
  const filename = match[1];
62
58
  this.rawRecordingVideoPath = filename;
63
- this.recorder.emit("videoFileCreated", { filename: `${this.outputVideoFilePath}.ts` });
59
+ this.emit("videoFileCreated", { filename: `${this.outputVideoFilePath}.ts` });
64
60
  }
65
61
  else {
66
- this.recorder.emit("DebugLog", { type: "ffmpeg", text: "No match found" });
62
+ this.emit("DebugLog", { type: "ffmpeg", text: "No match found" });
67
63
  }
68
64
  }
69
65
  }
70
- export class StreamManager {
71
- segmentManager = null;
66
+ export class StreamManager extends EventEmitter {
67
+ segment = null;
72
68
  extraDataController = null;
73
- recorder;
74
- owner;
75
- title;
76
69
  recordSavePath;
77
- constructor(recorder, getSavePath, owner, title, recordSavePath, hasSegment) {
70
+ recordStartTime;
71
+ constructor(getSavePath, hasSegment, disableDanma) {
72
+ super();
73
+ const recordSavePath = getSavePath({ startTime: Date.now() });
78
74
  this.recordSavePath = recordSavePath;
79
- this.recorder = recorder;
80
- this.owner = owner;
81
- this.title = title;
82
75
  if (hasSegment) {
83
- this.segmentManager = new Segment(recorder, getSavePath, owner, title);
76
+ this.segment = new Segment(getSavePath, disableDanma);
77
+ this.segment.on("DebugLog", (data) => {
78
+ this.emit("DebugLog", data);
79
+ });
80
+ this.segment.on("videoFileCreated", (data) => {
81
+ this.emit("videoFileCreated", data);
82
+ });
83
+ this.segment.on("videoFileCompleted", (data) => {
84
+ this.emit("videoFileCompleted", data);
85
+ });
84
86
  }
85
87
  else {
86
88
  const extraDataSavePath = replaceExtName(recordSavePath, ".json");
87
- this.extraDataController = createRecordExtraDataController(extraDataSavePath);
88
- this.extraDataController.setMeta({ title, user_name: owner });
89
- // TODO: 增加platform参数,直播开始时间
89
+ if (!disableDanma) {
90
+ this.extraDataController = createRecordExtraDataController(extraDataSavePath);
91
+ }
90
92
  }
91
93
  }
92
94
  async handleVideoStarted(stderrLine) {
93
- if (this.segmentManager) {
94
- if (stderrLine) {
95
- await this.segmentManager.onSegmentStart(stderrLine);
95
+ if (this.segment) {
96
+ if (isFfmpegStartSegment(stderrLine)) {
97
+ await this.segment.onSegmentStart(stderrLine);
96
98
  }
97
99
  }
98
100
  else {
99
- this.recorder.emit("videoFileCreated", { filename: this.videoFilePath });
101
+ // 不能直接在onStart回调进行判断,在某些情况下会链接无法录制的情况
102
+ if (isFfmpegStart(stderrLine)) {
103
+ if (this.recordStartTime)
104
+ return;
105
+ this.recordStartTime = Date.now();
106
+ this.emit("videoFileCreated", { filename: this.videoFilePath });
107
+ }
100
108
  }
101
109
  }
102
110
  async handleVideoCompleted() {
103
- if (this.segmentManager) {
104
- await this.segmentManager.handleSegmentEnd();
111
+ if (this.segment) {
112
+ await this.segment.handleSegmentEnd();
105
113
  }
106
114
  else {
107
- this.getExtraDataController()?.setMeta({ recordStopTimestamp: Date.now() });
108
- await this.getExtraDataController()?.flush();
109
- this.recorder.emit("videoFileCompleted", { filename: this.videoFilePath });
115
+ if (this.recordStartTime) {
116
+ await this.getExtraDataController()?.flush();
117
+ this.emit("videoFileCompleted", { filename: this.videoFilePath });
118
+ }
110
119
  }
111
120
  }
112
121
  getExtraDataController() {
113
- return this.segmentManager?.extraDataController || this.extraDataController;
122
+ return this.segment?.extraDataController || this.extraDataController;
114
123
  }
115
124
  get videoFilePath() {
116
- return this.segmentManager ? `${this.recordSavePath}-PART%03d.ts` : `${this.recordSavePath}.ts`;
125
+ return this.segment ? `${this.recordSavePath}-PART%03d.ts` : `${this.recordSavePath}.ts`;
117
126
  }
118
127
  }
119
- //# sourceMappingURL=streamManager.js.map
package/lib/utils.d.ts CHANGED
@@ -36,13 +36,22 @@ export declare function assertObjectType(data: unknown, msg?: string): asserts d
36
36
  export declare function formatDate(date: Date, format: string): string;
37
37
  export declare function removeSystemReservedChars(filename: string): string;
38
38
  export declare function isFfmpegStartSegment(line: string): boolean;
39
+ export declare function isFfmpegStart(line: string): boolean;
39
40
  export declare const formatTemplate: (string: string, ...args: any[]) => string;
40
- export declare function createInvalidStreamChecker(): (ffmpegLogLine: string) => boolean;
41
+ export declare function createInvalidStreamChecker(count?: number): (ffmpegLogLine: string) => boolean;
41
42
  export declare function createTimeoutChecker(onTimeout: () => void, time: number): {
42
43
  update: () => void;
43
44
  stop: () => void;
44
45
  };
45
- declare function downloadImage(imageUrl: string, savePath: string): Promise<void>;
46
+ export declare function downloadImage(imageUrl: string, savePath: string): Promise<void>;
47
+ /**
48
+ * 根据指定的顺序对对象数组进行排序
49
+ * @param objects 要排序的对象数组
50
+ * @param order 指定的顺序
51
+ * @param key 用于排序的键
52
+ * @returns 排序后的对象数组
53
+ */
54
+ export declare function sortByKeyOrder<T, K extends keyof T>(objects: T[], order: T[K][], key: K): T[];
46
55
  declare const _default: {
47
56
  replaceExtName: typeof replaceExtName;
48
57
  singleton: typeof singleton;
@@ -58,5 +67,7 @@ declare const _default: {
58
67
  createTimeoutChecker: typeof createTimeoutChecker;
59
68
  downloadImage: typeof downloadImage;
60
69
  md5: (str: string) => string;
70
+ uuid: () => `${string}-${string}-${string}-${string}-${string}`;
71
+ sortByKeyOrder: typeof sortByKeyOrder;
61
72
  };
62
73
  export default _default;
package/lib/utils.js CHANGED
@@ -126,6 +126,9 @@ export function removeSystemReservedChars(filename) {
126
126
  export function isFfmpegStartSegment(line) {
127
127
  return line.includes("Opening ") && line.includes("for writing");
128
128
  }
129
+ export function isFfmpegStart(line) {
130
+ return line.includes("frame=") && line.includes("fps=");
131
+ }
129
132
  export const formatTemplate = function template(string, ...args) {
130
133
  const nargs = /\{([0-9a-zA-Z_]+)\}/g;
131
134
  let params;
@@ -152,7 +155,7 @@ export const formatTemplate = function template(string, ...args) {
152
155
  }
153
156
  });
154
157
  };
155
- export function createInvalidStreamChecker() {
158
+ export function createInvalidStreamChecker(count = 15) {
156
159
  let prevFrame = 0;
157
160
  let frameUnchangedCount = 0;
158
161
  return (ffmpegLogLine) => {
@@ -161,7 +164,7 @@ export function createInvalidStreamChecker() {
161
164
  const [, frameText] = streamInfo;
162
165
  const frame = Number(frameText);
163
166
  if (frame === prevFrame) {
164
- if (++frameUnchangedCount >= 10) {
167
+ if (++frameUnchangedCount >= count) {
165
168
  return true;
166
169
  }
167
170
  }
@@ -171,9 +174,6 @@ export function createInvalidStreamChecker() {
171
174
  }
172
175
  return false;
173
176
  }
174
- if (ffmpegLogLine.includes("HTTP error 404 Not Found")) {
175
- return true;
176
- }
177
177
  return false;
178
178
  };
179
179
  }
@@ -201,7 +201,7 @@ export function createTimeoutChecker(onTimeout, time) {
201
201
  },
202
202
  };
203
203
  }
204
- async function downloadImage(imageUrl, savePath) {
204
+ export async function downloadImage(imageUrl, savePath) {
205
205
  const res = await fetch(imageUrl);
206
206
  if (!res.body) {
207
207
  throw new Error("No body in response");
@@ -213,6 +213,24 @@ async function downloadImage(imageUrl, savePath) {
213
213
  const md5 = (str) => {
214
214
  return crypto.createHash("md5").update(str).digest("hex");
215
215
  };
216
+ const uuid = () => {
217
+ return crypto.randomUUID();
218
+ };
219
+ /**
220
+ * 根据指定的顺序对对象数组进行排序
221
+ * @param objects 要排序的对象数组
222
+ * @param order 指定的顺序
223
+ * @param key 用于排序的键
224
+ * @returns 排序后的对象数组
225
+ */
226
+ export function sortByKeyOrder(objects, order, key) {
227
+ const orderMap = new Map(order.map((value, index) => [value, index]));
228
+ return [...objects].sort((a, b) => {
229
+ const indexA = orderMap.get(a[key]) ?? Number.MAX_VALUE;
230
+ const indexB = orderMap.get(b[key]) ?? Number.MAX_VALUE;
231
+ return indexA - indexB;
232
+ });
233
+ }
216
234
  export default {
217
235
  replaceExtName,
218
236
  singleton,
@@ -228,5 +246,6 @@ export default {
228
246
  createTimeoutChecker,
229
247
  downloadImage,
230
248
  md5,
249
+ uuid,
250
+ sortByKeyOrder,
231
251
  };
232
- //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bililive-tools/manager",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Batch scheduling recorders",
5
5
  "main": "./lib/index.js",
6
6
  "type": "module",
@@ -22,6 +22,12 @@
22
22
  "files": [
23
23
  "lib"
24
24
  ],
25
+ "keywords": [
26
+ "bililive-tools",
27
+ "manager",
28
+ "scheduling",
29
+ "recorders"
30
+ ],
25
31
  "repository": "https://github.com/renmu123/biliLive-tools",
26
32
  "author": "renmu123",
27
33
  "license": "LGPL",
@@ -30,7 +36,10 @@
30
36
  "fast-xml-parser": "^4.5.0",
31
37
  "filenamify": "^6.0.0",
32
38
  "mitt": "^3.0.1",
33
- "string-argv": "^0.3.2"
39
+ "string-argv": "^0.3.2",
40
+ "lodash-es": "^4.17.21",
41
+ "axios": "^1.7.8",
42
+ "fs-extra": "^11.2.0"
34
43
  },
35
44
  "scripts": {
36
45
  "build": "pnpm run test && tsc",
package/lib/api.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEpC,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;IAC7B,OAAO,EAAE,IAAI;IACb,kDAAkD;IAClD,8FAA8F;IAC9F,KAAK,EAAE,KAAK;CACb,CAAC,CAAC;AAiBH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAqB,OAAc;IAC9E,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAiB7B,mEAAmE,EAAE;QACrE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;KAC1B,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,yBAAyB,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAE/F,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC;QAClC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE,WAAW,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
package/lib/common.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../src/common.ts"],"names":[],"mappings":"AAIA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAU,CAAC;AACjF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAU,CAAC;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAU,CAAC"}
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAIlC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,CAAC;AAEjB;;GAEG;AAEH,MAAM,UAAU,eAAe,CAC7B,QAA6B,EAC7B,IAA2B;IAE3B,OAAO,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAA6B,EAC7B,QAAqB;IAErB,aAAa;IACb,OAAO;QACL,UAAU,EAAE,QAAQ,CAAC,EAAE;QACvB,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChB,IAAI;YACJ,WAAW;YACX,OAAO;YACP,SAAS;YACT,kBAAkB;YAClB,SAAS;YACT,kBAAkB;YAClB,kBAAkB;YAClB,OAAO;YACP,SAAS;YACT,aAAa;YACb,WAAW;YACX,eAAe;YACf,qCAAqC;YACrC,UAAU;YACV,KAAK;SACN,CAAC;KACH,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,kDAAkD;AAClD,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,IAAI,UAAU,GAAW,QAAQ,CAAC;AAClC,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,UAAU,GAAG,OAAO,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAA+B,EAAE,EAAE;IACxE,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;AACzB,CAAC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAsB,QAA6B;IAClF,yBAAyB;IACzB,OAAO,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC;AAC5B,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"record_extra_data_controller.js","sourceRoot":"","sources":["../src/record_extra_data_controller.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyB3C,MAAM,UAAU,+BAA+B,CAAC,QAAgB;IAC9D,MAAM,IAAI,GAAoB;QAC5B,IAAI,EAAE;YACJ,oBAAoB,EAAE,IAAI,CAAC,GAAG,EAAE;SACjC;QACD,QAAQ,EAAE,EAAE;KACb,CAAC;IAEF,MAAM,YAAY,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE;QACrD,0BAA0B,EAAE,IAAI;KACjC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,0BAA0B;IAC1B,MAAM,UAAU,GAA4C,CAAC,OAAO,EAAE,EAAE;QACtE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAyC,CAAC,IAAI,EAAE,EAAE;QAC7D,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,IAAI,CAAC,IAAI;YACZ,GAAG,IAAI;SACR,CAAC;QACF,YAAY,EAAE,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,KAAK,GAAuC,KAAK,IAAI,EAAE;QAC3D,YAAY,CAAC,KAAK,EAAE,CAAC;QACrB,YAAY,CAAC,MAAM,EAAE,CAAC;QAEtB,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;QACpE,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,UAAU;QACV,OAAO;QACP,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,IAAqB;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC;IAE3B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC;QAC7B,gBAAgB,EAAE,KAAK;QACvB,mBAAmB,EAAE,IAAI;QACzB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;SAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;SACzC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,EAAE,oBAAoB,CAAC,GAAG,IAAI,CAAC;QACzE,MAAM,IAAI,GAAG;YACX,KAAK,EAAE,EAAE;YACT,YAAY,EAAE,QAAQ;YACtB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC;YAC/B,YAAY,EAAE,MAAM,CAAC,EAAE,CAAC;YACxB,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC1E,WAAW,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;YACrC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,IAAI,EAAE,CAAC;YAChC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;YACnB,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YACrB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;SAClC,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG;YACZ,IAAI,CAAC,YAAY,CAAC;YAClB,IAAI,CAAC,QAAQ,CAAC;YACd,IAAI,CAAC,YAAY,CAAC;YAClB,IAAI,CAAC,SAAS,CAAC;YACf,IAAI,CAAC,SAAS,CAAC;YACf,IAAI,CAAC,QAAQ,CAAC;YACd,IAAI,CAAC,WAAW,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC;YACb,IAAI,CAAC,UAAU,CAAC;SACjB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEL,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;SAC3C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,EAAE,oBAAoB,CAAC,GAAG,IAAI,CAAC;QACzE,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACnC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;YACjC,gCAAgC;SACjC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;SAC7B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC;SAC5C,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,EAAE,oBAAoB,CAAC,GAAG,IAAI,CAAC;QACzE,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACnC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;YACjC,gCAAgC;SACjC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEL,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ;SAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;SACvC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACX,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,EAAE,oBAAoB,CAAC,GAAG,IAAI,CAAC;QACzE,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC;YACnC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;YAC9B,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAChC,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC;YAClC,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC;YACjC,gCAAgC;SACjC,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACL,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAC/B,CAAC,EAAE;YACD,QAAQ,EAAE;gBACR,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,gBAAgB,EAAE,QAAQ,CAAC,oBAAoB;gBAC/C,eAAe,EAAE,QAAQ,CAAC,kBAAkB;gBAC5C,UAAU,EAAE,QAAQ,CAAC,KAAK;gBAC1B,SAAS,EAAE,QAAQ,CAAC,SAAS;gBAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;aAC1B;YACD,CAAC,EAAE,QAAQ;YACX,IAAI,EAAE,KAAK;YACX,EAAE,EAAE,UAAU;YACd,KAAK,EAAE,SAAS;SACjB;KACF,CAAC,CAAC;IACH,OAAO;EACP,UAAU,EAAE,CAAC;AACf,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- {"version":3,"file":"streamManager.js","sourceRoot":"","sources":["../src/streamManager.ts"],"names":[],"mappings":"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"}
package/lib/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}