mirror of
https://github.com/blakeblackshear/frigate.git
synced 2026-10-20 05:32:49 +03:00
The userinfo pattern ran from any host:port to the last "@" in the token, so rtsp://host:554/live?x=a@b lost its host and a comma between two URLs was swallowed, which merged the paths /ffprobe splits on. It also backtracked quadratically on long lines with many "://", and every subprocess log line goes through it. A "user:" userinfo now runs to the last "@" before the next URL unless a port follows the colon, and any other userinfo stops at the end of the authority. Query masking now covers only real secret names, so auth, private and autoken are left alone.
202 lines
5.5 KiB
Python
202 lines
5.5 KiB
Python
import os
|
|
import re
|
|
|
|
INSTALL_DIR = "/opt/frigate"
|
|
CONFIG_DIR = "/config"
|
|
DEFAULT_DB_PATH = f"{CONFIG_DIR}/frigate.db"
|
|
MODEL_CACHE_DIR = f"{CONFIG_DIR}/model_cache"
|
|
BASE_DIR = "/media/frigate"
|
|
CLIPS_DIR = f"{BASE_DIR}/clips"
|
|
EXPORT_DIR = f"{BASE_DIR}/exports"
|
|
EXPORT_STAGING_DIR = f"{EXPORT_DIR}/staging"
|
|
FACE_DIR = f"{CLIPS_DIR}/faces"
|
|
THUMB_DIR = f"{CLIPS_DIR}/thumbs"
|
|
RECORD_DIR = f"{BASE_DIR}/recordings"
|
|
TRIGGER_DIR = f"{CLIPS_DIR}/triggers"
|
|
BIRDSEYE_PIPE = "/tmp/cache/birdseye"
|
|
CACHE_DIR = "/tmp/cache"
|
|
REPLAY_CAMERA_PREFIX = "_replay_"
|
|
REPLAY_DIR = os.path.join(CLIPS_DIR, "replay")
|
|
PLUS_ENV_VAR = "PLUS_API_KEY"
|
|
PLUS_API_HOST = "https://api.frigate.video"
|
|
|
|
SHM_FRAMES_VAR = "SHM_MAX_FRAMES"
|
|
|
|
REDACTED_CREDENTIAL_SENTINEL = "__FRIGATE_SAVED_CREDENTIAL__"
|
|
|
|
# Stream type constants
|
|
|
|
STREAM_TYPE_MAIN = "main"
|
|
STREAM_TYPE_SUB = "sub"
|
|
SUB_CACHE_TAG = "@sub"
|
|
RECORD_STREAM_TYPES = (STREAM_TYPE_MAIN, STREAM_TYPE_SUB)
|
|
ROLE_TO_STREAM_TYPE = {"record": STREAM_TYPE_MAIN, "record_sub": STREAM_TYPE_SUB}
|
|
STREAM_TYPE_TO_ROLE = {v: k for k, v in ROLE_TO_STREAM_TYPE.items()}
|
|
|
|
# Attribute & Object constants
|
|
|
|
DEFAULT_ATTRIBUTE_LABEL_MAP = {
|
|
"person": ["amazon", "face"],
|
|
"car": [
|
|
"amazon",
|
|
"an_post",
|
|
"canada_post",
|
|
"dhl",
|
|
"dpd",
|
|
"fedex",
|
|
"gls",
|
|
"license_plate",
|
|
"nzpost",
|
|
"postnl",
|
|
"postnord",
|
|
"purolator",
|
|
"royal_mail",
|
|
"ups",
|
|
"usps",
|
|
],
|
|
"truck": ["license_plate"],
|
|
"garbage_truck": ["license_plate"],
|
|
"motorcycle": ["license_plate"],
|
|
"bus": ["license_plate"],
|
|
"school_bus": ["license_plate"],
|
|
}
|
|
ATTRIBUTE_LABEL_DISPLAY_MAP = {
|
|
"amazon": "Amazon",
|
|
"an_post": "An Post",
|
|
"canada_post": "Canada Post",
|
|
"dhl": "DHL",
|
|
"dpd": "DPD",
|
|
"fedex": "FedEx",
|
|
"gls": "GLS",
|
|
"nzpost": "NZ Post",
|
|
"postnl": "PostNL",
|
|
"postnord": "PostNord",
|
|
"purolator": "Purolator",
|
|
"royal_mail": "Royal Mail",
|
|
"ups": "UPS",
|
|
"usps": "USPS",
|
|
}
|
|
LABEL_CONSOLIDATION_MAP = {
|
|
"car": 0.8,
|
|
"face": 0.5,
|
|
}
|
|
LABEL_CONSOLIDATION_DEFAULT = 0.9
|
|
LABEL_NMS_MAP = {
|
|
"car": 0.6,
|
|
}
|
|
LABEL_NMS_DEFAULT = 0.4
|
|
|
|
# Audio constants
|
|
|
|
AUDIO_DURATION = 0.975
|
|
AUDIO_FORMAT = "s16le"
|
|
AUDIO_MAX_BIT_RANGE = 32768.0
|
|
AUDIO_SAMPLE_RATE = 16000
|
|
AUDIO_MIN_CONFIDENCE = 0.5
|
|
|
|
# DB constants
|
|
|
|
MAX_WAL_SIZE = 10 # MB
|
|
|
|
# Ffmpeg constants
|
|
|
|
DEFAULT_FFMPEG_VERSION = os.environ.get("DEFAULT_FFMPEG_VERSION", "")
|
|
INCLUDED_FFMPEG_VERSIONS = os.environ.get("INCLUDED_FFMPEG_VERSIONS", "").split(":")
|
|
LIBAVFORMAT_VERSION_MAJOR = int(os.environ.get("LIBAVFORMAT_VERSION_MAJOR", "59"))
|
|
FFMPEG_HWACCEL_NVIDIA = "preset-nvidia"
|
|
FFMPEG_HWACCEL_VAAPI = "preset-vaapi"
|
|
FFMPEG_HWACCEL_VULKAN = "preset-vulkan"
|
|
FFMPEG_HWACCEL_RKMPP = "preset-rkmpp"
|
|
FFMPEG_HWACCEL_AMF = "preset-amd-amf"
|
|
FFMPEG_HVC1_ARGS = ["-tag:v", "hvc1"]
|
|
|
|
# RKNN constants
|
|
SUPPORTED_RK_SOCS = ["rk3562", "rk3566", "rk3568", "rk3576", "rk3588"]
|
|
|
|
# Regex constants
|
|
|
|
REGEX_CAMERA_NAME = r"^[a-zA-Z0-9_-]+$"
|
|
REGEX_RTSP_CAMERA_USER_PASS = r":\/\/[a-zA-Z0-9_-]+:[\S]+@"
|
|
# A "user:" userinfo may hold "/", "#" or "@" in the password, so it runs to the
|
|
# last "@" before the next URL. A port after the colon is rejected so a bare
|
|
# host:port/path@x is not taken for credentials. Anything else stops at the
|
|
# authority end.
|
|
REGEX_URL_USERINFO = (
|
|
r"://(?:[^\s/?#:\[\]]*:(?!\d+(?:[/?#,\s]|$))(?:(?!://)\S)*|[^\s/?#]+)@"
|
|
)
|
|
_CREDENTIAL_QUERY_KEYS = (
|
|
r"(?:user(?:name)?|usr|login|pass(?:word|wd)?|pwd"
|
|
r"|(?:[a-z_]*_)?token|(?:[a-z_]*_)?secret|client_private|api_?key)"
|
|
)
|
|
REGEX_CREDENTIAL_QUERY_PARAM = rf"(?i)([?&]{_CREDENTIAL_QUERY_KEYS}=)[^&\s]*"
|
|
REGEX_MASKED_CREDENTIAL = rf"(?i)://\*:\*@|[?&]{_CREDENTIAL_QUERY_KEYS}=\*(?![^&\s])"
|
|
REGEX_JSON = re.compile(r"^\s*\{")
|
|
|
|
# Known Driver Names
|
|
|
|
DRIVER_ENV_VAR = "LIBVA_DRIVER_NAME"
|
|
DRIVER_AMD = "radeonsi"
|
|
DRIVER_INTEL_i965 = "i965"
|
|
DRIVER_INTEL_iHD = "iHD"
|
|
|
|
# Preview Values
|
|
|
|
PREVIEW_FRAME_TYPE = "webp"
|
|
|
|
# Record Values
|
|
|
|
CACHE_SEGMENT_FORMAT = "%Y%m%d%H%M%S%z"
|
|
MAX_PRE_CAPTURE = 60
|
|
MAX_SEGMENT_DURATION = 600
|
|
MAX_SEGMENTS_IN_CACHE = 6
|
|
MAX_PLAYLIST_SECONDS = 7200 # support 2 hour segments for a single playlist to account for cameras with inconsistent segment times
|
|
|
|
# Internal Comms Topics
|
|
|
|
INSERT_MANY_RECORDINGS = "insert_many_recordings"
|
|
INSERT_PREVIEW = "insert_preview"
|
|
REQUEST_REGION_GRID = "request_region_grid"
|
|
UPSERT_REVIEW_SEGMENT = "upsert_review_segment"
|
|
CLEAR_ONGOING_REVIEW_SEGMENTS = "clear_ongoing_review_segments"
|
|
UPDATE_CAMERA_ACTIVITY = "update_camera_activity"
|
|
UPDATE_AUDIO_ACTIVITY = "update_audio_activity"
|
|
EXPIRE_AUDIO_ACTIVITY = "expire_audio_activity"
|
|
UPDATE_AUDIO_TRANSCRIPTION_STATE = "update_audio_transcription_state"
|
|
UPDATE_EVENT_DESCRIPTION = "update_event_description"
|
|
UPDATE_REVIEW_DESCRIPTION = "update_review_description"
|
|
UPDATE_MODEL_STATE = "update_model_state"
|
|
UPDATE_EMBEDDINGS_REINDEX_PROGRESS = "handle_embeddings_reindex_progress"
|
|
UPDATE_BIRDSEYE_LAYOUT = "update_birdseye_layout"
|
|
UPDATE_JOB_STATE = "update_job_state"
|
|
UPDATE_NOTICE = "update_notice"
|
|
NOTIFICATION_TEST = "notification_test"
|
|
|
|
# IO Nice Values
|
|
|
|
PROCESS_PRIORITY_HIGH = 0
|
|
PROCESS_PRIORITY_MED = 10
|
|
PROCESS_PRIORITY_LOW = 19
|
|
|
|
# Stats Values
|
|
|
|
FREQUENCY_STATS_POINTS = 15
|
|
|
|
# Autotracking
|
|
|
|
AUTOTRACKING_MAX_AREA_RATIO = 0.6
|
|
AUTOTRACKING_MOTION_MIN_DISTANCE = 20
|
|
AUTOTRACKING_MOTION_MAX_POINTS = 500
|
|
AUTOTRACKING_MAX_MOVE_METRICS = 500
|
|
AUTOTRACKING_ZOOM_OUT_HYSTERESIS = 1.1
|
|
AUTOTRACKING_ZOOM_IN_HYSTERESIS = 0.95
|
|
AUTOTRACKING_ZOOM_EDGE_THRESHOLD = 0.05
|
|
|
|
# Auth
|
|
|
|
JWT_SECRET_ENV_VAR = "FRIGATE_JWT_SECRET"
|
|
PASSWORD_HASH_ALGORITHM = "pbkdf2_sha256"
|
|
|
|
# Queues
|
|
|
|
FAST_QUEUE_TIMEOUT = 0.00001 # seconds
|