iobroker.eusec 0.8.2
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 +21 -0
- package/README.md +569 -0
- package/adapter-settings.js +2423 -0
- package/admin/admin.d.ts +93 -0
- package/admin/euSec.png +0 -0
- package/admin/i18n/de/translations.json +18 -0
- package/admin/i18n/en/translations.json +18 -0
- package/admin/i18n/es/translations.json +18 -0
- package/admin/i18n/fr/translations.json +18 -0
- package/admin/i18n/it/translations.json +18 -0
- package/admin/i18n/nl/translations.json +18 -0
- package/admin/i18n/pl/translations.json +18 -0
- package/admin/i18n/pt/translations.json +18 -0
- package/admin/i18n/ru/translations.json +18 -0
- package/admin/i18n/zh-cn/translations.json +18 -0
- package/admin/index_m.html +156 -0
- package/admin/jsonConfig.json +134 -0
- package/admin/style.css +31 -0
- package/admin/words.js +221 -0
- package/build/lib/interfaces.js +3 -0
- package/build/lib/interfaces.js.map +1 -0
- package/build/lib/log.js +53 -0
- package/build/lib/log.js.map +1 -0
- package/build/lib/tools.js +99 -0
- package/build/lib/tools.js.map +1 -0
- package/build/lib/types.js +127 -0
- package/build/lib/types.js.map +1 -0
- package/build/lib/utils.js +451 -0
- package/build/lib/utils.js.map +1 -0
- package/build/lib/video.js +224 -0
- package/build/lib/video.js.map +1 -0
- package/build/lib/web.js +86 -0
- package/build/lib/web.js.map +1 -0
- package/build/main.js +1358 -0
- package/build/main.js.map +1 -0
- package/io-package.json +216 -0
- package/package.json +84 -0
package/admin/words.js
ADDED
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/*global systemDictionary:true */
|
|
2
|
+
"use strict";
|
|
3
|
+
|
|
4
|
+
systemDictionary = {
|
|
5
|
+
"eufy-security adapter settings": {
|
|
6
|
+
"en": "Adapter settings for eufy-security",
|
|
7
|
+
"de": "Adaptereinstellungen für eufy-security",
|
|
8
|
+
"ru": "Настройки адаптера для eufy-security",
|
|
9
|
+
"pt": "Configurações do adaptador para eufy-security",
|
|
10
|
+
"nl": "Adapterinstellingen voor eufy-security",
|
|
11
|
+
"fr": "Paramètres d'adaptateur pour eufy-security",
|
|
12
|
+
"it": "Impostazioni dell'adattatore per eufy-security",
|
|
13
|
+
"es": "Ajustes del adaptador para eufy-security",
|
|
14
|
+
"pl": "Ustawienia adaptera dla eufy-security",
|
|
15
|
+
"zh-cn": "eufy-security的适配器设置"
|
|
16
|
+
},
|
|
17
|
+
"Username": {
|
|
18
|
+
"en": "Username",
|
|
19
|
+
"de": "Benutzername",
|
|
20
|
+
"ru": "Имя пользователя",
|
|
21
|
+
"pt": "Nome de usuário",
|
|
22
|
+
"nl": "Gebruikersnaam",
|
|
23
|
+
"fr": "Nom d'utilisateur",
|
|
24
|
+
"it": "Nome utente",
|
|
25
|
+
"es": "Nombre de usuario",
|
|
26
|
+
"pl": "Nazwa użytkownika",
|
|
27
|
+
"zh-cn": "帳號"
|
|
28
|
+
},
|
|
29
|
+
"Password": {
|
|
30
|
+
"en": "Password",
|
|
31
|
+
"de": "Passwort",
|
|
32
|
+
"ru": "Пароль",
|
|
33
|
+
"pt": "Senha",
|
|
34
|
+
"nl": "Wachtwoord",
|
|
35
|
+
"fr": "Mot de passe",
|
|
36
|
+
"it": "Password",
|
|
37
|
+
"es": "Contraseña",
|
|
38
|
+
"pl": "Hasło",
|
|
39
|
+
"zh-cn": "密码"
|
|
40
|
+
},
|
|
41
|
+
"Polling interval (min)": {
|
|
42
|
+
"en": "Polling interval (min)",
|
|
43
|
+
"de": "Abfrageintervall (min)",
|
|
44
|
+
"ru": "Интервал опроса (мин)",
|
|
45
|
+
"pt": "Intervalo de sondagem (min)",
|
|
46
|
+
"nl": "Polling-interval (min)",
|
|
47
|
+
"fr": "Intervalle d'interrogation (min)",
|
|
48
|
+
"it": "Intervallo di polling (min)",
|
|
49
|
+
"es": "Intervalo de sondeo (min)",
|
|
50
|
+
"pl": "Okres odpytywania (min)",
|
|
51
|
+
"zh-cn": "轮询间隔(分钟)"
|
|
52
|
+
},
|
|
53
|
+
"Max camera livestream duration (sec)": {
|
|
54
|
+
"en": "Max camera livestream duration (sec)",
|
|
55
|
+
"de": "Maximale Livestream-Dauer der Kamera (Sek.)",
|
|
56
|
+
"ru": "Максимальная продолжительность прямой трансляции с камеры (сек)",
|
|
57
|
+
"pt": "Duração máxima da transmissão ao vivo da câmera (segundos)",
|
|
58
|
+
"nl": "Max. Duur livestream camera (sec)",
|
|
59
|
+
"fr": "Durée maximale de la diffusion en direct de la caméra (s)",
|
|
60
|
+
"it": "Durata massima del live streaming della videocamera (sec)",
|
|
61
|
+
"es": "Duración máxima de la transmisión en vivo de la cámara (segundos)",
|
|
62
|
+
"pl": "Maksymalny czas trwania transmisji na żywo z kamery (s)",
|
|
63
|
+
"zh-cn": "相机直播的最大持续时间(秒)"
|
|
64
|
+
},
|
|
65
|
+
"Time in seconds before event reset": {
|
|
66
|
+
"en": "Time in seconds before event reset",
|
|
67
|
+
"de": "Zeit in Sekunden vor dem Zurücksetzen des Ereignisses",
|
|
68
|
+
"ru": "Время в секундах до сброса события",
|
|
69
|
+
"pt": "Tempo em segundos antes da redefinição do evento",
|
|
70
|
+
"nl": "Tijd in seconden voordat de gebeurtenis wordt gereset",
|
|
71
|
+
"fr": "Temps en secondes avant la réinitialisation de l'événement",
|
|
72
|
+
"it": "Tempo in secondi prima del ripristino dell'evento",
|
|
73
|
+
"es": "Tiempo en segundos antes del reinicio del evento",
|
|
74
|
+
"pl": "Czas w sekundach do zresetowania zdarzenia",
|
|
75
|
+
"zh-cn": "事件重置之前的时间(以秒为单位)"
|
|
76
|
+
},
|
|
77
|
+
"Authentication settings": {
|
|
78
|
+
"en": "Authentication settings",
|
|
79
|
+
"de": "Authentifizierungseinstellungen",
|
|
80
|
+
"ru": "Настройки аутентификации",
|
|
81
|
+
"pt": "Configurações de autenticação",
|
|
82
|
+
"nl": "Authenticatie-instellingen",
|
|
83
|
+
"fr": "Paramètres d'authentification",
|
|
84
|
+
"it": "Impostazioni di autenticazione",
|
|
85
|
+
"es": "Configuración de autenticación",
|
|
86
|
+
"pl": "Ustawienia uwierzytelniania",
|
|
87
|
+
"zh-cn": "验证设定"
|
|
88
|
+
},
|
|
89
|
+
"Other settings": {
|
|
90
|
+
"en": "Other settings",
|
|
91
|
+
"de": "Andere Einstellungen",
|
|
92
|
+
"ru": "Другие настройки",
|
|
93
|
+
"pt": "Outros ajustes",
|
|
94
|
+
"nl": "Andere instellingen",
|
|
95
|
+
"fr": "Autres réglages",
|
|
96
|
+
"it": "Altre impostazioni",
|
|
97
|
+
"es": "Otros ajustes",
|
|
98
|
+
"pl": "Inne ustawienia",
|
|
99
|
+
"zh-cn": "其他设定"
|
|
100
|
+
},
|
|
101
|
+
"Settings": {
|
|
102
|
+
"en": "Settings",
|
|
103
|
+
"de": "Einstellungen",
|
|
104
|
+
"ru": "Настройки",
|
|
105
|
+
"pt": "Configurações",
|
|
106
|
+
"nl": "Instellingen",
|
|
107
|
+
"fr": "Réglages",
|
|
108
|
+
"it": "Impostazioni",
|
|
109
|
+
"es": "Ajustes",
|
|
110
|
+
"pl": "Ustawienia",
|
|
111
|
+
"zh-cn": "设定值"
|
|
112
|
+
},
|
|
113
|
+
"Main settings": {
|
|
114
|
+
"en": "Main settings",
|
|
115
|
+
"de": "Haupteinstellungen",
|
|
116
|
+
"ru": "Основные параметры",
|
|
117
|
+
"pt": "Configurações principais",
|
|
118
|
+
"nl": "Belangrijkste instellingen",
|
|
119
|
+
"fr": "Réglages principaux",
|
|
120
|
+
"it": "Impostazioni principali",
|
|
121
|
+
"es": "Ajustes principales",
|
|
122
|
+
"pl": "Ustawienia główne",
|
|
123
|
+
"zh-cn": "主要设定"
|
|
124
|
+
},
|
|
125
|
+
"Livestream settings": {
|
|
126
|
+
"en": "Livestream settings",
|
|
127
|
+
"de": "Livestream-Einstellungen",
|
|
128
|
+
"ru": "Настройки прямой трансляции",
|
|
129
|
+
"pt": "Configurações de transmissão ao vivo",
|
|
130
|
+
"nl": "Livestream-instellingen",
|
|
131
|
+
"fr": "Paramètres de diffusion en direct",
|
|
132
|
+
"it": "Impostazioni live streaming",
|
|
133
|
+
"es": "Configuración de transmisión en vivo",
|
|
134
|
+
"pl": "Ustawienia transmisji na żywo",
|
|
135
|
+
"zh-cn": "直播设置"
|
|
136
|
+
},
|
|
137
|
+
"Prefer local connection": {
|
|
138
|
+
"en": "Prefer local connection",
|
|
139
|
+
"de": "Lokale Verbindung bevorzugen",
|
|
140
|
+
"ru": "Предпочитает местное подключение",
|
|
141
|
+
"pt": "Preferir conexão local",
|
|
142
|
+
"nl": "Voorkeur voor lokale verbinding",
|
|
143
|
+
"fr": "Préférer une connexion locale",
|
|
144
|
+
"it": "Preferire la connessione locale",
|
|
145
|
+
"es": "Prefiero la conexión local",
|
|
146
|
+
"pl": "Preferowane połączenie lokalne",
|
|
147
|
+
"zh-cn": "倾向于本地连接"
|
|
148
|
+
},
|
|
149
|
+
"Only local connection": {
|
|
150
|
+
"en": "Only local connection",
|
|
151
|
+
"de": "Nur lokale Verbindung",
|
|
152
|
+
"ru": "Только локальное подключение",
|
|
153
|
+
"pt": "Apenas conexão local",
|
|
154
|
+
"nl": "Alleen lokale verbinding",
|
|
155
|
+
"fr": "Uniquement connexion locale",
|
|
156
|
+
"it": "Solo connessione locale",
|
|
157
|
+
"es": "Solo conexión local",
|
|
158
|
+
"pl": "Tylko połączenie lokalne",
|
|
159
|
+
"zh-cn": "仅本地连接"
|
|
160
|
+
},
|
|
161
|
+
"Quickest connection": {
|
|
162
|
+
"en": "Quickest connection",
|
|
163
|
+
"de": "Schnellste Verbindung",
|
|
164
|
+
"ru": "Самое быстрое соединение",
|
|
165
|
+
"pt": "Conexão mais rápida",
|
|
166
|
+
"nl": "Snelste verbinding",
|
|
167
|
+
"fr": "Connexion la plus rapide",
|
|
168
|
+
"it": "Connessione più veloce",
|
|
169
|
+
"es": "Conexión más rápida",
|
|
170
|
+
"pl": "Najszybsze połączenie",
|
|
171
|
+
"zh-cn": "最快的连接"
|
|
172
|
+
},
|
|
173
|
+
"P2P connection type": {
|
|
174
|
+
"en": "P2P connection type",
|
|
175
|
+
"de": "P2P-Verbindungstyp",
|
|
176
|
+
"ru": "Тип подключения P2P",
|
|
177
|
+
"pt": "Tipo de conexão P2P",
|
|
178
|
+
"nl": "P2P-verbindingstype",
|
|
179
|
+
"fr": "Type de connexion P2P",
|
|
180
|
+
"it": "Tipo di connessione P2P",
|
|
181
|
+
"es": "Tipo de conexión P2P",
|
|
182
|
+
"pl": "Typ połączenia P2P",
|
|
183
|
+
"zh-cn": "P2P连接类型"
|
|
184
|
+
},
|
|
185
|
+
"Accept incoming invitations": {
|
|
186
|
+
"en": "Accept incoming invitations",
|
|
187
|
+
"de": "Eingehende Einladungen annehmen",
|
|
188
|
+
"ru": "Принимать входящие приглашения",
|
|
189
|
+
"pt": "Aceitar os convites recebidos",
|
|
190
|
+
"nl": "Accepteer inkomende uitnodigingen",
|
|
191
|
+
"fr": "Accepter les invitations entrantes",
|
|
192
|
+
"it": "Accetta inviti in arrivo",
|
|
193
|
+
"es": "Aceptar invitaciones entrantes",
|
|
194
|
+
"pl": "Przyjmowanie zaproszeń przychodzących",
|
|
195
|
+
"zh-cn": "接受收到的邀请"
|
|
196
|
+
},
|
|
197
|
+
"Alarm sound duration (sec)": {
|
|
198
|
+
"en": "Alarm sound duration (sec)",
|
|
199
|
+
"de": "Dauer des Alarmtons (Sek.)",
|
|
200
|
+
"ru": "Длительность звукового сигнала тревоги (сек)",
|
|
201
|
+
"pt": "Duração do som do alarme (seg)",
|
|
202
|
+
"nl": "Duur alarmgeluid (sec)",
|
|
203
|
+
"fr": "Durée du son de l'alarme (sec)",
|
|
204
|
+
"it": "Durata del suono dell'allarme (sec)",
|
|
205
|
+
"es": "Duración del sonido de la alarma (s)",
|
|
206
|
+
"pl": "Czas trwania dźwięku alarmu (sek.)",
|
|
207
|
+
"zh-cn": "警报声持续时间(秒"
|
|
208
|
+
},
|
|
209
|
+
"Automatically download video": {
|
|
210
|
+
"en": "Automatically download video",
|
|
211
|
+
"de": "Automatisches Herunterladen von Videos",
|
|
212
|
+
"ru": "Автоматическая загрузка видео",
|
|
213
|
+
"pt": "Descarregar vídeo automaticamente",
|
|
214
|
+
"nl": "Video automatisch downloaden",
|
|
215
|
+
"fr": "Téléchargement automatique de la vidéo",
|
|
216
|
+
"it": "Scarica automaticamente il video",
|
|
217
|
+
"es": "Descarga automática de vídeo",
|
|
218
|
+
"pl": "Automatycznie pobieraj wideo",
|
|
219
|
+
"zh-cn": "自动下载视频"
|
|
220
|
+
}
|
|
221
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/lib/interfaces.ts"],"names":[],"mappings":""}
|
package/build/lib/log.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ioBrokerLogger = void 0;
|
|
4
|
+
class ioBrokerLogger {
|
|
5
|
+
constructor(log) {
|
|
6
|
+
this.log = log;
|
|
7
|
+
}
|
|
8
|
+
_getStack() {
|
|
9
|
+
var _a;
|
|
10
|
+
const _prepareStackTrace = Error.prepareStackTrace;
|
|
11
|
+
Error.prepareStackTrace = (_, stack) => stack;
|
|
12
|
+
const stack = (_a = new Error().stack) === null || _a === void 0 ? void 0 : _a.slice(3);
|
|
13
|
+
Error.prepareStackTrace = _prepareStackTrace;
|
|
14
|
+
return stack;
|
|
15
|
+
}
|
|
16
|
+
_getMessage(message, hideTag = false, optionalParams) {
|
|
17
|
+
const msg = message ? message : "";
|
|
18
|
+
const stack = this._getStack();
|
|
19
|
+
const typeName = stack[0].getTypeName() !== null ? stack[0].getTypeName() : "";
|
|
20
|
+
const functionName = stack[0].getFunctionName() !== null ? `${stack[0].getFunctionName()}` : "";
|
|
21
|
+
let tag = "";
|
|
22
|
+
if (typeName !== "" && !hideTag) {
|
|
23
|
+
tag = `[${typeName}`;
|
|
24
|
+
if (functionName !== "") {
|
|
25
|
+
tag = `${tag}.${functionName}] `;
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
tag = `${tag}] `;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
if (optionalParams && optionalParams.length > 0) {
|
|
32
|
+
return `${tag}${msg} ${JSON.stringify(optionalParams)}`;
|
|
33
|
+
}
|
|
34
|
+
return `${tag}${msg}`;
|
|
35
|
+
}
|
|
36
|
+
trace(message, ...optionalParams) {
|
|
37
|
+
this.log.silly(this._getMessage(message, false, optionalParams));
|
|
38
|
+
}
|
|
39
|
+
debug(message, ...optionalParams) {
|
|
40
|
+
this.log.debug(this._getMessage(message, false, optionalParams));
|
|
41
|
+
}
|
|
42
|
+
info(message, ...optionalParams) {
|
|
43
|
+
this.log.info(this._getMessage(message, true, optionalParams));
|
|
44
|
+
}
|
|
45
|
+
warn(message, ...optionalParams) {
|
|
46
|
+
this.log.warn(this._getMessage(message, true, optionalParams));
|
|
47
|
+
}
|
|
48
|
+
error(message, ...optionalParams) {
|
|
49
|
+
this.log.error(this._getMessage(message, true, optionalParams));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
exports.ioBrokerLogger = ioBrokerLogger;
|
|
53
|
+
//# sourceMappingURL=log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/lib/log.ts"],"names":[],"mappings":";;;AAEA,MAAa,cAAc;IAIvB,YAAmB,GAAoB;QACnC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACnB,CAAC;IAEO,SAAS;;QACb,MAAM,kBAAkB,GAAG,KAAK,CAAC,iBAAiB,CAAC;QACnD,KAAK,CAAC,iBAAiB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAA,IAAI,KAAK,EAAE,CAAC,KAAK,0CAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,KAAK,CAAC,iBAAiB,GAAG,kBAAkB,CAAC;QAC7C,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,WAAW,CAAC,OAAgB,EAAE,OAAO,GAAG,KAAK,EAAE,cAAsB;QACzE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChG,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,QAAQ,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE;YAC7B,GAAG,GAAG,IAAI,QAAQ,EAAE,CAAC;YACrB,IAAI,YAAY,KAAK,EAAE,EAAE;gBACrB,GAAG,GAAG,GAAG,GAAG,IAAI,YAAY,IAAI,CAAC;aACpC;iBAAM;gBACH,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC;aACpB;SACJ;QAED,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7C,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;SAC3D;QACD,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IAC1B,CAAC;IAEM,KAAK,CAAC,OAAgB,EAAE,GAAG,cAAqB;QACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,CAAC;IAEM,KAAK,CAAC,OAAgB,EAAE,GAAG,cAAqB;QACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;IACrE,CAAC;IAEM,IAAI,CAAC,OAAgB,EAAE,GAAG,cAAqB;QAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,CAAC;IAEM,IAAI,CAAC,OAAgB,EAAE,GAAG,cAAqB;QAClD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACnE,CAAC;IAEM,KAAK,CAAC,OAAgB,EAAE,GAAG,cAAqB;QACnD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACpE,CAAC;CAEJ;AAzDD,wCAyDC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.translateText = exports.isArray = exports.isObject = void 0;
|
|
7
|
+
const got_1 = __importDefault(require("got"));
|
|
8
|
+
/**
|
|
9
|
+
* Tests whether the given variable is a real object and not an Array
|
|
10
|
+
* @param it The variable to test
|
|
11
|
+
*/
|
|
12
|
+
function isObject(it) {
|
|
13
|
+
// This is necessary because:
|
|
14
|
+
// typeof null === 'object'
|
|
15
|
+
// typeof [] === 'object'
|
|
16
|
+
// [] instanceof Object === true
|
|
17
|
+
return Object.prototype.toString.call(it) === "[object Object]";
|
|
18
|
+
}
|
|
19
|
+
exports.isObject = isObject;
|
|
20
|
+
/**
|
|
21
|
+
* Tests whether the given variable is really an Array
|
|
22
|
+
* @param it The variable to test
|
|
23
|
+
*/
|
|
24
|
+
function isArray(it) {
|
|
25
|
+
if (Array.isArray != null)
|
|
26
|
+
return Array.isArray(it);
|
|
27
|
+
return Object.prototype.toString.call(it) === "[object Array]";
|
|
28
|
+
}
|
|
29
|
+
exports.isArray = isArray;
|
|
30
|
+
/**
|
|
31
|
+
* Translates text using the Google Translate API
|
|
32
|
+
* @param text The text to translate
|
|
33
|
+
* @param targetLang The target languate
|
|
34
|
+
* @param yandexApiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
35
|
+
*/
|
|
36
|
+
async function translateText(text, targetLang, yandexApiKey) {
|
|
37
|
+
if (targetLang === "en") {
|
|
38
|
+
return text;
|
|
39
|
+
}
|
|
40
|
+
else if (!text) {
|
|
41
|
+
return "";
|
|
42
|
+
}
|
|
43
|
+
if (yandexApiKey) {
|
|
44
|
+
return translateYandex(text, targetLang, yandexApiKey);
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
return translateGoogle(text, targetLang);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.translateText = translateText;
|
|
51
|
+
/**
|
|
52
|
+
* Translates text with Yandex API
|
|
53
|
+
* @param text The text to translate
|
|
54
|
+
* @param targetLang The target languate
|
|
55
|
+
* @param apiKey The yandex API key. You can create one for free at https://translate.yandex.com/developers
|
|
56
|
+
*/
|
|
57
|
+
async function translateYandex(text, targetLang, apiKey) {
|
|
58
|
+
var _a;
|
|
59
|
+
if (targetLang === "zh-cn") {
|
|
60
|
+
targetLang = "zh";
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const url = `https://translate.yandex.net/api/v1.5/tr.json/translate?key=${apiKey}&text=${encodeURIComponent(text)}&lang=en-${targetLang}`;
|
|
64
|
+
const response = await (0, got_1.default)({ url, timeout: 15000 });
|
|
65
|
+
if (isArray((_a = response.body) === null || _a === void 0 ? void 0 : _a.text)) {
|
|
66
|
+
return response.body.text[0];
|
|
67
|
+
}
|
|
68
|
+
throw new Error("Invalid response for translate request");
|
|
69
|
+
}
|
|
70
|
+
catch (e) {
|
|
71
|
+
throw new Error(`Could not translate to "${targetLang}": ${e}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Translates text with Google API
|
|
76
|
+
* @param text The text to translate
|
|
77
|
+
* @param targetLang The target languate
|
|
78
|
+
*/
|
|
79
|
+
async function translateGoogle(text, targetLang) {
|
|
80
|
+
var _a;
|
|
81
|
+
try {
|
|
82
|
+
const url = `http://translate.googleapis.com/translate_a/single?client=gtx&sl=en&tl=${targetLang}&dt=t&q=${encodeURIComponent(text)}&ie=UTF-8&oe=UTF-8`;
|
|
83
|
+
const response = await (0, got_1.default)({ url, timeout: 15000 });
|
|
84
|
+
if (isArray(response.body)) {
|
|
85
|
+
// we got a valid response
|
|
86
|
+
return response.body[0][0][0];
|
|
87
|
+
}
|
|
88
|
+
throw new Error("Invalid response for translate request");
|
|
89
|
+
}
|
|
90
|
+
catch (e) {
|
|
91
|
+
if (((_a = e.response) === null || _a === void 0 ? void 0 : _a.status) === 429) {
|
|
92
|
+
throw new Error(`Could not translate to "${targetLang}": Rate-limited by Google Translate`);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
throw new Error(`Could not translate to "${targetLang}": ${e}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/lib/tools.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAsB;AAEtB;;;GAGG;AACH,SAAgB,QAAQ,CAAC,EAAW;IAChC,6BAA6B;IAC7B,2BAA2B;IAC3B,yBAAyB;IACzB,gCAAgC;IAChC,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,iBAAiB,CAAC;AACpE,CAAC;AAND,4BAMC;AAED;;;GAGG;AACH,SAAgB,OAAO,CAAC,EAAW;IAC/B,IAAI,KAAK,CAAC,OAAO,IAAI,IAAI;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,gBAAgB,CAAC;AACnE,CAAC;AAHD,0BAGC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,UAAkB,EAAE,YAAqB;IACvF,IAAI,UAAU,KAAK,IAAI,EAAE;QACrB,OAAO,IAAI,CAAC;KACf;SAAM,IAAI,CAAC,IAAI,EAAE;QACd,OAAO,EAAE,CAAC;KACb;IACD,IAAI,YAAY,EAAE;QACd,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;KAC1D;SAAM;QACH,OAAO,eAAe,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;KAC5C;AACL,CAAC;AAXD,sCAWC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB,EAAE,MAAc;;IAC3E,IAAI,UAAU,KAAK,OAAO,EAAE;QACxB,UAAU,GAAG,IAAI,CAAC;KACrB;IACD,IAAI;QACA,MAAM,GAAG,GAAG,+DAA+D,MAAM,SAAS,kBAAkB,CAAC,IAAI,CAAC,YAAY,UAAU,EAAE,CAAC;QAC3I,MAAM,QAAQ,GAAG,MAAM,IAAA,aAAG,EAAC,EAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,MAAC,QAAQ,CAAC,IAAY,0CAAE,IAAI,CAAC,EAAE;YACvC,OAAQ,QAAQ,CAAC,IAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACzC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;KAC7D;IAAC,OAAO,CAAC,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,MAAM,CAAC,EAAE,CAAC,CAAC;KACnE;AACL,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,eAAe,CAAC,IAAY,EAAE,UAAkB;;IAC3D,IAAI;QACA,MAAM,GAAG,GAAG,0EAA0E,UAAU,WAAW,kBAAkB,CAAC,IAAI,CAAC,oBAAoB,CAAC;QACxJ,MAAM,QAAQ,GAAG,MAAM,IAAA,aAAG,EAAC,EAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAC,CAAC,CAAC;QAClD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;YACxB,0BAA0B;YAC1B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACjC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;KAC7D;IAAC,OAAO,CAAM,EAAE;QACb,IAAI,CAAA,MAAA,CAAC,CAAC,QAAQ,0CAAE,MAAM,MAAK,GAAG,EAAE;YAC5B,MAAM,IAAI,KAAK,CACX,2BAA2B,UAAU,qCAAqC,CAC7E,CAAC;SACL;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,2BAA2B,UAAU,MAAM,CAAC,EAAE,CAAC,CAAC;SACnE;KACJ;AACL,CAAC"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LockStateID = exports.IndoorCameraStateID = exports.DoorbellStateID = exports.KeyPadStateID = exports.MotionSensorStateID = exports.EntrySensorStateID = exports.StationStateID = exports.CameraStateID = exports.DeviceStateID = exports.RoleMapping = exports.IMAGE_FILE_PNG_EXT = exports.IMAGE_FILE_JPEG_EXT = exports.STREAM_FILE_NAME_EXT = exports.DataLocation = void 0;
|
|
4
|
+
const eufy_security_client_1 = require("eufy-security-client");
|
|
5
|
+
exports.DataLocation = {
|
|
6
|
+
LIVESTREAM: "live",
|
|
7
|
+
LAST_LIVESTREAM: "last_live",
|
|
8
|
+
LAST_EVENT: "last_event",
|
|
9
|
+
TEMP: "tmp"
|
|
10
|
+
};
|
|
11
|
+
exports.STREAM_FILE_NAME_EXT = ".m3u8";
|
|
12
|
+
exports.IMAGE_FILE_JPEG_EXT = ".jpeg";
|
|
13
|
+
exports.IMAGE_FILE_PNG_EXT = ".png";
|
|
14
|
+
exports.RoleMapping = {
|
|
15
|
+
[eufy_security_client_1.PropertyName.Name]: "info.name",
|
|
16
|
+
[eufy_security_client_1.PropertyName.StationMacAddress]: "info.mac",
|
|
17
|
+
[eufy_security_client_1.PropertyName.StationLANIpAddress]: "info.ip",
|
|
18
|
+
[eufy_security_client_1.PropertyName.DeviceState]: "info.status",
|
|
19
|
+
[eufy_security_client_1.PropertyName.DeviceBattery]: "value.battery",
|
|
20
|
+
[eufy_security_client_1.PropertyName.DeviceBatteryTemp]: "value.temperature",
|
|
21
|
+
[eufy_security_client_1.PropertyName.DeviceMotionDetected]: "sensor.motion",
|
|
22
|
+
[eufy_security_client_1.PropertyName.DevicePersonDetected]: "sensor.motion",
|
|
23
|
+
[eufy_security_client_1.PropertyName.DeviceRinging]: "sensor",
|
|
24
|
+
[eufy_security_client_1.PropertyName.DeviceCryingDetected]: "sensor.noise",
|
|
25
|
+
[eufy_security_client_1.PropertyName.DeviceSoundDetected]: "sensor.noise",
|
|
26
|
+
[eufy_security_client_1.PropertyName.DevicePetDetected]: "sensor",
|
|
27
|
+
[eufy_security_client_1.PropertyName.DeviceSensorOpen]: "sensor",
|
|
28
|
+
[eufy_security_client_1.PropertyName.DeviceBatteryLow]: "indicator.lowbat",
|
|
29
|
+
[eufy_security_client_1.PropertyName.DeviceLockStatus]: "info.status",
|
|
30
|
+
};
|
|
31
|
+
exports.DeviceStateID = {
|
|
32
|
+
NAME: "name",
|
|
33
|
+
MODEL: "model",
|
|
34
|
+
SERIAL_NUMBER: "serial_number",
|
|
35
|
+
HARDWARE_VERSION: "hardware_version",
|
|
36
|
+
SOFTWARE_VERSION: "software_version",
|
|
37
|
+
ENABLED: "device_enabled"
|
|
38
|
+
};
|
|
39
|
+
exports.CameraStateID = {
|
|
40
|
+
...exports.DeviceStateID,
|
|
41
|
+
STATE: "state",
|
|
42
|
+
MAC_ADDRESS: "mac_address",
|
|
43
|
+
LAST_EVENT_PIC_URL: "last_event_pic_url",
|
|
44
|
+
LAST_EVENT_PIC_HTML: "last_event_pic_html",
|
|
45
|
+
LAST_EVENT_VIDEO_URL: "last_event_video_url",
|
|
46
|
+
LIVESTREAM: "livestream",
|
|
47
|
+
LAST_LIVESTREAM_VIDEO_URL: "last_livestream_video_url",
|
|
48
|
+
LAST_LIVESTREAM_PIC_URL: "last_livestream_pic_url",
|
|
49
|
+
LAST_LIVESTREAM_PIC_HTML: "last_livestream_pic_html",
|
|
50
|
+
START_STREAM: "start_stream",
|
|
51
|
+
STOP_STREAM: "stop_stream",
|
|
52
|
+
BATTERY: "battery",
|
|
53
|
+
BATTERY_TEMPERATURE: "battery_temperature",
|
|
54
|
+
LAST_CHARGE_TOTAL_EVENTS: "last_charge_total_events",
|
|
55
|
+
LAST_CHARGE_USED_DAYS: "last_charge_used_days",
|
|
56
|
+
LAST_CHARGE_FILTERED_EVENTS: "last_charge_filtered_events",
|
|
57
|
+
LAST_CHARGE_SAVED_EVENTS: "last_charge_saved_events",
|
|
58
|
+
WIFI_RSSI: "wifi_rssi",
|
|
59
|
+
MOTION_DETECTED: "motion_detected",
|
|
60
|
+
PERSON_DETECTED: "person_detected",
|
|
61
|
+
LAST_PERSON_IDENTIFIED: "last_person_identified",
|
|
62
|
+
WATERMARK: "watermark",
|
|
63
|
+
ANTITHEFT_DETECTION: "antitheft_detection",
|
|
64
|
+
AUTO_NIGHTVISION: "auto_nightvision",
|
|
65
|
+
MOTION_DETECTION: "motion_detection",
|
|
66
|
+
LED_STATUS: "led_status",
|
|
67
|
+
RTSP_STREAM: "rtsp_stream",
|
|
68
|
+
RTSP_STREAM_URL: "rtsp_stream_url",
|
|
69
|
+
TRIGGER_ALARM_SOUND: "trigger_alarm_sound",
|
|
70
|
+
RESET_ALARM_SOUND: "reset_alarm_sound",
|
|
71
|
+
};
|
|
72
|
+
exports.StationStateID = {
|
|
73
|
+
...exports.DeviceStateID,
|
|
74
|
+
GUARD_MODE: "guard_mode",
|
|
75
|
+
CURRENT_MODE: "current_mode",
|
|
76
|
+
LAN_IP_ADDRESS: "lan_ip_address",
|
|
77
|
+
MAC_ADDRESS: "mac_address",
|
|
78
|
+
REBOOT: "reboot",
|
|
79
|
+
CONNECTION: "connection",
|
|
80
|
+
TRIGGER_ALARM_SOUND: "trigger_alarm_sound",
|
|
81
|
+
RESET_ALARM_SOUND: "reset_alarm_sound",
|
|
82
|
+
};
|
|
83
|
+
exports.EntrySensorStateID = {
|
|
84
|
+
...exports.DeviceStateID,
|
|
85
|
+
STATE: "state",
|
|
86
|
+
SENSOR_OPEN: "sensor_open",
|
|
87
|
+
LOW_BATTERY: "low_battery",
|
|
88
|
+
SENSOR_CHANGE_TIME: "sensor_change_time",
|
|
89
|
+
};
|
|
90
|
+
exports.MotionSensorStateID = {
|
|
91
|
+
...exports.DeviceStateID,
|
|
92
|
+
STATE: "state",
|
|
93
|
+
LOW_BATTERY: "low_battery",
|
|
94
|
+
MOTION_DETECTED: "motion_detected",
|
|
95
|
+
};
|
|
96
|
+
exports.KeyPadStateID = {
|
|
97
|
+
...exports.DeviceStateID,
|
|
98
|
+
STATE: "state",
|
|
99
|
+
LOW_BATTERY: "low_battery",
|
|
100
|
+
};
|
|
101
|
+
exports.DoorbellStateID = {
|
|
102
|
+
...exports.CameraStateID,
|
|
103
|
+
RINGING: "ringing",
|
|
104
|
+
};
|
|
105
|
+
exports.IndoorCameraStateID = {
|
|
106
|
+
...exports.CameraStateID,
|
|
107
|
+
CRYING_DETECTED: "crying_detected",
|
|
108
|
+
SOUND_DETECTED: "sound_detected",
|
|
109
|
+
SOUND_DETECTION: "sound_detection",
|
|
110
|
+
PET_DETECTED: "pet_detected",
|
|
111
|
+
PET_DETECTION: "pet_detection",
|
|
112
|
+
PAN_LEFT: "pan_left",
|
|
113
|
+
PAN_RIGHT: "pan_right",
|
|
114
|
+
TILT_UP: "tilt_up",
|
|
115
|
+
TILT_DOWN: "titl_down",
|
|
116
|
+
ROTATE_360: "rotate_360",
|
|
117
|
+
};
|
|
118
|
+
exports.LockStateID = {
|
|
119
|
+
...exports.DeviceStateID,
|
|
120
|
+
STATE: "state",
|
|
121
|
+
BATTERY: "battery",
|
|
122
|
+
WIFI_RSSI: "wifi_rssi",
|
|
123
|
+
LOCK: "lock",
|
|
124
|
+
LOCK_STATUS: "lock_status",
|
|
125
|
+
CALIBRATE: "calibrate",
|
|
126
|
+
};
|
|
127
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"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"}
|