@camera.ui/server 2.2.5 → 2.2.6

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 (379) hide show
  1. package/dist/interface/assets/{404-CiOxoqnT.js → 404-BLVuKvLk.js} +1 -1
  2. package/dist/interface/assets/{About-DWOlfWEm.js → About-C-AJ0jfI.js} +1 -1
  3. package/dist/interface/assets/Assistant-BJKGIvVo.js +1 -0
  4. package/dist/interface/assets/{Assistant-CXx7EY1W.css → Assistant-BQ6Ld-bt.css} +1 -1
  5. package/dist/interface/assets/{Automation-BJgwUkUB.js → Automation-C95DzuZb.js} +3 -3
  6. package/dist/interface/assets/{AutomationImport-9GRAndAt.js → AutomationImport-C8VYjDzf.js} +2 -2
  7. package/dist/interface/assets/{AutomationStore-D_HR2Xby.js → AutomationStore-CE4PKRGd.js} +2 -2
  8. package/dist/interface/assets/{AutomationStoreDetail-B9MxV2py.js → AutomationStoreDetail-DavWfjLv.js} +2 -2
  9. package/dist/interface/assets/Automations-BOP_17Ri.js +2 -0
  10. package/dist/interface/assets/Camera-BW9ikKqh.css +1 -0
  11. package/dist/interface/assets/Camera-C5S7eI9a.js +2 -0
  12. package/dist/interface/assets/{CameraConsole-BKPTLSTO.js → CameraConsole-C4AmtcrM.js} +1 -1
  13. package/dist/interface/assets/{Cameras-DcrVCgLy.js → Cameras-DR577Bno.js} +2 -2
  14. package/dist/interface/assets/{Camview-DasO326h.css → Camview-Bri_T7Tq.css} +1 -1
  15. package/dist/interface/assets/Camview-CHxKB41T.js +1 -0
  16. package/dist/interface/assets/{Config-BmEL5EaW.js → Config-BrDDGWpr.js} +1 -1
  17. package/dist/interface/assets/{ConfigActionAssistant-DM4tIhoa.js → ConfigActionAssistant-YtCVI8LZ.js} +1 -1
  18. package/dist/interface/assets/{ConfigActionCameraControl-Deo0eDPS.js → ConfigActionCameraControl-Dg_1zOYt.js} +1 -1
  19. package/dist/interface/assets/{ConfigActionHttp-BxJmoshF.js → ConfigActionHttp-BzwLv2tn.js} +1 -1
  20. package/dist/interface/assets/{ConfigActionImageInput-KrzXFQDm.js → ConfigActionImageInput-CLdY2sV4.js} +1 -1
  21. package/dist/interface/assets/{ConfigActionMqtt-BoYBomRC.js → ConfigActionMqtt-lGqYshl3.js} +1 -1
  22. package/dist/interface/assets/{ConfigActionNotification-CSAOijDt.js → ConfigActionNotification-D5Dj3EoU.js} +1 -1
  23. package/dist/interface/assets/{ConfigActionNotificationControl-BOdyKiOs.js → ConfigActionNotificationControl-Dy5fKamr.js} +1 -1
  24. package/dist/interface/assets/{ConfigActionOutput-CwsPcnd_.js → ConfigActionOutput-DzsQ31L0.js} +1 -1
  25. package/dist/interface/assets/{ConfigActionPlugin-D3wyULpp.js → ConfigActionPlugin-BFrBcXvL.js} +1 -1
  26. package/dist/interface/assets/{ConfigActionSensor-BmeaIxYY.js → ConfigActionSensor-CX8ePlan.js} +1 -1
  27. package/dist/interface/assets/{ConfigActionSnapshot-DbyFKcYr.js → ConfigActionSnapshot-BATLRmh6.js} +1 -1
  28. package/dist/interface/assets/{ConfigActionVariable-cThGJ1Pc.js → ConfigActionVariable-Dgn5jvaR.js} +1 -1
  29. package/dist/interface/assets/{ConfigConditionIfElse-BugkJeXR.js → ConfigConditionIfElse-D5IIBjyk.js} +1 -1
  30. package/dist/interface/assets/{ConfigConditionSensorState-Bf-mMf4E.js → ConfigConditionSensorState-C0JxBWdG.js} +1 -1
  31. package/dist/interface/assets/{ConfigConditionSwitch-DcpFoYET.js → ConfigConditionSwitch-Brlgd0XP.js} +1 -1
  32. package/dist/interface/assets/{ConfigSensorValueInput-CgAI34__.js → ConfigSensorValueInput-CtuH8dCa.js} +1 -1
  33. package/dist/interface/assets/{ConfigTriggerDetection-BWK6gfwM.js → ConfigTriggerDetection-DsL7lLQl.js} +1 -1
  34. package/dist/interface/assets/{ConfigTriggerGeofence-Cm3CU7Tl.js → ConfigTriggerGeofence-CAGIk1_W.js} +1 -1
  35. package/dist/interface/assets/{ConfigTriggerMqtt-BMFjTAso.js → ConfigTriggerMqtt-B_iFalAQ.js} +1 -1
  36. package/dist/interface/assets/{ConfigTriggerSensor-DOdJkZRo.js → ConfigTriggerSensor-hYNbLXUu.js} +1 -1
  37. package/dist/interface/assets/{ConfigTriggerSystem-BFDIbZsE.js → ConfigTriggerSystem-DR1EFpE9.js} +1 -1
  38. package/dist/interface/assets/{ConfigTriggerWebhook-DDoUEVHb.js → ConfigTriggerWebhook-C-B5GGFH.js} +1 -1
  39. package/dist/interface/assets/{Console-BIj7cIqO.js → Console-cIr6lYux.js} +1 -1
  40. package/dist/interface/assets/CuiAssistantConversation-Bigl43Ph.js +5 -0
  41. package/dist/interface/assets/CuiAssistantConversation-BmshW6Vc.css +1 -0
  42. package/dist/interface/assets/{CuiAutomationRunsDialog-DMUfNcsf.js → CuiAutomationRunsDialog-Ci7SWAml.js} +1 -1
  43. package/dist/interface/assets/{CuiBottomSheet-FwsPnJ3n.js → CuiBottomSheet-C2sM2E3M.js} +1 -1
  44. package/dist/interface/assets/CuiBottomSheet-ViBOgklN.js +1 -0
  45. package/dist/interface/assets/CuiCameraPipCard-wdK7xir-.js +1 -0
  46. package/dist/interface/assets/{CuiCameraRecordings-BeciatDY.js → CuiCameraRecordings-BB7bF67B.js} +1 -1
  47. package/dist/interface/assets/{CuiCameraShares-CSFwIYsg.js → CuiCameraShares-B6jdUBVm.js} +1 -1
  48. package/dist/interface/assets/CuiCameraTable-CHnQFkce.js +1 -0
  49. package/dist/interface/assets/{CuiCameraTable-DBRfGX3I.js → CuiCameraTable-CpBo25Qc.js} +1 -1
  50. package/dist/interface/assets/{CuiChartTable-CtasoxMM.js → CuiChartTable-dIcxGtfl.js} +1 -1
  51. package/dist/interface/assets/{CuiConsole-DQbAafiz.js → CuiConsole-BGptpT6r.js} +1 -1
  52. package/dist/interface/assets/{CuiDataTable-JlD7Agky.js → CuiDataTable-CQmp5mAy.js} +1 -1
  53. package/dist/interface/assets/CuiLightControl-wbZi3fA1.js +1 -0
  54. package/dist/interface/assets/CuiPluginCard-BjIc7It9.js +2 -0
  55. package/dist/interface/assets/{CuiPluginCategoryChip-B2bR5LQa.js → CuiPluginCategoryChip-BtJ_6_gN.js} +1 -1
  56. package/dist/interface/assets/{CuiPluginOAuthButton-DfEjfcY-.js → CuiPluginOAuthButton-Duf35I8K.js} +2 -2
  57. package/dist/interface/assets/{CuiPluginTrustBadge-C6CW6Soh.js → CuiPluginTrustBadge-jxXeRTH2.js} +1 -1
  58. package/dist/interface/assets/{CuiQRCode-DGKBhDib.js → CuiQRCode-BNchrpoB.js} +1 -1
  59. package/dist/interface/assets/{CuiSchema-pAAVh28m.js → CuiSchema-DGTMkVSe.js} +1 -1
  60. package/dist/interface/assets/{CuiTopNavbarItem-ve-3Dsc3.js → CuiTopNavbarItem-CHtLvn53.js} +1 -1
  61. package/dist/interface/assets/Faces-p18jNfXl.js +1 -0
  62. package/dist/interface/assets/FirstSteps-HzaBMDbH.js +1 -0
  63. package/dist/interface/assets/Floorplan-DYyEx7WO.js +1 -0
  64. package/dist/interface/assets/Instances-Dl-6rL5O.js +1 -0
  65. package/dist/interface/assets/{Logs-BhRactvQ.js → Logs-DsJkuQFq.js} +2 -2
  66. package/dist/interface/assets/{Menu-DMCmUVDs.js → Menu-D_woMkjL.js} +1 -1
  67. package/dist/interface/assets/Metrics-l3UwykCM.js +12 -0
  68. package/dist/interface/assets/{OAuthDeviceFlow-BMEwVkIa.js → OAuthDeviceFlow-CXfILAE1.js} +1 -1
  69. package/dist/interface/assets/Plugin-Ldj3HygQ.js +1 -0
  70. package/dist/interface/assets/{PluginConsole-C4Ba_U_1.js → PluginConsole-C96m5zKy.js} +1 -1
  71. package/dist/interface/assets/{PluginDetail-13OWIzdd.js → PluginDetail-CnfaI1vh.js} +2 -2
  72. package/dist/interface/assets/{PluginSchema-DN0cSU8s.js → PluginSchema-u1bqXU29.js} +1 -1
  73. package/dist/interface/assets/{PluginSearch-sPkO8aH3.js → PluginSearch-BiXG3Xk2.js} +2 -2
  74. package/dist/interface/assets/PluginSearch-BuE7we1T.js +1 -0
  75. package/dist/interface/assets/{PluginUpdateProgress-CeWuRp3Z.js → PluginUpdateProgress-BT4lN9HT.js} +1 -1
  76. package/dist/interface/assets/{Plugins-C8yjhxnQ.js → Plugins-Csx6AXaW.js} +1 -1
  77. package/dist/interface/assets/Recordings-BEKAn6QK.css +1 -0
  78. package/dist/interface/assets/Recordings-D0KTY5cI.js +1 -0
  79. package/dist/interface/assets/{SensorEdit-C-yJdJuP.js → SensorEdit-zs-f_o1N.js} +1 -1
  80. package/dist/interface/assets/{SensorHistory-ClAcOgHj.js → SensorHistory-Cet35_RO.js} +1 -1
  81. package/dist/interface/assets/Sensors-BLAoalEt.js +2 -0
  82. package/dist/interface/assets/Settings-C-LCDIbK.js +1 -0
  83. package/dist/interface/assets/SettingsAccount-BsN7jGmo.js +1 -0
  84. package/dist/interface/assets/SettingsAccount-DuVyCSE-.js +1 -0
  85. package/dist/interface/assets/{SettingsAppearance-CJt4xJEW.js → SettingsAppearance-BS4EQNjH.js} +1 -1
  86. package/dist/interface/assets/SettingsAppearance-DQcGbYbV.js +1 -0
  87. package/dist/interface/assets/SettingsAssistant-B0PF3Rdg.css +1 -0
  88. package/dist/interface/assets/SettingsAssistant-DViJklFd.js +1 -0
  89. package/dist/interface/assets/{SettingsBackup-DIJmci05.js → SettingsBackup-DBlV1gej.js} +1 -1
  90. package/dist/interface/assets/{SettingsList-Cb_dLy5T.js → SettingsList-D8eSwbBY.js} +1 -1
  91. package/dist/interface/assets/{SettingsMqtt-LIuCRPT5.js → SettingsMqtt-JoszJJgV.js} +1 -1
  92. package/dist/interface/assets/{SettingsNotifications-CZxqqH_8.js → SettingsNotifications-3veSrxa_.js} +1 -1
  93. package/dist/interface/assets/{SettingsRecordings-BEpwMh-y.js → SettingsRecordings-CLz9Zp47.js} +1 -1
  94. package/dist/interface/assets/{SettingsRemote-DRt-N_yA.js → SettingsRemote-DUyl8k7I.js} +2 -2
  95. package/dist/interface/assets/{SettingsSystem-Cncdpx8T.js → SettingsSystem-txTFGomQ.js} +2 -2
  96. package/dist/interface/assets/{SettingsUsers-DZkz8WlI.js → SettingsUsers-CUp6vQPc.js} +1 -1
  97. package/dist/interface/assets/{Terminal-U4yfJN3O.js → Terminal-hln2UuSR.js} +2 -2
  98. package/dist/interface/assets/Training-D6lhvUf-.js +1 -0
  99. package/dist/interface/assets/Updates-BwSWt9w7.js +2 -0
  100. package/dist/interface/assets/{VariableInput-PVsqGYW0.js → VariableInput-183LygmK.js} +1 -1
  101. package/dist/interface/assets/{VersionsHandler-Df7dhddp.js → VersionsHandler-DkbkcypK.js} +1 -1
  102. package/dist/interface/assets/{VirtualSensorCreate-FTKANjd-.js → VirtualSensorCreate-Bn4tgdxA.js} +1 -1
  103. package/dist/interface/assets/Workers-B6b15izn.js +2 -0
  104. package/dist/interface/assets/api-C9mnOxie.js +4 -0
  105. package/dist/interface/assets/api-Cj9a6qPu.css +2 -0
  106. package/dist/interface/assets/{api-DpqXhwcx.js → api-h4HRB3ef.js} +1 -1
  107. package/dist/interface/assets/{assistant-Lz3mFLDo.js → assistant-4hYyIu6D.js} +1 -1
  108. package/dist/interface/assets/{auth-L7_5vsJs.js → auth-DFesRtwI.js} +1 -1
  109. package/dist/interface/assets/{automations-D1XFFSrm.js → automations-D2bnX8uw.js} +1 -1
  110. package/dist/interface/assets/{cameraSources-DEGJDtmK.js → cameraSources-DmVZWs4-.js} +1 -1
  111. package/dist/interface/assets/cloudHandoff-Ba98bzeq.js +1 -0
  112. package/dist/interface/assets/{config-CVqy37fG.js → config-DDaCrMSU.js} +1 -1
  113. package/dist/interface/assets/esm-Bn9gXwX4.js +1 -0
  114. package/dist/interface/assets/esm-BzM6y2-F.js +1 -0
  115. package/dist/interface/assets/esm-CP3JWrtj.js +1 -0
  116. package/dist/interface/assets/esm-CjAXkqCf.js +1 -0
  117. package/dist/interface/assets/esm-Cqxk-j1S.js +1 -0
  118. package/dist/interface/assets/esm-DFHd3JNU.js +1 -0
  119. package/dist/interface/assets/esm-DfMLJtug.js +1 -0
  120. package/dist/interface/assets/esm-DhDrpq7a.js +1 -0
  121. package/dist/interface/assets/esm-DvhM-SOd.js +1 -0
  122. package/dist/interface/assets/esm-G63bqygQ.js +1 -0
  123. package/dist/interface/assets/esm-Gn-Y59hU.js +1 -0
  124. package/dist/interface/assets/esm-KJSOz2vj.js +1 -0
  125. package/dist/interface/assets/esm-Ryfc94Tm.js +1 -0
  126. package/dist/interface/assets/esm-rSfI5Poy.js +1 -0
  127. package/dist/interface/assets/{flowSchema-CppNBDy1.js → flowSchema-YJtAu9gB.js} +1 -1
  128. package/dist/interface/assets/main-C796FmqQ.js +3 -0
  129. package/dist/interface/assets/{main-Bo0Lb1y2.css → main-DVa5U7UB.css} +1 -1
  130. package/dist/interface/assets/{mqtt-BENV9Fx4.js → mqtt-DGBPptzB.js} +1 -1
  131. package/dist/interface/assets/native-CZJE8bTs.js +1 -0
  132. package/dist/interface/assets/native-DKZwialB.js +1 -0
  133. package/dist/interface/assets/{notifications-By40oPng.js → notifications-5yeK345h.js} +1 -1
  134. package/dist/interface/assets/plugin-DSEMkqaK.js +1 -0
  135. package/dist/interface/assets/{plugins-09rEDbMz.js → plugins-BTOdE_zv.js} +1 -1
  136. package/dist/interface/assets/{rooms-LBxn-Uuu.js → rooms-BCdm6IAx.js} +1 -1
  137. package/dist/interface/assets/{sensorIcons-Csu5s0uk.js → sensorIcons-5Ynqwo3e.js} +1 -1
  138. package/dist/interface/assets/{sensorSlots-CtbKmsGG.js → sensorSlots-BF70tpV7.js} +1 -1
  139. package/dist/interface/assets/{sensors-CbzNs18A.js → sensors-CeFEEz8r.js} +1 -1
  140. package/dist/interface/assets/{server-Btp5KILd.js → server-bhW2Mw4D.js} +1 -1
  141. package/dist/interface/assets/{theme-GhzGwpqd.js → theme-DF_XA58O.js} +1 -1
  142. package/dist/interface/assets/{types-D8QWPhe-.js → types-ArGM5-5O.js} +1 -1
  143. package/dist/interface/assets/{types-BAwhu9iv.js → types-BcAxmlqC.js} +1 -1
  144. package/dist/interface/assets/{ungrouped-BMk56E3L.js → ungrouped-CkIlDUwl.js} +1 -1
  145. package/dist/interface/assets/{updates-CGo0T4sn.js → updates-D3x_kPMM.js} +1 -1
  146. package/dist/interface/assets/{useAppVersion-CJlexqyz.js → useAppVersion-Dcvu95bZ.js} +1 -1
  147. package/dist/interface/assets/{useBackupRestore-_s8vS5WF.js → useBackupRestore-xp5KhKVn.js} +1 -1
  148. package/dist/interface/assets/{useCameraOptions-CFISVNgk.js → useCameraOptions-8I4MTDgj.js} +1 -1
  149. package/dist/interface/assets/useKeyboardInset-C0Lp0UcX.js +1 -0
  150. package/dist/interface/assets/{useLogsSocket-D-ndWAg0.js → useLogsSocket-bpOiLgWT.js} +1 -1
  151. package/dist/interface/assets/{useNavLayout-CG0X_3kt.js → useNavLayout-Cjf6Da2u.js} +1 -1
  152. package/dist/interface/assets/{usePluginUpdates-nW_dt66E.js → usePluginUpdates-bOMj-IvL.js} +1 -1
  153. package/dist/interface/assets/{usePushRegistration-DCqOAxR4.js → usePushRegistration-HOvLuUVP.js} +2 -2
  154. package/dist/interface/assets/{useServerRestart-CxJGxAcU.js → useServerRestart-CQN4cdHJ.js} +1 -1
  155. package/dist/interface/assets/{useStreamStatus-CXb1HbAq.js → useStreamStatus-Da7c2Wme.js} +1 -1
  156. package/dist/interface/assets/{useTabSwipe-DHb8__wU.js → useTabSwipe-fFuyJJBQ.js} +1 -1
  157. package/dist/interface/assets/{useUpdateChannel-BR4PMh1R.js → useUpdateChannel-Ca1RX32u.js} +1 -1
  158. package/dist/interface/assets/{useUpdatesSocket-DKDRZhvc.js → useUpdatesSocket-DHZNpLQX.js} +1 -1
  159. package/dist/interface/assets/{useUserOptions-lyc4WJ4L.js → useUserOptions-BQdOB-Dp.js} +1 -1
  160. package/dist/interface/assets/{vendor-capacitor-f9ShAzys.js → vendor-capacitor-Bs_WzL0Q.js} +2 -2
  161. package/dist/interface/assets/web-BDNQnMmA.js +1 -0
  162. package/dist/interface/assets/web-BhJykCtq.js +1 -0
  163. package/dist/interface/assets/web-BjKL51lK-wWFeZlLg.js +1 -0
  164. package/dist/interface/assets/web-C7nJwIOa.js +1 -0
  165. package/dist/interface/assets/web-CGJsJQDb.js +1 -0
  166. package/dist/interface/assets/web-CJwASxrl.js +1 -0
  167. package/dist/interface/assets/web-CLe0L31Y.js +1 -0
  168. package/dist/interface/assets/web-DEv1hAn1.js +1 -0
  169. package/dist/interface/assets/web-DaeQvsXT.js +1 -0
  170. package/dist/interface/assets/web-H3-wNunW.js +1 -0
  171. package/dist/interface/assets/web-LCdyqJq1.js +1 -0
  172. package/dist/interface/assets/web-XZWYTK65.js +1 -0
  173. package/dist/interface/assets/web-rU5hlxxW.js +1 -0
  174. package/dist/interface/ha/{404-B2T8Gktj.js → 404-C0mWQGWl.js} +1 -1
  175. package/dist/interface/ha/{About-CrTKzU9_.js → About-ByE7XErJ.js} +3 -3
  176. package/dist/interface/ha/{Assistant-BDHJmYx_.js → Assistant-Z3FTR868.js} +2264 -2133
  177. package/dist/interface/ha/{Automation-Czo5EsAg.js → Automation-COQqTFNw.js} +170 -170
  178. package/dist/interface/ha/{AutomationImport-CuFAQbiX.js → AutomationImport-ueWqMBX9.js} +6 -6
  179. package/dist/interface/ha/{AutomationStore-D-6x0JIt.js → AutomationStore-DBO4aZqy.js} +73 -73
  180. package/dist/interface/ha/{AutomationStoreDetail-Dad4q1MN.js → AutomationStoreDetail-DMnYu7hf.js} +6 -6
  181. package/dist/interface/ha/{Automations-C-oGM5SR.js → Automations-CMdbidc0.js} +70 -70
  182. package/dist/interface/ha/Camera-C28q_3pu.js +657 -0
  183. package/dist/interface/ha/{CameraConsole-hRGwbjsD.js → CameraConsole-oMNZfKE6.js} +3 -3
  184. package/dist/interface/ha/{Cameras-Bk5TFXA8.js → Cameras-CsqrLx97.js} +182 -182
  185. package/dist/interface/ha/{Camview-CsKKqxxY.js → Camview-Br0LUakz.js} +542 -542
  186. package/dist/interface/ha/{Config-Vl4-K3A_.js → Config-Y5eUNSW7.js} +110 -110
  187. package/dist/interface/ha/{ConfigActionAssistant-OWUX8glZ.js → ConfigActionAssistant-hl-6ZACj.js} +4 -4
  188. package/dist/interface/ha/{ConfigActionCameraControl-DEaOot8w.js → ConfigActionCameraControl-DnXlVFWD.js} +3 -3
  189. package/dist/interface/ha/{ConfigActionHttp-CSr2BpKL.js → ConfigActionHttp-BkpkMmRd.js} +2 -2
  190. package/dist/interface/ha/{ConfigActionImageInput--O8Tyca-.js → ConfigActionImageInput-Dp78_QS_.js} +1 -1
  191. package/dist/interface/ha/{ConfigActionMqtt-DQJ4-gs2.js → ConfigActionMqtt-DA_UWb5j.js} +4 -4
  192. package/dist/interface/ha/{ConfigActionNotification-wR8CCA_T.js → ConfigActionNotification-CQ4Ses3a.js} +3 -3
  193. package/dist/interface/ha/{ConfigActionNotificationControl-DNMrHwPz.js → ConfigActionNotificationControl-Cb5PNGz-.js} +2 -2
  194. package/dist/interface/ha/{ConfigActionOutput-C-LVFxFP.js → ConfigActionOutput-DLuNHwRb.js} +1 -1
  195. package/dist/interface/ha/{ConfigActionPlugin-BCREAkNo.js → ConfigActionPlugin-ChKFCNaj.js} +4 -4
  196. package/dist/interface/ha/{ConfigActionSensor-D48CQ6qR.js → ConfigActionSensor-DOutFalW.js} +5 -5
  197. package/dist/interface/ha/{ConfigActionSnapshot-DpDy88Mg.js → ConfigActionSnapshot-GWgY6YIN.js} +2 -2
  198. package/dist/interface/ha/{ConfigActionVariable-D9BxmwvB.js → ConfigActionVariable-bu-9VYTG.js} +1 -1
  199. package/dist/interface/ha/{ConfigConditionIfElse-CW42tQFY.js → ConfigConditionIfElse-iNp8tlZV.js} +3 -3
  200. package/dist/interface/ha/{ConfigConditionSensorState-BZpij7kB.js → ConfigConditionSensorState-Dn7kcHpJ.js} +4 -4
  201. package/dist/interface/ha/{ConfigConditionSwitch-DlTuJ9Sf.js → ConfigConditionSwitch-DaUlDgo0.js} +4 -4
  202. package/dist/interface/ha/{ConfigSensorValueInput-2QLHESlE.js → ConfigSensorValueInput-D6m6suqJ.js} +7 -7
  203. package/dist/interface/ha/{ConfigTriggerDetection-DPmUkmUJ.js → ConfigTriggerDetection-C5B_DC_L.js} +11 -11
  204. package/dist/interface/ha/{ConfigTriggerGeofence--T9OXhGl.js → ConfigTriggerGeofence-B4WVNcK5.js} +5 -5
  205. package/dist/interface/ha/{ConfigTriggerMqtt-fZn_X6yY.js → ConfigTriggerMqtt-wnMfk_Un.js} +1 -1
  206. package/dist/interface/ha/{ConfigTriggerSensor-_3O6iBFX.js → ConfigTriggerSensor-xFpI5KPu.js} +1 -1
  207. package/dist/interface/ha/{ConfigTriggerSystem-CC9lqi8Q.js → ConfigTriggerSystem-YI9WYYVM.js} +2 -2
  208. package/dist/interface/ha/{ConfigTriggerWebhook-BuBcgXqf.js → ConfigTriggerWebhook-58c2KgUe.js} +2 -2
  209. package/dist/interface/ha/{Console-DNc49UEt.js → Console-Coiqh32K.js} +4 -4
  210. package/dist/interface/ha/{CuiAutomationRunsDialog-Dj_iiZht.js → CuiAutomationRunsDialog-CJ2MGfEY.js} +2 -2
  211. package/dist/interface/ha/{CuiBottomSheet-DG7wOV7m.js → CuiBottomSheet-BlG9Pl9j.js} +1 -1
  212. package/dist/interface/ha/{CuiCameraRecordings-BlOZTfQ4.js → CuiCameraRecordings-DLXEB4Q7.js} +12 -12
  213. package/dist/interface/ha/{CuiCameraShares-BOn-mobi.js → CuiCameraShares-BCIeaM6u.js} +6 -6
  214. package/dist/interface/ha/{CuiCameraTable-D50FLiK8.js → CuiCameraTable-PYYC7sOu.js} +2 -2
  215. package/dist/interface/ha/{CuiChartTable-CfcVRvdZ.js → CuiChartTable-FQ2iR5Hd.js} +4 -4
  216. package/dist/interface/ha/{CuiConsole-UpN0Wihm.js → CuiConsole-C77k5q_-.js} +1 -1
  217. package/dist/interface/ha/{CuiDataTable-CpADXKNF.js → CuiDataTable-CIKQLseG.js} +2 -2
  218. package/dist/interface/ha/{CuiPluginCard-CT6ZfL9o.js → CuiPluginCard-DZNXKP_P.js} +42 -42
  219. package/dist/interface/ha/{CuiPluginOAuthButton-BJVKd6Ac.js → CuiPluginOAuthButton-DVf52_Zc.js} +2 -2
  220. package/dist/interface/ha/{CuiPluginTrustBadge-gb9GI24w.js → CuiPluginTrustBadge-CPljYiM8.js} +1 -1
  221. package/dist/interface/ha/{CuiQRCode-DqKDx9zR.js → CuiQRCode-oe8PLnLj.js} +2 -2
  222. package/dist/interface/ha/{CuiSchema-CHeJkx0k.js → CuiSchema-CQy94ZTs.js} +152 -152
  223. package/dist/interface/ha/{CuiTopNavbarItem-CFeI6ZYU.js → CuiTopNavbarItem-D6OHZLQY.js} +1 -1
  224. package/dist/interface/ha/{Faces-CTfvhhCj.js → Faces-DxAPvemO.js} +15 -15
  225. package/dist/interface/ha/{FirstSteps-C-WXJ8IL.js → FirstSteps-ZINTSaeL.js} +30 -30
  226. package/dist/interface/ha/{Floorplan-CDKTYN7B.js → Floorplan-DkbL8ppT.js} +155 -155
  227. package/dist/interface/ha/{Instances-n23yvN3L.js → Instances-totWtqd7.js} +13 -13
  228. package/dist/interface/ha/{Logs-Dfm0BWOQ.js → Logs-CzabIFja.js} +12 -12
  229. package/dist/interface/ha/{Menu-76kvdAEF.js → Menu-DcVBOQfw.js} +15 -15
  230. package/dist/interface/ha/{Metrics-lnivlTWm.js → Metrics-B_SN5hbp.js} +407 -407
  231. package/dist/interface/ha/{OAuthDeviceFlow-4ChaymHu.js → OAuthDeviceFlow-B28TPsTQ.js} +2 -2
  232. package/dist/interface/ha/{Plugin-BV8YA8aN.js → Plugin-B2PbbB8d.js} +208 -208
  233. package/dist/interface/ha/{PluginConsole-csf1Km7f.js → PluginConsole-_KeG4FvO.js} +4 -4
  234. package/dist/interface/ha/{PluginDetail-DTff6cbA.js → PluginDetail-GK_Fx14e.js} +7 -7
  235. package/dist/interface/ha/{PluginSearch-CdjxmFPN.js → PluginSearch-qSy4aqAW.js} +96 -96
  236. package/dist/interface/ha/{PluginUpdateProgress-ClyF4pbA.js → PluginUpdateProgress-C4Q2j6VO.js} +3 -3
  237. package/dist/interface/ha/{Plugins-_xOrqP36.js → Plugins-D0tvZHie.js} +54 -54
  238. package/dist/interface/ha/{Recordings-dTZv0pkp.js → Recordings-CpxJYaAa.js} +303 -307
  239. package/dist/interface/ha/{SensorEdit-DDRkZjmm.js → SensorEdit-8KtqLXEu.js} +377 -377
  240. package/dist/interface/ha/{SensorHistory-DSGlRITr.js → SensorHistory-CPTTsdjM.js} +2 -2
  241. package/dist/interface/ha/{Sensors-DjhGRUzM.js → Sensors-DJt_Hnn2.js} +102 -102
  242. package/dist/interface/ha/{Settings-DYuvz4de.js → Settings-B-OdG5pG.js} +10 -10
  243. package/dist/interface/ha/{SettingsAccount-DQAo8SnK.js → SettingsAccount-Ba2-2Lbi.js} +233 -233
  244. package/dist/interface/ha/{SettingsAppearance-_tbhpUA0.js → SettingsAppearance-D56HjSuQ.js} +7 -7
  245. package/dist/interface/ha/{SettingsAssistant-DSf-dYuD.js → SettingsAssistant-DglU0auc.js} +666 -621
  246. package/dist/interface/ha/{SettingsBackup-wLOa7xtw.js → SettingsBackup-DZx4McDz.js} +8 -8
  247. package/dist/interface/ha/{SettingsList-CYujivw5.js → SettingsList-D9nIGkbE.js} +4 -4
  248. package/dist/interface/ha/{SettingsMqtt-DbxJ-h3J.js → SettingsMqtt-BOszh--k.js} +180 -180
  249. package/dist/interface/ha/{SettingsNotifications-DO2-KJvq.js → SettingsNotifications-DBVpZfp0.js} +3 -3
  250. package/dist/interface/ha/{SettingsRecordings-C47i1UhI.js → SettingsRecordings-D3oJnizu.js} +3 -3
  251. package/dist/interface/ha/{SettingsRemote-BPvb-KLI.js → SettingsRemote-BOotvcOT.js} +54 -54
  252. package/dist/interface/ha/{SettingsSystem-BJPrv9JE.js → SettingsSystem-Bg11qoQX.js} +9 -9
  253. package/dist/interface/ha/{SettingsUsers-CcpCz6Y1.js → SettingsUsers-KpLs9Jnh.js} +25 -25
  254. package/dist/interface/ha/{Terminal-DT7-WNH1.js → Terminal-D6opTHYI.js} +168 -173
  255. package/dist/interface/ha/{Training-CqGBf8k1.js → Training-OB2KOQ7L.js} +537 -537
  256. package/dist/interface/ha/{Updates-CgdrqX6R.js → Updates-C_OvXJjd.js} +14 -14
  257. package/dist/interface/ha/{VariableInput-DOzSFgxT.js → VariableInput-CfaDp67S.js} +1 -1
  258. package/dist/interface/ha/{VersionsHandler-ItklhE2t.js → VersionsHandler-D1FVeYUZ.js} +10 -10
  259. package/dist/interface/ha/{VirtualSensorCreate-DbS3VqHC.js → VirtualSensorCreate-DJIgMVrt.js} +7 -7
  260. package/dist/interface/ha/{Workers-6PU7yUv1.js → Workers-cJMI4mYX.js} +26 -26
  261. package/dist/interface/ha/{api-anWolhVj.js → api-CDawdL4p.js} +1 -1
  262. package/dist/interface/ha/{api-Dv3Lk_g5.js → api-D2VzV4is.js} +9257 -9084
  263. package/dist/interface/ha/{assistant-B3m0Kgev.js → assistant-BmDAfChm.js} +1 -1
  264. package/dist/interface/ha/{auth-CAkpM_7A.js → auth-CvLz9C4w.js} +1 -1
  265. package/dist/interface/ha/{automationBlueprint-DwVvbKbw.js → automationBlueprint-BhNaeOZ1.js} +2 -2
  266. package/dist/interface/ha/{base-C-TYDHjS.js → base-XgWmQghV.js} +14 -3
  267. package/dist/interface/ha/cameraui-cards.js +1 -1
  268. package/dist/interface/ha/{cards-B0qagpBw.js → cards-MQrnU0T8.js} +1334 -1334
  269. package/dist/interface/ha/{config-C20itAPE.js → config-t_oAKFkJ.js} +1 -1
  270. package/dist/interface/ha/{esm-i8Tigknm.js → esm-C9XVFkXu.js} +4 -4
  271. package/dist/interface/ha/{mqtt-C6JvkA5E.js → mqtt-C20h1uze.js} +1 -1
  272. package/dist/interface/ha/{native-DBH9ocSq.js → native-BVUxNLM1.js} +4 -4
  273. package/dist/interface/ha/{notifications-gLmNZxwZ.js → notifications-Cy9DKiEn.js} +1 -1
  274. package/dist/interface/ha/{pinia-Du8AM917.js → pinia-BokSpDzj.js} +1 -0
  275. package/dist/interface/ha/{plugins-6x0kBuQb.js → plugins-jozYyBhV.js} +1 -1
  276. package/dist/interface/ha/{rooms-C-mLT6mX.js → rooms-DyfT3cXp.js} +1 -1
  277. package/dist/interface/ha/{server-DuikIt69.js → server-hCCjQjZE.js} +1 -1
  278. package/dist/interface/ha/{types-C0NcQ4Cz.js → types-RG0SckNR.js} +1 -1
  279. package/dist/interface/ha/{ungrouped-ooCH0Izh.js → ungrouped-BbyfoCQp.js} +19 -19
  280. package/dist/interface/ha/{updates-H8MlOQLC.js → updates-hUgVDgoD.js} +6 -6
  281. package/dist/interface/ha/{useAppVersion-DAUCV_cn.js → useAppVersion-wNhZDuvR.js} +1 -1
  282. package/dist/interface/ha/useKeyboardInset-Cmbvb_W3.js +27 -0
  283. package/dist/interface/ha/{useLogsSocket-BOLAXPuD.js → useLogsSocket-y9Aex3tJ.js} +1 -1
  284. package/dist/interface/ha/{useNavLayout-B7VoHzM1.js → useNavLayout-Ehb0t34k.js} +2 -2
  285. package/dist/interface/ha/{useServerRestart-qSH0bqwY.js → useServerRestart-CRSVcz3z.js} +1 -1
  286. package/dist/interface/ha/{useTabSwipe-DYzG_gVG.js → useTabSwipe-B_bseZkI.js} +1 -1
  287. package/dist/interface/ha/{useUpdateChannel-CK7JiWbG.js → useUpdateChannel-C_GU6lj6.js} +2 -2
  288. package/dist/interface/ha/{useUpdatesSocket-DrqkGMuR.js → useUpdatesSocket-CYgHb7UX.js} +1 -1
  289. package/dist/interface/ha/{useUserOptions-BteVUdaT.js → useUserOptions-pVYr-s3O.js} +1 -1
  290. package/dist/interface/ha/{web-D_q41D0i.js → web-CLbVbnCW.js} +5 -5
  291. package/dist/interface/index.html +28 -28
  292. package/dist/interface/sw.js +1 -1
  293. package/dist/server/package.json +3 -3
  294. package/dist/server/requirements.txt +1 -1
  295. package/dist/server/src/api/controllers/rooms.controller.js +3 -1
  296. package/dist/server/src/api/controllers/rooms.controller.js.map +1 -1
  297. package/dist/server/src/api/database/types.d.ts +1 -0
  298. package/dist/server/src/api/schemas/assistant.schema.d.ts +2 -0
  299. package/dist/server/src/api/schemas/assistant.schema.js +1 -0
  300. package/dist/server/src/api/schemas/assistant.schema.js.map +1 -1
  301. package/dist/server/src/api/services/cameras.service.d.ts +1 -0
  302. package/dist/server/src/api/services/cameras.service.js +8 -0
  303. package/dist/server/src/api/services/cameras.service.js.map +1 -1
  304. package/dist/server/src/assistant/manager.d.ts +1 -0
  305. package/dist/server/src/assistant/manager.js +1 -1
  306. package/dist/server/src/assistant/manager.js.map +1 -1
  307. package/dist/server/src/assistant/scheduler.js +8 -1
  308. package/dist/server/src/assistant/scheduler.js.map +1 -1
  309. package/dist/server/src/plugins/index.js +5 -4
  310. package/dist/server/src/plugins/index.js.map +1 -1
  311. package/npm-shrinkwrap.json +6 -6
  312. package/package.json +3 -3
  313. package/dist/interface/assets/Assistant-B1xdMAkA.js +0 -1
  314. package/dist/interface/assets/Automations-Bpw8olkc.js +0 -2
  315. package/dist/interface/assets/Camera-B4ojNnKb.css +0 -1
  316. package/dist/interface/assets/Camera-BpFfZDaS.js +0 -2
  317. package/dist/interface/assets/Camview-C16pyCZk.js +0 -1
  318. package/dist/interface/assets/CuiAssistantConversation-CRNCKRHz.js +0 -5
  319. package/dist/interface/assets/CuiAssistantConversation-DQ0wOJvV.css +0 -1
  320. package/dist/interface/assets/CuiBottomSheet-CYi5c3fP.js +0 -1
  321. package/dist/interface/assets/CuiCameraPipCard-Cb_Qbly6.js +0 -1
  322. package/dist/interface/assets/CuiCameraTable-BgL5FZso.js +0 -1
  323. package/dist/interface/assets/CuiLightControl-CLYl5pfN.js +0 -1
  324. package/dist/interface/assets/CuiPluginCard-CC1oXY16.js +0 -2
  325. package/dist/interface/assets/Faces-1xd5yGuO.js +0 -1
  326. package/dist/interface/assets/FirstSteps-E9cMqa0a.js +0 -1
  327. package/dist/interface/assets/Floorplan-BovV_ATh.js +0 -1
  328. package/dist/interface/assets/Instances-BbxyB7vR.js +0 -1
  329. package/dist/interface/assets/Metrics-BgXrNl38.js +0 -12
  330. package/dist/interface/assets/Plugin-CDNywaVE.js +0 -1
  331. package/dist/interface/assets/PluginSearch-xNIlfXk4.js +0 -1
  332. package/dist/interface/assets/Recordings-BHT8Vvv_.js +0 -1
  333. package/dist/interface/assets/Recordings-DwuojaAw.css +0 -1
  334. package/dist/interface/assets/Sensors-Cza4Et2c.js +0 -2
  335. package/dist/interface/assets/Settings-Cj0leoGd.js +0 -1
  336. package/dist/interface/assets/SettingsAccount-COkcBBSz.js +0 -1
  337. package/dist/interface/assets/SettingsAccount-DjrJdssy.js +0 -1
  338. package/dist/interface/assets/SettingsAppearance-D20YW7Vq.js +0 -1
  339. package/dist/interface/assets/SettingsAssistant-CDdbbG-c.css +0 -1
  340. package/dist/interface/assets/SettingsAssistant-DKWDp1AI.js +0 -1
  341. package/dist/interface/assets/Training-DfgE_dA8.js +0 -1
  342. package/dist/interface/assets/Updates-cCvbFq3w.js +0 -2
  343. package/dist/interface/assets/Workers-Ba37_3cY.js +0 -2
  344. package/dist/interface/assets/api-C1mraOYr.js +0 -4
  345. package/dist/interface/assets/api-z8ZVnoOl.css +0 -2
  346. package/dist/interface/assets/cloudHandoff-DkUx4m3P.js +0 -1
  347. package/dist/interface/assets/esm-0kxqa_1s.js +0 -1
  348. package/dist/interface/assets/esm-4p_M5mFV.js +0 -1
  349. package/dist/interface/assets/esm-8G-vO1KQ.js +0 -1
  350. package/dist/interface/assets/esm-8cB56ICb.js +0 -1
  351. package/dist/interface/assets/esm-B92csSEb.js +0 -1
  352. package/dist/interface/assets/esm-BHiNTIiN.js +0 -1
  353. package/dist/interface/assets/esm-Bu9PMLmw.js +0 -1
  354. package/dist/interface/assets/esm-CS6Ra46d.js +0 -1
  355. package/dist/interface/assets/esm-CWvQWALL.js +0 -1
  356. package/dist/interface/assets/esm-D2UDrwmt.js +0 -1
  357. package/dist/interface/assets/esm-D8OHF2X1.js +0 -1
  358. package/dist/interface/assets/esm-DrXkS8eG.js +0 -1
  359. package/dist/interface/assets/esm-pfoHiO1a.js +0 -1
  360. package/dist/interface/assets/esm-tJSCF7Vh.js +0 -1
  361. package/dist/interface/assets/main-BK3kmiG2.js +0 -3
  362. package/dist/interface/assets/native-BEkWOGyD.js +0 -1
  363. package/dist/interface/assets/native-ugMg173F.js +0 -1
  364. package/dist/interface/assets/plugin-eafNQWg2.js +0 -1
  365. package/dist/interface/assets/useKeyboardInset-DkUn62i7.js +0 -1
  366. package/dist/interface/assets/web-3OOGlctS.js +0 -1
  367. package/dist/interface/assets/web-5NFVd9gs.js +0 -1
  368. package/dist/interface/assets/web-A4yovlXr.js +0 -1
  369. package/dist/interface/assets/web-BBC3YoWX.js +0 -1
  370. package/dist/interface/assets/web-BjKL51lK-DUIsII0n.js +0 -1
  371. package/dist/interface/assets/web-C2-YAfsx.js +0 -1
  372. package/dist/interface/assets/web-CUL_MhvM.js +0 -1
  373. package/dist/interface/assets/web-CZVCXYLV.js +0 -1
  374. package/dist/interface/assets/web-DJ-LUxlV.js +0 -1
  375. package/dist/interface/assets/web-DNsEGLGS.js +0 -1
  376. package/dist/interface/assets/web-DZsU0QT_.js +0 -1
  377. package/dist/interface/assets/web-MoyOTbiU.js +0 -1
  378. package/dist/interface/assets/web-avRH_3t7.js +0 -1
  379. package/dist/interface/ha/Camera-CerkQGbZ.js +0 -654
