homesec 1.2.0__py3-none-any.whl → 1.2.2__py3-none-any.whl
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.
- homesec/models/__init__.py +3 -1
- homesec/models/config.py +3 -1
- homesec/models/source/__init__.py +3 -0
- homesec/models/source/ftp.py +97 -0
- homesec/models/source/local_folder.py +30 -0
- homesec/models/source/rtsp.py +165 -0
- homesec/plugins/filters/yolo.py +2 -2
- homesec/plugins/sources/ftp.py +1 -1
- homesec/plugins/sources/local_folder.py +1 -1
- homesec/plugins/sources/rtsp.py +2 -2
- homesec/sources/__init__.py +4 -2
- homesec/sources/ftp.py +1 -1
- homesec/sources/local_folder.py +1 -1
- homesec/sources/rtsp/__init__.py +5 -0
- homesec/sources/rtsp/clock.py +18 -0
- homesec/sources/rtsp/core.py +1264 -0
- homesec/sources/rtsp/frame_pipeline.py +325 -0
- homesec/sources/rtsp/hardware.py +143 -0
- homesec/sources/rtsp/motion.py +94 -0
- homesec/sources/rtsp/recorder.py +180 -0
- homesec/sources/rtsp/utils.py +35 -0
- {homesec-1.2.0.dist-info → homesec-1.2.2.dist-info}/METADATA +216 -167
- {homesec-1.2.0.dist-info → homesec-1.2.2.dist-info}/RECORD +26 -16
- homesec/models/source.py +0 -81
- homesec/sources/rtsp.py +0 -1304
- {homesec-1.2.0.dist-info → homesec-1.2.2.dist-info}/WHEEL +0 -0
- {homesec-1.2.0.dist-info → homesec-1.2.2.dist-info}/entry_points.txt +0 -0
- {homesec-1.2.0.dist-info → homesec-1.2.2.dist-info}/licenses/LICENSE +0 -0
|
@@ -13,16 +13,19 @@ homesec/health/__init__.py,sha256=fbndfsLOR9aA7d_5I1mEZN0oM5IYMmcJNjOt0iaXKZc,10
|
|
|
13
13
|
homesec/health/server.py,sha256=VP-4XmZ0K3ooFyd000AFOZohZ5R7QcnZC4n7oj0RMqI,7014
|
|
14
14
|
homesec/maintenance/__init__.py,sha256=6a5W2x8oUgnoWaK374-Wq_nrOD5UDAUqUtSANaEck2M,60
|
|
15
15
|
homesec/maintenance/cleanup_clips.py,sha256=sqeWLE9GrJfe29ntCasgvT2M-FWTymydHDQG-fZ3khg,23451
|
|
16
|
-
homesec/models/__init__.py,sha256=
|
|
16
|
+
homesec/models/__init__.py,sha256=0gcTdSg0CW77Hy3D7wlCyyYvvBJMdD51BL5uIiz4Vfc,2043
|
|
17
17
|
homesec/models/alert.py,sha256=cMFr4NUGygq0-m2ep0jhjzVrFKM7kN1wJON1J0XwGY4,1010
|
|
18
18
|
homesec/models/clip.py,sha256=QaftnY7q20fQX4BTX6j-FBZLaoVSgk0DbpNf8kdnT60,2225
|
|
19
|
-
homesec/models/config.py,sha256=
|
|
19
|
+
homesec/models/config.py,sha256=5V0_RNIh-hqKA8OCU5EdBwQVRbZ3nmkqoay54V6vgVE,14272
|
|
20
20
|
homesec/models/enums.py,sha256=WQk1PvYnJd5iaz51P5GM3XayqCf0VpQnLYmSuw1hrZk,3293
|
|
21
21
|
homesec/models/events.py,sha256=sgPDCSp9w60VUKKREYxNBZaxrFWW_bYyLwMFGHBawjk,4942
|
|
22
22
|
homesec/models/filter.py,sha256=6NS1rBI2zmrswK9NtMn0vZlbwbeMGCPuLCDKP9XWN0I,2259
|
|
23
|
-
homesec/models/source.py,sha256=F8ksGrOa09bxx5IEgQmxPWJNWOm8zvFLsRJxihJTlM4,2367
|
|
24
23
|
homesec/models/storage.py,sha256=63wyHdDt3QrfdsP0SmhrxtOeWRllZ1O2GPrA4jI7XmU,235
|
|
25
24
|
homesec/models/vlm.py,sha256=Uk6TPwqbKxzyAsOlBSzZru74nKjp2-LLyzIp5b3wM_c,3293
|
|
25
|
+
homesec/models/source/__init__.py,sha256=vZFpll5ftShIGe_VOoqQ6XiFZKKAKqgZ3bOW9feB_VM,60
|
|
26
|
+
homesec/models/source/ftp.py,sha256=ZRU0YxNa99qTlCS2pIXKl8kmM1KQyIHOHyaFox6XPKk,2871
|
|
27
|
+
homesec/models/source/local_folder.py,sha256=ymneTjcCzvLzFmen3GF8kYfGIlxWgb10BDvgdXnWFcQ,803
|
|
28
|
+
homesec/models/source/rtsp.py,sha256=h_XzIM22JKHA0Mz4IUZMTPlzKkU_U7sSF6p5PPIVoWw,4852
|
|
26
29
|
homesec/pipeline/__init__.py,sha256=kiQLECc6JIPmeIdBJrVpTApPs0GBAgWoZ1kU4XZyJVY,214
|
|
27
30
|
homesec/pipeline/alert_policy.py,sha256=gFl5SJ96fgEfEUnhSL51YA6O2GPGXTXmxaDC-q3h1rs,152
|
|
28
31
|
homesec/pipeline/core.py,sha256=D552e-xpIpom5C-Y_TkWB9Ufbm8xClGmCdo_4tseXuU,23840
|
|
@@ -35,25 +38,32 @@ homesec/plugins/alert_policies/noop.py,sha256=xcdyZAlQf6X_AqQWUPkRMHLK8J6d7PTXWo
|
|
|
35
38
|
homesec/plugins/analyzers/__init__.py,sha256=GLC01lACmqZjKjMbkUnB_yYnOTxW_XEOwOfHK-I9SX0,915
|
|
36
39
|
homesec/plugins/analyzers/openai.py,sha256=qLN9Qhj-DvqEE6nHXIfW0QPp2EhSVwIVVXzq-QSqdzQ,15979
|
|
37
40
|
homesec/plugins/filters/__init__.py,sha256=JgPJTcW8yKa6JRIED4w8o5j_n_k5J7xwQbhAqDYofA4,866
|
|
38
|
-
homesec/plugins/filters/yolo.py,sha256=
|
|
41
|
+
homesec/plugins/filters/yolo.py,sha256=RUJqP9vtHDEoTqR9U3zt2ae_4Y8DGaJ2bsmJGVlfYMw,11126
|
|
39
42
|
homesec/plugins/notifiers/__init__.py,sha256=6T3OX4Vg1XKZeSG6AlZzw0o2KlaRr_mePBDIZEbr5Rw,1066
|
|
40
43
|
homesec/plugins/notifiers/mqtt.py,sha256=1zUKUHFvT65ysawFXEwWHvY8rg310fRsSSKhIFeaUL4,5946
|
|
41
44
|
homesec/plugins/notifiers/multiplex.py,sha256=LlnwozjkMDQwz7__v7mT4AohZbiWZK39CZunamRp7FM,3676
|
|
42
45
|
homesec/plugins/notifiers/sendgrid_email.py,sha256=gZSv3FRaN8qCMO6D-MX8b6XVz-gSgrFhkFV6j1ILdi4,8682
|
|
43
46
|
homesec/plugins/sources/__init__.py,sha256=weLYuCLrmWIUvRTYmfgqVcOFHonZgTngDKFSks4yg8s,1025
|
|
44
|
-
homesec/plugins/sources/ftp.py,sha256=
|
|
45
|
-
homesec/plugins/sources/local_folder.py,sha256=
|
|
46
|
-
homesec/plugins/sources/rtsp.py,sha256=
|
|
47
|
+
homesec/plugins/sources/ftp.py,sha256=c2HktqWlzQyRDMVMVEb6R9zIK-Q1AyJMHPUp92jHhyM,853
|
|
48
|
+
homesec/plugins/sources/local_folder.py,sha256=zHyMT-PKEJCaf4mw29TBjj-jK_oQmO3zPyOAt4n5HWI,1227
|
|
49
|
+
homesec/plugins/sources/rtsp.py,sha256=rqWtOOKgxGqC2lwdgkEdpH_xMatH2-3xn_Kt_biAA20,824
|
|
47
50
|
homesec/plugins/storage/__init__.py,sha256=oJPrjgpke7VK3MY8L-GGmDVB4eWx7IgXcmVQXMcMw7g,1235
|
|
48
51
|
homesec/plugins/storage/dropbox.py,sha256=AQkEFV4lXqS1pbVazNuskEaEpr5CvLkrYdUK8EE7eAM,9992
|
|
49
52
|
homesec/plugins/storage/local.py,sha256=CbuSaWEi9ft1zxOURcmOKzwyq0UXIyHqyHoQD6sxivI,3231
|
|
50
53
|
homesec/repository/__init__.py,sha256=6cye2uQIA2v6jeLk5D2S9y3rlkfzJH5GceqdOroF3hU,160
|
|
51
54
|
homesec/repository/clip_repository.py,sha256=nRcswsIX--Z9p7J33FsqNlDtMAmt438VUbfvZHX0FlY,17090
|
|
52
|
-
homesec/sources/__init__.py,sha256=
|
|
55
|
+
homesec/sources/__init__.py,sha256=zjjoGbpha4Aqx2Y3fca743gs6gEyYDtRjUbCCwJ0NG0,598
|
|
53
56
|
homesec/sources/base.py,sha256=dKTxJxcDwJtykWDN3WYzkW5mtkRqlOJxJLWcLy82_Zo,7582
|
|
54
|
-
homesec/sources/ftp.py,sha256=
|
|
55
|
-
homesec/sources/local_folder.py,sha256=
|
|
56
|
-
homesec/sources/rtsp.py,sha256=
|
|
57
|
+
homesec/sources/ftp.py,sha256=t1XFo7aN31mN4wFfSVJuJhA2o_nFi1zQQZCl4VZGQlA,7312
|
|
58
|
+
homesec/sources/local_folder.py,sha256=UduSyDKesT5DBoBx8Qjp7tAZatUR6bvXTEHzC7VoLWQ,8474
|
|
59
|
+
homesec/sources/rtsp/__init__.py,sha256=wtBzdwzL7Cg0HyIGIpS3lBagekCAi_EYJOyCZFbT7K0,103
|
|
60
|
+
homesec/sources/rtsp/clock.py,sha256=Gf-CLBfgUmxfajmZim89vmWRG14hnc7iUUBVNNiUz6w,338
|
|
61
|
+
homesec/sources/rtsp/core.py,sha256=tX6FH_ete2Xop-6O7CzH-a0A42OaCa2-jUQXjl5oQ0E,48235
|
|
62
|
+
homesec/sources/rtsp/frame_pipeline.py,sha256=cIGrH5z4WE8swoAThTl7Wu3SViNq-00YyCcKMLBrCso,11620
|
|
63
|
+
homesec/sources/rtsp/hardware.py,sha256=sKCJhoVdmkDfCk2s5RL0lDPX_CuvcwlgVUESgRJK3us,4892
|
|
64
|
+
homesec/sources/rtsp/motion.py,sha256=FKDa1hvD_H3uxgnQ-Z0c7MhVd6u_35cO6XKZRVrXpaY,2870
|
|
65
|
+
homesec/sources/rtsp/recorder.py,sha256=fqL-zr-vtnFrDQc87zZFYeM-6JSUfMwQsc0zfR-mgy4,7009
|
|
66
|
+
homesec/sources/rtsp/utils.py,sha256=aufPAP6oc39kyFAiN0HTDhdXf3bQqWSVeVWNIHx5MmI,1021
|
|
57
67
|
homesec/state/__init__.py,sha256=Evt1jqTebmpJD1NUzNh3vwt5pbjDlLjQ0DgMCSAZOuM,255
|
|
58
68
|
homesec/state/postgres.py,sha256=I-cXqW5cgz-hpaHc0JIv3DnIBTmGxE28P8ZxBAGabSw,17765
|
|
59
69
|
homesec/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -61,8 +71,8 @@ homesec/telemetry/db_log_handler.py,sha256=KM8g4kcOyPzFJbpGxpSzecx_hrEWY0YfpoIKy
|
|
|
61
71
|
homesec/telemetry/postgres_settings.py,sha256=EVD2_oi_KReFJvQmXxW026aurl_YD-KexT7rkbGQPHc,1198
|
|
62
72
|
homesec/telemetry/db/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
|
|
63
73
|
homesec/telemetry/db/log_table.py,sha256=wcZLwRht7FMa0z2gf37f_RxdVTNIdDiK4i_N3c_ibwg,473
|
|
64
|
-
homesec-1.2.
|
|
65
|
-
homesec-1.2.
|
|
66
|
-
homesec-1.2.
|
|
67
|
-
homesec-1.2.
|
|
68
|
-
homesec-1.2.
|
|
74
|
+
homesec-1.2.2.dist-info/METADATA,sha256=dYxpcVPEWLuX_TLZIEZZywjcgYgJO--J1IGgDu8aUyQ,25157
|
|
75
|
+
homesec-1.2.2.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
76
|
+
homesec-1.2.2.dist-info/entry_points.txt,sha256=8ocCj_fP1qxIuL-DVDAUiaUbEdTMX_kg_BzVrJsbQYg,45
|
|
77
|
+
homesec-1.2.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
78
|
+
homesec-1.2.2.dist-info/RECORD,,
|
homesec/models/source.py
DELETED
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
"""Source configuration models."""
|
|
2
|
-
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from pydantic import BaseModel, Field, field_validator
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class RTSPSourceConfig(BaseModel):
|
|
9
|
-
"""RTSP source configuration."""
|
|
10
|
-
|
|
11
|
-
model_config = {"extra": "forbid"}
|
|
12
|
-
|
|
13
|
-
camera_name: str | None = None
|
|
14
|
-
rtsp_url_env: str | None = None
|
|
15
|
-
rtsp_url: str | None = None
|
|
16
|
-
detect_rtsp_url_env: str | None = None
|
|
17
|
-
detect_rtsp_url: str | None = None
|
|
18
|
-
output_dir: str = "./recordings"
|
|
19
|
-
pixel_threshold: int = 45
|
|
20
|
-
min_changed_pct: float = 1.0
|
|
21
|
-
blur_kernel: int = 5
|
|
22
|
-
stop_delay: float = 10.0
|
|
23
|
-
max_recording_s: float = 60.0
|
|
24
|
-
max_reconnect_attempts: int = 20
|
|
25
|
-
disable_hwaccel: bool = False
|
|
26
|
-
frame_timeout_s: float = 2.0
|
|
27
|
-
frame_queue_size: int = 20
|
|
28
|
-
reconnect_backoff_s: float = 1.0
|
|
29
|
-
debug_motion: bool = False
|
|
30
|
-
heartbeat_s: float = 30.0
|
|
31
|
-
rtsp_connect_timeout_s: float = 2.0
|
|
32
|
-
rtsp_io_timeout_s: float = 2.0
|
|
33
|
-
ffmpeg_flags: list[str] = Field(default_factory=list)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class LocalFolderSourceConfig(BaseModel):
|
|
37
|
-
"""Local folder source configuration."""
|
|
38
|
-
|
|
39
|
-
model_config = {"extra": "forbid"}
|
|
40
|
-
|
|
41
|
-
camera_name: str | None = None
|
|
42
|
-
watch_dir: str = "recordings"
|
|
43
|
-
poll_interval: float = 1.0
|
|
44
|
-
stability_threshold_s: float = 3.0
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class FtpSourceConfig(BaseModel):
|
|
48
|
-
"""FTP source configuration."""
|
|
49
|
-
|
|
50
|
-
model_config = {"extra": "forbid"}
|
|
51
|
-
|
|
52
|
-
camera_name: str | None = None
|
|
53
|
-
host: str = "0.0.0.0"
|
|
54
|
-
port: int = 2121
|
|
55
|
-
root_dir: str = "./ftp_incoming"
|
|
56
|
-
ftp_subdir: str | None = None
|
|
57
|
-
anonymous: bool = True
|
|
58
|
-
username_env: str | None = None
|
|
59
|
-
password_env: str | None = None
|
|
60
|
-
perms: str = "elw"
|
|
61
|
-
passive_ports: str | None = None
|
|
62
|
-
masquerade_address: str | None = None
|
|
63
|
-
heartbeat_s: float = 30.0
|
|
64
|
-
allowed_extensions: list[str] = Field(default_factory=lambda: [".mp4"])
|
|
65
|
-
delete_non_matching: bool = True
|
|
66
|
-
delete_incomplete: bool = True
|
|
67
|
-
default_duration_s: float = 10.0
|
|
68
|
-
log_level: str = "INFO"
|
|
69
|
-
|
|
70
|
-
@field_validator("allowed_extensions")
|
|
71
|
-
@classmethod
|
|
72
|
-
def _normalize_extensions(cls, value: list[str]) -> list[str]:
|
|
73
|
-
cleaned: list[str] = []
|
|
74
|
-
for item in value:
|
|
75
|
-
ext = str(item).strip().lower()
|
|
76
|
-
if not ext:
|
|
77
|
-
continue
|
|
78
|
-
if not ext.startswith("."):
|
|
79
|
-
ext = f".{ext}"
|
|
80
|
-
cleaned.append(ext)
|
|
81
|
-
return cleaned
|