@camera.ui/server 0.0.50-internal.0 → 0.0.50-internal.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.
Files changed (390) hide show
  1. package/dist/interface/index.html +44 -44
  2. package/dist/interface/js/{@primevue.OhxoO3MD.0.0.50-internal.0.js → @primevue.BAIU_p3r.0.0.50-internal.2.js} +1 -1
  3. package/dist/interface/js/{@tanstack.D1IL6eOv.0.0.50-internal.0.js → @tanstack.mdCorqzE.0.0.50-internal.2.js} +1 -1
  4. package/dist/interface/js/{@vee-validate.BGPyWWTh.0.0.50-internal.0.js → @vee-validate.D0vsSsly.0.0.50-internal.2.js} +1 -1
  5. package/dist/interface/js/{@vueuse.BsKtqdiG.0.0.50-internal.0.js → @vueuse.we5ZpWr2.0.0.50-internal.2.js} +1 -1
  6. package/dist/interface/js/{Adminpanel.D93Kvbwp.0.0.50-internal.0.js → Adminpanel.9AEBJ3H1.0.0.50-internal.2.js} +1 -1
  7. package/dist/interface/js/{Camera.DF2l3OMA.0.0.50-internal.0.js → Camera.CZcnEH0C.0.0.50-internal.2.js} +1 -1
  8. package/dist/interface/js/{Cameras.YzvZccdv.0.0.50-internal.0.js → Cameras.DE0LkcGu.0.0.50-internal.2.js} +2 -2
  9. package/dist/interface/js/Cammesh.CVvmkelB.0.0.50-internal.2.js +1 -0
  10. package/dist/interface/js/{Camview.CB7_HnoQ.0.0.50-internal.0.js → Camview.CUr4pGoU.0.0.50-internal.2.js} +1 -1
  11. package/dist/interface/js/{Config.BwflsWTm.0.0.50-internal.0.js → Config.CaJhu4fF.0.0.50-internal.2.js} +2 -2
  12. package/dist/interface/js/{Console.DZM8pN8Q.0.0.50-internal.0.js → Console.5VUmgryj.0.0.50-internal.2.js} +1 -1
  13. package/dist/interface/js/{CuiConsole.BXXU7Gth.0.0.50-internal.0.js → CuiConsole.iYmUxAR5.0.0.50-internal.2.js} +1 -1
  14. package/dist/interface/js/{CuiPluginCard.YFOrpbVD.0.0.50-internal.0.js → CuiPluginCard.DXPyE5mF.0.0.50-internal.2.js} +1 -1
  15. package/dist/interface/js/{CuiTimeline.VV5KSJd5.0.0.50-internal.0.js → CuiTimeline.BqtlOFnV.0.0.50-internal.2.js} +1 -1
  16. package/dist/interface/js/{FirstSteps.b-nvymgb.0.0.50-internal.0.js → FirstSteps.C_RI-SDQ.0.0.50-internal.2.js} +1 -1
  17. package/dist/interface/js/{Plugin.BOMpVEwM.0.0.50-internal.0.js → Plugin.Ch_v02eN.0.0.50-internal.2.js} +1 -1
  18. package/dist/interface/js/{Plugins.DdPwaUDA.0.0.50-internal.0.js → Plugins.BpXAYgSG.0.0.50-internal.2.js} +1 -1
  19. package/dist/interface/js/Recordings.CIKHJytH.0.0.50-internal.2.js +1 -0
  20. package/dist/interface/js/{Settings.D24ttaPu.0.0.50-internal.0.js → Settings.BcLoGNEy.0.0.50-internal.2.js} +1 -1
  21. package/dist/interface/js/{SettingsAccount.ms3aqz4E.0.0.50-internal.0.js → SettingsAccount.DMROW8kx.0.0.50-internal.2.js} +1 -1
  22. package/dist/interface/js/SettingsAppearance.CUaHpihp.0.0.50-internal.2.js +1 -0
  23. package/dist/interface/js/{SettingsAppearance.vue_vue_type_script_setup_true_lang.CBQ6lL3T.0.0.50-internal.0.js → SettingsAppearance.vue_vue_type_script_setup_true_lang.BuKZ-Uco.0.0.50-internal.2.js} +1 -1
  24. package/dist/interface/js/{SettingsBackup.BPEc4Rjg.0.0.50-internal.0.js → SettingsBackup.0QdwFSpv.0.0.50-internal.2.js} +1 -1
  25. package/dist/interface/js/SettingsRecordings.B-aj0U8_.0.0.50-internal.2.js +1 -0
  26. package/dist/interface/js/{SettingsRemote.BL5nXbUT.0.0.50-internal.0.js → SettingsRemote.Bi1YAJ76.0.0.50-internal.2.js} +1 -1
  27. package/dist/interface/js/{SettingsSystem.D7T0AIpm.0.0.50-internal.0.js → SettingsSystem.CAx66Iir.0.0.50-internal.2.js} +1 -1
  28. package/dist/interface/js/{SettingsUsers.1u0vCOVG.0.0.50-internal.0.js → SettingsUsers.CQcDtGy1.0.0.50-internal.2.js} +1 -1
  29. package/dist/interface/js/{VersionsHandler.vue_vue_type_script_setup_true_lang.xDishkkS.0.0.50-internal.0.js → VersionsHandler.vue_vue_type_script_setup_true_lang.BhXMzIhV.0.0.50-internal.2.js} +1 -1
  30. package/dist/interface/js/{ace-builds.D1nmvCwb.0.0.50-internal.0.js → ace-builds.C0sCXSu5.0.0.50-internal.2.js} +2 -2
  31. package/dist/interface/js/{ace.config.G96T2z54.0.0.50-internal.0.js → ace.config.DNqPWa0Q.0.0.50-internal.2.js} +1 -1
  32. package/dist/interface/js/{backup.B_Gzxtp_.0.0.50-internal.0.js → backup.DAXgG3bP.0.0.50-internal.2.js} +1 -1
  33. package/dist/interface/js/{chart.js.CP_nMnnf.0.0.50-internal.0.js → chart.js.Bq3YocRX.0.0.50-internal.2.js} +1 -1
  34. package/dist/interface/js/{close-circle.DYLuVIOg.0.0.50-internal.0.js → close-circle.9rxyNw0z.0.0.50-internal.2.js} +1 -1
  35. package/dist/interface/js/{dnd-core.T9OeW7mu.0.0.50-internal.0.js → dnd-core.BuEvHAsS.0.0.50-internal.2.js} +1 -1
  36. package/dist/interface/js/{draggabilly.D3zGcBb3.0.0.50-internal.0.js → draggabilly.DUdE08x8.0.0.50-internal.2.js} +1 -1
  37. package/dist/interface/js/{engine.io-client.kITRnq-g.0.0.50-internal.0.js → engine.io-client.DWU6YI8o.0.0.50-internal.2.js} +1 -1
  38. package/dist/interface/js/{fast-deep-equal.Bpc9mIsj.0.0.50-internal.0.js → fast-deep-equal.BpPyC6E4.0.0.50-internal.2.js} +1 -1
  39. package/dist/interface/js/{highlight.js.BlSXU-Wb.0.0.50-internal.0.js → highlight.js.BoR2Rhdd.0.0.50-internal.2.js} +1 -1
  40. package/dist/interface/js/{linkify-it.C3N1lWsJ.0.0.50-internal.0.js → linkify-it.BXzPONHs.0.0.50-internal.2.js} +1 -1
  41. package/dist/interface/js/{main.D0YR3Jat.0.0.50-internal.0.js → main.DwcBYfWc.0.0.50-internal.2.js} +3 -3
  42. package/dist/interface/js/{markdown-it.Dj0dt5s2.0.0.50-internal.0.js → markdown-it.BUDVOjPt.0.0.50-internal.2.js} +1 -1
  43. package/dist/interface/js/{nprogress.BwQWDcGj.0.0.50-internal.0.js → nprogress.CsG-OBoI.0.0.50-internal.2.js} +1 -1
  44. package/dist/interface/js/{pinia.DRh7plEC.0.0.50-internal.0.js → pinia.CqEQao5R.0.0.50-internal.2.js} +1 -1
  45. package/dist/interface/js/{primevue.Cl58krXf.0.0.50-internal.0.js → primevue.D91sslRx.0.0.50-internal.2.js} +1 -1
  46. package/dist/interface/js/{qrcode.C1sDj6P8.0.0.50-internal.0.js → qrcode.SdSTPzZO.0.0.50-internal.2.js} +1 -1
  47. package/dist/interface/js/{react-dnd-touch-backend.BA4WhUJo.0.0.50-internal.0.js → react-dnd-touch-backend.BwroebQ4.0.0.50-internal.2.js} +1 -1
  48. package/dist/interface/js/{refresh-rounded.D_SmhhUf.0.0.50-internal.0.js → refresh-rounded.DxM48YSv.0.0.50-internal.2.js} +1 -1
  49. package/dist/interface/js/{rxjs.C-fTBwEO.0.0.50-internal.0.js → rxjs.Cmpbnzo4.0.0.50-internal.2.js} +1 -1
  50. package/dist/interface/js/{socket.io-client.DKrRxgjP.0.0.50-internal.0.js → socket.io-client.DF2YgZo1.0.0.50-internal.2.js} +1 -1
  51. package/dist/interface/js/{socket.io-parser.EXj3YDH2.0.0.50-internal.0.js → socket.io-parser.BUs2ineY.0.0.50-internal.2.js} +1 -1
  52. package/dist/interface/js/{system.CY8rGd-Q.0.0.50-internal.0.js → system.DmkT2LKx.0.0.50-internal.2.js} +1 -1
  53. package/dist/interface/js/{trash-fill.CMnCN3Oy.0.0.50-internal.0.js → trash-fill.dPzyZDVa.0.0.50-internal.2.js} +1 -1
  54. package/dist/interface/js/{unidragger.D0w6Tqtt.0.0.50-internal.0.js → unidragger.y2ZlFveS.0.0.50-internal.2.js} +1 -1
  55. package/dist/interface/js/{vee-validate.BeiObIH8.0.0.50-internal.0.js → vee-validate.Y-alCADW.0.0.50-internal.2.js} +1 -1
  56. package/dist/interface/js/{vue-chartjs.DtdZdiYw.0.0.50-internal.0.js → vue-chartjs.sRVFTqDf.0.0.50-internal.2.js} +1 -1
  57. package/dist/interface/js/{vue-i18n.BW2bx_6z.0.0.50-internal.0.js → vue-i18n.D5WrXOZa.0.0.50-internal.2.js} +1 -1
  58. package/dist/interface/js/{vue-inline-svg.BJkQGmKz.0.0.50-internal.0.js → vue-inline-svg.R0uz_abA.0.0.50-internal.2.js} +1 -1
  59. package/dist/interface/js/{vue-router.B2mOXHaC.0.0.50-internal.0.js → vue-router.65mnGy-o.0.0.50-internal.2.js} +1 -1
  60. package/dist/interface/js/{vue-zoomable.BKDyCJE7.0.0.50-internal.0.js → vue-zoomable.B1Qop6Uu.0.0.50-internal.2.js} +1 -1
  61. package/dist/interface/js/{vue3-dnd.DRK24CBp.0.0.50-internal.0.js → vue3-dnd.CwmyAcir.0.0.50-internal.2.js} +1 -1
  62. package/dist/interface/js/{zoom-out.DxvzgVEo.0.0.50-internal.0.js → zoom-out.CMPALvRh.0.0.50-internal.2.js} +1 -1
  63. package/dist/interface/sw.js +1 -1
  64. package/dist/server/package.json +1 -1
  65. package/dist/server/src/rpc/server.js +4 -1
  66. package/dist/server/src/rpc/server.js.map +1 -1
  67. package/package.json +1 -1
  68. package/.prettierignore +0 -12
  69. package/.prettierrc.json +0 -12
  70. package/artillery.yaml +0 -29
  71. package/bin/cameraui-server.ts +0 -11
  72. package/dist/interface/js/Cammesh.D-6dAROQ.0.0.50-internal.0.js +0 -1
  73. package/dist/interface/js/Recordings.DhxjIW7e.0.0.50-internal.0.js +0 -1
  74. package/dist/interface/js/SettingsAppearance.DsTjKXk1.0.0.50-internal.0.js +0 -1
  75. package/dist/interface/js/SettingsRecordings.DgW7M0jj.0.0.50-internal.0.js +0 -1
  76. package/eslint.config.js +0 -103
  77. package/localdeps.txt +0 -10
  78. package/mypy.ini +0 -30
  79. package/requirements.txt +0 -15
  80. package/ruff.toml +0 -90
  81. package/src/__init__.py +0 -0
  82. package/src/_camera_ui_tools/__init__.py +0 -0
  83. package/src/_camera_ui_tools/__pycache__/__init__.cpython-311.pyc +0 -0
  84. package/src/api/controllers/api.controller.ts +0 -19
  85. package/src/api/controllers/auth.controller.ts +0 -294
  86. package/src/api/controllers/backup.controller.ts +0 -72
  87. package/src/api/controllers/cameras.controller.ts +0 -1029
  88. package/src/api/controllers/config.controller.ts +0 -102
  89. package/src/api/controllers/files.controller.ts +0 -35
  90. package/src/api/controllers/frameWorkers.controller.ts +0 -109
  91. package/src/api/controllers/plugins.controller.ts +0 -1206
  92. package/src/api/controllers/system.controller.ts +0 -273
  93. package/src/api/controllers/users.controller.ts +0 -648
  94. package/src/api/database/checks.ts +0 -268
  95. package/src/api/database/constants.ts +0 -8
  96. package/src/api/database/index.ts +0 -262
  97. package/src/api/database/migration.ts +0 -62
  98. package/src/api/database/selfcheck.ts +0 -492
  99. package/src/api/database/types.ts +0 -104
  100. package/src/api/go2rtc/api/application.ts +0 -48
  101. package/src/api/go2rtc/api/config.ts +0 -61
  102. package/src/api/go2rtc/api/discover.ts +0 -197
  103. package/src/api/go2rtc/api/index.ts +0 -49
  104. package/src/api/go2rtc/api/snapshot.ts +0 -44
  105. package/src/api/go2rtc/api/streams.ts +0 -168
  106. package/src/api/go2rtc/index.ts +0 -43
  107. package/src/api/go2rtc/queue.ts +0 -50
  108. package/src/api/go2rtc/types.ts +0 -174
  109. package/src/api/index.ts +0 -286
  110. package/src/api/middlewares/authPermission.middleware.ts +0 -46
  111. package/src/api/middlewares/authValidation.middleware.ts +0 -160
  112. package/src/api/middlewares/pagination.middleware.ts +0 -67
  113. package/src/api/middlewares/socketAuth.middleware.ts +0 -136
  114. package/src/api/plugins/header.plugin.ts +0 -15
  115. package/src/api/plugins/logger.plugin.ts +0 -44
  116. package/src/api/plugins/proxy.plugin.ts +0 -255
  117. package/src/api/plugins/socket.plugin.ts +0 -28
  118. package/src/api/plugins/system.plugin.ts +0 -48
  119. package/src/api/plugins/useragent.plugin.ts +0 -19
  120. package/src/api/routes/api.routes.ts +0 -10
  121. package/src/api/routes/auth.routes.ts +0 -56
  122. package/src/api/routes/backup.routes.ts +0 -28
  123. package/src/api/routes/cameras.routes.ts +0 -281
  124. package/src/api/routes/config.routes.ts +0 -66
  125. package/src/api/routes/files.routes.ts +0 -15
  126. package/src/api/routes/frameWorkers.routes.ts +0 -39
  127. package/src/api/routes/index.ts +0 -37
  128. package/src/api/routes/plugins.routes.ts +0 -420
  129. package/src/api/routes/system.routes.ts +0 -101
  130. package/src/api/routes/users.routes.ts +0 -167
  131. package/src/api/schemas/backup.schema.ts +0 -112
  132. package/src/api/schemas/cameras.schema.ts +0 -479
  133. package/src/api/schemas/config.schema.ts +0 -38
  134. package/src/api/schemas/go2rtc.schema.ts +0 -189
  135. package/src/api/schemas/plugins.schema.ts +0 -126
  136. package/src/api/schemas/storage.schema.ts +0 -11
  137. package/src/api/schemas/system.schema.ts +0 -45
  138. package/src/api/schemas/users.schema.ts +0 -185
  139. package/src/api/services/auth.service.ts +0 -210
  140. package/src/api/services/backup.service.ts +0 -144
  141. package/src/api/services/cameras.service.ts +0 -671
  142. package/src/api/services/plugins.service.ts +0 -470
  143. package/src/api/services/system.service.ts +0 -85
  144. package/src/api/services/users.service.ts +0 -276
  145. package/src/api/types/index.ts +0 -675
  146. package/src/api/utils/cert.ts +0 -254
  147. package/src/api/utils/constants.ts +0 -17
  148. package/src/api/utils/fetch.ts +0 -21
  149. package/src/api/utils/moveFiles.ts +0 -45
  150. package/src/api/utils/parse.ts +0 -17
  151. package/src/api/websocket/index.ts +0 -110
  152. package/src/api/websocket/nsp/logs.ts +0 -240
  153. package/src/api/websocket/nsp/main.ts +0 -27
  154. package/src/api/websocket/nsp/metrics.ts +0 -301
  155. package/src/api/websocket/nsp/notifications.ts +0 -43
  156. package/src/api/websocket/nsp/plugins.ts +0 -37
  157. package/src/api/websocket/nsp/server.ts +0 -220
  158. package/src/api/websocket/nsp/status.ts +0 -77
  159. package/src/api/websocket/types.ts +0 -55
  160. package/src/api.ts +0 -163
  161. package/src/camera/classes.ts +0 -32
  162. package/src/camera/controller.ts +0 -579
  163. package/src/camera/device.ts +0 -422
  164. package/src/camera/frameWorker.ts +0 -403
  165. package/src/camera/index.ts +0 -679
  166. package/src/camera/interfaces.ts +0 -95
  167. package/src/camera/iou.ts +0 -153
  168. package/src/camera/polygon.ts +0 -226
  169. package/src/camera/python/__init__.py +0 -0
  170. package/src/camera/python/__pycache__/__init__.cpython-311.pyc +0 -0
  171. package/src/camera/python/__pycache__/classes.cpython-311.pyc +0 -0
  172. package/src/camera/python/__pycache__/delegate_controller.cpython-311.pyc +0 -0
  173. package/src/camera/python/__pycache__/interfaces.cpython-311.pyc +0 -0
  174. package/src/camera/python/__pycache__/iou.cpython-310.pyc +0 -0
  175. package/src/camera/python/__pycache__/iou.cpython-311.pyc +0 -0
  176. package/src/camera/python/__pycache__/iou2.cpython-310.pyc +0 -0
  177. package/src/camera/python/__pycache__/polygon.cpython-311.pyc +0 -0
  178. package/src/camera/python/__pycache__/typings.cpython-311.pyc +0 -0
  179. package/src/camera/python/__pycache__/video_frame.cpython-311.pyc +0 -0
  180. package/src/camera/python/classes.py +0 -41
  181. package/src/camera/python/interfaces.py +0 -130
  182. package/src/camera/python/iou.py +0 -158
  183. package/src/camera/python/polygon.py +0 -230
  184. package/src/camera/python/test/__pycache__/polygon.cpython-310.pyc +0 -0
  185. package/src/camera/python/test/iou_test.py +0 -799
  186. package/src/camera/python/test/polygon.py +0 -238
  187. package/src/camera/python/test/polygon_test.py +0 -256
  188. package/src/camera/python/test/polygon_test2.py +0 -484
  189. package/src/camera/python/typings.py +0 -50
  190. package/src/camera/python/video_frame.py +0 -143
  191. package/src/camera/session.ts +0 -192
  192. package/src/camera/streaming/fmp4-session.ts +0 -390
  193. package/src/camera/streaming/peer-connection.ts +0 -273
  194. package/src/camera/streaming/rtsp-session.ts +0 -331
  195. package/src/camera/streaming/webrtc-connection.ts +0 -260
  196. package/src/camera/streaming/werift-session.ts +0 -317
  197. package/src/camera/test/iou_test.ts +0 -761
  198. package/src/camera/test/polygon.test.ts +0 -611
  199. package/src/camera/test/polygon_test.ts +0 -210
  200. package/src/camera/types.ts +0 -48
  201. package/src/camera/utils.ts +0 -489
  202. package/src/camera/videoFrame.ts +0 -123
  203. package/src/cloud/index.ts +0 -61
  204. package/src/cloud/remote/cloudflare.ts +0 -18
  205. package/src/cloud/remote/upnp.ts +0 -18
  206. package/src/cloud/remote/utils.ts +0 -24
  207. package/src/cloud/types.ts +0 -16
  208. package/src/decoder/child.ts +0 -883
  209. package/src/decoder/imageUtils.ts +0 -275
  210. package/src/decoder/manager.ts +0 -251
  211. package/src/decoder/python/__init__.py +0 -0
  212. package/src/decoder/python/__pycache__/__init__.cpython-311.pyc +0 -0
  213. package/src/decoder/python/__pycache__/image_utils.cpython-311.pyc +0 -0
  214. package/src/decoder/python/__pycache__/typings.cpython-311.pyc +0 -0
  215. package/src/decoder/python/__pycache__/utils.cpython-311.pyc +0 -0
  216. package/src/decoder/python/child.py +0 -903
  217. package/src/decoder/python/image_utils.py +0 -196
  218. package/src/decoder/python/pool.py +0 -45
  219. package/src/decoder/python/test/group.py +0 -62
  220. package/src/decoder/python/test/motion.mp4 +0 -0
  221. package/src/decoder/python/test/motion2.mp4 +0 -0
  222. package/src/decoder/python/test/opencl.cl +0 -70
  223. package/src/decoder/python/test/opencl2.cl +0 -130
  224. package/src/decoder/python/test/test.py +0 -427
  225. package/src/decoder/python/test/test1.jpg +0 -0
  226. package/src/decoder/python/test/test1_resized.jpg +0 -0
  227. package/src/decoder/python/test/test2.jpg +0 -0
  228. package/src/decoder/python/test/test2.py +0 -451
  229. package/src/decoder/python/test/test2_resized.jpg +0 -0
  230. package/src/decoder/python/test/test3.jpg +0 -0
  231. package/src/decoder/python/test/utils.py +0 -50
  232. package/src/decoder/python/typings.py +0 -57
  233. package/src/decoder/python/utils.py +0 -70
  234. package/src/decoder/test/child.ts +0 -117
  235. package/src/decoder/test/ffmpeg.ts +0 -371
  236. package/src/decoder/test/test.ts +0 -182
  237. package/src/decoder/types.ts +0 -27
  238. package/src/decoder/utils.ts +0 -64
  239. package/src/decoder/wasm/asconfig.json +0 -28
  240. package/src/decoder/wasm/assembly/console.ts +0 -1
  241. package/src/decoder/wasm/assembly/index.ts +0 -890
  242. package/src/decoder/wasm/build/decoder.d.ts +0 -43
  243. package/src/decoder/wasm/build/decoder.js +0 -108
  244. package/src/decoder/wasm/build/decoder.wasm +0 -0
  245. package/src/decoder/wasm/tsconfig.json +0 -5
  246. package/src/decoder/worker.ts +0 -113
  247. package/src/go2rtc/index.ts +0 -324
  248. package/src/go2rtc/types.ts +0 -88
  249. package/src/main.ts +0 -267
  250. package/src/manager/coreManager.ts +0 -78
  251. package/src/manager/deviceManager.ts +0 -132
  252. package/src/manager/types.ts +0 -17
  253. package/src/plugins/index.ts +0 -443
  254. package/src/plugins/plugin.ts +0 -177
  255. package/src/plugins/runtime/base.ts +0 -282
  256. package/src/plugins/runtime/index.ts +0 -15
  257. package/src/plugins/runtime/node/child.ts +0 -193
  258. package/src/plugins/runtime/node/index.ts +0 -67
  259. package/src/plugins/runtime/node/plugin.ts +0 -122
  260. package/src/plugins/runtime/node/pluginApi.ts +0 -27
  261. package/src/plugins/runtime/node/proxy/cameraDevice.ts +0 -299
  262. package/src/plugins/runtime/node/proxy/coreManager.ts +0 -128
  263. package/src/plugins/runtime/node/proxy/deviceManager.ts +0 -187
  264. package/src/plugins/runtime/node/storage.ts +0 -312
  265. package/src/plugins/runtime/node/storageController.ts +0 -91
  266. package/src/plugins/runtime/python/__init__.py +0 -0
  267. package/src/plugins/runtime/python/__pycache__/__init__.cpython-311.pyc +0 -0
  268. package/src/plugins/runtime/python/__pycache__/camera_storage.cpython-311.pyc +0 -0
  269. package/src/plugins/runtime/python/__pycache__/config_service.cpython-311.pyc +0 -0
  270. package/src/plugins/runtime/python/__pycache__/constants.cpython-311.pyc +0 -0
  271. package/src/plugins/runtime/python/__pycache__/ipc.cpython-311.pyc +0 -0
  272. package/src/plugins/runtime/python/__pycache__/logger.cpython-311.pyc +0 -0
  273. package/src/plugins/runtime/python/__pycache__/message_queue.cpython-311.pyc +0 -0
  274. package/src/plugins/runtime/python/__pycache__/namespaces.cpython-311.pyc +0 -0
  275. package/src/plugins/runtime/python/__pycache__/plugin.cpython-311.pyc +0 -0
  276. package/src/plugins/runtime/python/__pycache__/plugin_api.cpython-311.pyc +0 -0
  277. package/src/plugins/runtime/python/__pycache__/plugin_logger.cpython-311.pyc +0 -0
  278. package/src/plugins/runtime/python/__pycache__/proxy_utils.cpython-311.pyc +0 -0
  279. package/src/plugins/runtime/python/__pycache__/schema.cpython-311.pyc +0 -0
  280. package/src/plugins/runtime/python/__pycache__/storage.cpython-311.pyc +0 -0
  281. package/src/plugins/runtime/python/__pycache__/storage_controller.cpython-311.pyc +0 -0
  282. package/src/plugins/runtime/python/__pycache__/typings.cpython-311.pyc +0 -0
  283. package/src/plugins/runtime/python/child.py +0 -248
  284. package/src/plugins/runtime/python/index.ts +0 -73
  285. package/src/plugins/runtime/python/namespaces.py +0 -101
  286. package/src/plugins/runtime/python/plugin.py +0 -155
  287. package/src/plugins/runtime/python/plugin_api.py +0 -29
  288. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-310.pyc +0 -0
  289. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-311.pyc +0 -0
  290. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-38.pyc +0 -0
  291. package/src/plugins/runtime/python/proxy/__pycache__/camera_device.cpython-39.pyc +0 -0
  292. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-311.pyc +0 -0
  293. package/src/plugins/runtime/python/proxy/__pycache__/constants.cpython-39.pyc +0 -0
  294. package/src/plugins/runtime/python/proxy/__pycache__/core_manager.cpython-311.pyc +0 -0
  295. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-310.pyc +0 -0
  296. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-311.pyc +0 -0
  297. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-38.pyc +0 -0
  298. package/src/plugins/runtime/python/proxy/__pycache__/device_manager.cpython-39.pyc +0 -0
  299. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-310.pyc +0 -0
  300. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-311.pyc +0 -0
  301. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-38.pyc +0 -0
  302. package/src/plugins/runtime/python/proxy/__pycache__/generate_keys.cpython-39.pyc +0 -0
  303. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-310.pyc +0 -0
  304. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-311.pyc +0 -0
  305. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-38.pyc +0 -0
  306. package/src/plugins/runtime/python/proxy/__pycache__/message_queue.cpython-39.pyc +0 -0
  307. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-310.pyc +0 -0
  308. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-311.pyc +0 -0
  309. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-38.pyc +0 -0
  310. package/src/plugins/runtime/python/proxy/__pycache__/plugins_manager.cpython-39.pyc +0 -0
  311. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-310.pyc +0 -0
  312. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-311.pyc +0 -0
  313. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-38.pyc +0 -0
  314. package/src/plugins/runtime/python/proxy/__pycache__/system_manager.cpython-39.pyc +0 -0
  315. package/src/plugins/runtime/python/proxy/camera_device.py +0 -1732
  316. package/src/plugins/runtime/python/proxy/core_manager.py +0 -126
  317. package/src/plugins/runtime/python/proxy/device_manager.py +0 -197
  318. package/src/plugins/runtime/python/schema.py +0 -99
  319. package/src/plugins/runtime/python/storage.py +0 -353
  320. package/src/plugins/runtime/python/storage_controller.py +0 -102
  321. package/src/plugins/runtime/python/typings.py +0 -195
  322. package/src/plugins/schema.ts +0 -472
  323. package/src/plugins/types.ts +0 -60
  324. package/src/plugins/worker.ts +0 -250
  325. package/src/rpc/index.ts +0 -149
  326. package/src/rpc/namespaces.ts +0 -79
  327. package/src/rpc/server.ts +0 -422
  328. package/src/rpc/types.ts +0 -119
  329. package/src/rpc/utils.ts +0 -16
  330. package/src/services/config/constants.ts +0 -47
  331. package/src/services/config/defaults.ts +0 -57
  332. package/src/services/config/index.ts +0 -744
  333. package/src/services/config/types.ts +0 -211
  334. package/src/services/logger/index.ts +0 -96
  335. package/src/types.ts +0 -47
  336. package/src/utils/path.ts +0 -16
  337. package/src/utils/pythonInstaller.ts +0 -597
  338. package/tsconfig.json +0 -37
  339. package/types/fastify.d.ts +0 -14
  340. package/updates.config.js +0 -3
  341. /package/dist/interface/assets/{@xterm.DYP7pi_n.0.0.50-internal.0.css → @xterm.DYP7pi_n.0.0.50-internal.2.css} +0 -0
  342. /package/dist/interface/assets/{Adminpanel.BKek2EMH.0.0.50-internal.0.css → Adminpanel.BKek2EMH.0.0.50-internal.2.css} +0 -0
  343. /package/dist/interface/assets/{Cameras.BDWZJqPN.0.0.50-internal.0.css → Cameras.BDWZJqPN.0.0.50-internal.2.css} +0 -0
  344. /package/dist/interface/assets/{Camview.BFUFMoNX.0.0.50-internal.0.css → Camview.BFUFMoNX.0.0.50-internal.2.css} +0 -0
  345. /package/dist/interface/assets/{CuiConsole.DCYyxdVg.0.0.50-internal.0.css → CuiConsole.DCYyxdVg.0.0.50-internal.2.css} +0 -0
  346. /package/dist/interface/assets/{CuiPluginCard.yF8V0SZY.0.0.50-internal.0.css → CuiPluginCard.yF8V0SZY.0.0.50-internal.2.css} +0 -0
  347. /package/dist/interface/assets/{CuiTimeline.BkIwlYtw.0.0.50-internal.0.css → CuiTimeline.BkIwlYtw.0.0.50-internal.2.css} +0 -0
  348. /package/dist/interface/assets/{Plugin.DJElsAn5.0.0.50-internal.0.css → Plugin.DJElsAn5.0.0.50-internal.2.css} +0 -0
  349. /package/dist/interface/assets/{Plugins.0h77qnmN.0.0.50-internal.0.css → Plugins.0h77qnmN.0.0.50-internal.2.css} +0 -0
  350. /package/dist/interface/assets/{Settings.CkgfRkQr.0.0.50-internal.0.css → Settings.CkgfRkQr.0.0.50-internal.2.css} +0 -0
  351. /package/dist/interface/assets/{SettingsAccount.DeFul3eQ.0.0.50-internal.0.css → SettingsAccount.DeFul3eQ.0.0.50-internal.2.css} +0 -0
  352. /package/dist/interface/assets/{SettingsBackup.CX0rT0QJ.0.0.50-internal.0.css → SettingsBackup.CX0rT0QJ.0.0.50-internal.2.css} +0 -0
  353. /package/dist/interface/assets/{highlight.Ch2EwETz.0.0.50-internal.0.css → highlight.Ch2EwETz.0.0.50-internal.2.css} +0 -0
  354. /package/dist/interface/assets/{logo-256.BCQk9H1-.0.0.50-internal.0.png → logo-256.BCQk9H1-.0.0.50-internal.2.png} +0 -0
  355. /package/dist/interface/assets/{logo-512.DLKVOU2S.0.0.50-internal.0.png → logo-512.DLKVOU2S.0.0.50-internal.2.png} +0 -0
  356. /package/dist/interface/assets/{logo.DmEiRk0z.0.0.50-internal.0.png → logo.DmEiRk0z.0.0.50-internal.2.png} +0 -0
  357. /package/dist/interface/assets/{main.Cip9LkS3.0.0.50-internal.0.css → main.Cip9LkS3.0.0.50-internal.2.css} +0 -0
  358. /package/dist/interface/assets/{mode-json.Br7xisR1.0.0.50-internal.0.js → mode-json.Br7xisR1.0.0.50-internal.2.js} +0 -0
  359. /package/dist/interface/assets/{mode-yaml.CIYL8U3d.0.0.50-internal.0.js → mode-yaml.CIYL8U3d.0.0.50-internal.2.js} +0 -0
  360. /package/dist/interface/assets/{worker-base.jEXLGV2h.0.0.50-internal.0.js → worker-base.jEXLGV2h.0.0.50-internal.2.js} +0 -0
  361. /package/dist/interface/assets/{worker-json.DgwNIOck.0.0.50-internal.0.js → worker-json.DgwNIOck.0.0.50-internal.2.js} +0 -0
  362. /package/dist/interface/assets/{worker-yaml.B3uUYINB.0.0.50-internal.0.js → worker-yaml.B3uUYINB.0.0.50-internal.2.js} +0 -0
  363. /package/dist/interface/js/{@babel.l0sNRNKZ.0.0.50-internal.0.js → @babel.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  364. /package/dist/interface/js/{@intlify.BkGPX90O.0.0.50-internal.0.js → @intlify.BkGPX90O.0.0.50-internal.2.js} +0 -0
  365. /package/dist/interface/js/{@kurkle.D8fDXNIl.0.0.50-internal.0.js → @kurkle.D8fDXNIl.0.0.50-internal.2.js} +0 -0
  366. /package/dist/interface/js/{@primeuix.BFAY2Bk9.0.0.50-internal.0.js → @primeuix.BFAY2Bk9.0.0.50-internal.2.js} +0 -0
  367. /package/dist/interface/js/{@react-dnd.CcwRs9xb.0.0.50-internal.0.js → @react-dnd.CcwRs9xb.0.0.50-internal.2.js} +0 -0
  368. /package/dist/interface/js/{@socket.io.Dkula2eQ.0.0.50-internal.0.js → @socket.io.Dkula2eQ.0.0.50-internal.2.js} +0 -0
  369. /package/dist/interface/js/{@vue.B5vqhCp2.0.0.50-internal.0.js → @vue.B5vqhCp2.0.0.50-internal.2.js} +0 -0
  370. /package/dist/interface/js/{@xterm.CAa7rpjv.0.0.50-internal.0.js → @xterm.C-5Lxnx_.0.0.50-internal.2.js} +0 -0
  371. /package/dist/interface/js/{axios.DHr9lByg.0.0.50-internal.0.js → axios.DHr9lByg.0.0.50-internal.2.js} +0 -0
  372. /package/dist/interface/js/{birpc.l0sNRNKZ.0.0.50-internal.0.js → birpc.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  373. /package/dist/interface/js/{compare-versions.DqEOhma6.0.0.50-internal.0.js → compare-versions.DqEOhma6.0.0.50-internal.2.js} +0 -0
  374. /package/dist/interface/js/{dijkstrajs.C00ieaqj.0.0.50-internal.0.js → dijkstrajs.C00ieaqj.0.0.50-internal.2.js} +0 -0
  375. /package/dist/interface/js/{engine.io-parser.BiEtp6m2.0.0.50-internal.0.js → engine.io-parser.BiEtp6m2.0.0.50-internal.2.js} +0 -0
  376. /package/dist/interface/js/{entities.C20TfXL6.0.0.50-internal.0.js → entities.C20TfXL6.0.0.50-internal.2.js} +0 -0
  377. /package/dist/interface/js/{ev-emitter.X5f1qa-c.0.0.50-internal.0.js → ev-emitter.X5f1qa-c.0.0.50-internal.2.js} +0 -0
  378. /package/dist/interface/js/{get-size.D1dS-IaP.0.0.50-internal.0.js → get-size.D1dS-IaP.0.0.50-internal.2.js} +0 -0
  379. /package/dist/interface/js/{hookable.l0sNRNKZ.0.0.50-internal.0.js → hookable.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  380. /package/dist/interface/js/{mdurl.k9Sl0PQj.0.0.50-internal.0.js → mdurl.k9Sl0PQj.0.0.50-internal.2.js} +0 -0
  381. /package/dist/interface/js/{perfect-debounce.l0sNRNKZ.0.0.50-internal.0.js → perfect-debounce.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  382. /package/dist/interface/js/{primelocale.Bga3dOQu.0.0.50-internal.0.js → primelocale.Bga3dOQu.0.0.50-internal.2.js} +0 -0
  383. /package/dist/interface/js/{punycode.js.Dj65hjkv.0.0.50-internal.0.js → punycode.js.Dj65hjkv.0.0.50-internal.2.js} +0 -0
  384. /package/dist/interface/js/{react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.0.js → react-dnd-html5-backend.1HQjlkwI.0.0.50-internal.2.js} +0 -0
  385. /package/dist/interface/js/{redux.BFxtlG_c.0.0.50-internal.0.js → redux.BFxtlG_c.0.0.50-internal.2.js} +0 -0
  386. /package/dist/interface/js/{tslib.9k7AwCpt.0.0.50-internal.0.js → tslib.9k7AwCpt.0.0.50-internal.2.js} +0 -0
  387. /package/dist/interface/js/{uc.micro.kMc2yuuw.0.0.50-internal.0.js → uc.micro.kMc2yuuw.0.0.50-internal.2.js} +0 -0
  388. /package/dist/interface/js/{uuid.C6aID195.0.0.50-internal.0.js → uuid.C6aID195.0.0.50-internal.2.js} +0 -0
  389. /package/dist/interface/js/{vue.l0sNRNKZ.0.0.50-internal.0.js → vue.l0sNRNKZ.0.0.50-internal.2.js} +0 -0
  390. /package/dist/interface/js/{zod.SKKegNRO.0.0.50-internal.0.js → zod.SKKegNRO.0.0.50-internal.2.js} +0 -0
@@ -1,671 +0,0 @@
1
- import { createSourceName, isEqual, mergeWith } from '@camera.ui/common/utils';
2
- import TTLCache from '@isaacs/ttlcache';
3
- import { container, delay, registry } from 'tsyringe';
4
-
5
- import { CAMERA_EXTENSIONS } from '../../plugins/types.js';
6
- import { ConfigService } from '../../services/config/index.js';
7
- import { Database } from '../database/index.js';
8
- import { PluginsService } from './plugins.service.js';
9
- import { UsersService } from './users.service.js';
10
-
11
- import type {
12
- Camera,
13
- CameraExtension,
14
- CameraInputSettings,
15
- CameraSource,
16
- DetectionZone,
17
- Go2RtcRTSPSource,
18
- Go2RtcSnapshotSource,
19
- Go2RtcWSSource,
20
- ProbeConfig,
21
- } from '@camera.ui/types';
22
- import type { CameraUiAPI } from '../../api.js';
23
- import type { DeepPartial } from '../../types.js';
24
- import type { DBCamera } from '../database/types.js';
25
- import type { Go2RtcApi } from '../go2rtc/index.js';
26
- import type { CreateStreamData, DeviceSource, DeviceSourceType, Go2RTCProbe } from '../go2rtc/types.js';
27
-
28
- const cameraSourceProbeCache = new TTLCache<string, Go2RTCProbe>({ max: 100, ttl: Infinity });
29
-
30
- @registry([
31
- {
32
- token: 'dbs',
33
- useValue: delay(() => Database),
34
- },
35
- ])
36
- export class CamerasService {
37
- private configService: ConfigService;
38
- private api: CameraUiAPI;
39
- private dbs: Database;
40
- private go2rtcApi: Go2RtcApi;
41
-
42
- private usersService: UsersService;
43
- private pluginsService: PluginsService;
44
-
45
- constructor() {
46
- this.configService = container.resolve<ConfigService>('configService');
47
- this.api = container.resolve<CameraUiAPI>('api');
48
- this.dbs = container.resolve<Database>('dbs');
49
- this.go2rtcApi = container.resolve<Go2RtcApi>('go2rtcApi');
50
-
51
- this.usersService = new UsersService();
52
- this.pluginsService = new PluginsService();
53
- }
54
-
55
- public async createCamera(cameraData: DBCamera): Promise<DBCamera> {
56
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
57
-
58
- const plugin = this.pluginsService.getPluginById(cameraData.pluginId);
59
- if (plugin) {
60
- plugin.contract.extensions.forEach((extensionType) => {
61
- if (extensionType !== 'hub') {
62
- cameraData.extensions[extensionType] = {
63
- id: plugin.id,
64
- name: plugin.pluginName,
65
- };
66
- } else {
67
- cameraData.extensions[extensionType] ??= [];
68
- cameraData.extensions[extensionType].push({
69
- id: plugin.id,
70
- name: plugin.pluginName,
71
- });
72
- }
73
- });
74
- }
75
-
76
- await this.addCameraSourcesToConfig(cameraData._id, cameraData.name, cameraData.sources);
77
-
78
- cameras.push(cameraData);
79
- await this.dbs.camerasDB.put('cameras', cameras);
80
-
81
- const transformedCamera = this.transformCamera(cameraData);
82
- await this.api.addCamera(transformedCamera);
83
-
84
- return cameraData;
85
- }
86
-
87
- public async patchZones(cameraname: string, zoneData: DetectionZone[]): Promise<DBCamera | undefined> {
88
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
89
- const camera = cameras.find((camera) => camera.name === cameraname);
90
-
91
- if (camera) {
92
- camera.detectionZones = zoneData;
93
- await this.dbs.camerasDB.put('cameras', cameras);
94
- this.api.updateCamera(this.transformCamera(camera));
95
- }
96
-
97
- return camera;
98
- }
99
-
100
- public list(): DBCamera[] {
101
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
102
- return cameras;
103
- }
104
-
105
- public async discoverCameras(type?: DeviceSourceType, src?: string): Promise<{ sources: DeviceSource[] }> {
106
- switch (type?.toLowerCase()) {
107
- case 'homekit':
108
- return this.go2rtcApi.discoverApi.discoverHomekit();
109
- case 'onvif':
110
- return this.go2rtcApi.discoverApi.discoverOnvif(src ? { src } : undefined);
111
- case 'hass':
112
- return this.go2rtcApi.discoverApi.discoverHass();
113
- case 'gopro':
114
- return this.go2rtcApi.discoverApi.discoverGopro();
115
- case 'ffmpeg':
116
- return this.go2rtcApi.discoverApi.discoverFFmpeg();
117
- case 'dvrip':
118
- return this.go2rtcApi.discoverApi.discoverDvrip();
119
- case 'webtorrent':
120
- return this.go2rtcApi.discoverApi.discoverWebtorrent();
121
- default:
122
- return this.go2rtcApi.discoverApi.discoverSources();
123
- }
124
- }
125
-
126
- public listTransformed(): Camera[] {
127
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
128
- const transformedCameras = cameras.map((camera) => this.transformCamera(camera));
129
- return transformedCameras;
130
- }
131
-
132
- public listByPluginId(pluginId: string): DBCamera[] {
133
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
134
- return cameras.filter((camera) => camera.pluginId === pluginId);
135
- }
136
-
137
- public listTransformedByPluginId(pluginId: string): Camera[] {
138
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
139
- const filteredCameras = cameras.filter((camera) => camera.pluginId === pluginId);
140
- const transformedCameras = filteredCameras.map((camera) => this.transformCamera(camera));
141
- return transformedCameras;
142
- }
143
-
144
- public listByExtension(pluginName: string): DBCamera[] {
145
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
146
- return cameras.filter((camera) => camera.extensions.plugins.some((p) => p.name === pluginName));
147
- }
148
-
149
- public listTransformedByExtension(pluginName: string, extensions: CameraExtension[]): Camera[] {
150
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
151
- const camerasMap = new Map<string, Camera>();
152
-
153
- for (const type of extensions) {
154
- let dbCameras: DBCamera[] = [];
155
-
156
- if (type === 'hub') {
157
- dbCameras = cameras.filter((camera) => camera.extensions[type]?.some((p) => p.name === pluginName));
158
- } else {
159
- dbCameras = cameras.filter((camera) => camera.extensions[type]?.name === pluginName);
160
- }
161
-
162
- dbCameras.forEach((camera) => camerasMap.set(camera._id, this.transformCamera(camera)));
163
- }
164
-
165
- return Array.from(camerasMap.values());
166
- }
167
-
168
- public findById(id: string): DBCamera | undefined {
169
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
170
- return cameras?.find((cameraObj) => cameraObj._id === id);
171
- }
172
-
173
- public findTransformedById(id: string): Camera | undefined {
174
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
175
- const camera = cameras?.find((cameraObj) => cameraObj._id === id);
176
-
177
- if (camera) {
178
- return this.transformCamera(camera);
179
- }
180
- }
181
-
182
- public findByName(cameraname: string): DBCamera | undefined {
183
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
184
- return cameras?.find((cameraObj) => cameraObj.name === cameraname);
185
- }
186
-
187
- public findTransformedByName(cameraname: string): Camera | undefined {
188
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
189
- const camera = cameras?.find((cameraObj) => cameraObj.name === cameraname);
190
-
191
- if (camera) {
192
- return this.transformCamera(camera);
193
- }
194
- }
195
-
196
- public findByPluginAndName(cameraname: string, pluginId: string): DBCamera | undefined {
197
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
198
- return cameras?.find((cameraObj) => cameraObj.name === cameraname && cameraObj.pluginId === pluginId);
199
- }
200
-
201
- public findTransformedByPluginAndName(cameraname: string, pluginId: string): Camera | undefined {
202
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
203
- const camera = cameras?.find((cameraObj) => cameraObj.name === cameraname && cameraObj.pluginId === pluginId);
204
-
205
- if (camera) {
206
- return this.transformCamera(camera);
207
- }
208
- }
209
-
210
- public async patchCameraByName(cameraname: string, cameraData: DeepPartial<DBCamera>): Promise<DBCamera | undefined> {
211
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
212
- const camera = cameras.find((camera) => camera.name === cameraname);
213
- const cameraController = this.api.getCamera(camera?._id ?? '');
214
- const cameraOld = structuredClone(camera);
215
-
216
- if (camera && cameraOld) {
217
- mergeWith(camera, cameraData, (source: any[], target: any, key) => {
218
- if (key === 'sources') {
219
- return (target as CameraInputSettings[]).map((srcItem) => {
220
- const objItem: CameraInputSettings | undefined = source.find((o: any) => o.name === srcItem.name);
221
- const sourceId = objItem?._id ?? srcItem._id;
222
- return objItem ? { ...objItem, ...srcItem, _id: sourceId, name: objItem.name } : srcItem;
223
- });
224
- }
225
-
226
- if (key === 'extensions') {
227
- return cameraOld.extensions;
228
- }
229
-
230
- if (Array.isArray(source)) {
231
- return target;
232
- }
233
- });
234
-
235
- if (!isEqual(cameraOld, camera, true)) {
236
- if (cameraOld.name !== camera.name) {
237
- await this.removeCameraSourcesFromConfig(cameraOld.name, cameraOld.sources);
238
- }
239
-
240
- const orphanedSources = cameraOld.sources.filter((source) => !camera.sources.find((s) => s.name === source.name));
241
- await this.removeCameraSourcesFromConfig(camera.name, orphanedSources);
242
- }
243
-
244
- await this.addCameraSourcesToConfig(camera._id, camera.name, camera.sources);
245
- await this.dbs.camerasDB.put('cameras', cameras);
246
-
247
- const sourcesChanged = !isEqual(cameraOld.sources, camera.sources, true);
248
- if (sourcesChanged) {
249
- cameraController?.streamInfos.clear();
250
- }
251
-
252
- this.api.updateCamera(this.transformCamera(camera));
253
- }
254
-
255
- return camera;
256
- }
257
-
258
- public async enableExtensionByName(cameraname: string, pluginNameOrId: string, extensionType: CameraExtension): Promise<DBCamera | undefined> {
259
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
260
- const plugin = this.pluginsService.getPluginByName(pluginNameOrId) ?? this.pluginsService.getPluginById(pluginNameOrId);
261
- const camera = cameras.find((camera) => camera.name === cameraname);
262
- const cameraOld = structuredClone(camera);
263
-
264
- if (camera && cameraOld && plugin) {
265
- if (
266
- CAMERA_EXTENSIONS.includes(extensionType) &&
267
- extensionType !== 'hub' &&
268
- extensionType !== 'cameraController' &&
269
- camera.extensions[extensionType]?.name !== plugin.pluginName &&
270
- camera.extensions.plugins.some((p) => p.name === plugin.pluginName)
271
- ) {
272
- const oldExtension = camera.extensions[extensionType]?.name;
273
- const oldPlugin = oldExtension ? this.pluginsService.getPluginByName(oldExtension) : undefined;
274
-
275
- camera.extensions[extensionType] = {
276
- id: plugin.id,
277
- name: plugin.pluginName,
278
- };
279
-
280
- const transformedCamera = this.transformCamera(camera);
281
-
282
- await this.dbs.camerasDB.put('cameras', cameras);
283
-
284
- if (oldPlugin && oldExtension) {
285
- await this.api.deselectCamera(oldPlugin.id, transformedCamera, extensionType);
286
- }
287
-
288
- this.api.updateCamera(transformedCamera);
289
- await this.api.selectCamera(plugin.id, transformedCamera, extensionType);
290
- }
291
- }
292
-
293
- return camera;
294
- }
295
-
296
- public async disableExtensionByName(cameraname: string, pluginNameOrId: string, extensionType: CameraExtension): Promise<DBCamera | undefined> {
297
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
298
- const plugin = this.pluginsService.getPluginByName(pluginNameOrId) ?? this.pluginsService.getPluginById(pluginNameOrId);
299
- const camera = cameras.find((camera) => camera.name === cameraname);
300
- const cameraOld = structuredClone(camera);
301
-
302
- if (camera && cameraOld && plugin) {
303
- if (
304
- CAMERA_EXTENSIONS.includes(extensionType) &&
305
- extensionType !== 'hub' &&
306
- extensionType !== 'cameraController' &&
307
- camera.extensions[extensionType]?.name === plugin.pluginName &&
308
- camera.extensions.plugins.some((p) => p.name === plugin.pluginName)
309
- ) {
310
- camera.extensions[extensionType] = undefined;
311
-
312
- const transformedCamera = this.transformCamera(camera);
313
-
314
- await this.dbs.camerasDB.put('cameras', cameras);
315
- await this.api.deselectCamera(plugin.id, transformedCamera, extensionType);
316
- this.api.updateCamera(transformedCamera);
317
-
318
- setTimeout(() => {
319
- this.api.resetCameraState(camera._id, extensionType);
320
- }, 100);
321
- }
322
- }
323
-
324
- return camera;
325
- }
326
-
327
- public async addExtensionByName(cameraname: string, pluginNameOrId: string, extension: CameraExtension): Promise<DBCamera | undefined> {
328
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
329
- const plugin = this.pluginsService.getPluginByName(pluginNameOrId) ?? this.pluginsService.getPluginById(pluginNameOrId);
330
- const camera = cameras.find((camera) => camera.name === cameraname);
331
- const cameraOld = structuredClone(camera);
332
-
333
- if (camera && cameraOld && plugin && !camera.extensions.plugins.some((p) => p.name === plugin.pluginName)) {
334
- camera.extensions.plugins.push({
335
- id: plugin.id,
336
- name: plugin.pluginName,
337
- });
338
-
339
- const addedExtensions: CameraExtension[] = [];
340
-
341
- if (extension !== 'hub') {
342
- if (!camera.extensions[extension]) {
343
- camera.extensions[extension] = {
344
- id: plugin.id,
345
- name: plugin.pluginName,
346
- };
347
- addedExtensions.push(extension);
348
- }
349
- } else {
350
- camera.extensions[extension] ??= [];
351
- camera.extensions[extension].push({
352
- id: plugin.id,
353
- name: plugin.pluginName,
354
- });
355
- addedExtensions.push(extension);
356
- }
357
-
358
- const transformedCamera = this.transformCamera(camera);
359
-
360
- await this.dbs.camerasDB.put('cameras', cameras);
361
- this.api.updateCamera(transformedCamera);
362
- await Promise.allSettled(addedExtensions.map((extensionType) => this.api.selectCamera(plugin.id, transformedCamera, extensionType)));
363
- }
364
-
365
- return camera;
366
- }
367
-
368
- public async removeExtensionByName(cameraname: string, pluginNameOrId: string, extension: CameraExtension): Promise<DBCamera | undefined> {
369
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
370
- const plugin = this.pluginsService.getPluginByName(pluginNameOrId) ?? this.pluginsService.getPluginById(pluginNameOrId);
371
- const camera = cameras.find((camera) => camera.name === cameraname);
372
- const cameraOld = structuredClone(camera);
373
-
374
- if (camera && cameraOld && plugin && camera.extensions.plugins.some((p) => p.name === plugin.pluginName)) {
375
- camera.extensions.plugins = camera.extensions.plugins.filter((p) => p.name !== plugin.pluginName);
376
-
377
- const removedExtensions = new Set<CameraExtension>();
378
-
379
- if (extension !== 'hub') {
380
- if (camera.extensions[extension]?.name === plugin.pluginName) {
381
- camera.extensions[extension] = undefined;
382
- removedExtensions.add(extension);
383
- }
384
- } else {
385
- camera.extensions[extension] ??= [];
386
- camera.extensions[extension] = camera.extensions[extension].filter((p) => p.name !== plugin.pluginName);
387
- removedExtensions.add(extension);
388
- }
389
-
390
- const transformedCamera = this.transformCamera(camera);
391
-
392
- await this.dbs.camerasDB.put('cameras', cameras);
393
- await Promise.allSettled(Array.from(removedExtensions).map((extensionType) => this.api.deselectCamera(plugin.id, transformedCamera, extensionType)));
394
- this.api.updateCamera(transformedCamera);
395
- }
396
-
397
- return camera;
398
- }
399
-
400
- public async removeExtension(pluginNameOrId: string, extension: CameraExtension): Promise<void> {
401
- const cameras = this.dbs.camerasDB.get('cameras') ?? [];
402
-
403
- for (const camera of cameras) {
404
- const plugin = this.pluginsService.getPluginByName(pluginNameOrId) ?? this.pluginsService.getPluginById(pluginNameOrId);
405
-
406
- if (plugin && camera.extensions.plugins.some((p) => p.name === plugin.pluginName)) {
407
- camera.extensions.plugins = camera.extensions.plugins.filter((p) => p.name !== plugin.pluginName);
408
-
409
- const removedExtensions = new Set<CameraExtension>();
410
-
411
- if (extension !== 'hub') {
412
- if (camera.extensions[extension]?.name === plugin.pluginName) {
413
- camera.extensions[extension] = undefined;
414
- removedExtensions.add(extension);
415
- }
416
- } else {
417
- camera.extensions[extension] ??= [];
418
- camera.extensions[extension] = camera.extensions[extension].filter((p) => p.name !== plugin.pluginName);
419
- removedExtensions.add(extension);
420
- }
421
-
422
- const transformedCamera = this.transformCamera(camera);
423
- await this.dbs.camerasDB.put('cameras', cameras);
424
- await Promise.allSettled(Array.from(removedExtensions).map((extensionType) => this.api.deselectCamera(plugin.id, transformedCamera, extensionType)));
425
- this.api.updateCamera(this.transformCamera(camera));
426
- }
427
- }
428
- }
429
-
430
- public async removeByName(cameraname: string): Promise<void> {
431
- let cameras = this.dbs.camerasDB.get('cameras') ?? [];
432
- const camera = cameras.find((cameraObj) => cameraObj.name === cameraname);
433
-
434
- if (camera) {
435
- cameras = cameras.filter((cameraObj) => cameraObj.name !== camera.name);
436
-
437
- for (const source of camera.sources) {
438
- cameraSourceProbeCache.delete(source._id);
439
- }
440
-
441
- await this.usersService.removeCameraFromPreferences(camera._id);
442
- await this.dbs.camerasDB.put('cameras', cameras);
443
- await this.removeCameraSourcesFromConfig(camera.name, camera.sources);
444
- await this.api.removeCamera(this.transformCamera(camera), camera.extensions);
445
- }
446
- }
447
-
448
- public async removeById(id: string): Promise<void> {
449
- let cameras = this.dbs.camerasDB.get('cameras') ?? [];
450
- const camera = cameras.find((cameraObj) => cameraObj._id === id);
451
-
452
- if (camera) {
453
- cameras = cameras.filter((cameraObj) => cameraObj.name !== camera.name);
454
-
455
- for (const source of camera.sources) {
456
- cameraSourceProbeCache.delete(source._id);
457
- }
458
-
459
- await this.usersService.removeCameraFromPreferences(camera._id);
460
- await this.dbs.camerasDB.put('cameras', cameras);
461
- await this.removeCameraSourcesFromConfig(camera.name, camera.sources);
462
- await this.api.removeCamera(this.transformCamera(camera), camera.extensions);
463
- }
464
- }
465
-
466
- public async removeByPluginName(pluginName: string): Promise<void> {
467
- const plugin = this.pluginsService.getPluginDbByName(pluginName);
468
-
469
- if (plugin) {
470
- await this.removeByPluginId(plugin._id);
471
- }
472
- }
473
-
474
- public async removeByPluginId(pluginId: string): Promise<void> {
475
- let cameras = this.dbs.camerasDB.get('cameras') ?? [];
476
- const camera = cameras.find((cameraObj) => cameraObj.pluginId === pluginId);
477
-
478
- if (camera) {
479
- cameras = cameras.filter((cameraObj) => cameraObj._id !== camera._id);
480
-
481
- for (const source of camera.sources) {
482
- cameraSourceProbeCache.delete(source._id);
483
- }
484
-
485
- await this.usersService.removeCameraFromPreferences(camera._id);
486
- await this.dbs.camerasDB.put('cameras', cameras);
487
- await this.removeCameraSourcesFromConfig(camera.name, camera.sources);
488
- await this.api.removeCamera(this.transformCamera(camera), camera.extensions);
489
- }
490
- }
491
-
492
- public async removeByPluginIdAndName(cameraname: string, pluginId: string): Promise<void> {
493
- let cameras = this.dbs.camerasDB.get('cameras') ?? [];
494
- const camera = cameras.find((cameraObj) => cameraObj.name === cameraname && cameraObj.pluginId === pluginId);
495
-
496
- if (camera) {
497
- cameras = cameras.filter((cameraObj) => cameraObj._id !== camera._id);
498
-
499
- for (const source of camera.sources) {
500
- cameraSourceProbeCache.delete(source._id);
501
- }
502
-
503
- await this.usersService.removeCameraFromPreferences(camera._id);
504
- await this.dbs.camerasDB.put('cameras', cameras);
505
- await this.removeCameraSourcesFromConfig(camera.name, camera.sources);
506
- await this.api.removeCamera(this.transformCamera(camera), camera.extensions);
507
- }
508
- }
509
-
510
- public async removeAll(): Promise<void> {
511
- let cameras = this.dbs.camerasDB.get('cameras') ?? [];
512
- const camerasToRemove: DBCamera[] = [];
513
-
514
- cameras.forEach((camera) => camerasToRemove.push(camera));
515
- cameras = [];
516
-
517
- cameraSourceProbeCache.clear();
518
- await this.usersService.resetAllPreferences();
519
- await this.dbs.camerasDB.put('cameras', cameras);
520
- await Promise.all(camerasToRemove.map((camera) => this.removeCameraSourcesFromConfig(camera.name, camera.sources)));
521
- await Promise.all(camerasToRemove.map((camera) => this.api.removeCamera(this.transformCamera(camera), camera.extensions)));
522
- }
523
-
524
- public async probeCameraSource(camera: DBCamera, source: CameraSource, probeData?: ProbeConfig): Promise<Go2RTCProbe> {
525
- cameraSourceProbeCache.purgeStale();
526
-
527
- const inCache = cameraSourceProbeCache.get(source._id);
528
-
529
- if (inCache) {
530
- return inCache;
531
- }
532
-
533
- const src = createSourceName(camera.name, source.name);
534
- const probe = await this.go2rtcApi.streamsApi.probeStreamSource({ src }, probeData);
535
-
536
- cameraSourceProbeCache.set(source._id, probe);
537
- return probe;
538
- }
539
-
540
- public transformCamera(camera: DBCamera): Camera {
541
- const transformedCamera: Camera = {
542
- ...camera,
543
- sources: camera.sources.map((source) => ({
544
- _id: source._id,
545
- name: source.name,
546
- role: source.role,
547
- useForSnapshot: source.useForSnapshot,
548
- hotMode: source.hotMode,
549
- urls: {
550
- ws: this.generateWsUrls(camera, source),
551
- rtsp: this.generateRTSPUrls(camera, source),
552
- snapshot: this.generateSnapshotUrls(camera, source),
553
- },
554
- })),
555
- };
556
-
557
- return transformedCamera;
558
- }
559
-
560
- private async addCameraSourcesToConfig(cameraId: string, cameraname: string, sources: CameraInputSettings[]): Promise<void> {
561
- for (const source of sources) {
562
- source.urls = source.urls.map((url) => {
563
- if (url.startsWith('cui://')) {
564
- url = `cui://127.0.0.1:${this.configService.config.port}/api/cameras/streams/${cameraId}/${source.name}`;
565
- }
566
- return url;
567
- });
568
-
569
- const sourceName = createSourceName(cameraname, source.name);
570
- const ffmpegUrl = `ffmpeg:${sourceName}#cameraui#audio=pcma#audio=opus#audio=aac`;
571
- const baseUrls = [...source.urls];
572
- const cameraSources: CreateStreamData[] = [];
573
-
574
- const hasFFmpegUrl = baseUrls.some((url) => url.startsWith('ffmpeg:') && url.includes('#cameraui'));
575
- if (!hasFFmpegUrl && source.role !== 'snapshot') {
576
- baseUrls.push(ffmpegUrl);
577
- }
578
-
579
- if (!this.sourceExistAndEqual(sourceName, baseUrls)) {
580
- cameraSources.push({ name: sourceName, src: baseUrls });
581
- }
582
-
583
- this.configService.go2rtcConfig.streams ??= {};
584
-
585
- for (const sourceData of cameraSources) {
586
- await this.go2rtcApi.streamsApi.createStream({
587
- name: sourceData.name,
588
- src: sourceData.src,
589
- });
590
-
591
- this.configService.go2rtcConfig.streams[sourceData.name] = sourceData.src;
592
- }
593
- }
594
- }
595
-
596
- private async removeCameraSourcesFromConfig(cameraname: string, oldSources: CameraInputSettings[]): Promise<void> {
597
- for (const source of oldSources) {
598
- const sourceName = createSourceName(cameraname, source.name);
599
- const sourcesToRemove: string[] = [];
600
-
601
- if (this.configService.go2rtcConfig.streams?.[sourceName]) {
602
- sourcesToRemove.push(sourceName);
603
- }
604
-
605
- this.configService.go2rtcConfig.streams ??= {};
606
-
607
- for (const src of sourcesToRemove) {
608
- await this.go2rtcApi.streamsApi.deleteStream({ src });
609
- delete this.configService.go2rtcConfig.streams?.[src];
610
- }
611
-
612
- if (Object.keys(this.configService.go2rtcConfig.streams).length === 0) {
613
- delete this.configService.go2rtcConfig.streams;
614
- await this.configService.writeGo2RtcConfigApi();
615
- }
616
- }
617
- }
618
-
619
- private sourceExistAndEqual(sourceName: string, source: string[]): boolean {
620
- if (this.configService.go2rtcConfig.streams?.[sourceName]) {
621
- let configSource = this.configService.go2rtcConfig.streams[sourceName];
622
- configSource = typeof configSource === 'string' ? [configSource] : configSource;
623
- return isEqual(configSource, source, true);
624
- }
625
-
626
- return false;
627
- }
628
-
629
- private generateWsUrls(camera: DBCamera, source: CameraInputSettings): Go2RtcWSSource {
630
- const sourceName = createSourceName(camera.name, source.name);
631
- const go2rtcAddress = this.configService.go2rtcAddress('ws');
632
- const baseWebRtcUrl = `${go2rtcAddress}/api/ws?src=${sourceName}`;
633
-
634
- return {
635
- webrtc: baseWebRtcUrl,
636
- mse: baseWebRtcUrl,
637
- };
638
- }
639
-
640
- private generateRTSPUrls(camera: DBCamera, source: CameraInputSettings): Go2RtcRTSPSource {
641
- const sourceName = createSourceName(camera.name, source.name);
642
- const go2rtcAddress = this.configService.go2rtcAddress('rtsp');
643
- const onvifAddress = this.configService.go2rtcAddress('onvif');
644
- const baseRtspUrl = `${go2rtcAddress}/${sourceName}`;
645
- const baseOnvifUrl = `${onvifAddress}/${sourceName}`;
646
-
647
- return {
648
- base: baseRtspUrl,
649
- default: `${baseRtspUrl}?video&audio&backchannel=1&timeout=15`,
650
- muted: `${baseRtspUrl}?video&timeout=15`,
651
- aac: `${baseRtspUrl}?video&audio=aac&backchannel=1&timeout=15`,
652
- opus: `${baseRtspUrl}?video&audio=opus&backchannel=1&timeout=15`,
653
- pcma: `${baseRtspUrl}?video&audio=pcma&backchannel=1&timeout=15`,
654
- onvif: baseOnvifUrl,
655
- };
656
- }
657
-
658
- private generateSnapshotUrls(camera: DBCamera, source: CameraInputSettings): Go2RtcSnapshotSource {
659
- const sourceName = createSourceName(camera.name, source.name);
660
- const go2rtcAddress = this.configService.go2rtcAddress('api');
661
- const baseMjpegStreamUrl = `${go2rtcAddress}/api/stream.mjpeg?src=${sourceName}`;
662
- const baseFrameMp4StreamUrl = `${go2rtcAddress}/api/frame.mp4?src=${sourceName}`;
663
- const baseFrameJpegStreamUrl = `${go2rtcAddress}/api/frame.jpeg?src=${sourceName}`;
664
-
665
- return {
666
- mp4: baseFrameMp4StreamUrl,
667
- jpeg: baseFrameJpegStreamUrl,
668
- mjpeg: baseMjpegStreamUrl,
669
- };
670
- }
671
- }