@@ -1,56 +1,56 @@
1
1
  import { c as e, m as t } from "./ripple-ZDATPc2w.js";
2
2
  import { B as n, D as r, Dt as i, G as a, H as o, Jt as s, K as c, M as l, Wt as u, _t as d, bt as f, d as p, f as m, ft as h, gt as g, kt as _, l as v, lt as y, ot as b, p as x, qt as S, r as C, rt as w, u as T, ut as E, v as D, x as O, xt as k, y as A, yt as j, z as M } from "./runtime-core.esm-bundler-_TfE0DWz.js";
3
3
  import { t as ee } from "./tooltip-BDrlgLof.js";
4
- import { t as N } from "./message-D6dIy_hz.js";
5
- import { A as P, Ar as te, D as F, Dr as ne, Er as I, F as L, I as R, L as z, O as B, Ot as re, Si as V, St as ie, Yt as ae, _t as H, a as U, fi as oe, gr as se, jn as ce, k as W, kt as le, m as G, si as ue, tt as de, wr as fe } from "./api-Dv3Lk_g5.js";
6
- import { M as pe } from "./protocol-BB4jdtUC-DW3jl2tV.js";
7
- import { i as me, o as he } from "./intercomService-B7HkLs6z.js";
8
- import { $ as ge, et as _e, nt as ve, rt as ye, tt as be } from "./pinia-Du8AM917.js";
9
- import { n as K } from "./vue-i18n-D5EAy78K.js";
10
- import { n as xe, t as q } from "./button-BouAFgf5.js";
11
- import { t as J } from "./inputtext-C_ygnPrC.js";
12
- import { t as Se } from "./close-CxFbonhd.js";
13
- import { t as Ce } from "./select-DV7p2EDj.js";
14
- import { i as we, n as Te, r as Ee, t as De } from "./accordion-BylV-jUK.js";
15
- import { t as Oe } from "./chip-BTHURsTF.js";
16
- import { i as ke, t as Ae } from "./CuiDataTable-CpADXKNF.js";
17
- import { n as je, r as Me, t as Ne } from "./CuiSchema-CHeJkx0k.js";
18
- import { t as Pe } from "./CuiCameraTable-D50FLiK8.js";
19
- import { u as Fe } from "./cards-B0qagpBw.js";
20
- import { t as Ie } from "./plus-CgxY7W0L.js";
21
- import { t as Le } from "./radar-BG-Tcwg_.js";
22
- import { n as Re, t as ze } from "./eye-off-UG_p9nl8.js";
23
- import { t as Be } from "./rooms-C-mLT6mX.js";
4
+ import { t as te } from "./message-D6dIy_hz.js";
5
+ import { An as N, Ar as P, D as F, Dr as ne, Dt as re, E as I, Er as ie, F as L, I as R, Jt as z, O as B, Ot as V, P as H, Si as U, a as W, et as ae, fi as oe, gr as se, gt as G, k as K, m as q, si as ce, wr as le, xt as ue } from "./api-D2VzV4is.js";
6
+ import { M as de } from "./protocol-BB4jdtUC-DW3jl2tV.js";
7
+ import { i as fe, o as pe } from "./intercomService-B7HkLs6z.js";
8
+ import { $ as me, et as he, nt as ge, rt as _e, tt as ve } from "./pinia-BokSpDzj.js";
9
+ import { n as J } from "./vue-i18n-D5EAy78K.js";
10
+ import { n as ye, t as be } from "./button-BouAFgf5.js";
11
+ import { t as Y } from "./inputtext-C_ygnPrC.js";
12
+ import { t as xe } from "./close-CxFbonhd.js";
13
+ import { t as Se } from "./select-DV7p2EDj.js";
14
+ import { i as Ce, n as we, r as Te, t as Ee } from "./accordion-BylV-jUK.js";
15
+ import { t as De } from "./chip-BTHURsTF.js";
16
+ import { i as Oe, t as ke } from "./CuiDataTable-CIKQLseG.js";
17
+ import { n as Ae, r as je, t as Me } from "./CuiSchema-CQy94ZTs.js";
18
+ import { t as Ne } from "./CuiCameraTable-PYYC7sOu.js";
19
+ import { u as Pe } from "./cards-MQrnU0T8.js";
20
+ import { t as Fe } from "./plus-CgxY7W0L.js";
21
+ import { t as Ie } from "./radar-BG-Tcwg_.js";
22
+ import { n as Le, t as Re } from "./eye-off-UG_p9nl8.js";
23
+ import { t as ze } from "./rooms-DyfT3cXp.js";
24
24
  //#region ~icons/material-symbols/camera-rounded
