iobroker.eusec 1.2.0 → 1.3.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/LICENSE +1 -1
- package/README.md +47 -114
- package/admin/i18n/de/translations.json +252 -1
- package/admin/i18n/en/translations.json +252 -1
- package/admin/i18n/es/translations.json +252 -1
- package/admin/i18n/fr/translations.json +252 -1
- package/admin/i18n/it/translations.json +252 -1
- package/admin/i18n/nl/translations.json +252 -1
- package/admin/i18n/pl/translations.json +252 -1
- package/admin/i18n/pt/translations.json +252 -1
- package/admin/i18n/ru/translations.json +252 -1
- package/admin/i18n/uk/translations.json +275 -24
- package/admin/i18n/zh-cn/translations.json +252 -1
- package/admin/jsonConfig.json +1015 -0
- package/admin/words.js +3297 -17
- package/build/lib/log.js +1 -0
- package/build/lib/log.js.map +1 -1
- package/build/lib/types.js +6 -5
- package/build/lib/types.js.map +2 -2
- package/build/lib/utils.js +51 -41
- package/build/lib/utils.js.map +2 -2
- package/build/lib/video.js +148 -20
- package/build/lib/video.js.map +3 -3
- package/build/main.js +550 -169
- package/build/main.js.map +3 -3
- package/io-package.json +51 -52
- package/package.json +40 -37
- package/build/lib/tools.js +0 -94
- package/build/lib/tools.js.map +0 -7
- package/build/lib/web.js +0 -64
- package/build/lib/web.js.map +0 -7
package/build/lib/log.js
CHANGED
package/build/lib/log.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/log.ts"],
|
|
4
4
|
"sourcesContent": ["import { Logger } from \"ts-log\";\r\n\r\nexport class ioBrokerLogger implements Logger {\r\n\r\n private readonly log: ioBroker.Logger;\r\n\r\n public constructor(log: ioBroker.Logger) {\r\n this.log = log;\r\n }\r\n\r\n private _getStack(): any {\r\n const _prepareStackTrace = Error.prepareStackTrace;\r\n Error.prepareStackTrace = (_, stack) => stack;\r\n const stack = new Error().stack?.slice(3);\r\n Error.prepareStackTrace = _prepareStackTrace;\r\n return stack;\r\n }\r\n\r\n private _getMessage(message?: string, hideTag = false, optionalParams?: any[]): string {\r\n const msg = message ? message : \"\";\r\n const stack = this._getStack();\r\n const typeName = stack[0].getTypeName() !== null ? stack[0].getTypeName() : \"\";\r\n const functionName = stack[0].getFunctionName() !== null ? `${stack[0].getFunctionName()}` : \"\";\r\n let tag = \"\";\r\n if (typeName !== \"\" && !hideTag) {\r\n tag = `[${typeName}`;\r\n if (functionName !== \"\") {\r\n tag = `${tag}.${functionName}] `;\r\n } else {\r\n tag = `${tag}] `;\r\n }\r\n }\r\n\r\n if (optionalParams && optionalParams.length > 0) {\r\n return `${tag}${msg} ${JSON.stringify(optionalParams)}`;\r\n }\r\n return `${tag}${msg}`;\r\n }\r\n\r\n public trace(message?: string, ...optionalParams: any[]): void {\r\n this.log.silly(this._getMessage(message, false, optionalParams));\r\n }\r\n\r\n public debug(message?: string, ...optionalParams: any[]): void {\r\n this.log.debug(this._getMessage(message, false, optionalParams));\r\n }\r\n\r\n public info(message?: string, ...optionalParams: any[]): void {\r\n this.log.info(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n public warn(message?: string, ...optionalParams: any[]): void {\r\n this.log.warn(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n public error(message?: string, ...optionalParams: any[]): void {\r\n this.log.error(this._getMessage(message, true, optionalParams));\r\n }\r\n\r\n}"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,eAAiC;AAAA,
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEO,MAAM,eAAiC;AAAA,EAEzB;AAAA,EAEV,YAAY,KAAsB;AACrC,SAAK,MAAM;AAAA,EACf;AAAA,EAEQ,YAAiB;AAV7B;AAWQ,UAAM,qBAAqB,MAAM;AACjC,UAAM,oBAAoB,CAAC,GAAGA,WAAUA;AACxC,UAAM,SAAQ,SAAI,MAAM,EAAE,UAAZ,mBAAmB,MAAM;AACvC,UAAM,oBAAoB;AAC1B,WAAO;AAAA,EACX;AAAA,EAEQ,YAAY,SAAkB,UAAU,OAAO,gBAAgC;AACnF,UAAM,MAAM,UAAU,UAAU;AAChC,UAAM,QAAQ,KAAK,UAAU;AAC7B,UAAM,WAAW,MAAM,CAAC,EAAE,YAAY,MAAM,OAAO,MAAM,CAAC,EAAE,YAAY,IAAI;AAC5E,UAAM,eAAe,MAAM,CAAC,EAAE,gBAAgB,MAAM,OAAO,GAAG,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK;AAC7F,QAAI,MAAM;AACV,QAAI,aAAa,MAAM,CAAC,SAAS;AAC7B,YAAM,IAAI,QAAQ;AAClB,UAAI,iBAAiB,IAAI;AACrB,cAAM,GAAG,GAAG,IAAI,YAAY;AAAA,MAChC,OAAO;AACH,cAAM,GAAG,GAAG;AAAA,MAChB;AAAA,IACJ;AAEA,QAAI,kBAAkB,eAAe,SAAS,GAAG;AAC7C,aAAO,GAAG,GAAG,GAAG,GAAG,IAAI,KAAK,UAAU,cAAc,CAAC;AAAA,IACzD;AACA,WAAO,GAAG,GAAG,GAAG,GAAG;AAAA,EACvB;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,OAAO,cAAc,CAAC;AAAA,EACnE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,KAAK,YAAqB,gBAA6B;AAC1D,SAAK,IAAI,KAAK,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EACjE;AAAA,EAEO,MAAM,YAAqB,gBAA6B;AAC3D,SAAK,IAAI,MAAM,KAAK,YAAY,SAAS,MAAM,cAAc,CAAC;AAAA,EAClE;AAEJ;",
|
|
6
6
|
"names": ["stack"]
|
|
7
7
|
}
|
package/build/lib/types.js
CHANGED
|
@@ -28,10 +28,7 @@ __export(types_exports, {
|
|
|
28
28
|
module.exports = __toCommonJS(types_exports);
|
|
29
29
|
var import_eufy_security_client = require("eufy-security-client");
|
|
30
30
|
const DataLocation = {
|
|
31
|
-
|
|
32
|
-
LAST_LIVESTREAM: "last_live",
|
|
33
|
-
LAST_EVENT: "last_event",
|
|
34
|
-
TEMP: "tmp"
|
|
31
|
+
LAST_EVENT: "last_event"
|
|
35
32
|
};
|
|
36
33
|
const STREAM_FILE_NAME_EXT = ".m3u8";
|
|
37
34
|
const IMAGE_FILE_JPEG_EXT = ".jpg";
|
|
@@ -60,6 +57,9 @@ const RoleMapping = {
|
|
|
60
57
|
[import_eufy_security_client.PropertyName.DeviceChargingStatus]: "info.status"
|
|
61
58
|
};
|
|
62
59
|
const DeviceStateID = {
|
|
60
|
+
/*LAST_EVENT_PIC_URL: "last_event_pic_url",
|
|
61
|
+
LAST_EVENT_PIC_HTML: "last_event_pic_html",
|
|
62
|
+
LAST_EVENT_VIDEO_URL: "last_event_video_url",*/
|
|
63
63
|
LIVESTREAM: "livestream",
|
|
64
64
|
START_STREAM: "start_stream",
|
|
65
65
|
STOP_STREAM: "stop_stream",
|
|
@@ -77,7 +77,8 @@ const DeviceStateID = {
|
|
|
77
77
|
SET_DEFAULT_ANGLE: "set_default_angle",
|
|
78
78
|
SET_PRIVACY_ANGLE: "set_privacy_angle",
|
|
79
79
|
CALIBRATE: "calibrate",
|
|
80
|
-
UNLOCK: "unlock"
|
|
80
|
+
UNLOCK: "unlock",
|
|
81
|
+
OPEN_BOX: "open_box"
|
|
81
82
|
};
|
|
82
83
|
const StationStateID = {
|
|
83
84
|
REBOOT: "reboot",
|
package/build/lib/types.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/types.ts"],
|
|
4
|
-
"sourcesContent": ["import { PropertyName } from \"eufy-security-client\";\r\n\r\nimport { IRoleMapping } from \"./interfaces\";\r\n\r\nexport const DataLocation = {\r\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAA6B;AAItB,MAAM,eAAe;AAAA,EACxB,YAAY;
|
|
4
|
+
"sourcesContent": ["import { PropertyName } from \"eufy-security-client\";\r\n\r\nimport { IRoleMapping } from \"./interfaces\";\r\n\r\nexport const DataLocation = {\r\n LAST_EVENT: \"last_event\",\r\n}\r\n\r\nexport const STREAM_FILE_NAME_EXT = \".m3u8\";\r\nexport const IMAGE_FILE_JPEG_EXT = \".jpg\";\r\n\r\nexport const RoleMapping: IRoleMapping = {\r\n [PropertyName.Name]: \"info.name\",\r\n [PropertyName.StationMacAddress]: \"info.mac\",\r\n [PropertyName.StationLANIpAddress]: \"info.ip\",\r\n [PropertyName.DeviceState]: \"info.status\",\r\n [PropertyName.DeviceBattery]: \"value.battery\",\r\n [PropertyName.DeviceBatteryTemp]: \"value.temperature\",\r\n [PropertyName.DeviceMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DevicePersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceRinging]: \"sensor\",\r\n [PropertyName.DeviceCryingDetected]: \"sensor.noise\",\r\n [PropertyName.DeviceSoundDetected]: \"sensor.noise\",\r\n [PropertyName.DevicePetDetected]: \"sensor\",\r\n [PropertyName.DeviceSensorOpen]: \"sensor\",\r\n [PropertyName.DeviceBatteryLow]: \"indicator.lowbat\",\r\n [PropertyName.DeviceLockStatus]: \"info.status\",\r\n [PropertyName.DeviceDogLickDetected]: \"sensor\",\r\n [PropertyName.DeviceDogPoopDetected]: \"sensor\",\r\n [PropertyName.DeviceVehicleDetected]: \"sensor\",\r\n [PropertyName.DeviceRadarMotionDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceStrangerPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceIdentityPersonDetected]: \"sensor.motion\",\r\n [PropertyName.DeviceChargingStatus]: \"info.status\",\r\n}\r\n\r\nexport const DeviceStateID = {\r\n /*LAST_EVENT_PIC_URL: \"last_event_pic_url\",\r\n LAST_EVENT_PIC_HTML: \"last_event_pic_html\",\r\n LAST_EVENT_VIDEO_URL: \"last_event_video_url\",*/\r\n LIVESTREAM: \"livestream\",\r\n START_STREAM: \"start_stream\",\r\n STOP_STREAM: \"stop_stream\",\r\n RTSP_STREAM_URL: \"rtsp_stream_url\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n PICTURE_URL: \"picture_url\",\r\n PICTURE_HTML: \"picture_html\",\r\n LIVESTREAM_RTSP: \"livestream_rtsp\",\r\n PAN_LEFT: \"pan_left\",\r\n PAN_RIGHT: \"pan_right\",\r\n TILT_UP: \"tilt_up\",\r\n TILT_DOWN: \"titl_down\",\r\n ROTATE_360: \"rotate_360\",\r\n SET_DEFAULT_ANGLE: \"set_default_angle\",\r\n SET_PRIVACY_ANGLE: \"set_privacy_angle\",\r\n CALIBRATE: \"calibrate\",\r\n UNLOCK: \"unlock\",\r\n OPEN_BOX: \"open_box\",\r\n}\r\n\r\nexport const StationStateID = {\r\n REBOOT: \"reboot\",\r\n CONNECTION: \"connection\",\r\n TRIGGER_ALARM_SOUND: \"trigger_alarm_sound\",\r\n RESET_ALARM_SOUND: \"reset_alarm_sound\",\r\n}"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAA6B;AAItB,MAAM,eAAe;AAAA,EACxB,YAAY;AAChB;AAEO,MAAM,uBAAuB;AAC7B,MAAM,sBAAsB;AAE5B,MAAM,cAA4B;AAAA,EACrC,CAAC,yCAAa,IAAI,GAAG;AAAA,EACrB,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,mBAAmB,GAAG;AAAA,EACpC,CAAC,yCAAa,WAAW,GAAG;AAAA,EAC5B,CAAC,yCAAa,aAAa,GAAG;AAAA,EAC9B,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,aAAa,GAAG;AAAA,EAC9B,CAAC,yCAAa,oBAAoB,GAAG;AAAA,EACrC,CAAC,yCAAa,mBAAmB,GAAG;AAAA,EACpC,CAAC,yCAAa,iBAAiB,GAAG;AAAA,EAClC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,gBAAgB,GAAG;AAAA,EACjC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,qBAAqB,GAAG;AAAA,EACtC,CAAC,yCAAa,yBAAyB,GAAG;AAAA,EAC1C,CAAC,yCAAa,4BAA4B,GAAG;AAAA,EAC7C,CAAC,yCAAa,4BAA4B,GAAG;AAAA,EAC7C,CAAC,yCAAa,oBAAoB,GAAG;AACzC;AAEO,MAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIzB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACd;AAEO,MAAM,iBAAiB;AAAA,EAC1B,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,mBAAmB;AACvB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/build/lib/utils.js
CHANGED
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -27,13 +31,12 @@ __export(utils_exports, {
|
|
|
27
31
|
changeRole: () => changeRole,
|
|
28
32
|
convertCamelCaseToSnakeCase: () => convertCamelCaseToSnakeCase,
|
|
29
33
|
deleteStates: () => deleteStates,
|
|
30
|
-
getDataFilePath: () => getDataFilePath,
|
|
31
34
|
getImageAsHTML: () => getImageAsHTML,
|
|
35
|
+
getShortUrl: () => getShortUrl,
|
|
32
36
|
getVideoClipLength: () => getVideoClipLength,
|
|
33
37
|
handleUpdate: () => handleUpdate,
|
|
34
38
|
isEmpty: () => isEmpty,
|
|
35
39
|
lowestUnusedNumber: () => lowestUnusedNumber,
|
|
36
|
-
moveFiles: () => moveFiles,
|
|
37
40
|
removeFiles: () => removeFiles,
|
|
38
41
|
removeLastChar: () => removeLastChar,
|
|
39
42
|
setStateAsync: () => setStateAsync,
|
|
@@ -61,13 +64,6 @@ const getImageAsHTML = function(data, mime = "image/jpg") {
|
|
|
61
64
|
return `<img src="data:${mime};base64,${data.toString("base64")}" style="width: auto ;height: 100%;" />`;
|
|
62
65
|
return "";
|
|
63
66
|
};
|
|
64
|
-
const getDataFilePath = function(adapter, stationSerial, folderName, fileName) {
|
|
65
|
-
const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
|
|
66
|
-
if (!import_fs_extra.default.existsSync(dir_path)) {
|
|
67
|
-
import_fs_extra.default.mkdirSync(dir_path, { mode: 509, recursive: true });
|
|
68
|
-
}
|
|
69
|
-
return import_path.default.join(dir_path, fileName);
|
|
70
|
-
};
|
|
71
67
|
const setStateAsync = async function(adapter, state_id, common_name, value, role = "text", type = "string") {
|
|
72
68
|
await adapter.setObjectNotExistsAsync(state_id, {
|
|
73
69
|
type: "state",
|
|
@@ -83,34 +79,13 @@ const setStateAsync = async function(adapter, state_id, common_name, value, role
|
|
|
83
79
|
await adapter.setStateAsync(state_id, { val: value, ack: true });
|
|
84
80
|
};
|
|
85
81
|
const removeFiles = function(adapter, stationSerial, folderName, device_sn) {
|
|
86
|
-
return new Promise((resolve, reject) => {
|
|
87
|
-
try {
|
|
88
|
-
const dir_path = import_path.default.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);
|
|
89
|
-
if (import_fs_extra.default.existsSync(dir_path)) {
|
|
90
|
-
const files = import_fs_extra.default.readdirSync(dir_path).filter((fn) => fn.startsWith(device_sn));
|
|
91
|
-
try {
|
|
92
|
-
files.map((filename) => import_fs_extra.default.removeSync(import_path.default.join(dir_path, filename)));
|
|
93
|
-
} catch (error) {
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
resolve();
|
|
97
|
-
} catch (error) {
|
|
98
|
-
reject(error);
|
|
99
|
-
}
|
|
100
|
-
});
|
|
101
|
-
};
|
|
102
|
-
const moveFiles = function(adapter, stationSerial, device_sn, srcFolderName, dstFolderName) {
|
|
103
|
-
return new Promise((resolve, reject) => {
|
|
82
|
+
return new Promise(async (resolve, reject) => {
|
|
104
83
|
try {
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
import_fs_extra.default.mkdirSync(dirDstPath, { mode: 509, recursive: true });
|
|
109
|
-
}
|
|
110
|
-
if (import_fs_extra.default.existsSync(dirSrcPath)) {
|
|
111
|
-
const files = import_fs_extra.default.readdirSync(dirSrcPath).filter((fn) => fn.startsWith(device_sn));
|
|
84
|
+
const dir_path = import_path.default.join(stationSerial, folderName);
|
|
85
|
+
if (await adapter.fileExistsAsync(adapter.namespace, dir_path)) {
|
|
86
|
+
const files = (await adapter.readDirAsync(adapter.namespace, dir_path)).filter((fn) => fn.file.startsWith(device_sn));
|
|
112
87
|
try {
|
|
113
|
-
files.map((filename) =>
|
|
88
|
+
files.map((filename) => adapter.delFileAsync(adapter.namespace, import_path.default.join(dir_path, filename.file)));
|
|
114
89
|
} catch (error) {
|
|
115
90
|
}
|
|
116
91
|
}
|
|
@@ -189,8 +164,8 @@ const deleteStates = async function(adapter, property) {
|
|
|
189
164
|
await adapter.delObjectAsync(id).catch();
|
|
190
165
|
});
|
|
191
166
|
};
|
|
192
|
-
const handleUpdate = async function(adapter, log,
|
|
193
|
-
if (
|
|
167
|
+
const handleUpdate = async function(adapter, log, oldVersion, newVersion) {
|
|
168
|
+
if (oldVersion != 0 && oldVersion <= 0.61) {
|
|
194
169
|
try {
|
|
195
170
|
const all = await adapter.getStatesAsync("T*");
|
|
196
171
|
if (all) {
|
|
@@ -216,7 +191,7 @@ const handleUpdate = async function(adapter, log, old_version) {
|
|
|
216
191
|
log.error("Version 0.6.1: Error:", error);
|
|
217
192
|
}
|
|
218
193
|
}
|
|
219
|
-
if (
|
|
194
|
+
if (oldVersion != 0 && oldVersion <= 0.74) {
|
|
220
195
|
try {
|
|
221
196
|
await adapter.setObjectAsync("verify_code", {
|
|
222
197
|
type: "state",
|
|
@@ -233,7 +208,7 @@ const handleUpdate = async function(adapter, log, old_version) {
|
|
|
233
208
|
log.error("Version 0.7.4: Error:", error);
|
|
234
209
|
}
|
|
235
210
|
}
|
|
236
|
-
if (
|
|
211
|
+
if (oldVersion != 0 && oldVersion <= 1) {
|
|
237
212
|
for (const state of ["last_event_pic_url", "last_event_pic_html", "last_event_video_url"]) {
|
|
238
213
|
try {
|
|
239
214
|
await deleteStates(adapter, state);
|
|
@@ -242,24 +217,59 @@ const handleUpdate = async function(adapter, log, old_version) {
|
|
|
242
217
|
}
|
|
243
218
|
}
|
|
244
219
|
}
|
|
220
|
+
if (oldVersion == 0 && newVersion == 1.3) {
|
|
221
|
+
const data_dir = utils.getAbsoluteInstanceDataDir(adapter);
|
|
222
|
+
try {
|
|
223
|
+
const file = import_path.default.join(data_dir, "adapter.json");
|
|
224
|
+
if (import_fs_extra.default.statSync(file).isFile()) {
|
|
225
|
+
const fileContent = import_fs_extra.default.readFileSync(file, "utf8");
|
|
226
|
+
await adapter.writeFileAsync(adapter.namespace, "adapter.json", fileContent);
|
|
227
|
+
}
|
|
228
|
+
} catch (error) {
|
|
229
|
+
}
|
|
230
|
+
try {
|
|
231
|
+
const file = import_path.default.join(data_dir, "persistent.json");
|
|
232
|
+
if (import_fs_extra.default.statSync(file).isFile()) {
|
|
233
|
+
const fileContent = import_fs_extra.default.readFileSync(file, "utf8");
|
|
234
|
+
await adapter.writeFileAsync(adapter.namespace, "driver.json", fileContent);
|
|
235
|
+
}
|
|
236
|
+
} catch (error) {
|
|
237
|
+
}
|
|
238
|
+
try {
|
|
239
|
+
import_fs_extra.default.removeSync(data_dir);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
}
|
|
242
|
+
adapter.log.warn("Migrated configuration files to new location (needs restart). Restart of the adapter initiated.");
|
|
243
|
+
adapter.restartAdapter();
|
|
244
|
+
}
|
|
245
245
|
};
|
|
246
246
|
const convertCamelCaseToSnakeCase = function(value) {
|
|
247
247
|
return value.replace(/[A-Z]/g, (letter, index) => {
|
|
248
248
|
return index == 0 ? letter.toLowerCase() : "_" + letter.toLowerCase();
|
|
249
249
|
});
|
|
250
250
|
};
|
|
251
|
+
function getShortUrl(url, prefixUrl) {
|
|
252
|
+
if (url.password) {
|
|
253
|
+
url = new URL(url.toString());
|
|
254
|
+
url.password = "[redacted]";
|
|
255
|
+
}
|
|
256
|
+
let shortUrl = url.toString();
|
|
257
|
+
if (prefixUrl && shortUrl.startsWith(prefixUrl)) {
|
|
258
|
+
shortUrl = shortUrl.slice(prefixUrl.length);
|
|
259
|
+
}
|
|
260
|
+
return shortUrl;
|
|
261
|
+
}
|
|
251
262
|
// Annotate the CommonJS export names for ESM import in node:
|
|
252
263
|
0 && (module.exports = {
|
|
253
264
|
changeRole,
|
|
254
265
|
convertCamelCaseToSnakeCase,
|
|
255
266
|
deleteStates,
|
|
256
|
-
getDataFilePath,
|
|
257
267
|
getImageAsHTML,
|
|
268
|
+
getShortUrl,
|
|
258
269
|
getVideoClipLength,
|
|
259
270
|
handleUpdate,
|
|
260
271
|
isEmpty,
|
|
261
272
|
lowestUnusedNumber,
|
|
262
|
-
moveFiles,
|
|
263
273
|
removeFiles,
|
|
264
274
|
removeLastChar,
|
|
265
275
|
setStateAsync,
|
package/build/lib/utils.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { CommandType, Device } from \"eufy-security-client\";\r\nimport path from \"path\";\r\nimport fse from \"fs-extra\";\r\nimport * as utils from \"@iobroker/adapter-core\";\r\n\r\nimport { ioBrokerLogger } from \"./log\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const setStateChangedAsync = async function(adapter: ioBroker.Adapter, id: string, value: any): ioBroker.SetStateChangedPromise {\r\n return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch();\r\n};\r\n\r\nexport const isEmpty = function(str: string | null | undefined): boolean {\r\n if (str) {\r\n if (str.length > 0)\r\n return false;\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const getImageAsHTML = function(data: Buffer, mime = \"image/jpg\"): string {\r\n if (data && data.length > 0)\r\n return `<img src=\"data:${mime};base64,${data.toString(\"base64\")}\" style=\"width: auto ;height: 100%;\" />`;\r\n return \"\";\r\n}\r\n\r\nexport const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, fileName: string): string {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (!fse.existsSync(dir_path)) {\r\n fse.mkdirSync(dir_path, {mode: 0o775, recursive: true});\r\n }\r\n return path.join(dir_path, fileName);\r\n}\r\n\r\nexport const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = \"text\", type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"mixed\" | \"file\" | undefined = \"string\"): Promise<void> {\r\n await adapter.setObjectNotExistsAsync(state_id, {\r\n type: \"state\",\r\n common: {\r\n name: common_name,\r\n type: type,\r\n role: role,\r\n read: true,\r\n write: false,\r\n },\r\n native: {\r\n },\r\n });\r\n await adapter.setStateAsync(state_id, { val: value, ack: true });\r\n}\r\n\r\nexport const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (fse.existsSync(dir_path)) {\r\n const files = fse.readdirSync(dir_path).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.removeSync(path.join(dir_path, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const moveFiles = function(adapter: ioBroker.Adapter, stationSerial: string, device_sn: string, srcFolderName: string, dstFolderName: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dirSrcPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);\r\n const dirDstPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);\r\n if (!fse.existsSync(dirDstPath)) {\r\n fse.mkdirSync(dirDstPath, {mode: 0o775, recursive: true});\r\n }\r\n if (fse.existsSync(dirSrcPath)) {\r\n const files = fse.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.moveSync(path.join(dirSrcPath, filename), path.join(dirDstPath, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\nexport const lowestUnusedNumber = function (sequence: number[], startingFrom: number): number {\r\n const arr = sequence.slice(0);\r\n arr.sort((a, b) => a - b);\r\n return arr.reduce((lowest, num, i) => {\r\n const seqIndex = i + startingFrom;\r\n return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest\r\n }, arr.length + startingFrom);\r\n}\r\n\r\nexport const sleep = async (ms: number): Promise<void> => {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n};\r\n\r\nexport const getVideoClipLength = (device: Device): number => {\r\n let length = 60;\r\n const workingMode = device.getRawProperty(CommandType.CMD_SET_PIR_POWERMODE);\r\n if (workingMode !== undefined) {\r\n switch(workingMode) {\r\n case \"0\":\r\n if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())\r\n length = 20;\r\n else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())\r\n length = 30;\r\n break;\r\n case \"1\":\r\n // Corrisponds to 60 seconds\r\n break;\r\n case \"2\":\r\n const customValue = device.getRawProperty(CommandType.CMD_DEV_RECORD_TIMEOUT);\r\n if (customValue !== undefined) {\r\n try {\r\n length = Number.parseInt(customValue);\r\n } catch(error) {\r\n }\r\n }\r\n break;\r\n case \"3\":\r\n // Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)\r\n break;\r\n }\r\n }\r\n return length;\r\n};\r\n\r\nexport const removeLastChar = function(text: string, char: string): string {\r\n const strArr = [...text];\r\n strArr.splice(text.lastIndexOf(char), 1);\r\n return strArr.join(\"\");\r\n}\r\n\r\nexport const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise<void> {\r\n try {\r\n const states = await adapter.getStatesAsync(`*.${state}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.extendObjectAsync(id, {\r\n type: \"state\",\r\n common: {\r\n role: role\r\n }\r\n }, {}).catch();\r\n });\r\n } catch (error) {\r\n log.error(`state: ${state} role: ${role} - Error:`, error);\r\n }\r\n};\r\n\r\nexport const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise<void> {\r\n const states = await adapter.getStatesAsync(`*.${property}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.delObjectAsync(id).catch();\r\n });\r\n};\r\n\r\nexport const handleUpdate = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, old_version: number): Promise<void> {\r\n if (old_version <= 0.61) {\r\n try {\r\n const all = await adapter.getStatesAsync(\"T*\");\r\n if (all) {\r\n Object.keys(all).forEach(async id => {\r\n await adapter.delObjectAsync(id, { recursive: false }).catch();\r\n });\r\n }\r\n const channels = await adapter.getChannelsOfAsync();\r\n if (channels) {\r\n Object.values(channels).forEach(async channel => {\r\n if (channel.common.name !== \"info\") {\r\n await adapter.delObjectAsync(channel._id, {recursive: false}).catch();\r\n }\r\n });\r\n }\r\n const devices = await adapter.getDevicesAsync();\r\n if (devices) {\r\n Object.values(devices).forEach(async device => {\r\n await adapter.delObjectAsync(device._id, {recursive: false}).catch();\r\n });\r\n }\r\n } catch (error) {\r\n log.error(\"Version 0.6.1: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 0.74) {\r\n try {\r\n await adapter.setObjectAsync(\"verify_code\", {\r\n type: \"state\",\r\n common: {\r\n name: \"2FA verification code\",\r\n type: \"string\",\r\n role: \"state\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n } catch (error) {\r\n log.error(\"Version 0.7.4: Error:\", error);\r\n }\r\n }\r\n if (old_version <= 1) {\r\n for (const state of [\"last_event_pic_url\", \"last_event_pic_html\", \"last_event_video_url\"]) {\r\n try {\r\n await deleteStates(adapter, state);\r\n } catch (error) {\r\n log.error(`Version 1.0.0 - ${state}: Error:`, error);\r\n }\r\n }\r\n }\r\n};\r\n\r\nexport const convertCamelCaseToSnakeCase = function (value: string): string {\r\n return value.replace(/[A-Z]/g, (letter, index) => {\r\n return index == 0 ? letter.toLowerCase() : \"_\" + letter.toLowerCase();\r\n });\r\n};"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import { CommandType, Device } from \"eufy-security-client\";\r\nimport path from \"path\";\r\nimport fse from \"fs-extra\";\r\nimport * as utils from \"@iobroker/adapter-core\";\r\n\r\nimport { ioBrokerLogger } from \"./log\";\r\nimport { euSec } from \"../main\";\r\n\r\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\r\nexport const setStateChangedAsync = async function(adapter: ioBroker.Adapter, id: string, value: any): ioBroker.SetStateChangedPromise {\r\n return await adapter.setStateChangedAsync(id, value === undefined || value === null ? null : { val: value, ack: true }).catch();\r\n};\r\n\r\nexport const isEmpty = function(str: string | null | undefined): boolean {\r\n if (str) {\r\n if (str.length > 0)\r\n return false;\r\n return true;\r\n }\r\n return true;\r\n};\r\n\r\nexport const getImageAsHTML = function(data: Buffer, mime = \"image/jpg\"): string {\r\n if (data && data.length > 0)\r\n return `<img src=\"data:${mime};base64,${data.toString(\"base64\")}\" style=\"width: auto ;height: 100%;\" />`;\r\n return \"\";\r\n}\r\n\r\n/*export const getDataFilePath = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, fileName: string): string {\r\n const dir_path = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, folderName);\r\n if (!fse.existsSync(dir_path)) {\r\n fse.mkdirSync(dir_path, {mode: 0o775, recursive: true});\r\n }\r\n return path.join(dir_path, fileName);\r\n}*/\r\n\r\nexport const setStateAsync = async function(adapter: ioBroker.Adapter, state_id: string, common_name: string, value: string, role = \"text\", type: \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\" | \"mixed\" | undefined = \"string\"): Promise<void> {\r\n await adapter.setObjectNotExistsAsync(state_id, {\r\n type: \"state\",\r\n common: {\r\n name: common_name,\r\n type: type,\r\n role: role,\r\n read: true,\r\n write: false,\r\n },\r\n native: {\r\n },\r\n });\r\n await adapter.setStateAsync(state_id, { val: value, ack: true });\r\n}\r\n\r\nexport const removeFiles = function(adapter: ioBroker.Adapter, stationSerial: string, folderName: string, device_sn: string): Promise<void> {\r\n return new Promise(async (resolve, reject) => {\r\n try {\r\n const dir_path = path.join(stationSerial, folderName);\r\n if (await adapter.fileExistsAsync(adapter.namespace, dir_path)) {\r\n const files = (await adapter.readDirAsync(adapter.namespace, dir_path)).filter(fn => fn.file.startsWith(device_sn));\r\n try {\r\n files.map(filename => adapter.delFileAsync(adapter.namespace, path.join(dir_path, filename.file)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}\r\n\r\n/*export const moveFiles = function(adapter: ioBroker.Adapter, stationSerial: string, device_sn: string, srcFolderName: string, dstFolderName: string): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n try {\r\n const dirSrcPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, srcFolderName);\r\n const dirDstPath = path.join(utils.getAbsoluteInstanceDataDir(adapter), stationSerial, dstFolderName);\r\n if (!fse.existsSync(dirDstPath)) {\r\n fse.mkdirSync(dirDstPath, {mode: 0o775, recursive: true});\r\n }\r\n if (fse.existsSync(dirSrcPath)) {\r\n const files = fse.readdirSync(dirSrcPath).filter(fn => fn.startsWith(device_sn));\r\n try {\r\n files.map(filename => fse.moveSync(path.join(dirSrcPath, filename), path.join(dirDstPath, filename)));\r\n } catch (error) {\r\n }\r\n }\r\n resolve();\r\n } catch (error) {\r\n reject(error);\r\n }\r\n });\r\n}*/\r\n\r\nexport const lowestUnusedNumber = function (sequence: number[], startingFrom: number): number {\r\n const arr = sequence.slice(0);\r\n arr.sort((a, b) => a - b);\r\n return arr.reduce((lowest, num, i) => {\r\n const seqIndex = i + startingFrom;\r\n return num !== seqIndex && seqIndex < lowest ? seqIndex : lowest\r\n }, arr.length + startingFrom);\r\n}\r\n\r\nexport const sleep = async (ms: number): Promise<void> => {\r\n return new Promise((resolve) => {\r\n setTimeout(resolve, ms);\r\n });\r\n};\r\n\r\nexport const getVideoClipLength = (device: Device): number => {\r\n let length = 60;\r\n const workingMode = device.getRawProperty(CommandType.CMD_SET_PIR_POWERMODE);\r\n if (workingMode !== undefined) {\r\n switch(workingMode) {\r\n case \"0\":\r\n if (device.isCamera2Product() || device.isIndoorCamera() || device.isSoloCameras())\r\n length = 20;\r\n else if (device.isBatteryDoorbell() || device.isBatteryDoorbell2())\r\n length = 30;\r\n break;\r\n case \"1\":\r\n // Corrisponds to 60 seconds\r\n break;\r\n case \"2\":\r\n const customValue = device.getRawProperty(CommandType.CMD_DEV_RECORD_TIMEOUT);\r\n if (customValue !== undefined) {\r\n try {\r\n length = Number.parseInt(customValue);\r\n } catch(error) {\r\n }\r\n }\r\n break;\r\n case \"3\":\r\n // Corrisponds to 60 seconds?? (this mode exists only for battery doorbells; mode: Optimal Battery Life)\r\n break;\r\n }\r\n }\r\n return length;\r\n};\r\n\r\nexport const removeLastChar = function(text: string, char: string): string {\r\n const strArr = [...text];\r\n strArr.splice(text.lastIndexOf(char), 1);\r\n return strArr.join(\"\");\r\n}\r\n\r\nexport const changeRole = async function(adapter: ioBroker.Adapter, log: ioBrokerLogger, state: string, role: string): Promise<void> {\r\n try {\r\n const states = await adapter.getStatesAsync(`*.${state}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.extendObjectAsync(id, {\r\n type: \"state\",\r\n common: {\r\n role: role\r\n }\r\n }, {}).catch();\r\n });\r\n } catch (error) {\r\n log.error(`state: ${state} role: ${role} - Error:`, error);\r\n }\r\n};\r\n\r\nexport const deleteStates = async function(adapter: ioBroker.Adapter, property: string): Promise<void> {\r\n const states = await adapter.getStatesAsync(`*.${property}`);\r\n if (states)\r\n Object.keys(states).forEach(async id => {\r\n await adapter.delObjectAsync(id).catch();\r\n });\r\n};\r\n\r\nexport const handleUpdate = async function(adapter: euSec, log: ioBrokerLogger, oldVersion: number, newVersion: number): Promise<void> {\r\n if (oldVersion != 0 && oldVersion <= 0.61) {\r\n try {\r\n const all = await adapter.getStatesAsync(\"T*\");\r\n if (all) {\r\n Object.keys(all).forEach(async id => {\r\n await adapter.delObjectAsync(id, { recursive: false }).catch();\r\n });\r\n }\r\n const channels = await adapter.getChannelsOfAsync();\r\n if (channels) {\r\n Object.values(channels).forEach(async channel => {\r\n if (channel.common.name !== \"info\") {\r\n await adapter.delObjectAsync(channel._id, {recursive: false}).catch();\r\n }\r\n });\r\n }\r\n const devices = await adapter.getDevicesAsync();\r\n if (devices) {\r\n Object.values(devices).forEach(async device => {\r\n await adapter.delObjectAsync(device._id, {recursive: false}).catch();\r\n });\r\n }\r\n } catch (error) {\r\n log.error(\"Version 0.6.1: Error:\", error);\r\n }\r\n }\r\n if (oldVersion != 0 && oldVersion <= 0.74) {\r\n try {\r\n await adapter.setObjectAsync(\"verify_code\", {\r\n type: \"state\",\r\n common: {\r\n name: \"2FA verification code\",\r\n type: \"string\",\r\n role: \"state\",\r\n read: true,\r\n write: true,\r\n },\r\n native: {},\r\n });\r\n } catch (error) {\r\n log.error(\"Version 0.7.4: Error:\", error);\r\n }\r\n }\r\n if (oldVersion != 0 && oldVersion <= 1) {\r\n for (const state of [\"last_event_pic_url\", \"last_event_pic_html\", \"last_event_video_url\"]) {\r\n try {\r\n await deleteStates(adapter, state);\r\n } catch (error) {\r\n log.error(`Version 1.0.0 - ${state}: Error:`, error);\r\n }\r\n }\r\n }\r\n if (oldVersion == 0 && newVersion == 1.3) {\r\n const data_dir = utils.getAbsoluteInstanceDataDir(adapter);\r\n try {\r\n const file = path.join(data_dir, \"adapter.json\");\r\n if (fse.statSync(file).isFile()) {\r\n const fileContent = fse.readFileSync(file, \"utf8\");\r\n await adapter.writeFileAsync(adapter.namespace, \"adapter.json\", fileContent);\r\n }\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n try {\r\n const file = path.join(data_dir, \"persistent.json\");\r\n if (fse.statSync(file).isFile()) {\r\n const fileContent = fse.readFileSync(file, \"utf8\");\r\n await adapter.writeFileAsync(adapter.namespace, \"driver.json\", fileContent);\r\n }\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n try {\r\n fse.removeSync(data_dir);\r\n } catch (error) {\r\n //log.error(`Version 3.0.0: Error:`, error);\r\n }\r\n adapter.log.warn(\"Migrated configuration files to new location (needs restart). Restart of the adapter initiated.\")\r\n adapter.restartAdapter();\r\n }\r\n};\r\n\r\nexport const convertCamelCaseToSnakeCase = function (value: string): string {\r\n return value.replace(/[A-Z]/g, (letter, index) => {\r\n return index == 0 ? letter.toLowerCase() : \"_\" + letter.toLowerCase();\r\n });\r\n};\r\n\r\nexport function getShortUrl(url: URL, prefixUrl?: string): string {\r\n if (url.password) {\r\n url = new URL(url.toString()); // prevent original url mutation\r\n url.password = \"[redacted]\";\r\n }\r\n let shortUrl = url.toString();\r\n if (prefixUrl && shortUrl.startsWith(prefixUrl)) {\r\n shortUrl = shortUrl.slice(prefixUrl.length);\r\n }\r\n\r\n return shortUrl;\r\n}"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kCAAoC;AACpC,kBAAiB;AACjB,sBAAgB;AAChB,YAAuB;AAMhB,MAAM,uBAAuB,eAAe,SAA2B,IAAY,OAA6C;AACnI,SAAO,MAAM,QAAQ,qBAAqB,IAAI,UAAU,UAAa,UAAU,OAAO,OAAO,EAAE,KAAK,OAAO,KAAK,KAAK,CAAC,EAAE,MAAM;AAClI;AAEO,MAAM,UAAU,SAAS,KAAyC;AACrE,MAAI,KAAK;AACL,QAAI,IAAI,SAAS;AACb,aAAO;AACX,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,MAAM,iBAAiB,SAAS,MAAc,OAAO,aAAqB;AAC7E,MAAI,QAAQ,KAAK,SAAS;AACtB,WAAO,kBAAkB,IAAI,WAAW,KAAK,SAAS,QAAQ,CAAC;AACnE,SAAO;AACX;AAUO,MAAM,gBAAgB,eAAe,SAA2B,UAAkB,aAAqB,OAAe,OAAO,QAAQ,OAAmF,UAAyB;AACpP,QAAM,QAAQ,wBAAwB,UAAU;AAAA,IAC5C,MAAM;AAAA,IACN,QAAQ;AAAA,MACJ,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,IACX;AAAA,IACA,QAAQ,CACR;AAAA,EACJ,CAAC;AACD,QAAM,QAAQ,cAAc,UAAU,EAAE,KAAK,OAAO,KAAK,KAAK,CAAC;AACnE;AAEO,MAAM,cAAc,SAAS,SAA2B,eAAuB,YAAoB,WAAkC;AACxI,SAAO,IAAI,QAAQ,OAAO,SAAS,WAAW;AAC1C,QAAI;AACA,YAAM,WAAW,YAAAA,QAAK,KAAK,eAAe,UAAU;AACpD,UAAI,MAAM,QAAQ,gBAAgB,QAAQ,WAAW,QAAQ,GAAG;AAC5D,cAAM,SAAS,MAAM,QAAQ,aAAa,QAAQ,WAAW,QAAQ,GAAG,OAAO,QAAM,GAAG,KAAK,WAAW,SAAS,CAAC;AAClH,YAAI;AACA,gBAAM,IAAI,cAAY,QAAQ,aAAa,QAAQ,WAAW,YAAAA,QAAK,KAAK,UAAU,SAAS,IAAI,CAAC,CAAC;AAAA,QACrG,SAAS,OAAO;AAAA,QAChB;AAAA,MACJ;AACA,cAAQ;AAAA,IACZ,SAAS,OAAO;AACZ,aAAO,KAAK;AAAA,IAChB;AAAA,EACJ,CAAC;AACL;AAwBO,MAAM,qBAAqB,SAAU,UAAoB,cAA8B;AAC1F,QAAM,MAAM,SAAS,MAAM,CAAC;AAC5B,MAAI,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AACxB,SAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM;AAClC,UAAM,WAAW,IAAI;AACrB,WAAO,QAAQ,YAAY,WAAW,SAAS,WAAW;AAAA,EAC9D,GAAG,IAAI,SAAS,YAAY;AAChC;AAEO,MAAM,QAAQ,OAAO,OAA8B;AACtD,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC5B,eAAW,SAAS,EAAE;AAAA,EAC1B,CAAC;AACL;AAEO,MAAM,qBAAqB,CAAC,WAA2B;AAC1D,MAAI,SAAS;AACb,QAAM,cAAc,OAAO,eAAe,wCAAY,qBAAqB;AAC3E,MAAI,gBAAgB,QAAW;AAC3B,YAAO,aAAa;AAAA,MAChB,KAAK;AACD,YAAI,OAAO,iBAAiB,KAAK,OAAO,eAAe,KAAK,OAAO,cAAc;AAC7E,mBAAS;AAAA,iBACJ,OAAO,kBAAkB,KAAK,OAAO,mBAAmB;AAC7D,mBAAS;AACb;AAAA,MACJ,KAAK;AAED;AAAA,MACJ,KAAK;AACD,cAAM,cAAc,OAAO,eAAe,wCAAY,sBAAsB;AAC5E,YAAI,gBAAgB,QAAW;AAC3B,cAAI;AACA,qBAAS,OAAO,SAAS,WAAW;AAAA,UACxC,SAAQ,OAAO;AAAA,UACf;AAAA,QACJ;AACA;AAAA,MACJ,KAAK;AAED;AAAA,IACR;AAAA,EACJ;AACA,SAAO;AACX;AAEO,MAAM,iBAAiB,SAAS,MAAc,MAAsB;AACvE,QAAM,SAAS,CAAC,GAAG,IAAI;AACvB,SAAO,OAAO,KAAK,YAAY,IAAI,GAAG,CAAC;AACvC,SAAO,OAAO,KAAK,EAAE;AACzB;AAEO,MAAM,aAAa,eAAe,SAA2B,KAAqB,OAAe,MAA6B;AACjI,MAAI;AACA,UAAM,SAAS,MAAM,QAAQ,eAAe,KAAK,KAAK,EAAE;AACxD,QAAI;AACA,aAAO,KAAK,MAAM,EAAE,QAAQ,OAAM,OAAM;AACpC,cAAM,QAAQ,kBAAkB,IAAI;AAAA,UAChC,MAAM;AAAA,UACN,QAAQ;AAAA,YACJ;AAAA,UACJ;AAAA,QACJ,GAAG,CAAC,CAAC,EAAE,MAAM;AAAA,MACjB,CAAC;AAAA,EACT,SAAS,OAAO;AACZ,QAAI,MAAM,UAAU,KAAK,UAAU,IAAI,aAAa,KAAK;AAAA,EAC7D;AACJ;AAEO,MAAM,eAAe,eAAe,SAA2B,UAAiC;AACnG,QAAM,SAAS,MAAM,QAAQ,eAAe,KAAK,QAAQ,EAAE;AAC3D,MAAI;AACA,WAAO,KAAK,MAAM,EAAE,QAAQ,OAAM,OAAM;AACpC,YAAM,QAAQ,eAAe,EAAE,EAAE,MAAM;AAAA,IAC3C,CAAC;AACT;AAEO,MAAM,eAAe,eAAe,SAAgB,KAAqB,YAAoB,YAAmC;AACnI,MAAI,cAAc,KAAK,cAAc,MAAM;AACvC,QAAI;AACA,YAAM,MAAM,MAAM,QAAQ,eAAe,IAAI;AAC7C,UAAI,KAAK;AACL,eAAO,KAAK,GAAG,EAAE,QAAQ,OAAM,OAAM;AACjC,gBAAM,QAAQ,eAAe,IAAI,EAAE,WAAW,MAAM,CAAC,EAAE,MAAM;AAAA,QACjE,CAAC;AAAA,MACL;AACA,YAAM,WAAW,MAAM,QAAQ,mBAAmB;AAClD,UAAI,UAAU;AACV,eAAO,OAAO,QAAQ,EAAE,QAAQ,OAAM,YAAW;AAC7C,cAAI,QAAQ,OAAO,SAAS,QAAQ;AAChC,kBAAM,QAAQ,eAAe,QAAQ,KAAK,EAAC,WAAW,MAAK,CAAC,EAAE,MAAM;AAAA,UACxE;AAAA,QACJ,CAAC;AAAA,MACL;AACA,YAAM,UAAU,MAAM,QAAQ,gBAAgB;AAC9C,UAAI,SAAS;AACT,eAAO,OAAO,OAAO,EAAE,QAAQ,OAAM,WAAU;AAC3C,gBAAM,QAAQ,eAAe,OAAO,KAAK,EAAC,WAAW,MAAK,CAAC,EAAE,MAAM;AAAA,QACvE,CAAC;AAAA,MACL;AAAA,IACJ,SAAS,OAAO;AACZ,UAAI,MAAM,yBAAyB,KAAK;AAAA,IAC5C;AAAA,EACJ;AACA,MAAI,cAAc,KAAK,cAAc,MAAM;AACvC,QAAI;AACA,YAAM,QAAQ,eAAe,eAAe;AAAA,QACxC,MAAM;AAAA,QACN,QAAQ;AAAA,UACJ,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,QACX;AAAA,QACA,QAAQ,CAAC;AAAA,MACb,CAAC;AAAA,IACL,SAAS,OAAO;AACZ,UAAI,MAAM,yBAAyB,KAAK;AAAA,IAC5C;AAAA,EACJ;AACA,MAAI,cAAc,KAAK,cAAc,GAAG;AACpC,eAAW,SAAS,CAAC,sBAAsB,uBAAuB,sBAAsB,GAAG;AACvF,UAAI;AACA,cAAM,aAAa,SAAS,KAAK;AAAA,MACrC,SAAS,OAAO;AACZ,YAAI,MAAM,mBAAmB,KAAK,YAAY,KAAK;AAAA,MACvD;AAAA,IACJ;AAAA,EACJ;AACA,MAAI,cAAc,KAAK,cAAc,KAAK;AACtC,UAAM,WAAW,MAAM,2BAA2B,OAAO;AACzD,QAAI;AACA,YAAM,OAAO,YAAAA,QAAK,KAAK,UAAU,cAAc;AAC/C,UAAI,gBAAAC,QAAI,SAAS,IAAI,EAAE,OAAO,GAAG;AAC7B,cAAM,cAAc,gBAAAA,QAAI,aAAa,MAAM,MAAM;AACjD,cAAM,QAAQ,eAAe,QAAQ,WAAW,gBAAgB,WAAW;AAAA,MAC/E;AAAA,IACJ,SAAS,OAAO;AAAA,IAEhB;AACA,QAAI;AACA,YAAM,OAAO,YAAAD,QAAK,KAAK,UAAU,iBAAiB;AAClD,UAAI,gBAAAC,QAAI,SAAS,IAAI,EAAE,OAAO,GAAG;AAC7B,cAAM,cAAc,gBAAAA,QAAI,aAAa,MAAM,MAAM;AACjD,cAAM,QAAQ,eAAe,QAAQ,WAAW,eAAe,WAAW;AAAA,MAC9E;AAAA,IACJ,SAAS,OAAO;AAAA,IAEhB;AACA,QAAI;AACA,sBAAAA,QAAI,WAAW,QAAQ;AAAA,IAC3B,SAAS,OAAO;AAAA,IAEhB;AACA,YAAQ,IAAI,KAAK,iGAAiG;AAClH,YAAQ,eAAe;AAAA,EAC3B;AACJ;AAEO,MAAM,8BAA8B,SAAU,OAAuB;AACxE,SAAO,MAAM,QAAQ,UAAU,CAAC,QAAQ,UAAU;AAC9C,WAAO,SAAS,IAAI,OAAO,YAAY,IAAI,MAAM,OAAO,YAAY;AAAA,EACxE,CAAC;AACL;AAEO,SAAS,YAAY,KAAU,WAA4B;AAC9D,MAAI,IAAI,UAAU;AACd,UAAM,IAAI,IAAI,IAAI,SAAS,CAAC;AAC5B,QAAI,WAAW;AAAA,EACnB;AACA,MAAI,WAAW,IAAI,SAAS;AAC5B,MAAI,aAAa,SAAS,WAAW,SAAS,GAAG;AAC7C,eAAW,SAAS,MAAM,UAAU,MAAM;AAAA,EAC9C;AAEA,SAAO;AACX;",
|
|
6
6
|
"names": ["path", "fse"]
|
|
7
7
|
}
|
package/build/lib/video.js
CHANGED
|
@@ -18,6 +18,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
return to;
|
|
19
19
|
};
|
|
20
20
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
25
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
26
|
mod
|
|
23
27
|
));
|
|
@@ -28,22 +32,29 @@ __export(video_exports, {
|
|
|
28
32
|
StreamOutput: () => StreamOutput,
|
|
29
33
|
ffmpegPreviewImage: () => ffmpegPreviewImage,
|
|
30
34
|
ffmpegStreamToGo2rtc: () => ffmpegStreamToGo2rtc,
|
|
31
|
-
ffmpegStreamToHls: () => ffmpegStreamToHls
|
|
35
|
+
ffmpegStreamToHls: () => ffmpegStreamToHls,
|
|
36
|
+
streamToGo2rtc: () => streamToGo2rtc
|
|
32
37
|
});
|
|
33
38
|
module.exports = __toCommonJS(video_exports);
|
|
34
39
|
var import_net = __toESM(require("net"));
|
|
35
40
|
var import_path = __toESM(require("path"));
|
|
36
41
|
var import_fluent_ffmpeg = __toESM(require("@bropat/fluent-ffmpeg"));
|
|
37
|
-
var
|
|
42
|
+
var import_ffmpeg_for_homebridge = __toESM(require("ffmpeg-for-homebridge"));
|
|
38
43
|
var import_eufy_security_client = require("eufy-security-client");
|
|
39
44
|
var import_os = require("os");
|
|
40
45
|
var import_fs_extra = __toESM(require("fs-extra"));
|
|
46
|
+
var import_node_stream = __toESM(require("node:stream"));
|
|
47
|
+
var import_promises = require("node:stream/promises");
|
|
41
48
|
var import_utils = require("./utils");
|
|
42
|
-
|
|
49
|
+
class UniversalStream {
|
|
50
|
+
url;
|
|
51
|
+
static socks = /* @__PURE__ */ new Set();
|
|
52
|
+
server;
|
|
53
|
+
sock_id;
|
|
43
54
|
constructor(namespace, onSocket) {
|
|
44
55
|
let sockpath = "";
|
|
45
|
-
const unique_sock_id = (0, import_utils.lowestUnusedNumber)([...
|
|
46
|
-
|
|
56
|
+
const unique_sock_id = (0, import_utils.lowestUnusedNumber)([...UniversalStream.socks], 1);
|
|
57
|
+
UniversalStream.socks.add(unique_sock_id);
|
|
47
58
|
this.sock_id = unique_sock_id;
|
|
48
59
|
if (process.platform === "win32") {
|
|
49
60
|
const pipePrefix = "\\\\.\\pipe\\";
|
|
@@ -68,22 +79,22 @@ const _UniversalStream = class {
|
|
|
68
79
|
close() {
|
|
69
80
|
if (this.server)
|
|
70
81
|
this.server.close();
|
|
71
|
-
|
|
82
|
+
UniversalStream.socks.delete(this.sock_id);
|
|
72
83
|
}
|
|
84
|
+
}
|
|
85
|
+
const StreamInput = function(namespace, stream2) {
|
|
86
|
+
return new UniversalStream(namespace, (socket) => stream2.pipe(socket, { end: true }).on("error", (_error) => {
|
|
87
|
+
}));
|
|
73
88
|
};
|
|
74
|
-
|
|
75
|
-
UniversalStream
|
|
76
|
-
|
|
77
|
-
return new UniversalStream(namespace, (socket) => stream.pipe(socket, { end: true }));
|
|
78
|
-
};
|
|
79
|
-
const StreamOutput = function(namespace, stream) {
|
|
80
|
-
return new UniversalStream(namespace, (socket) => socket.pipe(stream, { end: true }));
|
|
89
|
+
const StreamOutput = function(namespace, stream2) {
|
|
90
|
+
return new UniversalStream(namespace, (socket) => socket.pipe(stream2, { end: true }).on("error", (_error) => {
|
|
91
|
+
}));
|
|
81
92
|
};
|
|
82
93
|
const ffmpegPreviewImage = (config, input, output, log, skip_seconds = 2) => {
|
|
83
94
|
return new Promise((resolve, reject) => {
|
|
84
95
|
try {
|
|
85
|
-
if (
|
|
86
|
-
import_fluent_ffmpeg.default.setFfmpegPath(
|
|
96
|
+
if (import_ffmpeg_for_homebridge.default) {
|
|
97
|
+
import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
|
|
87
98
|
(0, import_fluent_ffmpeg.default)().withProcessOptions({
|
|
88
99
|
detached: true
|
|
89
100
|
}).addOptions([
|
|
@@ -112,8 +123,8 @@ ${stderr}`);
|
|
|
112
123
|
const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream, output, log) => {
|
|
113
124
|
return new Promise((resolve, reject) => {
|
|
114
125
|
try {
|
|
115
|
-
if (
|
|
116
|
-
import_fluent_ffmpeg.default.setFfmpegPath(
|
|
126
|
+
if (import_ffmpeg_for_homebridge.default) {
|
|
127
|
+
import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
|
|
117
128
|
videoStream.on("error", (error) => {
|
|
118
129
|
log.error("ffmpegStreamToHls(): Videostream Error", error);
|
|
119
130
|
});
|
|
@@ -128,10 +139,13 @@ const ffmpegStreamToHls = (config, namespace, metadata, videoStream, audioStream
|
|
|
128
139
|
"-hls_init_time 0",
|
|
129
140
|
"-hls_time 2",
|
|
130
141
|
"-hls_segment_type mpegts",
|
|
142
|
+
//"-start_number 1",
|
|
131
143
|
"-sc_threshold 0",
|
|
132
144
|
`-g ${metadata.videoFPS}`,
|
|
133
145
|
"-fflags genpts+nobuffer+flush_packets",
|
|
146
|
+
//"-flush_packets 1",
|
|
134
147
|
"-hls_playlist_type event"
|
|
148
|
+
//"-hls_flags split_by_time"
|
|
135
149
|
];
|
|
136
150
|
switch (metadata.videoCodec) {
|
|
137
151
|
case import_eufy_security_client.VideoCodec.H264:
|
|
@@ -183,8 +197,8 @@ ${stderr}`);
|
|
|
183
197
|
const ffmpegStreamToGo2rtc = (config, namespace, camera, metadata, videoStream, audioStream, log) => {
|
|
184
198
|
return new Promise((resolve, reject) => {
|
|
185
199
|
try {
|
|
186
|
-
if (
|
|
187
|
-
import_fluent_ffmpeg.default.setFfmpegPath(
|
|
200
|
+
if (import_ffmpeg_for_homebridge.default) {
|
|
201
|
+
import_fluent_ffmpeg.default.setFfmpegPath(import_ffmpeg_for_homebridge.default);
|
|
188
202
|
videoStream.on("error", (error) => {
|
|
189
203
|
log.error("ffmpegStreamToGo2rtc(): Videostream Error", error);
|
|
190
204
|
});
|
|
@@ -199,6 +213,7 @@ const ffmpegStreamToGo2rtc = (config, namespace, camera, metadata, videoStream,
|
|
|
199
213
|
"-rtsp_transport tcp",
|
|
200
214
|
"-sc_threshold 0",
|
|
201
215
|
"-fflags genpts+nobuffer+flush_packets"
|
|
216
|
+
//"-rtpflags latm",
|
|
202
217
|
];
|
|
203
218
|
switch (metadata.videoCodec) {
|
|
204
219
|
case import_eufy_security_client.VideoCodec.H264:
|
|
@@ -253,12 +268,125 @@ ${stderr}`);
|
|
|
253
268
|
}
|
|
254
269
|
});
|
|
255
270
|
};
|
|
271
|
+
const streamToGo2rtc = async (camera, videoStream, audioStream, log, config, namespace, metadata) => {
|
|
272
|
+
const { default: got } = await import("got");
|
|
273
|
+
const api = got.extend({
|
|
274
|
+
hooks: {
|
|
275
|
+
beforeError: [
|
|
276
|
+
(error) => {
|
|
277
|
+
const { response, options } = error;
|
|
278
|
+
const { method, url, prefixUrl } = options;
|
|
279
|
+
const shortUrl = (0, import_utils.getShortUrl)(typeof url === "string" ? new URL(url) : url === void 0 ? new URL("") : url, typeof prefixUrl === "string" ? prefixUrl : prefixUrl.toString());
|
|
280
|
+
const body = (response == null ? void 0 : response.body) ? response.body : error.message;
|
|
281
|
+
error.message = `${error.message} | method: ${method} url: ${shortUrl}`;
|
|
282
|
+
if (response == null ? void 0 : response.body) {
|
|
283
|
+
error.message = `${error.message} body: ${body}`;
|
|
284
|
+
}
|
|
285
|
+
return error;
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
videoStream.on("error", (error) => {
|
|
291
|
+
log.error("streamToGo2rtc(): Videostream Error", error);
|
|
292
|
+
});
|
|
293
|
+
audioStream.on("error", (error) => {
|
|
294
|
+
log.error("streamToGo2rtc(): Audiostream Error", error);
|
|
295
|
+
});
|
|
296
|
+
return Promise.allSettled([
|
|
297
|
+
(0, import_promises.pipeline)(
|
|
298
|
+
videoStream,
|
|
299
|
+
api.stream.post(`http://localhost:1984/api/stream?dst=${camera}`).on("error", (error) => {
|
|
300
|
+
var _a, _b;
|
|
301
|
+
if (!((_b = (_a = error.response) == null ? void 0 : _a.body) == null ? void 0 : _b.startsWith("EOF"))) {
|
|
302
|
+
log.error(`streamToGo2rtc(): Got Videostream Error: ${error.message}`);
|
|
303
|
+
}
|
|
304
|
+
}),
|
|
305
|
+
new import_node_stream.default.PassThrough()
|
|
306
|
+
),
|
|
307
|
+
(0, import_promises.pipeline)(
|
|
308
|
+
audioStream,
|
|
309
|
+
api.stream.post(`http://localhost:1984/api/stream?dst=${camera}`).on("error", (error) => {
|
|
310
|
+
var _a, _b;
|
|
311
|
+
if (!((_b = (_a = error.response) == null ? void 0 : _a.body) == null ? void 0 : _b.startsWith("EOF"))) {
|
|
312
|
+
log.error(`streamToGo2rtc(): Got Audiostream Error: ${error.message}`);
|
|
313
|
+
}
|
|
314
|
+
}),
|
|
315
|
+
new import_node_stream.default.PassThrough()
|
|
316
|
+
)
|
|
317
|
+
// Alternative implementation in case of go2rtc audio bitstream isn't working (<= 1.8.5)
|
|
318
|
+
/*new Promise<void>((resolve, reject) => {
|
|
319
|
+
try {
|
|
320
|
+
if (pathToFfmpeg) {
|
|
321
|
+
ffmpeg.setFfmpegPath(pathToFfmpeg);
|
|
322
|
+
|
|
323
|
+
const uAudioStream = StreamInput(namespace, audioStream);
|
|
324
|
+
|
|
325
|
+
let audioFormat = "";
|
|
326
|
+
const options: string[] = [
|
|
327
|
+
"-rtsp_transport tcp",
|
|
328
|
+
"-fflags genpts+nobuffer+flush_packets",
|
|
329
|
+
//"-rtpflags latm",
|
|
330
|
+
//"-compression_level 5",
|
|
331
|
+
"-application lowdelay",
|
|
332
|
+
];
|
|
333
|
+
|
|
334
|
+
switch(metadata.audioCodec) {
|
|
335
|
+
case AudioCodec.AAC:
|
|
336
|
+
audioFormat = "aac";
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
const command = ffmpeg()
|
|
341
|
+
.withProcessOptions({
|
|
342
|
+
detached: true
|
|
343
|
+
});
|
|
344
|
+
|
|
345
|
+
if (audioFormat !== "") {
|
|
346
|
+
command.input(uAudioStream.url)
|
|
347
|
+
.inputFormat(audioFormat)
|
|
348
|
+
.audioCodec("opus");
|
|
349
|
+
} else {
|
|
350
|
+
log.warn(`streamToGo2rtc(): ffmpeg - Not support audio codec or unknown audio codec (${AudioCodec[metadata.audioCodec]})`);
|
|
351
|
+
}
|
|
352
|
+
command.output(`rtsp://localhost:${config.go2rtc_rtsp_port}/${camera}`)
|
|
353
|
+
.outputFormat("rtsp")
|
|
354
|
+
.addOptions(options)
|
|
355
|
+
.on("start", (commandline) => {
|
|
356
|
+
log.debug(`streamToGo2rtc(): ffmpeg - commandline: ${commandline}`);
|
|
357
|
+
})
|
|
358
|
+
.on("error", function(err, stdout, stderr) {
|
|
359
|
+
log.error(`streamToGo2rtc(): ffmpeg - An error occurred: ${err.message}`);
|
|
360
|
+
log.error(`streamToGo2rtc(): ffmpeg output:\n${stdout}`);
|
|
361
|
+
log.error(`streamToGo2rtc(): ffmpeg stderr:\n${stderr}`);
|
|
362
|
+
uAudioStream.close();
|
|
363
|
+
reject(err);
|
|
364
|
+
})
|
|
365
|
+
.on("end", (stdout, stderr) => {
|
|
366
|
+
log.debug(`streamToGo2rtc(): ffmpeg output:\n${stdout}`);
|
|
367
|
+
log.debug(`streamToGo2rtc(): ffmpeg stderr:\n${stderr}`);
|
|
368
|
+
log.debug("streamToGo2rtc(): Processing finished!");
|
|
369
|
+
uAudioStream.close();
|
|
370
|
+
resolve();
|
|
371
|
+
});
|
|
372
|
+
command.run();
|
|
373
|
+
} else {
|
|
374
|
+
reject(new Error("ffmpeg binary not found"));
|
|
375
|
+
}
|
|
376
|
+
} catch (error) {
|
|
377
|
+
log.error(`streamToGo2rtc(): Audio Error: ${error}`);
|
|
378
|
+
reject(error);
|
|
379
|
+
}
|
|
380
|
+
})*/
|
|
381
|
+
]);
|
|
382
|
+
};
|
|
256
383
|
// Annotate the CommonJS export names for ESM import in node:
|
|
257
384
|
0 && (module.exports = {
|
|
258
385
|
StreamInput,
|
|
259
386
|
StreamOutput,
|
|
260
387
|
ffmpegPreviewImage,
|
|
261
388
|
ffmpegStreamToGo2rtc,
|
|
262
|
-
ffmpegStreamToHls
|
|
389
|
+
ffmpegStreamToHls,
|
|
390
|
+
streamToGo2rtc
|
|
263
391
|
});
|
|
264
392
|
//# sourceMappingURL=video.js.map
|