@bililive-tools/manager 1.0.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/lib/utils.js ADDED
@@ -0,0 +1,232 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { Readable } from "node:stream";
5
+ import { finished } from "node:stream/promises";
6
+ import { throttle, range } from "lodash-es";
7
+ import filenamify from "filenamify";
8
+ export function asyncThrottle(fn, time, opts = {}) {
9
+ let savingPromise = null;
10
+ let hasDeferred = false;
11
+ const wrappedWithAllowDefer = () => {
12
+ if (savingPromise != null) {
13
+ hasDeferred = true;
14
+ return;
15
+ }
16
+ savingPromise = fn().finally(() => {
17
+ savingPromise = null;
18
+ if (hasDeferred) {
19
+ hasDeferred = false;
20
+ if (opts.immediateRunWhenEndOfDefer) {
21
+ wrappedWithAllowDefer();
22
+ }
23
+ else {
24
+ throttled();
25
+ }
26
+ }
27
+ });
28
+ };
29
+ const throttled = throttle(wrappedWithAllowDefer, time);
30
+ return throttled;
31
+ }
32
+ export function replaceExtName(filePath, newExtName) {
33
+ return path.join(path.dirname(filePath), path.basename(filePath, path.extname(filePath)) + newExtName);
34
+ }
35
+ /**
36
+ * 接收 fn ,返回一个和 fn 签名一致的函数 fn'。当已经有一个 fn' 在运行时,再调用
37
+ * fn' 会直接返回运行中 fn' 的 Promise,直到 Promise 结束 pending 状态
38
+ */
39
+ export function singleton(fn) {
40
+ let latestPromise = null;
41
+ return function (...args) {
42
+ if (latestPromise)
43
+ return latestPromise;
44
+ // @ts-ignore
45
+ const promise = fn.apply(this, args).finally(() => {
46
+ if (promise === latestPromise) {
47
+ latestPromise = null;
48
+ }
49
+ });
50
+ latestPromise = promise;
51
+ return promise;
52
+ };
53
+ }
54
+ /**
55
+ * 从数组中按照特定算法提取一些值(允许同个索引重复提取)。
56
+ * 算法的行为类似 flex 的 space-between。
57
+ *
58
+ * examples:
59
+ * ```
60
+ * console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 1))
61
+ * // [1]
62
+ * console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 3))
63
+ * // [1, 4, 7]
64
+ * console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 4))
65
+ * // [1, 3, 5, 7]
66
+ * console.log(getValuesFromArrayLikeFlexSpaceBetween([1, 2, 3, 4, 5, 6, 7], 11))
67
+ * // [1, 1, 2, 3, 3, 4, 5, 5, 6, 7, 7]
68
+ * ```
69
+ */
70
+ export function getValuesFromArrayLikeFlexSpaceBetween(array, columnCount) {
71
+ if (columnCount < 1)
72
+ return [];
73
+ if (columnCount === 1)
74
+ return [array[0]];
75
+ const spacingCount = columnCount - 1;
76
+ const spacingLength = array.length / spacingCount;
77
+ const columns = range(1, columnCount + 1);
78
+ const columnValues = columns.map((column, idx, columns) => {
79
+ // 首个和最后的列是特殊的,因为它们不在范围内,而是在两端
80
+ if (idx === 0) {
81
+ return array[0];
82
+ }
83
+ else if (idx === columns.length - 1) {
84
+ return array[array.length - 1];
85
+ }
86
+ const beforeSpacingCount = column - 1;
87
+ const colPos = beforeSpacingCount * spacingLength;
88
+ return array[Math.floor(colPos)];
89
+ });
90
+ return columnValues;
91
+ }
92
+ export function ensureFolderExist(fileOrFolderPath) {
93
+ const folder = path.dirname(fileOrFolderPath);
94
+ if (!fs.existsSync(folder)) {
95
+ fs.mkdirSync(folder, { recursive: true });
96
+ }
97
+ }
98
+ export function assert(assertion, msg) {
99
+ if (!assertion) {
100
+ throw new Error(msg);
101
+ }
102
+ }
103
+ export function assertStringType(data, msg) {
104
+ assert(typeof data === "string", msg);
105
+ }
106
+ export function assertNumberType(data, msg) {
107
+ assert(typeof data === "number", msg);
108
+ }
109
+ export function assertObjectType(data, msg) {
110
+ assert(typeof data === "object", msg);
111
+ }
112
+ export function formatDate(date, format) {
113
+ const map = {
114
+ yyyy: date.getFullYear().toString(),
115
+ MM: (date.getMonth() + 1).toString().padStart(2, "0"),
116
+ dd: date.getDate().toString().padStart(2, "0"),
117
+ HH: date.getHours().toString().padStart(2, "0"),
118
+ mm: date.getMinutes().toString().padStart(2, "0"),
119
+ ss: date.getSeconds().toString().padStart(2, "0"),
120
+ };
121
+ return format.replace(/yyyy|MM|dd|HH|mm|ss/g, (matched) => map[matched]);
122
+ }
123
+ export function removeSystemReservedChars(filename) {
124
+ return filenamify(filename, { replacement: "_" });
125
+ }
126
+ export function isFfmpegStartSegment(line) {
127
+ return line.includes("Opening ") && line.includes("for writing");
128
+ }
129
+ export const formatTemplate = function template(string, ...args) {
130
+ const nargs = /\{([0-9a-zA-Z_]+)\}/g;
131
+ let params;
132
+ if (args.length === 1 && typeof args[0] === "object") {
133
+ params = args[0];
134
+ }
135
+ else {
136
+ params = args;
137
+ }
138
+ if (!params || !params.hasOwnProperty) {
139
+ params = {};
140
+ }
141
+ return string.replace(nargs, function replaceArg(match, i, index) {
142
+ let result;
143
+ if (string[index - 1] === "{" && string[index + match.length] === "}") {
144
+ return i;
145
+ }
146
+ else {
147
+ result = Object.hasOwn(params, i) ? params[i] : null;
148
+ if (result === null || result === undefined) {
149
+ return "";
150
+ }
151
+ return result;
152
+ }
153
+ });
154
+ };
155
+ export function createInvalidStreamChecker() {
156
+ let prevFrame = 0;
157
+ let frameUnchangedCount = 0;
158
+ return (ffmpegLogLine) => {
159
+ const streamInfo = ffmpegLogLine.match(/frame=\s*(\d+) fps=.*? q=.*? size=.*? time=.*? bitrate=.*? speed=.*?/);
160
+ if (streamInfo != null) {
161
+ const [, frameText] = streamInfo;
162
+ const frame = Number(frameText);
163
+ if (frame === prevFrame) {
164
+ if (++frameUnchangedCount >= 10) {
165
+ return true;
166
+ }
167
+ }
168
+ else {
169
+ prevFrame = frame;
170
+ frameUnchangedCount = 0;
171
+ }
172
+ return false;
173
+ }
174
+ if (ffmpegLogLine.includes("HTTP error 404 Not Found")) {
175
+ return true;
176
+ }
177
+ return false;
178
+ };
179
+ }
180
+ export function createTimeoutChecker(onTimeout, time) {
181
+ let timer = null;
182
+ let stopped = false;
183
+ const update = () => {
184
+ if (stopped)
185
+ return;
186
+ if (timer != null)
187
+ clearTimeout(timer);
188
+ timer = setTimeout(() => {
189
+ timer = null;
190
+ onTimeout();
191
+ }, time);
192
+ };
193
+ update();
194
+ return {
195
+ update,
196
+ stop() {
197
+ stopped = true;
198
+ if (timer != null)
199
+ clearTimeout(timer);
200
+ timer = null;
201
+ },
202
+ };
203
+ }
204
+ async function downloadImage(imageUrl, savePath) {
205
+ const res = await fetch(imageUrl);
206
+ if (!res.body) {
207
+ throw new Error("No body in response");
208
+ }
209
+ const fileStream = fs.createWriteStream(savePath, { flags: "wx" });
210
+ // @ts-ignore
211
+ await finished(Readable.fromWeb(res.body).pipe(fileStream));
212
+ }
213
+ const md5 = (str) => {
214
+ return crypto.createHash("md5").update(str).digest("hex");
215
+ };
216
+ export default {
217
+ replaceExtName,
218
+ singleton,
219
+ getValuesFromArrayLikeFlexSpaceBetween,
220
+ ensureFolderExist,
221
+ assert,
222
+ assertStringType,
223
+ assertNumberType,
224
+ assertObjectType,
225
+ asyncThrottle,
226
+ isFfmpegStartSegment,
227
+ createInvalidStreamChecker,
228
+ createTimeoutChecker,
229
+ downloadImage,
230
+ md5,
231
+ };
232
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@bililive-tools/manager",
3
+ "version": "1.0.0",
4
+ "description": "Batch scheduling recorders",
5
+ "main": "./lib/index.js",
6
+ "type": "module",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./src/index.ts",
10
+ "development": "./src/index.ts",
11
+ "default": "./lib/index.js"
12
+ },
13
+ "./*.js": {
14
+ "types": "./src/*.ts",
15
+ "development": "./src/*.ts",
16
+ "default": "./lib/*.js"
17
+ }
18
+ },
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "files": [
23
+ "lib"
24
+ ],
25
+ "repository": "https://github.com/renmu123/biliLive-tools",
26
+ "author": "renmu123",
27
+ "license": "LGPL",
28
+ "dependencies": {
29
+ "@renmu/fluent-ffmpeg": "2.3.2",
30
+ "fast-xml-parser": "^4.5.0",
31
+ "filenamify": "^6.0.0",
32
+ "mitt": "^3.0.1",
33
+ "string-argv": "^0.3.2"
34
+ },
35
+ "scripts": {
36
+ "build": "pnpm run test && tsc",
37
+ "watch": "tsc -w",
38
+ "test": "vitest run"
39
+ }
40
+ }