25
- var Ve = {
25
+ var Be = {
26
26
  viewBox: "0 0 24 24",
27
27
  width: "1.2em",
28
28
  height: "1.2em"
29
29
  };
30
- function He(e, t) {
31
- return o(), x("svg", Ve, [...t[0] ||= [T("path", {
30
+ function Ve(e, t) {
31
+ return o(), x("svg", Be, [...t[0] ||= [T("path", {
32
32
  fill: "currentColor",
33
33
  d: "M12.5 9q-.275 0-.425-.25t0-.5L15 3.175q.2-.325.5-.387t.65.112q1.725.775 3.05 2.162T21.25 8.2q.125.325-.038.563T20.7 9zm-3.575 1.225l-3-5.2q-.2-.325-.1-.65t.4-.525Q7.425 3 8.888 2.5T12 2q.375 0 .825.038t.75.087q.35.05.463.3t-.063.55L9.8 10.225q-.15.25-.437.25t-.438-.25M2.85 14q-.275 0-.5-.187t-.275-.463t-.062-.6T2 12q0-1.575.513-3.137T4.1 5.9q.275-.35.638-.35t.562.375l4.2 7.325q.15.25-.012.5T9.05 14zm5 7.1q-1.65-.8-3.025-2.175T2.75 15.8q-.125-.325.05-.562T3.325 15h8.15q.275 0 .425.25t0 .5l-2.875 5.025q-.2.325-.5.425t-.675-.1M12 22q-.35 0-.788-.038t-.762-.087q-.35-.05-.475-.3t.05-.55l4.125-7.2q.15-.25.5-.25t.5.25l2.95 5.125q.175.275.113.6t-.413.6q-1.15.85-2.687 1.35T12 22m6.775-3.875l-4.25-7.375q-.15-.25.013-.5t.437-.25h6.175q.275 0 .5.188t.275.462t.062.6T22 12q0 1.575-.513 3.163T19.9 18.125q-.2.275-.575.288t-.55-.288"
34
34
  }, null, -1)]]);
35
35
  }
36
- var Ue = d({
36
+ var He = d({
37
37
  name: "material-symbols-camera-rounded",
38
- render: He
39
- }), We = "#### Source: Bubble\n\nOther names: [ESeeCloud](http://www.eseecloud.com/), [dvr163](http://help.dvr163.com/).\n\n- you can skip `username`, `password`, `port`, `ch` and `stream` if they are default\n- setup separate streams for different channels and streams\n\n```yaml\nstreams:\n camera1: bubble://username:password@192.168.1.123:34567/bubble/live?ch=0&stream=0\n```\n\n_Source: [Go2Rtc Bubble](https://github.com/seydx/go2rtc#source-bubble)_\n", Ge = "#### Source: CUI\n\nThis source can be used to stream dynamically generated, go2rtc compatible, URLs. The source is just a placeholder for a `https://` URL.\n\n```yaml\nstreams:\n camera1: cui://192.168.1.123:34567/some-identifier-if-you-want\n```\n\nThe URL will be changed to `https://192.168.1.123:34567/some-identifier-if-you-want` and the response must be like this:\n\n```json\n{\n {\n \"streamUrl\": \"rtsp://192.168.1.1:554/stream\",\n }\n}\n```\n\nGo2rtc will then use the `streamUrl` to stream the video. The `streamUrl` can be any URL that is compatible with go2rtc. The response must be a valid JSON object with the `streamUrl` key.\n", Ke = "#### Source: Doorbird\n\n[Doorbird](https://www.doorbird.com/) proprietary camera protocol with **two way audio** support.\n\n```yaml\nstreams:\n video-audio:\n - rtsp://user:pass@123.123.123.123:554/mpeg/media.amp\n - doorbird://user:pass@123.123.123.123?media=audio\n two-way:\n - rtsp://user:pass@123.123.123.123:554/mpeg/media.amp\n - doorbird://user:pass@123.123.123.123?media=audio\n - doorbird://user:pass@123.123.123.123\n mjpeg-video:\n - doorbird://user:pass@123.123.123.123?media=video\n```\n\n_Source: [Go2Rtc Tuya](https://github.com/seydx/go2rtc#source-doorbird)_\n", qe = "#### Source: DVRIP\n\nOther names: DVR-IP, NetSurveillance, Sofia protocol (NETsurveillance ActiveX plugin XMeye SDK).\n\n- you can skip `username`, `password`, `port`, `channel` and `subtype` if they are default\n- setup separate streams for different channels\n- use `subtype=0` for Main stream, and `subtype=1` for Extra1 stream\n- only the TCP protocol is supported\n\n```yaml\nstreams:\n only_stream: dvrip://username:password@192.168.1.123:34567?channel=0&subtype=0\n only_tts: dvrip://username:password@192.168.1.123:34567?backchannel=1\n two_way_audio:\n - dvrip://username:password@192.168.1.123:34567?channel=0&subtype=0\n - dvrip://username:password@192.168.1.123:34567?backchannel=1\n```\n\n_Source: [Go2Rtc DVRIP](https://github.com/seydx/go2rtc#source-dvrip)_\n", Je = "#### Source: Echo\n\nSome sources may have a dynamic link. And you will need to get it using a bash or python script. Your script should echo a link to the source. RTSP, FFmpeg or any of the [supported sources](https://github.com/seydx/go2rtc#module-streams).\n\n**Docker** and **Hass Add-on** users has preinstalled `python3`, `curl`, `jq`.\nCheck examples in [wiki](https://github.com/seydx/go2rtc/wiki/Source-Echo-examples).\n\n```yaml\nstreams:\n apple_hls: echo:python3 hls.py https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\n```\n\n_Source: [Go2Rtc Echo](https://github.com/seydx/go2rtc#source-echo)_\n", Ye = "#### Source: Exec\n\nExec source can run any external application and expect data from it. Two transports are supported - **pipe** and **RTSP**.\n\nIf you want to use **RTSP** transport - the command must contain the `{output}` argument in any place. On launch, it will be replaced by the local address of the RTSP server.\n\n**pipe** reads data from app stdout in different formats: **MJPEG**, **H.264/H.265 bitstream**, **MPEG-TS**. Also pipe can write data to app stdin in two formats: **PCMA** and **PCM/48000**.\n\nThe source can be used with:\n\n- [FFmpeg](https://ffmpeg.org/) - go2rtc ffmpeg source just a shortcut to exec source\n- [FFplay](https://ffmpeg.org/ffplay.html) - play audio on your server\n- [GStreamer](https://gstreamer.freedesktop.org/)\n- [Raspberry Pi Cameras](https://www.raspberrypi.com/documentation/computers/camera_software.html)\n- any your own software\n\n```yaml\nstreams:\n stream: exec:ffmpeg -re -i /media/BigBuckBunny.mp4 -c copy -rtsp_transport tcp -f rtsp {output}\n picam_h264: exec:libcamera-vid -t 0 --inline -o -\n picam_mjpeg: exec:libcamera-vid -t 0 --codec mjpeg -o -\n pi5cam_h264: exec:libcamera-vid -t 0 --libav-format h264 -o -\n canon: exec:gphoto2 --capture-movie --stdout#killsignal=2#killtimeout=5\n play_pcma: exec:ffplay -fflags nobuffer -f alaw -ar 8000 -i -#backchannel=1\n play_pcm48k: exec:ffplay -fflags nobuffer -f s16be -ar 48000 -i -#backchannel=1\n```\n\n_Source: [Go2Rtc Exec](https://github.com/seydx/go2rtc#source-exec)_\n", Xe = "#### Source: Expr\n\n[Expr](https://github.com/antonmedv/expr) - expression language and expression evaluation for Go.\n\n- [language definition](https://expr.medv.io/docs/Language-Definition) - takes best from JS, Python, Jinja2 syntax\n- your expression should return a link of any supported source\n- expression supports multiple operation, but:\n - all operations must be separated by a semicolon\n - all operations, except the last one, must declare a new variable (`let s = \"abc\";`)\n - the last operation should return a string\n- go2rtc supports additional functions:\n - `fetch` - JS-like HTTP requests\n - `match` - JS-like RegExp queries\n\n## Examples\n\n**Two way audio for Dahua VTO**\n\n```yaml\nstreams:\n dahua_vto: |\n expr: let host = \"admin:password@192.168.1.123\";\n fetch(\"http://\"+host+\"/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Audio.Compression=G.711A&Encode[0].MainFormat[0].Audio.Frequency=8000\").ok\n ? \"rtsp://\"+host+\"/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif\" : \"\"\n```\n\n**dom.ru**\n\nYou can get credentials via:\n\n- https://github.com/alexmorbo/domru (file `/share/domru/accounts`)\n- https://github.com/ad/domru\n\n```yaml\nstreams:\n dom_ru: |\n expr: let camera = \"99999999\"; let token = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"; let operator = 99;\n fetch(\"https://myhome.novotelecom.ru/rest/v1/forpost/cameras/\"+camera+\"/video\", {\n headers: {Authorization: \"Bearer \"+token, Operator: operator}\n }).json().data.URL\n```\n\n**Parse HLS files from Apple**\n\nSame example in two languages - python and expr.\n\n```yaml\nstreams:\n example_python: |\n echo:python -c 'from urllib.request import urlopen; import re\n\n # url1 = \"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8\"\n html1 = urlopen(\"https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\").read().decode(\"utf-8\")\n url1 = re.search(r\"https.+?m3u8\", html1)[0]\n\n # url2 = \"gear1/prog_index.m3u8\"\n html2 = urlopen(url1).read().decode(\"utf-8\")\n url2 = re.search(r\"^[a-z0-1/_]+\\.m3u8$\", html2, flags=re.MULTILINE)[0]\n\n # url3 = \"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/gear1/prog_index.m3u8\"\n url3 = url1[:url1.rindex(\"/\")+1] + url2\n\n print(\"ffmpeg:\" + url3 + \"#video=copy\")'\n\n example_expr: |\n expr:\n\n let html1 = fetch(\"https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\").text;\n let url1 = match(html1, \"https.+?m3u8\")[0];\n\n let html2 = fetch(url1).text;\n let url2 = match(html2, \"^[a-z0-1/_]+\\\\.m3u8$\", \"m\")[0];\n\n let url3 = url1[:lastIndexOf(url1, \"/\")+1] + url2;\n\n \"ffmpeg:\" + url3 + \"#video=copy\"\n```\n\n## Comparsion\n\n| expr | python | js |\n| ---------------------------- | -------------------------- | ------------------------------ |\n| let x = 1; | x = 1 | let x = 1 |\n| {a: 1, b: 2} | {\"a\": 1, \"b\": 2} | {a: 1, b: 2} |\n| let r = fetch(url, {method}) | r = request(method, url) | r = await fetch(url, {method}) |\n| r.ok | r.ok | r.ok |\n| r.status | r.status_code | r.status |\n| r.text | r.text | await r.text() |\n| r.json() | r.json() | await r.json() |\n| r.headers | r.headers | r.headers |\n| let m = match(text, \"abc\") | m = re.search(\"abc\", text) | let m = text.match(/abc/) |\n\n_Source: [Go2Rtc Expr](https://github.com/seydx/go2rtc#source-expr)_\n", Ze = "#### Source: FFmpeg\n\nYou can get any stream or file or device via FFmpeg and push it to go2rtc. The app will automatically start FFmpeg with the proper arguments when someone starts watching the stream.\n\n- FFmpeg preistalled for **Docker** and **Hass Add-on** users\n- **Hass Add-on** users can target files from [/media](https://www.home-assistant.io/more-info/local-media/setup-media/) folder\n\nFormat: `ffmpeg:{input}#{param1}#{param2}#{param3}`. Examples:\n\n```yaml\nstreams:\n # [FILE] all tracks will be copied without transcoding codecs\n file1: ffmpeg:/media/BigBuckBunny.mp4\n\n # [FILE] video will be transcoded to H264, audio will be skipped\n file2: ffmpeg:/media/BigBuckBunny.mp4#video=h264\n\n # [FILE] video will be copied, audio will be transcoded to pcmu\n file3: ffmpeg:/media/BigBuckBunny.mp4#video=copy#audio=pcmu\n\n # [HLS] video will be copied, audio will be skipped\n hls: ffmpeg:https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/gear5/prog_index.m3u8#video=copy\n\n # [MJPEG] video will be transcoded to H264\n mjpeg: ffmpeg:http://185.97.122.128/cgi-bin/faststream.jpg#video=h264\n\n # [RTSP] video with rotation, should be transcoded, so select H264\n rotate: ffmpeg:rtsp://rtsp:12345678@192.168.1.123/av_stream/ch0#video=h264#rotate=90\n```\n\nAll trascoding formats has [built-in templates](https://github.com/seydx/go2rtc/blob/master/internal/ffmpeg/ffmpeg.go): `h264`, `h265`, `opus`, `pcmu`, `pcmu/16000`, `pcmu/48000`, `pcma`, `pcma/16000`, `pcma/48000`, `aac`, `aac/16000`.\n\nBut you can override them via YAML config. You can also add your own formats to config and use them with source params.\n\n```yaml\nffmpeg:\n bin: ffmpeg # path to ffmpeg binary\n h264: '-codec:v libx264 -g:v 30 -preset:v superfast -tune:v zerolatency -profile:v main -level:v 4.1'\n mycodec: '-any args that supported by ffmpeg...'\n myinput: '-fflags nobuffer -flags low_delay -timeout 5000000 -i {input}'\n myraw: '-ss 00:00:20'\n```\n\n- You can use go2rtc stream name as ffmpeg input (ex. `ffmpeg:camera1#video=h264`)\n- You can use `video` and `audio` params multiple times (ex. `#video=copy#audio=copy#audio=pcmu`)\n- You can use `rotate` param with `90`, `180`, `270` or `-90` values, important with transcoding (ex. `#video=h264#rotate=90`)\n- You can use `width` and/or `height` params, important with transcoding (ex. `#video=h264#width=1280`)\n- You can use `drawtext` to add a timestamp (ex. `drawtext=x=2:y=2:fontsize=12:fontcolor=white:box=1:boxcolor=black`)\n - This will greatly increase the CPU of the server, even with hardware acceleration\n- You can use `raw` param for any additional FFmpeg arguments (ex. `#raw=-vf transpose=1`)\n- You can use `input` param to override default input template (ex. `#input=rtsp/udp` will change RTSP transport from TCP to UDP+TCP)\n - You can use raw input value (ex. `#input=-timeout 5000000 -i {input}`)\n - You can add your own input templates\n\nRead more about [hardware acceleration](https://github.com/seydx/go2rtc/wiki/Hardware-acceleration).\n\n**PS.** It is recommended to check the available hardware in the WebUI add page.\n\n<hr>\n\n#### Source: FFmpeg Device\n\nYou can get video from any USB-camera or Webcam as RTSP or WebRTC stream. This is part of FFmpeg integration.\n\n- check available devices in Web interface\n- `video_size` and `framerate` must be supported by your camera!\n- for Linux supported only video for now\n- for macOS you can stream Facetime camera or whole Desktop!\n- for macOS important to set right framerate\n\nFormat: `ffmpeg:device?{input-params}#{param1}#{param2}#{param3}`\n\n```yaml\nstreams:\n linux_usbcam: ffmpeg:device?video=0&video_size=1280x720#video=h264\n windows_webcam: ffmpeg:device?video=0#video=h264\n macos_facetime: ffmpeg:device?video=0&audio=1&video_size=1280x720&framerate=30#video=h264#audio=pcma\n```\n\n**PS.** It is recommended to check the available devices in the WebUI add page.\n\n_Source: [Go2Rtc FFmpeg](https://github.com/seydx/go2rtc#source-ffmpeg) & [Go2Rtc FFmpeg Device](https://github.com/seydx/go2rtc#source-ffmpeg-device)_\n", Qe = "#### Source: GoPro\n\nSupported models: HERO9, HERO10, HERO11, HERO12. \nSupported OS: Linux, Mac, Windows, [HassOS](https://www.home-assistant.io/installation/)\n\nThe other camera models have different APIs. I will try to add them in the next versions.\n\n## Config\n\n- USB-connected cameras create a new network interface in the system\n- Linux users do not need to install anything\n- Windows users should install the [network driver](https://community.gopro.com/s/article/GoPro-Webcam)\n- if the camera is detected but the stream does not start - you need to disable firewall\n\n1. Discover camera address: WebUI > Add > GoPro\n2. Add camera to config\n\n```yaml\nstreams:\n hero12: gopro://172.20.100.51\n```\n\n## Useful links\n\n- https://gopro.github.io/OpenGoPro/\n\n_Source: [Go2Rtc Hass](https://github.com/seydx/go2rtc#source-hass)_\n", $e = "#### Source: Hass\n\nSupport import camera links from [Home Assistant](https://www.home-assistant.io/) config files:\n\n- [Generic Camera](https://www.home-assistant.io/integrations/generic/), setup via GUI\n- [HomeKit Camera](https://www.home-assistant.io/integrations/homekit_controller/)\n- [ONVIF](https://www.home-assistant.io/integrations/onvif/)\n- [Roborock](https://github.com/humbertogontijo/homeassistant-roborock) vacuums with camera\n\n```yaml\nhass:\n config: '/config' # skip this setting if you Hass Add-on user\n\nstreams:\n generic_camera: hass:Camera1 # Settings > Integrations > Integration Name\n aqara_g3: hass:Camera-Hub-G3-AB12\n```\n\n**WebRTC Cameras**\n\nAny cameras in WebRTC format are supported. But at the moment Home Assistant only supports some [Nest](https://www.home-assistant.io/integrations/nest/) cameras in this fomat.\n\nThe Nest API only allows you to get a link to a stream for 5 minutes. So every 5 minutes the stream will be reconnected.\n\n```yaml\nstreams:\n # link to Home Assistant Supervised\n hass-webrtc1: hass://supervisor?entity_id=camera.nest_doorbell\n # link to external Hass with Long-Lived Access Tokens\n hass-webrtc2: hass://192.168.1.123:8123?entity_id=camera.nest_doorbell&token=eyXYZ...\n```\n\n_Source: [Go2Rtc Hass](https://github.com/seydx/go2rtc#source-hass)_\n", et = "#### Source: HomeKit\n\n**Important:**\n\n- You can use HomeKit Cameras **without Apple devices** (iPhone, iPad, etc.), it's just a yet another protocol\n- HomeKit device can be paired with only one ecosystem. So, if you have paired it to an iPhone (Apple Home) - you can't pair it with Home Assistant or go2rtc. Or if you have paired it to go2rtc - you can't pair it with iPhone\n- HomeKit device should be in same network with working [mDNS](https://en.wikipedia.org/wiki/Multicast_DNS) between device and go2rtc\n\ngo2rtc support import paired HomeKit devices from [Home Assistant](#source-hass). So you can use HomeKit camera with Hass and go2rtc simultaneously. If you using Hass, I recommend pairing devices with it, it will give you more options.\n\nYou can pair device with go2rtc on the HomeKit page. If you can't see your devices - reload the page. Also try reboot your HomeKit device (power off). If you still can't see it - you have a problems with mDNS.\n\nIf you see a device but it does not have a pair button - it is paired to some ecosystem (Apple Home, Home Assistant etc). You need to delete device from that ecosystem, and it will be available for pairing. If you cannot unpair device, you will have to reset it.\n\n**Important:**\n\n- HomeKit audio uses very non-standard **AAC-ELD** codec with very non-standard params and specification violation\n- Audio can't be played in `VLC` and probably any other player\n- Audio should be transcoded for using with MSE, WebRTC, etc.\n\nRecommended settings for using HomeKit Camera with WebRTC, MSE, MP4, RTSP:\n\n```\nstreams:\n aqara_g3:\n - hass:Camera-Hub-G3-AB12\n - ffmpeg:aqara_g3#audio=aac#audio=opus\n```\n\nRTSP link with \"normal\" audio for any player: `rtsp://192.168.1.123:8554/aqara_g3?video&audio=aac`\n\n**This source is in active development!** Tested only with [Aqara Camera Hub G3](https://www.aqara.com/eu/product/camera-hub-g3) (both EU and CN versions).\n\n_Source: [Go2Rtc HomeKit](https://github.com/seydx/go2rtc#source-homekit)_\n", tt = "#### Source: HTTP\n\nSupport Content-Type:\n\n- **HTTP-FLV** (`video/x-flv`) - same as RTMP, but over HTTP\n- **HTTP-JPEG** (`image/jpeg`) - camera snapshot link, can be converted by go2rtc to MJPEG stream\n- **HTTP-MJPEG** (`multipart/x`) - simple MJPEG stream over HTTP\n- **MPEG-TS** (`video/mpeg`) - legacy [streaming format](https://en.wikipedia.org/wiki/MPEG_transport_stream)\n\nSource also support HTTP and TCP streams with autodetection for different formats: **MJPEG**, **H.264/H.265 bitstream**, **MPEG-TS**.\n\n```yaml\nstreams:\n # [HTTP-FLV] stream in video/x-flv format\n http_flv: http://192.168.1.123:20880/api/camera/stream/780900131155/657617\n\n # [JPEG] snapshots from Dahua camera, will be converted to MJPEG stream\n dahua_snap: http://admin:password@192.168.1.123/cgi-bin/snapshot.cgi?channel=1\n\n # [MJPEG] stream will be proxied without modification\n http_mjpeg: https://mjpeg.sanford.io/count.mjpeg\n\n # [MJPEG or H.264/H.265 bitstream or MPEG-TS]\n tcp_magic: tcp://192.168.1.123:12345\n\n # Add custom header\n custom_header: 'https://mjpeg.sanford.io/count.mjpeg#header=Authorization: Bearer XXX'\n```\n\n**PS.** Dahua camera has bug: if you select MJPEG codec for RTSP second stream - snapshot won't work.\n\n_Source: [Go2Rtc Http](https://github.com/seydx/go2rtc#source-http)_\n", nt = "#### Source: ISAPI\n\nThis source type support only backchannel audio for Hikvision ISAPI protocol. So it should be used as second source in addition to the RTSP protocol.\n\n```yaml\nstreams:\n hikvision1:\n - rtsp://admin:password@192.168.1.123:554/Streaming/Channels/101\n - isapi://admin:password@192.168.1.123:80/\n```\n\n_Source: [Go2Rtc Isapi](https://github.com/seydx/go2rtc#source-isapi)_\n", rt = "#### Source: Ivideon\n\nSupport public cameras from service [Ivideon](https://tv.ivideon.com/).\n\n```yaml\nstreams:\n quailcam: ivideon:100-tu5dkUPct39cTp9oNEN2B6/0\n```\n\n_Source: [Go2Rtc Ivideon](https://github.com/seydx/go2rtc#source-ivideon)_\n", it = "#### Source: Kasa\n\n[TP-Link Kasa](https://www.kasasmart.com/) non-standard protocol [more info](https://medium.com/@hu3vjeen/reverse-engineering-tp-link-kc100-bac4641bf1cd).\n\n- `username` - urlsafe email, `alex@gmail.com` -> `alex%40gmail.com`\n- `password` - base64password, `secret1` -> `c2VjcmV0MQ==`\n\n```yaml\nstreams:\n kc401: kasa://username:password@192.168.1.123:19443/https/stream/mixed\n```\n\nTested: KD110, KC200, KC401, KC420WS, EC71.\n\n_Source: [Go2Rtc Kasa](https://github.com/seydx/go2rtc#source-kasa)_\n", at = "#### Source: Nest\n\nCurrently only WebRTC cameras are supported.\n\nFor simplicity, it is recommended to connect the Nest/WebRTC camera to the [Home Assistant](#source-hass). But if you can somehow get the below parameters - Nest/WebRTC source will work without Hass.\n\n```yaml\nstreams:\n nest-doorbell: nest:?client_id=***&client_secret=***&refresh_token=***&project_id=***&device_id=***\n```\n\n_Source: [Go2Rtc Nest](https://github.com/seydx/go2rtc#source-nest)_\n", ot = "#### Source: ONVIF\n\nThe source is not very useful if you already know RTSP and snapshot links for your camera. But it can be useful if you don't.\n\n**WebUI > Add** webpage support ONVIF autodiscovery. Your server must be on the same subnet as the camera. If you use docker, you must use \"network host\".\n\n```yaml\nstreams:\n dahua1: onvif://admin:password@192.168.1.123\n reolink1: onvif://admin:password@192.168.1.123:8000\n tapo1: onvif://admin:password@192.168.1.123:2020\n```\n\n_Source: [Go2Rtc Onvif](https://github.com/seydx/go2rtc#source-onvif)_\n", st = "#### Source: Ring\n\nThis source type support Ring cameras with [two way audio](#two-way-audio) support. If you have a `refresh_token` and `device_id` - you can use it in `go2rtc.yaml` config file. Otherwise, you can use the go2rtc interface and add your ring account (WebUI > Add > Ring). Once added, it will list all your Ring cameras.\n\n```yaml\nstreams:\n ring: ring:?device_id=XXX&refresh_token=XXX\n ring_snapshot: ring:?device_id=XXX&refresh_token=XXX&snapshot\n```\n\n_Source: [Go2Rtc Ring](https://github.com/seydx/go2rtc#source-ring)_\n", ct = "#### Source: Roborock\n\nThis source type support Roborock vacuums with cameras. Known working models:\n\n- Roborock S6 MaxV - only video (the vacuum has no microphone)\n- Roborock S7 MaxV - video and two way audio\n- Roborock Qrevo MaxV - video and two way audio\n\nSource support load Roborock credentials from Home Assistant [custom integration](https://github.com/humbertogontijo/homeassistant-roborock) or the [core integration](https://www.home-assistant.io/integrations/roborock). Otherwise, you need to log in to your Roborock account (MiHome account is not supported). Go to: go2rtc WebUI > Add webpage. Copy `roborock://...` source for your vacuum and paste it to `go2rtc.yaml` config.\n\nIf you have graphic pin for your vacuum - add it as numeric pin (lines: 123, 456, 789) to the end of the roborock-link.\n\n_Source: [Go2Rtc Roborock](https://github.com/seydx/go2rtc#source-roborock)_\n", lt = "#### Source: RTMP\n\nYou can get stream from RTMP server, for example [Nginx with nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module).\n\n```yaml\nstreams:\n rtmp_stream: rtmp://192.168.1.123/live/camera1\n```\n\n_Source: [Go2Rtc RTMP](https://github.com/seydx/go2rtc#source-rtmp)_\n", ut = "#### Source: RTSP\n\n```yaml\nstreams:\n sonoff_camera: rtsp://rtsp:12345678@192.168.1.123/av_stream/ch0\n dahua_camera:\n - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif\n - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=1\n amcrest_doorbell:\n - rtsp://username:password@192.168.1.123:554/cam/realmonitor?channel=1&subtype=0#backchannel=0\n unifi_camera: rtspx://192.168.1.123:7441/fD6ouM72bWoFijxK\n glichy_camera: ffmpeg:rtsp://username:password@192.168.1.123/live/ch00_1\n```\n\n**Recommendations**\n\n- **Amcrest Doorbell** users may want to disable two way audio, because with an active stream you won't have a call button working. You need to add `#backchannel=0` to the end of your RTSP link in YAML config file\n- **Dahua Doorbell** users may want to change backchannel [audio codec](https://github.com/AlexxIT/go2rtc/issues/52)\n- **Reolink** users may want NOT to use RTSP protocol at all, some camera models have a very awful unusable stream implementation\n- **Ubiquiti UniFi** users may want to disable HTTPS verification. Use `rtspx://` prefix instead of `rtsps://`. And don't use `?enableSrtp` [suffix](https://github.com/AlexxIT/go2rtc/issues/81)\n- **TP-Link Tapo** users may skip login and password, because go2rtc support login [without them](https://drmnsamoliu.github.io/video.html)\n- If your camera has two RTSP links - you can add both of them as sources. This is useful when streams has different codecs, as example AAC audio with main stream and PCMU/PCMA audio with second stream\n- If the stream from your camera is glitchy, try using [ffmpeg source](#source-ffmpeg). It will not add CPU load if you won't use transcoding\n- If the stream from your camera is very glitchy, try to use transcoding with [ffmpeg source](#source-ffmpeg)\n\n**Other options**\n\nFormat: `rtsp...#{param1}#{param2}#{param3}`\n\n- Ignore audio - `#media=video` or ignore video - `#media=audio`\n- Ignore two way audio API `#backchannel=0` - important for some glitchy cameras\n- Use WebSocket transport `#transport=ws...`\n\n**RTSP over WebSocket**\n\n```yaml\nstreams:\n # WebSocket with authorization, RTSP - without\n axis-rtsp-ws: rtsp://192.168.1.123:4567/axis-media/media.amp?overview=0&camera=1&resolution=1280x720&videoframeskipmode=empty&Axis-Orig-Sw=true#transport=ws://user:pass@192.168.1.123:4567/rtsp-over-websocket\n # WebSocket without authorization, RTSP - with\n dahua-rtsp-ws: rtsp://user:pass@192.168.1.123/cam/realmonitor?channel=1&subtype=1&proto=Private3#transport=ws://192.168.1.123/rtspoverwebsocket\n```\n\n_Source: [Go2Rtc RTSP](https://github.com/seydx/go2rtc#source-rtsp)_\n", dt = "#### Source: Tapo\n\n[TP-Link Tapo](https://www.tapo.com/) proprietary camera protocol with **two way audio** support.\n\n- stream quality is the same as [RTSP protocol](https://www.tapo.com/en/faq/34/)\n- use the **cloud password**, this is not the RTSP password! you do not need to add a login!\n- you can also use UPPERCASE MD5 hash from your cloud password with `admin` username\n- some new camera firmwares requires SHA256 instead of MD5\n\n```yaml\nstreams:\n # cloud password without username\n camera1: tapo://cloud-password@192.168.1.123\n # admin username and UPPERCASE MD5 cloud-password hash\n camera2: tapo://admin:UPPERCASE-MD5@192.168.1.123\n # admin username and UPPERCASE SHA256 cloud-password hash\n camera3: tapo://admin:UPPERCASE-SHA256@192.168.1.123\n```\n\n```bash\necho -n \"cloud password\" | md5 | awk '{print toupper($0)}'\necho -n \"cloud password\" | shasum -a 256 | awk '{print toupper($0)}'\n```\n\n_Source: [Go2Rtc Tapo](https://github.com/seydx/go2rtc#source-tapo)_\n", ft = "#### Source: Tuya\n\n[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Tuya Smart API` and `Tuya Cloud API`.\n\n**Tuya Smart API (recommended)**:\n\n- Cameras can be discovered through the go2rtc web interface via Tuya Smart account (Add > Tuya > Select region and fill in email and password > Login).\n- **Smart Life accounts are not supported**, you need to create a Tuya Smart account. If the cameras are already added to the Smart Life app, you need to remove them and add them again to the Tuya Smart app.\n\n**Tuya Cloud API**:\n\n- Requires setting up a cloud project in the Tuya Developer Platform.\n- Obtain `device_id`, `client_id`, `client_secret`, and `uid` from [Tuya IoT Platform](https://iot.tuya.com/). [Here's a guide](https://xzetsubou.github.io/hass-localtuya/cloud_api/).\n- Please ensure that you have subscribed to the `IoT Video Live Stream` service (Free Trial) in the Tuya Developer Platform, otherwise the stream will not work (Tuya Developer Platform > Service API > Authorize > IoT Video Live Stream).\n\n**Configuring the stream:**\n\n- Use `resolution` parameter to select the stream (not all cameras support `hd` stream through WebRTC even if the camera has it):\n - `hd` - HD stream (default)\n - `sd` - SD stream\n\n```yaml\nstreams:\n # Tuya Smart API: WebRTC main stream (use Add > Tuya to discover the URL)\n tuya_main:\n - tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX\n\n # Tuya Smart API: WebRTC sub stream (use Add > Tuya to discover the URL)\n tuya_sub:\n - tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX&resolution=sd\n\n # Tuya Cloud API: WebRTC main stream\n tuya_webrtc:\n - tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX\n\n # Tuya Cloud API: WebRTC sub stream\n tuya_webrtc_sd:\n - tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX&resolution=sd\n```\n\n_Source: [Go2Rtc Tuya](https://github.com/seydx/go2rtc#source-tuya)_\n", pt = "#### Source: WebRTC\n\nThis source type support four connection formats.\n\n**whep**\n\n[WebRTC/WHEP](https://datatracker.ietf.org/doc/draft-murillo-whep/) - is replaced by [WebRTC/WISH](https://datatracker.ietf.org/doc/charter-ietf-wish/02/) standard for WebRTC video/audio viewers. But it may already be supported in some third-party software. It is supported in go2rtc.\n\n**go2rtc**\n\nThis format is only supported in go2rtc. Unlike WHEP it supports asynchronous WebRTC connection and two way audio.\n\n**openipc**\n\nSupport connection to [OpenIPC](https://openipc.org/) cameras.\n\n**wyze**\n\nSupports connection to [Wyze](https://www.wyze.com/) cameras, using WebRTC protocol. You can use [docker-wyze-bridge](https://github.com/mrlt8/docker-wyze-bridge) project to get connection credentials.\n\n**kinesis**\n\nSupports [Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/), using WebRTC protocol. You need to specify signalling WebSocket URL with all credentials in query params, `client_id` and `ice_servers` list in [JSON format](https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer).\n\n```yaml\nstreams:\n webrtc-whep: webrtc:http://192.168.1.123:1984/api/webrtc?src=camera1\n webrtc-go2rtc: webrtc:ws://192.168.1.123:1984/api/ws?src=camera1\n webrtc-openipc: webrtc:ws://192.168.1.123/webrtc_ws#format=openipc#ice_servers=[{\"urls\":\"stun:stun.kinesisvideo.eu-north-1.amazonaws.com:443\"}]\n webrtc-wyze: webrtc:http://192.168.1.123:5000/signaling/camera1?kvs#format=wyze\n webrtc-kinesis: webrtc:wss://...amazonaws.com/?...#format=kinesis#client_id=...#ice_servers=[{...},{...}]\n```\n\n**PS.** For `kinesis` sources you can use [echo](#source-echo) to get connection params using `bash`/`python` or any other script language.\n\n_Source: [Go2Rtc WebRTC](https://github.com/seydx/go2rtc#source-webrtc)_\n", mt = "#### Source: WebTorrent\n\nThis source can get a stream from another go2rtc via [WebTorrent](#module-webtorrent) protocol.\n\n```yaml\nstreams:\n webtorrent1: webtorrent:?share=huofssuxaty00izc&pwd=k3l2j9djeg8v8r7e\n```\n\n_Source: [Go2Rtc Webtorrent](https://github.com/seydx/go2rtc#source-webtorrent)_\n", ht = "#### Source: Wyze\n\nThis source allows you to stream from [Wyze](https://wyze.com/) cameras using native P2P protocol without the Wyze app or SDK.\n\n**Important:**\n\n1. **Requires Wyze account**. You need to login once via the WebUI to load your cameras.\n2. **Requires firmware with DTLS**. Only cameras with DTLS-enabled firmware are supported.\n3. Internet access is only needed when loading cameras from your account. After that, all streaming is local P2P.\n4. Connection to the camera is local only (direct P2P to camera IP).\n\n**Features:**\n\n- H.264 and H.265 video codec support\n- AAC, G.711, PCM, and Opus audio codec support\n- Two-way audio (intercom) support\n- Resolution switching (HD/SD)\n\n## Setup\n\n1. Get your API Key from [Wyze Developer Portal](https://support.wyze.com/hc/en-us/articles/16129834216731)\n2. Go to go2rtc WebUI > Add > Wyze\n3. Enter your API ID, API Key, email, and password\n4. Select cameras to add - stream URLs are generated automatically\n\n**Example Config**\n\n```yaml\nwyze:\n user@email.com:\n api_id: 'your-api-id'\n api_key: 'your-api-key'\n password: 'yourpassword' # or MD5 triple-hash with \"md5:\" prefix\n\nstreams:\n wyze_cam: wyze://192.168.1.123?uid=WYZEUID1234567890AB&enr=xxx&mac=AABBCCDDEEFF&model=HL_CAM4&dtls=true\n```\n\n## Stream URL Format\n\nThe stream URL is automatically generated when you add cameras via the WebUI:\n\n```\nwyze://[IP]?uid=[P2P_ID]&enr=[ENR]&mac=[MAC]&model=[MODEL]&subtype=[hd|sd]&dtls=true\n```\n\n| Parameter | Description |\n| --------- | ----------------------------------------------- |\n| `IP` | Camera's local IP address |\n| `uid` | P2P identifier (20 chars) |\n| `enr` | Encryption key for DTLS |\n| `mac` | Device MAC address |\n| `model` | Camera model (e.g., HL_CAM4) |\n| `dtls` | Enable DTLS encryption (default: true) |\n| `subtype` | Camera resolution: `hd` or `sd` (default: `hd`) |\n\n## Configuration\n\n### Resolution\n\nYou can change the camera's resolution using the `subtype` parameter:\n\n```yaml\nstreams:\n wyze_hd: wyze://...&subtype=hd\n wyze_sd: wyze://...&subtype=sd\n```\n\n### Two-Way Audio\n\nTwo-way audio (intercom) is supported automatically. When a consumer sends audio to the stream, it will be transmitted to the camera's speaker.\n", gt = "#### Source: Xiaomi\n\nThis source allows you to view cameras from the [Xiaomi Mi Home](https://home.mi.com/) ecosystem.\n\n**Important:**\n\n1. **Not all cameras are supported**. There are several P2P protocol vendors in the Xiaomi ecosystem.\n Currently, the **CS2** vendor is supported. However, the **TUTK** vendor is not supported.\n2. Each time you connect to the camera, you need internet access to obtain encryption keys.\n3. Connection to the camera is local only.\n\n**Features:**\n\n- Multiple Xiaomi accounts supported\n- Cameras from multiple regions are supported for a single account\n- Two-way audio is supported\n- Cameras with multiple lenses are supported\n\n## Setup\n\n1. Goto go2rtc WebUI > Add > Xiaomi > Login with username and password\n2. Receive verification code by email or phone if required.\n3. Complete the captcha if required.\n4. If everything is OK, your account will be added and you can load cameras from it.\n\n**Example**\n\n```yaml\nxiaomi:\n 1234567890: V1:***\n\nstreams:\n xiaomi1: xiaomi://1234567890:cn@192.168.1.123?did=9876543210&model=isa.camera.hlc7\n```\n\n## Configuration\n\nYou can change camera's quality: `subtype=hd/sd/auto`\n\n```yaml\nstreams:\n xiaomi1: xiaomi://***&subtype=sd\n```\n\nYou can use second channel for Dual cameras: `channel=1`\n\n```yaml\nstreams:\n xiaomi1: xiaomi://***&channel=1\n```\n", _t = "# Yandex\n\nSource for receiving stream from new [Yandex IP camera](https://alice.yandex.ru/smart-home/security/ipcamera).\n\n## Get Yandex token\n\n1. Install HomeAssistant integration [YandexStation](https://github.com/AlexxIT/YandexStation).\n2. Copy token from HomeAssistant config folder: `/config/.storage/core.config_entries`, key: `\"x_token\"`.\n\n## Get device ID\n\n1. Open this link in any browser: https://iot.quasar.yandex.ru/m/v3/user/devices\n2. Copy ID of your camera, key: `\"id\"`.\n\n## Config examples\n\n```yaml\nstreams:\n yandex_stream: yandex:?x_token=XXXX&device_id=XXXX\n yandex_snapshot: yandex:?x_token=XXXX&device_id=XXXX&snapshot\n yandex_snapshot_custom_size: yandex:?x_token=XXXX&device_id=XXXX&snapshot=h=540\n```\n\n_Source: [Go2Rtc Yandex](https://github.com/AlexxIT/go2rtc/tree/master/internal/yandex)_\n", vt = [
38
+ render: Ve
39
+ }), Ue = "#### Source: Bubble\n\nOther names: [ESeeCloud](http://www.eseecloud.com/), [dvr163](http://help.dvr163.com/).\n\n- you can skip `username`, `password`, `port`, `ch` and `stream` if they are default\n- setup separate streams for different channels and streams\n\n```yaml\nstreams:\n camera1: bubble://username:password@192.168.1.123:34567/bubble/live?ch=0&stream=0\n```\n\n_Source: [Go2Rtc Bubble](https://github.com/seydx/go2rtc#source-bubble)_\n", We = "#### Source: CUI\n\nThis source can be used to stream dynamically generated, go2rtc compatible, URLs. The source is just a placeholder for a `https://` URL.\n\n```yaml\nstreams:\n camera1: cui://192.168.1.123:34567/some-identifier-if-you-want\n```\n\nThe URL will be changed to `https://192.168.1.123:34567/some-identifier-if-you-want` and the response must be like this:\n\n```json\n{\n {\n \"streamUrl\": \"rtsp://192.168.1.1:554/stream\",\n }\n}\n```\n\nGo2rtc will then use the `streamUrl` to stream the video. The `streamUrl` can be any URL that is compatible with go2rtc. The response must be a valid JSON object with the `streamUrl` key.\n", Ge = "#### Source: Doorbird\n\n[Doorbird](https://www.doorbird.com/) proprietary camera protocol with **two way audio** support.\n\n```yaml\nstreams:\n video-audio:\n - rtsp://user:pass@123.123.123.123:554/mpeg/media.amp\n - doorbird://user:pass@123.123.123.123?media=audio\n two-way:\n - rtsp://user:pass@123.123.123.123:554/mpeg/media.amp\n - doorbird://user:pass@123.123.123.123?media=audio\n - doorbird://user:pass@123.123.123.123\n mjpeg-video:\n - doorbird://user:pass@123.123.123.123?media=video\n```\n\n_Source: [Go2Rtc Tuya](https://github.com/seydx/go2rtc#source-doorbird)_\n", Ke = "#### Source: DVRIP\n\nOther names: DVR-IP, NetSurveillance, Sofia protocol (NETsurveillance ActiveX plugin XMeye SDK).\n\n- you can skip `username`, `password`, `port`, `channel` and `subtype` if they are default\n- setup separate streams for different channels\n- use `subtype=0` for Main stream, and `subtype=1` for Extra1 stream\n- only the TCP protocol is supported\n\n```yaml\nstreams:\n only_stream: dvrip://username:password@192.168.1.123:34567?channel=0&subtype=0\n only_tts: dvrip://username:password@192.168.1.123:34567?backchannel=1\n two_way_audio:\n - dvrip://username:password@192.168.1.123:34567?channel=0&subtype=0\n - dvrip://username:password@192.168.1.123:34567?backchannel=1\n```\n\n_Source: [Go2Rtc DVRIP](https://github.com/seydx/go2rtc#source-dvrip)_\n", qe = "#### Source: Echo\n\nSome sources may have a dynamic link. And you will need to get it using a bash or python script. Your script should echo a link to the source. RTSP, FFmpeg or any of the [supported sources](https://github.com/seydx/go2rtc#module-streams).\n\n**Docker** and **Hass Add-on** users has preinstalled `python3`, `curl`, `jq`.\nCheck examples in [wiki](https://github.com/seydx/go2rtc/wiki/Source-Echo-examples).\n\n```yaml\nstreams:\n apple_hls: echo:python3 hls.py https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\n```\n\n_Source: [Go2Rtc Echo](https://github.com/seydx/go2rtc#source-echo)_\n", Je = "#### Source: Exec\n\nExec source can run any external application and expect data from it. Two transports are supported - **pipe** and **RTSP**.\n\nIf you want to use **RTSP** transport - the command must contain the `{output}` argument in any place. On launch, it will be replaced by the local address of the RTSP server.\n\n**pipe** reads data from app stdout in different formats: **MJPEG**, **H.264/H.265 bitstream**, **MPEG-TS**. Also pipe can write data to app stdin in two formats: **PCMA** and **PCM/48000**.\n\nThe source can be used with:\n\n- [FFmpeg](https://ffmpeg.org/) - go2rtc ffmpeg source just a shortcut to exec source\n- [FFplay](https://ffmpeg.org/ffplay.html) - play audio on your server\n- [GStreamer](https://gstreamer.freedesktop.org/)\n- [Raspberry Pi Cameras](https://www.raspberrypi.com/documentation/computers/camera_software.html)\n- any your own software\n\n```yaml\nstreams:\n stream: exec:ffmpeg -re -i /media/BigBuckBunny.mp4 -c copy -rtsp_transport tcp -f rtsp {output}\n picam_h264: exec:libcamera-vid -t 0 --inline -o -\n picam_mjpeg: exec:libcamera-vid -t 0 --codec mjpeg -o -\n pi5cam_h264: exec:libcamera-vid -t 0 --libav-format h264 -o -\n canon: exec:gphoto2 --capture-movie --stdout#killsignal=2#killtimeout=5\n play_pcma: exec:ffplay -fflags nobuffer -f alaw -ar 8000 -i -#backchannel=1\n play_pcm48k: exec:ffplay -fflags nobuffer -f s16be -ar 48000 -i -#backchannel=1\n```\n\n_Source: [Go2Rtc Exec](https://github.com/seydx/go2rtc#source-exec)_\n", Ye = "#### Source: Expr\n\n[Expr](https://github.com/antonmedv/expr) - expression language and expression evaluation for Go.\n\n- [language definition](https://expr.medv.io/docs/Language-Definition) - takes best from JS, Python, Jinja2 syntax\n- your expression should return a link of any supported source\n- expression supports multiple operation, but:\n - all operations must be separated by a semicolon\n - all operations, except the last one, must declare a new variable (`let s = \"abc\";`)\n - the last operation should return a string\n- go2rtc supports additional functions:\n - `fetch` - JS-like HTTP requests\n - `match` - JS-like RegExp queries\n\n## Examples\n\n**Two way audio for Dahua VTO**\n\n```yaml\nstreams:\n dahua_vto: |\n expr: let host = \"admin:password@192.168.1.123\";\n fetch(\"http://\"+host+\"/cgi-bin/configManager.cgi?action=setConfig&Encode[0].MainFormat[0].Audio.Compression=G.711A&Encode[0].MainFormat[0].Audio.Frequency=8000\").ok\n ? \"rtsp://\"+host+\"/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif\" : \"\"\n```\n\n**dom.ru**\n\nYou can get credentials via:\n\n- https://github.com/alexmorbo/domru (file `/share/domru/accounts`)\n- https://github.com/ad/domru\n\n```yaml\nstreams:\n dom_ru: |\n expr: let camera = \"99999999\"; let token = \"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"; let operator = 99;\n fetch(\"https://myhome.novotelecom.ru/rest/v1/forpost/cameras/\"+camera+\"/video\", {\n headers: {Authorization: \"Bearer \"+token, Operator: operator}\n }).json().data.URL\n```\n\n**Parse HLS files from Apple**\n\nSame example in two languages - python and expr.\n\n```yaml\nstreams:\n example_python: |\n echo:python -c 'from urllib.request import urlopen; import re\n\n # url1 = \"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/bipbop_16x9_variant.m3u8\"\n html1 = urlopen(\"https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\").read().decode(\"utf-8\")\n url1 = re.search(r\"https.+?m3u8\", html1)[0]\n\n # url2 = \"gear1/prog_index.m3u8\"\n html2 = urlopen(url1).read().decode(\"utf-8\")\n url2 = re.search(r\"^[a-z0-1/_]+\\.m3u8$\", html2, flags=re.MULTILINE)[0]\n\n # url3 = \"https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/gear1/prog_index.m3u8\"\n url3 = url1[:url1.rindex(\"/\")+1] + url2\n\n print(\"ffmpeg:\" + url3 + \"#video=copy\")'\n\n example_expr: |\n expr:\n\n let html1 = fetch(\"https://developer.apple.com/streaming/examples/basic-stream-osx-ios5.html\").text;\n let url1 = match(html1, \"https.+?m3u8\")[0];\n\n let html2 = fetch(url1).text;\n let url2 = match(html2, \"^[a-z0-1/_]+\\\\.m3u8$\", \"m\")[0];\n\n let url3 = url1[:lastIndexOf(url1, \"/\")+1] + url2;\n\n \"ffmpeg:\" + url3 + \"#video=copy\"\n```\n\n## Comparsion\n\n| expr | python | js |\n| ---------------------------- | -------------------------- | ------------------------------ |\n| let x = 1; | x = 1 | let x = 1 |\n| {a: 1, b: 2} | {\"a\": 1, \"b\": 2} | {a: 1, b: 2} |\n| let r = fetch(url, {method}) | r = request(method, url) | r = await fetch(url, {method}) |\n| r.ok | r.ok | r.ok |\n| r.status | r.status_code | r.status |\n| r.text | r.text | await r.text() |\n| r.json() | r.json() | await r.json() |\n| r.headers | r.headers | r.headers |\n| let m = match(text, \"abc\") | m = re.search(\"abc\", text) | let m = text.match(/abc/) |\n\n_Source: [Go2Rtc Expr](https://github.com/seydx/go2rtc#source-expr)_\n", Xe = "#### Source: FFmpeg\n\nYou can get any stream or file or device via FFmpeg and push it to go2rtc. The app will automatically start FFmpeg with the proper arguments when someone starts watching the stream.\n\n- FFmpeg preistalled for **Docker** and **Hass Add-on** users\n- **Hass Add-on** users can target files from [/media](https://www.home-assistant.io/more-info/local-media/setup-media/) folder\n\nFormat: `ffmpeg:{input}#{param1}#{param2}#{param3}`. Examples:\n\n```yaml\nstreams:\n # [FILE] all tracks will be copied without transcoding codecs\n file1: ffmpeg:/media/BigBuckBunny.mp4\n\n # [FILE] video will be transcoded to H264, audio will be skipped\n file2: ffmpeg:/media/BigBuckBunny.mp4#video=h264\n\n # [FILE] video will be copied, audio will be transcoded to pcmu\n file3: ffmpeg:/media/BigBuckBunny.mp4#video=copy#audio=pcmu\n\n # [HLS] video will be copied, audio will be skipped\n hls: ffmpeg:https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_16x9/gear5/prog_index.m3u8#video=copy\n\n # [MJPEG] video will be transcoded to H264\n mjpeg: ffmpeg:http://185.97.122.128/cgi-bin/faststream.jpg#video=h264\n\n # [RTSP] video with rotation, should be transcoded, so select H264\n rotate: ffmpeg:rtsp://rtsp:12345678@192.168.1.123/av_stream/ch0#video=h264#rotate=90\n```\n\nAll trascoding formats has [built-in templates](https://github.com/seydx/go2rtc/blob/master/internal/ffmpeg/ffmpeg.go): `h264`, `h265`, `opus`, `pcmu`, `pcmu/16000`, `pcmu/48000`, `pcma`, `pcma/16000`, `pcma/48000`, `aac`, `aac/16000`.\n\nBut you can override them via YAML config. You can also add your own formats to config and use them with source params.\n\n```yaml\nffmpeg:\n bin: ffmpeg # path to ffmpeg binary\n h264: '-codec:v libx264 -g:v 30 -preset:v superfast -tune:v zerolatency -profile:v main -level:v 4.1'\n mycodec: '-any args that supported by ffmpeg...'\n myinput: '-fflags nobuffer -flags low_delay -timeout 5000000 -i {input}'\n myraw: '-ss 00:00:20'\n```\n\n- You can use go2rtc stream name as ffmpeg input (ex. `ffmpeg:camera1#video=h264`)\n- You can use `video` and `audio` params multiple times (ex. `#video=copy#audio=copy#audio=pcmu`)\n- You can use `rotate` param with `90`, `180`, `270` or `-90` values, important with transcoding (ex. `#video=h264#rotate=90`)\n- You can use `width` and/or `height` params, important with transcoding (ex. `#video=h264#width=1280`)\n- You can use `drawtext` to add a timestamp (ex. `drawtext=x=2:y=2:fontsize=12:fontcolor=white:box=1:boxcolor=black`)\n - This will greatly increase the CPU of the server, even with hardware acceleration\n- You can use `raw` param for any additional FFmpeg arguments (ex. `#raw=-vf transpose=1`)\n- You can use `input` param to override default input template (ex. `#input=rtsp/udp` will change RTSP transport from TCP to UDP+TCP)\n - You can use raw input value (ex. `#input=-timeout 5000000 -i {input}`)\n - You can add your own input templates\n\nRead more about [hardware acceleration](https://github.com/seydx/go2rtc/wiki/Hardware-acceleration).\n\n**PS.** It is recommended to check the available hardware in the WebUI add page.\n\n<hr>\n\n#### Source: FFmpeg Device\n\nYou can get video from any USB-camera or Webcam as RTSP or WebRTC stream. This is part of FFmpeg integration.\n\n- check available devices in Web interface\n- `video_size` and `framerate` must be supported by your camera!\n- for Linux supported only video for now\n- for macOS you can stream Facetime camera or whole Desktop!\n- for macOS important to set right framerate\n\nFormat: `ffmpeg:device?{input-params}#{param1}#{param2}#{param3}`\n\n```yaml\nstreams:\n linux_usbcam: ffmpeg:device?video=0&video_size=1280x720#video=h264\n windows_webcam: ffmpeg:device?video=0#video=h264\n macos_facetime: ffmpeg:device?video=0&audio=1&video_size=1280x720&framerate=30#video=h264#audio=pcma\n```\n\n**PS.** It is recommended to check the available devices in the WebUI add page.\n\n_Source: [Go2Rtc FFmpeg](https://github.com/seydx/go2rtc#source-ffmpeg) & [Go2Rtc FFmpeg Device](https://github.com/seydx/go2rtc#source-ffmpeg-device)_\n", Ze = "#### Source: GoPro\n\nSupported models: HERO9, HERO10, HERO11, HERO12. \nSupported OS: Linux, Mac, Windows, [HassOS](https://www.home-assistant.io/installation/)\n\nThe other camera models have different APIs. I will try to add them in the next versions.\n\n## Config\n\n- USB-connected cameras create a new network interface in the system\n- Linux users do not need to install anything\n- Windows users should install the [network driver](https://community.gopro.com/s/article/GoPro-Webcam)\n- if the camera is detected but the stream does not start - you need to disable firewall\n\n1. Discover camera address: WebUI > Add > GoPro\n2. Add camera to config\n\n```yaml\nstreams:\n hero12: gopro://172.20.100.51\n```\n\n## Useful links\n\n- https://gopro.github.io/OpenGoPro/\n\n_Source: [Go2Rtc Hass](https://github.com/seydx/go2rtc#source-hass)_\n", Qe = "#### Source: Hass\n\nSupport import camera links from [Home Assistant](https://www.home-assistant.io/) config files:\n\n- [Generic Camera](https://www.home-assistant.io/integrations/generic/), setup via GUI\n- [HomeKit Camera](https://www.home-assistant.io/integrations/homekit_controller/)\n- [ONVIF](https://www.home-assistant.io/integrations/onvif/)\n- [Roborock](https://github.com/humbertogontijo/homeassistant-roborock) vacuums with camera\n\n```yaml\nhass:\n config: '/config' # skip this setting if you Hass Add-on user\n\nstreams:\n generic_camera: hass:Camera1 # Settings > Integrations > Integration Name\n aqara_g3: hass:Camera-Hub-G3-AB12\n```\n\n**WebRTC Cameras**\n\nAny cameras in WebRTC format are supported. But at the moment Home Assistant only supports some [Nest](https://www.home-assistant.io/integrations/nest/) cameras in this fomat.\n\nThe Nest API only allows you to get a link to a stream for 5 minutes. So every 5 minutes the stream will be reconnected.\n\n```yaml\nstreams:\n # link to Home Assistant Supervised\n hass-webrtc1: hass://supervisor?entity_id=camera.nest_doorbell\n # link to external Hass with Long-Lived Access Tokens\n hass-webrtc2: hass://192.168.1.123:8123?entity_id=camera.nest_doorbell&token=eyXYZ...\n```\n\n_Source: [Go2Rtc Hass](https://github.com/seydx/go2rtc#source-hass)_\n", $e = "#### Source: HomeKit\n\n**Important:**\n\n- You can use HomeKit Cameras **without Apple devices** (iPhone, iPad, etc.), it's just a yet another protocol\n- HomeKit device can be paired with only one ecosystem. So, if you have paired it to an iPhone (Apple Home) - you can't pair it with Home Assistant or go2rtc. Or if you have paired it to go2rtc - you can't pair it with iPhone\n- HomeKit device should be in same network with working [mDNS](https://en.wikipedia.org/wiki/Multicast_DNS) between device and go2rtc\n\ngo2rtc support import paired HomeKit devices from [Home Assistant](#source-hass). So you can use HomeKit camera with Hass and go2rtc simultaneously. If you using Hass, I recommend pairing devices with it, it will give you more options.\n\nYou can pair device with go2rtc on the HomeKit page. If you can't see your devices - reload the page. Also try reboot your HomeKit device (power off). If you still can't see it - you have a problems with mDNS.\n\nIf you see a device but it does not have a pair button - it is paired to some ecosystem (Apple Home, Home Assistant etc). You need to delete device from that ecosystem, and it will be available for pairing. If you cannot unpair device, you will have to reset it.\n\n**Important:**\n\n- HomeKit audio uses very non-standard **AAC-ELD** codec with very non-standard params and specification violation\n- Audio can't be played in `VLC` and probably any other player\n- Audio should be transcoded for using with MSE, WebRTC, etc.\n\nRecommended settings for using HomeKit Camera with WebRTC, MSE, MP4, RTSP:\n\n```\nstreams:\n aqara_g3:\n - hass:Camera-Hub-G3-AB12\n - ffmpeg:aqara_g3#audio=aac#audio=opus\n```\n\nRTSP link with \"normal\" audio for any player: `rtsp://192.168.1.123:8554/aqara_g3?video&audio=aac`\n\n**This source is in active development!** Tested only with [Aqara Camera Hub G3](https://www.aqara.com/eu/product/camera-hub-g3) (both EU and CN versions).\n\n_Source: [Go2Rtc HomeKit](https://github.com/seydx/go2rtc#source-homekit)_\n", et = "#### Source: HTTP\n\nSupport Content-Type:\n\n- **HTTP-FLV** (`video/x-flv`) - same as RTMP, but over HTTP\n- **HTTP-JPEG** (`image/jpeg`) - camera snapshot link, can be converted by go2rtc to MJPEG stream\n- **HTTP-MJPEG** (`multipart/x`) - simple MJPEG stream over HTTP\n- **MPEG-TS** (`video/mpeg`) - legacy [streaming format](https://en.wikipedia.org/wiki/MPEG_transport_stream)\n\nSource also support HTTP and TCP streams with autodetection for different formats: **MJPEG**, **H.264/H.265 bitstream**, **MPEG-TS**.\n\n```yaml\nstreams:\n # [HTTP-FLV] stream in video/x-flv format\n http_flv: http://192.168.1.123:20880/api/camera/stream/780900131155/657617\n\n # [JPEG] snapshots from Dahua camera, will be converted to MJPEG stream\n dahua_snap: http://admin:password@192.168.1.123/cgi-bin/snapshot.cgi?channel=1\n\n # [MJPEG] stream will be proxied without modification\n http_mjpeg: https://mjpeg.sanford.io/count.mjpeg\n\n # [MJPEG or H.264/H.265 bitstream or MPEG-TS]\n tcp_magic: tcp://192.168.1.123:12345\n\n # Add custom header\n custom_header: 'https://mjpeg.sanford.io/count.mjpeg#header=Authorization: Bearer XXX'\n```\n\n**PS.** Dahua camera has bug: if you select MJPEG codec for RTSP second stream - snapshot won't work.\n\n_Source: [Go2Rtc Http](https://github.com/seydx/go2rtc#source-http)_\n", tt = "#### Source: ISAPI\n\nThis source type support only backchannel audio for Hikvision ISAPI protocol. So it should be used as second source in addition to the RTSP protocol.\n\n```yaml\nstreams:\n hikvision1:\n - rtsp://admin:password@192.168.1.123:554/Streaming/Channels/101\n - isapi://admin:password@192.168.1.123:80/\n```\n\n_Source: [Go2Rtc Isapi](https://github.com/seydx/go2rtc#source-isapi)_\n", nt = "#### Source: Ivideon\n\nSupport public cameras from service [Ivideon](https://tv.ivideon.com/).\n\n```yaml\nstreams:\n quailcam: ivideon:100-tu5dkUPct39cTp9oNEN2B6/0\n```\n\n_Source: [Go2Rtc Ivideon](https://github.com/seydx/go2rtc#source-ivideon)_\n", rt = "#### Source: Kasa\n\n[TP-Link Kasa](https://www.kasasmart.com/) non-standard protocol [more info](https://medium.com/@hu3vjeen/reverse-engineering-tp-link-kc100-bac4641bf1cd).\n\n- `username` - urlsafe email, `alex@gmail.com` -> `alex%40gmail.com`\n- `password` - base64password, `secret1` -> `c2VjcmV0MQ==`\n\n```yaml\nstreams:\n kc401: kasa://username:password@192.168.1.123:19443/https/stream/mixed\n```\n\nTested: KD110, KC200, KC401, KC420WS, EC71.\n\n_Source: [Go2Rtc Kasa](https://github.com/seydx/go2rtc#source-kasa)_\n", it = "#### Source: Nest\n\nCurrently only WebRTC cameras are supported.\n\nFor simplicity, it is recommended to connect the Nest/WebRTC camera to the [Home Assistant](#source-hass). But if you can somehow get the below parameters - Nest/WebRTC source will work without Hass.\n\n```yaml\nstreams:\n nest-doorbell: nest:?client_id=***&client_secret=***&refresh_token=***&project_id=***&device_id=***\n```\n\n_Source: [Go2Rtc Nest](https://github.com/seydx/go2rtc#source-nest)_\n", at = "#### Source: ONVIF\n\nThe source is not very useful if you already know RTSP and snapshot links for your camera. But it can be useful if you don't.\n\n**WebUI > Add** webpage support ONVIF autodiscovery. Your server must be on the same subnet as the camera. If you use docker, you must use \"network host\".\n\n```yaml\nstreams:\n dahua1: onvif://admin:password@192.168.1.123\n reolink1: onvif://admin:password@192.168.1.123:8000\n tapo1: onvif://admin:password@192.168.1.123:2020\n```\n\n_Source: [Go2Rtc Onvif](https://github.com/seydx/go2rtc#source-onvif)_\n", ot = "#### Source: Ring\n\nThis source type support Ring cameras with [two way audio](#two-way-audio) support. If you have a `refresh_token` and `device_id` - you can use it in `go2rtc.yaml` config file. Otherwise, you can use the go2rtc interface and add your ring account (WebUI > Add > Ring). Once added, it will list all your Ring cameras.\n\n```yaml\nstreams:\n ring: ring:?device_id=XXX&refresh_token=XXX\n ring_snapshot: ring:?device_id=XXX&refresh_token=XXX&snapshot\n```\n\n_Source: [Go2Rtc Ring](https://github.com/seydx/go2rtc#source-ring)_\n", st = "#### Source: Roborock\n\nThis source type support Roborock vacuums with cameras. Known working models:\n\n- Roborock S6 MaxV - only video (the vacuum has no microphone)\n- Roborock S7 MaxV - video and two way audio\n- Roborock Qrevo MaxV - video and two way audio\n\nSource support load Roborock credentials from Home Assistant [custom integration](https://github.com/humbertogontijo/homeassistant-roborock) or the [core integration](https://www.home-assistant.io/integrations/roborock). Otherwise, you need to log in to your Roborock account (MiHome account is not supported). Go to: go2rtc WebUI > Add webpage. Copy `roborock://...` source for your vacuum and paste it to `go2rtc.yaml` config.\n\nIf you have graphic pin for your vacuum - add it as numeric pin (lines: 123, 456, 789) to the end of the roborock-link.\n\n_Source: [Go2Rtc Roborock](https://github.com/seydx/go2rtc#source-roborock)_\n", ct = "#### Source: RTMP\n\nYou can get stream from RTMP server, for example [Nginx with nginx-rtmp-module](https://github.com/arut/nginx-rtmp-module).\n\n```yaml\nstreams:\n rtmp_stream: rtmp://192.168.1.123/live/camera1\n```\n\n_Source: [Go2Rtc RTMP](https://github.com/seydx/go2rtc#source-rtmp)_\n", lt = "#### Source: RTSP\n\n```yaml\nstreams:\n sonoff_camera: rtsp://rtsp:12345678@192.168.1.123/av_stream/ch0\n dahua_camera:\n - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=0&unicast=true&proto=Onvif\n - rtsp://admin:password@192.168.1.123/cam/realmonitor?channel=1&subtype=1\n amcrest_doorbell:\n - rtsp://username:password@192.168.1.123:554/cam/realmonitor?channel=1&subtype=0#backchannel=0\n unifi_camera: rtspx://192.168.1.123:7441/fD6ouM72bWoFijxK\n glichy_camera: ffmpeg:rtsp://username:password@192.168.1.123/live/ch00_1\n```\n\n**Recommendations**\n\n- **Amcrest Doorbell** users may want to disable two way audio, because with an active stream you won't have a call button working. You need to add `#backchannel=0` to the end of your RTSP link in YAML config file\n- **Dahua Doorbell** users may want to change backchannel [audio codec](https://github.com/AlexxIT/go2rtc/issues/52)\n- **Reolink** users may want NOT to use RTSP protocol at all, some camera models have a very awful unusable stream implementation\n- **Ubiquiti UniFi** users may want to disable HTTPS verification. Use `rtspx://` prefix instead of `rtsps://`. And don't use `?enableSrtp` [suffix](https://github.com/AlexxIT/go2rtc/issues/81)\n- **TP-Link Tapo** users may skip login and password, because go2rtc support login [without them](https://drmnsamoliu.github.io/video.html)\n- If your camera has two RTSP links - you can add both of them as sources. This is useful when streams has different codecs, as example AAC audio with main stream and PCMU/PCMA audio with second stream\n- If the stream from your camera is glitchy, try using [ffmpeg source](#source-ffmpeg). It will not add CPU load if you won't use transcoding\n- If the stream from your camera is very glitchy, try to use transcoding with [ffmpeg source](#source-ffmpeg)\n\n**Other options**\n\nFormat: `rtsp...#{param1}#{param2}#{param3}`\n\n- Ignore audio - `#media=video` or ignore video - `#media=audio`\n- Ignore two way audio API `#backchannel=0` - important for some glitchy cameras\n- Use WebSocket transport `#transport=ws...`\n\n**RTSP over WebSocket**\n\n```yaml\nstreams:\n # WebSocket with authorization, RTSP - without\n axis-rtsp-ws: rtsp://192.168.1.123:4567/axis-media/media.amp?overview=0&camera=1&resolution=1280x720&videoframeskipmode=empty&Axis-Orig-Sw=true#transport=ws://user:pass@192.168.1.123:4567/rtsp-over-websocket\n # WebSocket without authorization, RTSP - with\n dahua-rtsp-ws: rtsp://user:pass@192.168.1.123/cam/realmonitor?channel=1&subtype=1&proto=Private3#transport=ws://192.168.1.123/rtspoverwebsocket\n```\n\n_Source: [Go2Rtc RTSP](https://github.com/seydx/go2rtc#source-rtsp)_\n", ut = "#### Source: Tapo\n\n[TP-Link Tapo](https://www.tapo.com/) proprietary camera protocol with **two way audio** support.\n\n- stream quality is the same as [RTSP protocol](https://www.tapo.com/en/faq/34/)\n- use the **cloud password**, this is not the RTSP password! you do not need to add a login!\n- you can also use UPPERCASE MD5 hash from your cloud password with `admin` username\n- some new camera firmwares requires SHA256 instead of MD5\n\n```yaml\nstreams:\n # cloud password without username\n camera1: tapo://cloud-password@192.168.1.123\n # admin username and UPPERCASE MD5 cloud-password hash\n camera2: tapo://admin:UPPERCASE-MD5@192.168.1.123\n # admin username and UPPERCASE SHA256 cloud-password hash\n camera3: tapo://admin:UPPERCASE-SHA256@192.168.1.123\n```\n\n```bash\necho -n \"cloud password\" | md5 | awk '{print toupper($0)}'\necho -n \"cloud password\" | shasum -a 256 | awk '{print toupper($0)}'\n```\n\n_Source: [Go2Rtc Tapo](https://github.com/seydx/go2rtc#source-tapo)_\n", dt = "#### Source: Tuya\n\n[Tuya](https://www.tuya.com/) proprietary camera protocol with **two way audio** support. Go2rtc supports `Tuya Smart API` and `Tuya Cloud API`.\n\n**Tuya Smart API (recommended)**:\n\n- Cameras can be discovered through the go2rtc web interface via Tuya Smart account (Add > Tuya > Select region and fill in email and password > Login).\n- **Smart Life accounts are not supported**, you need to create a Tuya Smart account. If the cameras are already added to the Smart Life app, you need to remove them and add them again to the Tuya Smart app.\n\n**Tuya Cloud API**:\n\n- Requires setting up a cloud project in the Tuya Developer Platform.\n- Obtain `device_id`, `client_id`, `client_secret`, and `uid` from [Tuya IoT Platform](https://iot.tuya.com/). [Here's a guide](https://xzetsubou.github.io/hass-localtuya/cloud_api/).\n- Please ensure that you have subscribed to the `IoT Video Live Stream` service (Free Trial) in the Tuya Developer Platform, otherwise the stream will not work (Tuya Developer Platform > Service API > Authorize > IoT Video Live Stream).\n\n**Configuring the stream:**\n\n- Use `resolution` parameter to select the stream (not all cameras support `hd` stream through WebRTC even if the camera has it):\n - `hd` - HD stream (default)\n - `sd` - SD stream\n\n```yaml\nstreams:\n # Tuya Smart API: WebRTC main stream (use Add > Tuya to discover the URL)\n tuya_main:\n - tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX\n\n # Tuya Smart API: WebRTC sub stream (use Add > Tuya to discover the URL)\n tuya_sub:\n - tuya://protect-us.ismartlife.me?device_id=XXX&email=XXX&password=XXX&resolution=sd\n\n # Tuya Cloud API: WebRTC main stream\n tuya_webrtc:\n - tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX\n\n # Tuya Cloud API: WebRTC sub stream\n tuya_webrtc_sd:\n - tuya://openapi.tuyaus.com?device_id=XXX&uid=XXX&client_id=XXX&client_secret=XXX&resolution=sd\n```\n\n_Source: [Go2Rtc Tuya](https://github.com/seydx/go2rtc#source-tuya)_\n", ft = "#### Source: WebRTC\n\nThis source type support four connection formats.\n\n**whep**\n\n[WebRTC/WHEP](https://datatracker.ietf.org/doc/draft-murillo-whep/) - is replaced by [WebRTC/WISH](https://datatracker.ietf.org/doc/charter-ietf-wish/02/) standard for WebRTC video/audio viewers. But it may already be supported in some third-party software. It is supported in go2rtc.\n\n**go2rtc**\n\nThis format is only supported in go2rtc. Unlike WHEP it supports asynchronous WebRTC connection and two way audio.\n\n**openipc**\n\nSupport connection to [OpenIPC](https://openipc.org/) cameras.\n\n**wyze**\n\nSupports connection to [Wyze](https://www.wyze.com/) cameras, using WebRTC protocol. You can use [docker-wyze-bridge](https://github.com/mrlt8/docker-wyze-bridge) project to get connection credentials.\n\n**kinesis**\n\nSupports [Amazon Kinesis Video Streams](https://aws.amazon.com/kinesis/video-streams/), using WebRTC protocol. You need to specify signalling WebSocket URL with all credentials in query params, `client_id` and `ice_servers` list in [JSON format](https://developer.mozilla.org/en-US/docs/Web/API/RTCIceServer).\n\n```yaml\nstreams:\n webrtc-whep: webrtc:http://192.168.1.123:1984/api/webrtc?src=camera1\n webrtc-go2rtc: webrtc:ws://192.168.1.123:1984/api/ws?src=camera1\n webrtc-openipc: webrtc:ws://192.168.1.123/webrtc_ws#format=openipc#ice_servers=[{\"urls\":\"stun:stun.kinesisvideo.eu-north-1.amazonaws.com:443\"}]\n webrtc-wyze: webrtc:http://192.168.1.123:5000/signaling/camera1?kvs#format=wyze\n webrtc-kinesis: webrtc:wss://...amazonaws.com/?...#format=kinesis#client_id=...#ice_servers=[{...},{...}]\n```\n\n**PS.** For `kinesis` sources you can use [echo](#source-echo) to get connection params using `bash`/`python` or any other script language.\n\n_Source: [Go2Rtc WebRTC](https://github.com/seydx/go2rtc#source-webrtc)_\n", pt = "#### Source: WebTorrent\n\nThis source can get a stream from another go2rtc via [WebTorrent](#module-webtorrent) protocol.\n\n```yaml\nstreams:\n webtorrent1: webtorrent:?share=huofssuxaty00izc&pwd=k3l2j9djeg8v8r7e\n```\n\n_Source: [Go2Rtc Webtorrent](https://github.com/seydx/go2rtc#source-webtorrent)_\n", mt = "#### Source: Wyze\n\nThis source allows you to stream from [Wyze](https://wyze.com/) cameras using native P2P protocol without the Wyze app or SDK.\n\n**Important:**\n\n1. **Requires Wyze account**. You need to login once via the WebUI to load your cameras.\n2. **Requires firmware with DTLS**. Only cameras with DTLS-enabled firmware are supported.\n3. Internet access is only needed when loading cameras from your account. After that, all streaming is local P2P.\n4. Connection to the camera is local only (direct P2P to camera IP).\n\n**Features:**\n\n- H.264 and H.265 video codec support\n- AAC, G.711, PCM, and Opus audio codec support\n- Two-way audio (intercom) support\n- Resolution switching (HD/SD)\n\n## Setup\n\n1. Get your API Key from [Wyze Developer Portal](https://support.wyze.com/hc/en-us/articles/16129834216731)\n2. Go to go2rtc WebUI > Add > Wyze\n3. Enter your API ID, API Key, email, and password\n4. Select cameras to add - stream URLs are generated automatically\n\n**Example Config**\n\n```yaml\nwyze:\n user@email.com:\n api_id: 'your-api-id'\n api_key: 'your-api-key'\n password: 'yourpassword' # or MD5 triple-hash with \"md5:\" prefix\n\nstreams:\n wyze_cam: wyze://192.168.1.123?uid=WYZEUID1234567890AB&enr=xxx&mac=AABBCCDDEEFF&model=HL_CAM4&dtls=true\n```\n\n## Stream URL Format\n\nThe stream URL is automatically generated when you add cameras via the WebUI:\n\n```\nwyze://[IP]?uid=[P2P_ID]&enr=[ENR]&mac=[MAC]&model=[MODEL]&subtype=[hd|sd]&dtls=true\n```\n\n| Parameter | Description |\n| --------- | ----------------------------------------------- |\n| `IP` | Camera's local IP address |\n| `uid` | P2P identifier (20 chars) |\n| `enr` | Encryption key for DTLS |\n| `mac` | Device MAC address |\n| `model` | Camera model (e.g., HL_CAM4) |\n| `dtls` | Enable DTLS encryption (default: true) |\n| `subtype` | Camera resolution: `hd` or `sd` (default: `hd`) |\n\n## Configuration\n\n### Resolution\n\nYou can change the camera's resolution using the `subtype` parameter:\n\n```yaml\nstreams:\n wyze_hd: wyze://...&subtype=hd\n wyze_sd: wyze://...&subtype=sd\n```\n\n### Two-Way Audio\n\nTwo-way audio (intercom) is supported automatically. When a consumer sends audio to the stream, it will be transmitted to the camera's speaker.\n", ht = "#### Source: Xiaomi\n\nThis source allows you to view cameras from the [Xiaomi Mi Home](https://home.mi.com/) ecosystem.\n\n**Important:**\n\n1. **Not all cameras are supported**. There are several P2P protocol vendors in the Xiaomi ecosystem.\n Currently, the **CS2** vendor is supported. However, the **TUTK** vendor is not supported.\n2. Each time you connect to the camera, you need internet access to obtain encryption keys.\n3. Connection to the camera is local only.\n\n**Features:**\n\n- Multiple Xiaomi accounts supported\n- Cameras from multiple regions are supported for a single account\n- Two-way audio is supported\n- Cameras with multiple lenses are supported\n\n## Setup\n\n1. Goto go2rtc WebUI > Add > Xiaomi > Login with username and password\n2. Receive verification code by email or phone if required.\n3. Complete the captcha if required.\n4. If everything is OK, your account will be added and you can load cameras from it.\n\n**Example**\n\n```yaml\nxiaomi:\n 1234567890: V1:***\n\nstreams:\n xiaomi1: xiaomi://1234567890:cn@192.168.1.123?did=9876543210&model=isa.camera.hlc7\n```\n\n## Configuration\n\nYou can change camera's quality: `subtype=hd/sd/auto`\n\n```yaml\nstreams:\n xiaomi1: xiaomi://***&subtype=sd\n```\n\nYou can use second channel for Dual cameras: `channel=1`\n\n```yaml\nstreams:\n xiaomi1: xiaomi://***&channel=1\n```\n", gt = "# Yandex\n\nSource for receiving stream from new [Yandex IP camera](https://alice.yandex.ru/smart-home/security/ipcamera).\n\n## Get Yandex token\n\n1. Install HomeAssistant integration [YandexStation](https://github.com/AlexxIT/YandexStation).\n2. Copy token from HomeAssistant config folder: `/config/.storage/core.config_entries`, key: `\"x_token\"`.\n\n## Get device ID\n\n1. Open this link in any browser: https://iot.quasar.yandex.ru/m/v3/user/devices\n2. Copy ID of your camera, key: `\"id\"`.\n\n## Config examples\n\n```yaml\nstreams:\n yandex_stream: yandex:?x_token=XXXX&device_id=XXXX\n yandex_snapshot: yandex:?x_token=XXXX&device_id=XXXX&snapshot\n yandex_snapshot_custom_size: yandex:?x_token=XXXX&device_id=XXXX&snapshot=h=540\n```\n\n_Source: [Go2Rtc Yandex](https://github.com/AlexxIT/go2rtc/tree/master/internal/yandex)_\n", _t = [
40
40
  "nest:",
41
41
  "ring:",
42
42
  "yandex:",
43
43
  "webtorrent:"
44
44
  ];
45
- function Y(e) {
45
+ function vt(e) {
46
46
  let t = e.trim(), n;
47
- for (let e of ge) t.startsWith(e) && (!n || e.length > n.length) && (n = e);
47
+ for (let e of me) t.startsWith(e) && (!n || e.length > n.length) && (n = e);
48
48
  return n;
49
49
  }
50
50
  function yt(e) {
51
51
  let t = e.trim();
52
52
  if (!t) return "";
53
- for (let e of vt) if (t.startsWith(e)) {
53
+ for (let e of _t) if (t.startsWith(e)) {
54
54
  let n = t.slice(e.length);
55
55
  return n && !n.startsWith("?") ? `${e}?${n}` : t;
56
56
  }
@@ -75,35 +75,35 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
75
75
  }
76
76
  },
77
77
  setup(n, { expose: r }) {
78
- let i = new ae(), c = n, d = H(), { t: f } = K(), { mutateAsync: h, isPending: b } = i.previewCameraQuery(), S = /* #__PURE__ */ Object.assign({
79
- "../../markdowns/bubble.md": We,
80
- "../../markdowns/cui.md": Ge,
81
- "../../markdowns/doorbird.md": Ke,
82
- "../../markdowns/dvrip.md": qe,
83
- "../../markdowns/echo.md": Je,
84
- "../../markdowns/exec.md": Ye,
85
- "../../markdowns/expr.md": Xe,
86
- "../../markdowns/ffmpeg.md": Ze,
87
- "../../markdowns/gopro.md": Qe,
88
- "../../markdowns/hass.md": $e,
89
- "../../markdowns/homekit.md": et,
90
- "../../markdowns/http.md": tt,
91
- "../../markdowns/isapi.md": nt,
92
- "../../markdowns/ivideon.md": rt,
93
- "../../markdowns/kasa.md": it,
94
- "../../markdowns/nest.md": at,
95
- "../../markdowns/onvif.md": ot,
96
- "../../markdowns/ring.md": st,
97
- "../../markdowns/roborock.md": ct,
98
- "../../markdowns/rtmp.md": lt,
99
- "../../markdowns/rtsp.md": ut,
100
- "../../markdowns/tapo.md": dt,
101
- "../../markdowns/tuya.md": ft,
102
- "../../markdowns/webrtc.md": pt,
103
- "../../markdowns/webtorrent.md": mt,
104
- "../../markdowns/wyze.md": ht,
105
- "../../markdowns/xiaomi.md": gt,
106
- "../../markdowns/yandex.md": _t
78
+ let i = new z(), c = n, d = G(), { t: f } = J(), { mutateAsync: h, isPending: b } = i.previewCameraQuery(), S = /* #__PURE__ */ Object.assign({
79
+ "../../markdowns/bubble.md": Ue,
80
+ "../../markdowns/cui.md": We,
81
+ "../../markdowns/doorbird.md": Ge,
82
+ "../../markdowns/dvrip.md": Ke,
83
+ "../../markdowns/echo.md": qe,
84
+ "../../markdowns/exec.md": Je,
85
+ "../../markdowns/expr.md": Ye,
86
+ "../../markdowns/ffmpeg.md": Xe,
87
+ "../../markdowns/gopro.md": Ze,
88
+ "../../markdowns/hass.md": Qe,
89
+ "../../markdowns/homekit.md": $e,
90
+ "../../markdowns/http.md": et,
91
+ "../../markdowns/isapi.md": tt,
92
+ "../../markdowns/ivideon.md": nt,
93
+ "../../markdowns/kasa.md": rt,
94
+ "../../markdowns/nest.md": it,
95
+ "../../markdowns/onvif.md": at,
96
+ "../../markdowns/ring.md": ot,
97
+ "../../markdowns/roborock.md": st,
98
+ "../../markdowns/rtmp.md": ct,
99
+ "../../markdowns/rtsp.md": lt,
100
+ "../../markdowns/tapo.md": ut,
101
+ "../../markdowns/tuya.md": dt,
102
+ "../../markdowns/webrtc.md": ft,
103
+ "../../markdowns/webtorrent.md": pt,
104
+ "../../markdowns/wyze.md": mt,
105
+ "../../markdowns/xiaomi.md": ht,
106
+ "../../markdowns/yandex.md": gt
107
107
  }), w = k([
108
108
  "high-resolution",
109
109
  "mid-resolution",
@@ -114,29 +114,29 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
114
114
  return e.urls.some(bt);
115
115
  }
116
116
  function P(e) {
117
- let t = Y(e);
117
+ let t = vt(e);
118
118
  if (!t) return;
119
119
  let n = t.replace(/[:/]+$/, "");
120
120
  return S[`../../markdowns/${n}.md`];
121
121
  }
122
- function te(e) {
122
+ function F(e) {
123
123
  return !!P(e);
124
124
  }
125
- function F(e) {
125
+ function ne(e) {
126
126
  c.sources[e].urls.push("");
127
127
  }
128
- function ne(e, t) {
128
+ function I(e, t) {
129
129
  c.sources[e].urls.splice(t, 1);
130
130
  }
131
- function I(e, t, n) {
131
+ function ie(e, t, n) {
132
132
  c.sources[e].urls[t] = n;
133
133
  }
134
- function z(e, t) {
134
+ function R(e, t) {
135
135
  e.role = t, t === "snapshot" && (e.useForSnapshot = !1, e.hotMode = !1, e.preload = !1);
136
136
  }
137
137
  function B() {
138
138
  c.sources.push({
139
- _id: G(8),
139
+ _id: q(8),
140
140
  name: "",
141
141
  role: null,
142
142
  urls: [""],
@@ -146,10 +146,10 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
146
146
  muted: !1
147
147
  }), O.value = [c.sources.length];
148
148
  }
149
- function V(e) {
149
+ function U(e) {
150
150
  c.sources.splice(e, 1);
151
151
  }
152
- function ie(e) {
152
+ function W(e) {
153
153
  let t = P(e);
154
154
  t && d.openTextDialog({ data: {
155
155
  title: f("components.dialog.title.information"),
@@ -158,7 +158,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
158
158
  markdown: !0
159
159
  } });
160
160
  }
161
- async function U(e) {
161
+ async function ae(e) {
162
162
  let t = yt(e);
163
163
  if (t) try {
164
164
  let e = await h({ cameraData: { url: t } });
@@ -170,13 +170,13 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
170
170
  } catch {}
171
171
  }
172
172
  return r({ newSource: B }), (r, i) => {
173
- let c = Oe, d = Se, f = q, h = Ee, v = J, b = le, S = N, k = Ce, P = ce, B = je, ae = Ue, H = re, oe = we, se = Te, W = De, G = ee;
174
- return o(), x("div", xt, [A(W, {
173
+ let c = De, d = xe, f = be, h = Te, v = Y, b = V, S = te, k = Se, P = N, z = Ae, B = He, oe = re, se = Ce, G = we, K = Ee, q = ee;
174
+ return o(), x("div", xt, [A(K, {
175
175
  value: _(O),
176
176
  "onUpdate:value": i[0] ||= (e) => g(O) ? O.value = e : null,
177
177
  multiple: ""
178
178
  }, {
179
- default: y(() => [(o(!0), x(C, null, a(n.sources, (i, g) => (o(), p(se, {
179
+ default: y(() => [(o(!0), x(C, null, a(n.sources, (i, g) => (o(), p(G, {
180
180
  key: i._id,
181
181
  value: g,
182
182
  class: u({ "border-b-0": g === n.sources.length - 1 })
@@ -196,7 +196,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
196
196
  severity: "danger",
197
197
  class: "cui-icon-md ml-auto mr-2",
198
198
  loading: _(j),
199
- onClick: (e) => V(g)
199
+ onClick: (e) => U(g)
200
200
  }, {
201
201
  icon: y(() => [A(d, {
202
202
  width: "100%",
@@ -205,12 +205,12 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
205
205
  _: 1
206
206
  }, 8, ["loading", "onClick"])) : m("", !0)])]),
207
207
  _: 2
208
- }, 1032, ["class"]), A(oe, { pt: { content: { class: {
208
+ }, 1032, ["class"]), A(se, { pt: { content: { class: {
209
209
  "px-0": !0,
210
210
  "pb-5": g === n.sources.length - 1
211
211
  } } } }, {
212
212
  default: y(() => [T("div", Tt, [
213
- A(_(R), {
213
+ A(_(L), {
214
214
  modelValue: i.name,
215
215
  "onUpdate:modelValue": (e) => i.name = e,
216
216
  modelModifiers: { trim: !0 },
@@ -232,7 +232,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
232
232
  _: 2
233
233
  }, 1024),
234
234
  A(e, { name: "fade" }, {
235
- default: y(() => [A(_(L), {
235
+ default: y(() => [A(_(H), {
236
236
  name: `sources[${g}].name`,
237
237
  class: "cui-input-error"
238
238
  }, null, 8, ["name"])]),
@@ -255,7 +255,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
255
255
  "onUpdate:modelValue",
256
256
  "name"
257
257
  ]),
258
- A(_(R), {
258
+ A(_(L), {
259
259
  "model-value": i.role,
260
260
  name: `sources[${g}].role`,
261
261
  as: "div",
@@ -272,7 +272,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
272
272
  options: _(w).filter((e) => !n.sources.some((t) => t.role === e && t._id !== i._id)),
273
273
  invalid: t.length > 0,
274
274
  loading: _(j),
275
- onValueChange: (e) => z(i, e)
275
+ onValueChange: (e) => R(i, e)
276
276
  }, null, 8, [
277
277
  "model-value",
278
278
  "options",
@@ -283,7 +283,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
283
283
  _: 2
284
284
  }, 1024),
285
285
  A(e, { name: "fade" }, {
286
- default: y(() => [A(_(L), {
286
+ default: y(() => [A(_(H), {
287
287
  name: `sources[${g}].role`,
288
288
  class: "cui-input-error"
289
289
  }, null, 8, ["name"])]),
@@ -303,7 +303,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
303
303
  _: 2
304
304
  }, 1032, ["model-value", "name"]),
305
305
  T("div", Ot, [
306
- i.role !== "snapshot" && n.sources.length > 1 ? (o(), p(_(R), {
306
+ i.role !== "snapshot" && n.sources.length > 1 ? (o(), p(_(L), {
307
307
  key: 0,
308
308
  "model-value": i.useForSnapshot,
309
309
  value: !0,
@@ -328,7 +328,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
328
328
  _: 1
329
329
  }),
330
330
  A(e, { name: "fade" }, {
331
- default: y(() => [A(_(L), {
331
+ default: y(() => [A(_(H), {
332
332
  name: `sources[${g}].useForSnapshot`,
333
333
  class: "cui-input-switch-error"
334
334
  }, null, 8, ["name"])]),
@@ -349,7 +349,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
349
349
  ])])]),
350
350
  _: 2
351
351
  }, 1032, ["model-value", "name"])) : m("", !0),
352
- i.role === "snapshot" ? m("", !0) : (o(), p(_(R), {
352
+ i.role === "snapshot" ? m("", !0) : (o(), p(_(L), {
353
353
  key: 1,
354
354
  "model-value": i.hotMode,
355
355
  value: !0,
@@ -374,7 +374,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
374
374
  _: 1
375
375
  }),
376
376
  A(e, { name: "fade" }, {
377
- default: y(() => [A(_(L), {
377
+ default: y(() => [A(_(H), {
378
378
  name: `sources[${g}].hotMode`,
379
379
  class: "cui-input-switch-error"
380
380
  }, null, 8, ["name"])]),
@@ -393,7 +393,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
393
393
  ])])]),
394
394
  _: 2
395
395
  }, 1032, ["model-value", "name"])),
396
- i.role === "snapshot" ? m("", !0) : (o(), p(_(R), {
396
+ i.role === "snapshot" ? m("", !0) : (o(), p(_(L), {
397
397
  key: 2,
398
398
  "model-value": i.preload,
399
399
  value: !0,
@@ -418,7 +418,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
418
418
  _: 1
419
419
  }),
420
420
  A(e, { name: "fade" }, {
421
- default: y(() => [A(_(L), {
421
+ default: y(() => [A(_(H), {
422
422
  name: `sources[${g}].preload`,
423
423
  class: "cui-input-switch-error"
424
424
  }, null, 8, ["name"])]),
@@ -437,7 +437,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
437
437
  ])])]),
438
438
  _: 2
439
439
  }, 1032, ["model-value", "name"])),
440
- i.role === "snapshot" ? m("", !0) : (o(), p(_(R), {
440
+ i.role === "snapshot" ? m("", !0) : (o(), p(_(L), {
441
441
  key: 3,
442
442
  "model-value": i.muted,
443
443
  value: !0,
@@ -462,7 +462,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
462
462
  _: 1
463
463
  }),
464
464
  A(e, { name: "fade" }, {
465
- default: y(() => [A(_(L), {
465
+ default: y(() => [A(_(H), {
466
466
  name: `sources[${g}].muted`,
467
467
  class: "cui-input-switch-error"
468
468
  }, null, 8, ["name"])]),
@@ -503,7 +503,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
503
503
  type: "text"
504
504
  }, null, 8, ["model-value", "loading"])]),
505
505
  _: 2
506
- }, 1024)])) : (o(), p(_(R), {
506
+ }, 1024)])) : (o(), p(_(L), {
507
507
  key: 1,
508
508
  "model-value": n,
509
509
  name: `sources[${g}].urls[${a}]`,
@@ -518,29 +518,29 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
518
518
  loading: _(j),
519
519
  type: "text",
520
520
  placeholder: Gt,
521
- "onUpdate:modelValue": (e) => I(g, a, e ?? "")
521
+ "onUpdate:modelValue": (e) => ie(g, a, e ?? "")
522
522
  }, null, 8, [
523
523
  "model-value",
524
524
  "invalid",
525
525
  "loading",
526
526
  "onUpdate:modelValue"
527
- ]), A(H, null, {
527
+ ]), A(oe, null, {
528
528
  default: y(() => [
529
529
  E((o(), p(f, {
530
530
  text: "",
531
531
  rounded: "",
532
532
  severity: "secondary",
533
- disabled: _(j) || !te(n),
533
+ disabled: _(j) || !F(n),
534
534
  class: "border-right-color",
535
- onClick: (e) => ie(n)
535
+ onClick: (e) => W(n)
536
536
  }, {
537
- icon: y(() => [A(B, {
537
+ icon: y(() => [A(z, {
538
538
  width: "100%",
539
539
  height: "100%"
540
540
  })]),
541
541
  _: 1
542
542
  }, 8, ["disabled", "onClick"])), [[
543
- G,
543
+ q,
544
544
  { value: r.$t("components.dialog.components.new_camera.protocol_info") },
545
545
  void 0,
546
546
  { top: !0 }
@@ -549,17 +549,17 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
549
549
  text: "",
550
550
  rounded: "",
551
551
  severity: "secondary",
552
- disabled: _(j) || !_(Y)(n),
552
+ disabled: _(j) || !_(vt)(n),
553
553
  class: "border-right-color",
554
- onClick: (e) => U(n)
554
+ onClick: (e) => ae(n)
555
555
  }, {
556
- icon: y(() => [A(ae, {
556
+ icon: y(() => [A(B, {
557
557
  width: "100%",
558
558
  height: "100%"
559
559
  })]),
560
560
  _: 1
561
561
  }, 8, ["disabled", "onClick"])), [[
562
- G,
562
+ q,
563
563
  { value: r.$t("components.dialog.components.new_camera.test_source") },
564
564
  void 0,
565
565
  { top: !0 }
@@ -570,7 +570,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
570
570
  rounded: "",
571
571
  severity: "danger",
572
572
  disabled: _(j),
573
- onClick: t((e) => ne(g, a), ["prevent"])
573
+ onClick: t((e) => I(g, a), ["prevent"])
574
574
  }, {
575
575
  icon: y(() => [A(d, {
576
576
  width: "100%",
@@ -584,7 +584,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
584
584
  _: 2
585
585
  }, 1024),
586
586
  A(e, { name: "fade" }, {
587
- default: y(() => [A(_(L), {
587
+ default: y(() => [A(_(H), {
588
588
  name: `sources[${g}].urls[${a}]`,
589
589
  class: "cui-input-error"
590
590
  }, null, 8, ["name"])]),
@@ -596,7 +596,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
596
596
  size: "small",
597
597
  class: "cui-input-hint"
598
598
  }, {
599
- default: y(() => [D(s(_(Y)(n) ? r.$t("components.form.hint.source_detected_protocol", { protocol: _(Y)(n) }) : r.$t("components.form.hint.source_url")), 1)]),
599
+ default: y(() => [D(s(_(vt)(n) ? r.$t("components.form.hint.source_detected_protocol", { protocol: _(vt)(n) }) : r.$t("components.form.hint.source_url")), 1)]),
600
600
  _: 2
601
601
  }, 1024)
602
602
  ]),
@@ -607,7 +607,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
607
607
  loading: _(j),
608
608
  label: r.$t("components.form.button.add_source"),
609
609
  class: "ml-auto cui-button-medium",
610
- onClick: (e) => F(g)
610
+ onClick: (e) => ne(g)
611
611
  }, null, 8, [
612
612
  "loading",
613
613
  "label",
@@ -631,7 +631,7 @@ var xt = { class: "flex flex-col gap-6" }, St = { class: "flex gap-2 items-cente
631
631
  setup(e, { expose: t }) {
632
632
  let n = k("");
633
633
  return t({ onConfirm: async () => n.value.trim() || null }), (e, t) => {
634
- let r = J;
634
+ let r = Y;
635
635
  return o(), x("div", qt, [T("label", Jt, s(e.$t("components.form.label.name")), 1), A(r, {
636
636
  id: "roomName",
637
637
  modelValue: _(n),
@@ -701,7 +701,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
701
701
  isLoading: { type: Boolean }
702
702
  },
703
703
  setup(t) {
704
- let n = new Be(), r = t, i = H(), { t: a } = K(), { data: u, isBusy: d } = n.getRoomsQuery(), { mutateAsync: f } = n.createRoomMutation(), h = k(["camera", "doorbell"]), g = v(() => (u.value?.levels.length ?? 0) > 0), b = v(() => Xt(u.value, a));
704
+ let n = new ze(), r = t, i = G(), { t: a } = J(), { data: u, isBusy: d } = n.getRoomsQuery(), { mutateAsync: f } = n.createRoomMutation(), h = k(["camera", "doorbell"]), g = v(() => (u.value?.levels.length ?? 0) > 0), b = v(() => Xt(u.value, a));
705
705
  function S(e) {
706
706
  r.form.roomId = e;
707
707
  }
@@ -724,9 +724,9 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
724
724
  });
725
725
  }
726
726
  return (n, r) => {
727
- let i = J, a = le, u = N, f = Ce, v = Fe, w = q, O = Ee, k = we, j = Te, M = De, P = ee;
727
+ let i = Y, a = V, u = te, f = Se, v = Pe, w = be, O = Te, k = Ce, j = we, M = Ee, N = ee;
728
728
  return o(), x("div", Zt, [
729
- A(_(R), {
729
+ A(_(L), {
730
730
  modelValue: t.form.name,
731
731
  "onUpdate:modelValue": r[0] ||= (e) => t.form.name = e,
732
732
  modelModifiers: { trim: !0 },
@@ -745,7 +745,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
745
745
  _: 2
746
746
  }, 1024),
747
747
  A(e, { name: "fade" }, {
748
- default: y(() => [A(_(L), {
748
+ default: y(() => [A(_(H), {
749
749
  name: "name",
750
750
  class: "cui-input-error"
751
751
  })]),
@@ -805,7 +805,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
805
805
  icon: y(() => [A(v, { class: "w-4 h-4" })]),
806
806
  _: 1
807
807
  })), [[
808
- P,
808
+ N,
809
809
  n.$t("components.form.button.create_room"),
810
810
  void 0,
811
811
  { top: !0 }
@@ -828,7 +828,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
828
828
  _: 1
829
829
  }), A(k, { pt: { content: { class: "px-0" } } }, {
830
830
  default: y(() => [T("div", on, [
831
- A(_(R), {
831
+ A(_(L), {
832
832
  modelValue: t.form.info.manufacturer,
833
833
  "onUpdate:modelValue": r[3] ||= (e) => t.form.info.manufacturer = e,
834
834
  modelModifiers: { trim: !0 },
@@ -847,7 +847,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
847
847
  _: 2
848
848
  }, 1024),
849
849
  A(e, { name: "fade" }, {
850
- default: y(() => [A(_(L), {
850
+ default: y(() => [A(_(H), {
851
851
  name: "info.manufacturer",
852
852
  class: "cui-input-error"
853
853
  })]),
@@ -856,7 +856,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
856
856
  ]),
857
857
  _: 1
858
858
  }, 8, ["modelValue"]),
859
- A(_(R), {
859
+ A(_(L), {
860
860
  modelValue: t.form.info.model,
861
861
  "onUpdate:modelValue": r[4] ||= (e) => t.form.info.model = e,
862
862
  modelModifiers: { trim: !0 },
@@ -875,7 +875,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
875
875
  _: 2
876
876
  }, 1024),
877
877
  A(e, { name: "fade" }, {
878
- default: y(() => [A(_(L), {
878
+ default: y(() => [A(_(H), {
879
879
  name: "info.model",
880
880
  class: "cui-input-error"
881
881
  })]),
@@ -884,7 +884,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
884
884
  ]),
885
885
  _: 1
886
886
  }, 8, ["modelValue"]),
887
- A(_(R), {
887
+ A(_(L), {
888
888
  modelValue: t.form.info.hardware,
889
889
  "onUpdate:modelValue": r[5] ||= (e) => t.form.info.hardware = e,
890
890
  modelModifiers: { trim: !0 },
@@ -903,7 +903,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
903
903
  _: 2
904
904
  }, 1024),
905
905
  A(e, { name: "fade" }, {
906
- default: y(() => [A(_(L), {
906
+ default: y(() => [A(_(H), {
907
907
  name: "info.hardware",
908
908
  class: "cui-input-error"
909
909
  })]),
@@ -912,7 +912,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
912
912
  ]),
913
913
  _: 1
914
914
  }, 8, ["modelValue"]),
915
- A(_(R), {
915
+ A(_(L), {
916
916
  modelValue: t.form.info.serialNumber,
917
917
  "onUpdate:modelValue": r[6] ||= (e) => t.form.info.serialNumber = e,
918
918
  modelModifiers: { trim: !0 },
@@ -931,7 +931,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
931
931
  _: 2
932
932
  }, 1024),
933
933
  A(e, { name: "fade" }, {
934
- default: y(() => [A(_(L), {
934
+ default: y(() => [A(_(H), {
935
935
  name: "info.serialNumber",
936
936
  class: "cui-input-error"
937
937
  })]),
@@ -940,7 +940,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
940
940
  ]),
941
941
  _: 1
942
942
  }, 8, ["modelValue"]),
943
- A(_(R), {
943
+ A(_(L), {
944
944
  modelValue: t.form.info.firmwareVersion,
945
945
  "onUpdate:modelValue": r[7] ||= (e) => t.form.info.firmwareVersion = e,
946
946
  modelModifiers: { trim: !0 },
@@ -959,7 +959,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
959
959
  _: 2
960
960
  }, 1024),
961
961
  A(e, { name: "fade" }, {
962
- default: y(() => [A(_(L), {
962
+ default: y(() => [A(_(H), {
963
963
  name: "info.firmwareVersion",
964
964
  class: "cui-input-error"
965
965
  })]),
@@ -968,7 +968,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
968
968
  ]),
969
969
  _: 1
970
970
  }, 8, ["modelValue"]),
971
- A(_(R), {
971
+ A(_(L), {
972
972
  modelValue: t.form.info.supportUrl,
973
973
  "onUpdate:modelValue": r[8] ||= (e) => t.form.info.supportUrl = e,
974
974
  modelModifiers: { trim: !0 },
@@ -987,7 +987,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
987
987
  _: 2
988
988
  }, 1024),
989
989
  A(e, { name: "fade" }, {
990
- default: y(() => [A(_(L), {
990
+ default: y(() => [A(_(H), {
991
991
  name: "info.supportUrl",
992
992
  class: "cui-input-error"
993
993
  })]),
@@ -1006,25 +1006,25 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1006
1006
  ]);
1007
1007
  };
1008
1008
  }
1009
- }), mn = RegExp(`^(${ge.join("|")})`), hn = P().trim().min(1, "Camera Source is required").regex(mn, "Unsupported protocol — start the URL with a supported one (e.g. rtsp://)"), gn = W({
1010
- name: P().trim().min(1, "Camera Source Name is required"),
1009
+ }), mn = RegExp(`^(${me.join("|")})`), hn = K().trim().min(1, "Camera Source is required").regex(mn, "Unsupported protocol — start the URL with a supported one (e.g. rtsp://)"), gn = B({
1010
+ name: K().trim().min(1, "Camera Source Name is required"),
1011
1011
  urls: hn.array(),
1012
- role: ve,
1013
- useForSnapshot: F().default(!1),
1014
- hotMode: F().default(!0),
1015
- preload: F().default(!0),
1016
- muted: F().default(!1),
1017
- backchannelDisabled: F().default(!1),
1018
- timeout: B().int().min(5).max(120).nullish(),
1019
- handshakeTimeout: B().int().min(1).max(60).nullish(),
1020
- childSourceId: P().trim().nullish()
1012
+ role: ge,
1013
+ useForSnapshot: I().default(!1),
1014
+ hotMode: I().default(!0),
1015
+ preload: I().default(!0),
1016
+ muted: I().default(!1),
1017
+ backchannelDisabled: I().default(!1),
1018
+ timeout: F().int().min(5).max(120).nullish(),
1019
+ handshakeTimeout: F().int().min(1).max(60).nullish(),
1020
+ childSourceId: K().trim().nullish()
1021
1021
  }).strict().transform((e) => e.role === "snapshot" ? {
1022
1022
  ...e,
1023
1023
  useForSnapshot: !1,
1024
1024
  hotMode: !1,
1025
1025
  preload: !1
1026
- } : e), _n = W({
1027
- ..._e.shape,
1026
+ } : e), _n = B({
1027
+ ...he.shape,
1028
1028
  sources: gn.array().refine((e) => e.some((e) => e.role === "high-resolution" || e.role === "mid-resolution" || e.role === "low-resolution"), {
1029
1029
  path: ["sources[].role"],
1030
1030
  message: "One of the roles \"high-resolution\", \"mid-resolution\" or \"low-resolution\" is required"
@@ -1037,7 +1037,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1037
1037
  }, {
1038
1038
  message: "Each source role can be assigned to only one source",
1039
1039
  path: ["sources"]
1040
- }).superRefine(ye)
1040
+ }).superRefine(_e)
1041
1041
  }).strict(), vn = {
1042
1042
  disabled: !1,
1043
1043
  name: "",
@@ -1053,7 +1053,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1053
1053
  supportUrl: ""
1054
1054
  },
1055
1055
  sources: [{
1056
- _id: G(8),
1056
+ _id: q(8),
1057
1057
  name: "",
1058
1058
  role: "high-resolution",
1059
1059
  urls: [""],
@@ -1076,15 +1076,15 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1076
1076
  __name: "AddCamera",
1077
1077
  props: { camera: { default: () => vn } },
1078
1078
  setup(e, { expose: t }) {
1079
- let n = new ae(), r = e, a = V(), { t: c } = K(), { mutateAsync: l, isPending: u } = n.createCameraQuery(), { camera: d } = i(r), f = w("formRef"), p = w("sourcesRef"), m = k(U(d.value)), h = v(() => u.value);
1079
+ let n = new z(), r = e, a = U(), { t: c } = J(), { mutateAsync: l, isPending: u } = n.createCameraQuery(), { camera: d } = i(r), f = w("formRef"), p = w("sourcesRef"), m = k(W(d.value)), h = v(() => u.value);
1080
1080
  async function g() {
1081
1081
  if (!(await f.value?.validate())?.valid) return a.add({
1082
1082
  severity: "error",
1083
1083
  detail: c("components.toast.validation_failed"),
1084
1084
  life: 3e3
1085
1085
  }), null;
1086
- let e = U(m.value), t = {
1087
- ...be(),
1086
+ let e = W(m.value), t = {
1087
+ ...ve(),
1088
1088
  ...e,
1089
1089
  sources: e.sources.map((e) => ({
1090
1090
  ...e,
@@ -1100,8 +1100,8 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1100
1100
  onSave: g,
1101
1101
  onConfirm: g
1102
1102
  }), (e, t) => {
1103
- let n = pn, r = me, i = Kt, a = Me, c = q;
1104
- return o(), x("div", null, [A(_(z), {
1103
+ let n = pn, r = fe, i = Kt, a = je, c = be;
1104
+ return o(), x("div", null, [A(_(R), {
1105
1105
  ref_key: "formRef",
1106
1106
  ref: f,
1107
1107
  class: "flex flex-col w-full gap-6",
@@ -1156,7 +1156,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1156
1156
  onConfirm: { type: Function }
1157
1157
  },
1158
1158
  setup(e, { expose: t }) {
1159
- let n = W({ name: P().trim().min(1) }).passthrough(), r = e, i = V(), { t: c } = K(), l = w("formRef"), u = k(U(r.draft)), d = k({
1159
+ let n = B({ name: K().trim().min(1) }).passthrough(), r = e, i = U(), { t: c } = J(), l = w("formRef"), u = k(W(r.draft)), d = k({
1160
1160
  name: u.value.name,
1161
1161
  type: u.value.type,
1162
1162
  room: u.value.room,
@@ -1212,8 +1212,8 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1212
1212
  isLoading: h,
1213
1213
  onConfirm: g
1214
1214
  }), (e, t) => {
1215
- let r = J, i = le, c = pn, u = me, f = Kt;
1216
- return o(), x("div", null, [A(_(z), {
1215
+ let r = Y, i = V, c = pn, u = fe, f = Kt;
1216
+ return o(), x("div", null, [A(_(R), {
1217
1217
  ref_key: "formRef",
1218
1218
  ref: l,
1219
1219
  class: "flex flex-col w-full gap-6",
@@ -1267,7 +1267,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1267
1267
  onConnect: { type: Function }
1268
1268
  },
1269
1269
  setup(e, { expose: t }) {
1270
- let n = e, a = he(), c = V(), { t: l } = K(), u = r("dialogRefProps"), { schema: d } = i(n), f = w("schemaFormRef"), h = k(!1), g = v(() => ({
1270
+ let n = e, a = pe(), c = U(), { t: l } = J(), u = r("dialogRefProps"), { schema: d } = i(n), f = w("schemaFormRef"), h = k(!1), g = v(() => ({
1271
1271
  schema: d.value,
1272
1272
  config: {}
1273
1273
  })), y = v(() => !!(u.loading?.value || h.value));
@@ -1300,7 +1300,7 @@ var Zt = { class: "flex flex-col gap-6" }, Qt = {
1300
1300
  isLoading: y,
1301
1301
  onConfirm: b
1302
1302
  }), (t, n) => {
1303
- let r = J, i = Ne;
1303
+ let r = Y, i = Me;
1304
1304
  return o(), x("div", On, [e.camera.address ? (o(), x("div", kn, [T("label", An, s(t.$t("views.devices.address")), 1), A(r, {
1305
1305
  "model-value": e.camera.address,
1306
1306
  readonly: ""
@@ -1499,7 +1499,7 @@ function Hn() {
1499
1499
  ...i
1500
1500
  ];
1501
1501
  });
1502
- return pe(() => {
1502
+ return de(() => {
1503
1503
  $--, !($ > 0) && ($ = 0, In = setTimeout(() => {
1504
1504
  $ <= 0 && (Vn(), In = null);
1505
1505
  }, Pn));
@@ -1554,15 +1554,15 @@ var Un = { class: "flex flex-col" }, Wn = {
1554
1554
  }, or = { class: "flex items-center justify-center" }, sr = { class: "flex items-center justify-center" }, cr = {
1555
1555
  key: 1,
1556
1556
  class: "flex flex-col items-center justify-center py-6 gap-2"
1557
- }, lr = { class: "text-muted text-sm" }, ur = { class: "flex flex-wrap items-center gap-2 mt-4" }, dr = /*#__PURE__*/ I(/* @__PURE__ */ O({
1557
+ }, lr = { class: "text-muted text-sm" }, ur = { class: "flex flex-wrap items-center gap-2 mt-4" }, dr = /*#__PURE__*/ ie(/* @__PURE__ */ O({
1558
1558
  __name: "Cameras",
1559
1559
  setup(e) {
1560
- let { t } = K(), r = V(), i = H(), a = ie(), { smBreakpoint: c } = te(), l = Hn(), d = {
1560
+ let { t } = J(), r = U(), i = G(), a = ue(), { smBreakpoint: c } = P(), l = Hn(), d = {
1561
1561
  bodyRow: { class: "text-sm text-secondary" },
1562
1562
  column: { columnTitle: { class: "text-sm" } },
1563
1563
  datatable: { class: "z-0" }
1564
1564
  }, f = v(() => se(void 0, "admin")), h = v(() => l.sortedDevices.value), g = v(() => h.value.filter((e) => e.type === "camera")), b = v(() => h.value.filter((e) => e.type === "discovered")), w = v(() => l.isLoading.value), D = v(() => l.isScanning.value), O = v(() => l.hiddenDevices.value), k = v(() => l.showHidden.value), j = v(() => O.value.length);
1565
- function N(e) {
1565
+ function te(e) {
1566
1566
  switch (e) {
1567
1567
  case "added": return "green";
1568
1568
  case "discovered": return "orange";
@@ -1571,7 +1571,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1571
1571
  default: return "gray";
1572
1572
  }
1573
1573
  }
1574
- function P(e) {
1574
+ function N(e) {
1575
1575
  switch (e) {
1576
1576
  case "added": return t("views.devices.status_added");
1577
1577
  case "discovered": return t("views.devices.status_discovered");
@@ -1583,7 +1583,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1583
1583
  function F(e) {
1584
1584
  return l.isHidden(e);
1585
1585
  }
1586
- async function I(e) {
1586
+ async function re(e) {
1587
1587
  if (!F(e)) {
1588
1588
  if (e.type === "camera") {
1589
1589
  a.open({ cameraName: e.name });
@@ -1616,7 +1616,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1616
1616
  },
1617
1617
  schema: n.schema ?? [],
1618
1618
  onConnect: async (t) => {
1619
- L(await l.prepareDevice(e.discoveredId, t), e.discoveredId);
1619
+ I(await l.prepareDevice(e.discoveredId, t), e.discoveredId);
1620
1620
  }
1621
1621
  }
1622
1622
  } });
@@ -1631,7 +1631,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1631
1631
  }
1632
1632
  }
1633
1633
  }
1634
- function L(e, n) {
1634
+ function I(e, n) {
1635
1635
  i.openComponentDialog(Dn, { data: {
1636
1636
  title: t("views.devices.confirm_title"),
1637
1637
  confirmText: t("views.devices.confirm"),
@@ -1649,7 +1649,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1649
1649
  }
1650
1650
  } });
1651
1651
  }
1652
- async function R() {
1652
+ async function ie() {
1653
1653
  try {
1654
1654
  let e = await l.forceRescan();
1655
1655
  e.success ? r.add({
@@ -1672,14 +1672,14 @@ var Un = { class: "flex flex-col" }, Wn = {
1672
1672
  });
1673
1673
  }
1674
1674
  }
1675
- function z() {
1675
+ function L() {
1676
1676
  i.openComponentDialog(Sn, { data: {
1677
1677
  title: t("components.dialog.components.new_camera.add_camera"),
1678
1678
  fullscreen: !0,
1679
1679
  contentProps: {}
1680
1680
  } });
1681
1681
  }
1682
- async function B(e, n) {
1682
+ async function R(e, n) {
1683
1683
  e.stopPropagation();
1684
1684
  try {
1685
1685
  let e = await l.hideDevice(n);
@@ -1703,7 +1703,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1703
1703
  });
1704
1704
  }
1705
1705
  }
1706
- async function re(e, n) {
1706
+ async function z(e, n) {
1707
1707
  e.stopPropagation();
1708
1708
  try {
1709
1709
  let e = await l.unhideDevice(n.discoveredId);
@@ -1727,10 +1727,10 @@ var Un = { class: "flex flex-col" }, Wn = {
1727
1727
  });
1728
1728
  }
1729
1729
  }
1730
- function ae() {
1730
+ function B() {
1731
1731
  l.toggleShowHidden();
1732
1732
  }
1733
- function U(e) {
1733
+ function V(e) {
1734
1734
  return F(e) ? "opacity-50 cursor-not-allowed" : "";
1735
1735
  }
1736
1736
  return M(() => {
@@ -1738,7 +1738,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1738
1738
  }), n(() => {
1739
1739
  f.value && l.unsubscribe();
1740
1740
  }), (e, t) => {
1741
- let n = Pe, r = me, i = fe, a = ue, l = q, v = xe, O = ke, M = Oe, te = Ae, L = de, V = Le, ie = ne, H = ee;
1741
+ let n = Ne, r = fe, i = le, a = ce, l = be, v = ye, O = Oe, M = De, P = ke, I = ae, H = Ie, U = ne, W = ee;
1742
1742
  return o(), x("div", Un, [
1743
1743
  _(c) ? m("", !0) : (o(), x("h1", Wn, s(e.$t(`views.${String(e.$route.name).toLowerCase()}.title`)), 1)),
1744
1744
  _(f) ? (o(), x(C, { key: 2 }, [
@@ -1754,16 +1754,16 @@ var Un = { class: "flex flex-col" }, Wn = {
1754
1754
  severity: "secondary",
1755
1755
  label: e.$t("views.devices.rescan"),
1756
1756
  loading: _(D),
1757
- onClick: R
1757
+ onClick: ie
1758
1758
  }, null, 8, ["label", "loading"])
1759
1759
  ])) : m("", !0),
1760
1760
  !_(w) && _(g).length ? (o(), x("div", Qn, [T("span", $n, s(e.$t("views.devices.status_adopted_cameras")), 1), A(r, { class: "cui-card" }, {
1761
- content: y(() => [A(te, {
1761
+ content: y(() => [A(P, {
1762
1762
  value: _(g),
1763
1763
  "striped-rows": "",
1764
1764
  pt: d,
1765
1765
  class: "w-full",
1766
- onRowClick: t[0] ||= (e) => I(e.data)
1766
+ onRowClick: t[0] ||= (e) => re(e.data)
1767
1767
  }, {
1768
1768
  default: y(() => [
1769
1769
  A(O, {
@@ -1771,7 +1771,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1771
1771
  "header-class": "p-2 pl-4 w-5 max-w-5",
1772
1772
  class: "p-2 pl-4 w-5 max-w-5"
1773
1773
  }, {
1774
- body: y(({ data: e }) => [T("div", er, [E(A(v, { style: S({ background: N(e.status) }) }, null, 8, ["style"]), [[H, { value: P(e.status) }]])])]),
1774
+ body: y(({ data: e }) => [T("div", er, [E(A(v, { style: S({ background: te(e.status) }) }, null, 8, ["style"]), [[W, { value: N(e.status) }]])])]),
1775
1775
  _: 1
1776
1776
  }),
1777
1777
  A(O, {
@@ -1821,12 +1821,12 @@ var Un = { class: "flex flex-col" }, Wn = {
1821
1821
  key: 3,
1822
1822
  class: u(["flex min-h-0 flex-col", { "mt-6": _(g).length }])
1823
1823
  }, [T("span", ir, s(e.$t("views.devices.status_discovered")), 1), A(r, { class: "cui-card" }, {
1824
- content: y(() => [_(b).length ? (o(), x("div", ar, [A(te, {
1824
+ content: y(() => [_(b).length ? (o(), x("div", ar, [A(P, {
1825
1825
  value: _(b),
1826
1826
  "striped-rows": "",
1827
1827
  pt: d,
1828
1828
  class: "w-full",
1829
- onRowClick: t[1] ||= (e) => I(e.data)
1829
+ onRowClick: t[1] ||= (e) => re(e.data)
1830
1830
  }, {
1831
1831
  default: y(() => [
1832
1832
  A(O, {
@@ -1834,7 +1834,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1834
1834
  "header-class": "p-2 pl-4 w-5 max-w-5",
1835
1835
  class: "p-2 pl-4 w-5 max-w-5"
1836
1836
  }, {
1837
- body: y(({ data: e }) => [T("div", or, [E(A(v, { style: S({ background: N(e.status) }) }, null, 8, ["style"]), [[H, { value: P(e.status) }]])])]),
1837
+ body: y(({ data: e }) => [T("div", or, [E(A(v, { style: S({ background: te(e.status) }) }, null, 8, ["style"]), [[W, { value: N(e.status) }]])])]),
1838
1838
  _: 1
1839
1839
  }),
1840
1840
  A(O, {
@@ -1843,7 +1843,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1843
1843
  "header-class": "p-2",
1844
1844
  class: "p-2 w-full min-w-[200px] max-w-0"
1845
1845
  }, {
1846
- body: y(({ data: t }) => [T("div", { class: u(["font-bold text-color truncate", U(t)]) }, s(t.name), 3), T("div", { class: u(["text-xs text-muted truncate", U(t)]) }, s(t.manufacturer || e.$t("views.devices.unknown")) + " · " + s(t.model || e.$t("views.devices.unknown")), 3)]),
1846
+ body: y(({ data: t }) => [T("div", { class: u(["font-bold text-color truncate", V(t)]) }, s(t.name), 3), T("div", { class: u(["text-xs text-muted truncate", V(t)]) }, s(t.manufacturer || e.$t("views.devices.unknown")) + " · " + s(t.model || e.$t("views.devices.unknown")), 3)]),
1847
1847
  _: 1
1848
1848
  }, 8, ["header"]),
1849
1849
  A(O, {
@@ -1854,7 +1854,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1854
1854
  }, {
1855
1855
  body: y(({ data: e }) => [e.address ? (o(), x("span", {
1856
1856
  key: 0,
1857
- class: u(["text-xs text-muted whitespace-nowrap", U(e)])
1857
+ class: u(["text-xs text-muted whitespace-nowrap", V(e)])
1858
1858
  }, s(e.address), 3)) : m("", !0)]),
1859
1859
  _: 1
1860
1860
  }, 8, ["header"]),
@@ -1866,7 +1866,7 @@ var Un = { class: "flex flex-col" }, Wn = {
1866
1866
  }, {
1867
1867
  body: y(({ data: e }) => [A(M, {
1868
1868
  label: e.provider,
1869
- class: u(["text-xs whitespace-nowrap", U(e)])
1869
+ class: u(["text-xs whitespace-nowrap", V(e)])
1870
1870
  }, null, 8, ["label", "class"])]),
1871
1871
  _: 1
1872
1872
  }, 8, ["header"]),
@@ -1880,16 +1880,16 @@ var Un = { class: "flex flex-col" }, Wn = {
1880
1880
  text: "",
1881
1881
  rounded: "",
1882
1882
  class: "cui-icon-md",
1883
- onClick: (e) => re(e, t)
1883
+ onClick: (e) => z(e, t)
1884
1884
  }, {
1885
- icon: y(() => [A(_(Re), {
1885
+ icon: y(() => [A(_(Le), {
1886
1886
  width: "100%",
1887
1887
  height: "100%",
1888
1888
  class: "text-muted"
1889
1889
  })]),
1890
1890
  _: 1
1891
1891
  }, 8, ["onClick"])), [[
1892
- H,
1892
+ W,
1893
1893
  { value: e.$t("views.devices.unhide") },
1894
1894
  void 0,
1895
1895
  { left: !0 }
@@ -1899,16 +1899,16 @@ var Un = { class: "flex flex-col" }, Wn = {
1899
1899
  text: "",
1900
1900
  rounded: "",
1901
1901
  class: "cui-icon-md",
1902
- onClick: (e) => B(e, t)
1902
+ onClick: (e) => R(e, t)
1903
1903
  }, {
1904
- icon: y(() => [A(_(ze), {
1904
+ icon: y(() => [A(_(Re), {
1905
1905
  width: "100%",
1906
1906
  height: "100%",
1907
1907
  class: "text-muted"
1908
1908
  })]),
1909
1909
  _: 1
1910
1910
  }, 8, ["onClick"])), [[
1911
- H,
1911
+ W,
1912
1912
  { value: e.$t("views.devices.hide") },
1913
1913
  void 0,
1914
1914
  { left: !0 }
@@ -1917,12 +1917,12 @@ var Un = { class: "flex flex-col" }, Wn = {
1917
1917
  })
1918
1918
  ]),
1919
1919
  _: 1
1920
- }, 8, ["value"])])) : (o(), x("div", cr, [_(D) ? (o(), p(L, {
1920
+ }, 8, ["value"])])) : (o(), x("div", cr, [_(D) ? (o(), p(I, {
1921
1921
  key: 0,
1922
1922
  width: "24px",
1923
1923
  height: "24px",
1924
1924
  class: "text-muted"
1925
- })) : (o(), p(V, {
1925
+ })) : (o(), p(H, {
1926
1926
  key: 1,
1927
1927
  width: "32px",
1928
1928
  height: "32px",
@@ -1934,14 +1934,14 @@ var Un = { class: "flex flex-col" }, Wn = {
1934
1934
  severity: "secondary",
1935
1935
  class: "cui-button-medium",
1936
1936
  label: _(k) ? e.$t("views.devices.hide_hidden") : `${e.$t("views.devices.show_hidden")} (${_(j)})`,
1937
- onClick: ae
1937
+ onClick: B
1938
1938
  }, null, 8, ["label"])) : m("", !0),
1939
1939
  A(l, {
1940
1940
  severity: "secondary",
1941
1941
  class: "cui-button-medium",
1942
1942
  label: e.$t("views.devices.rescan"),
1943
1943
  loading: _(D),
1944
- onClick: R
1944
+ onClick: ie
1945
1945
  }, null, 8, ["label", "loading"])
1946
1946
  ])]),
1947
1947
  _: 1
@@ -1950,16 +1950,16 @@ var Un = { class: "flex flex-col" }, Wn = {
1950
1950
  content: y(() => [A(n)]),
1951
1951
  _: 1
1952
1952
  })])),
1953
- ("hasPermission" in e ? e.hasPermission : _(se))(void 0, "admin") ? (o(), p(ie, {
1953
+ ("hasPermission" in e ? e.hasPermission : _(se))(void 0, "admin") ? (o(), p(U, {
1954
1954
  key: 3,
1955
1955
  "tooltip-props": { value: e.$t("views.cameras.add_camera") },
1956
1956
  "button-props": { class: "text-white" },
1957
- icon: _(Ie),
1957
+ icon: _(Fe),
1958
1958
  "icon-props": {
1959
1959
  width: "30px",
1960
1960
  height: "30px"
1961
1961
  },
1962
- onClick: z
1962
+ onClick: L
1963
1963
  }, null, 8, ["tooltip-props", "icon"])) : m("", !0)
1964
1964
  ]);
1965
1965
  };