├── .cspell └── frigate-dictionary.txt ├── .devcontainer ├── devcontainer.json ├── features │ └── onnxruntime-gpu │ │ ├── devcontainer-feature.json │ │ └── install.sh ├── initialize.sh └── post_create.sh ├── .dockerignore ├── .github ├── DISCUSSION_TEMPLATE │ ├── camera-support.yml │ ├── config-support.yml │ ├── detector-support.yml │ ├── general-support.yml │ ├── hardware-acceleration-support.yml │ ├── question.yml │ └── report-a-bug.yml ├── FUNDING.yml ├── ISSUE_TEMPLATE │ ├── config.yml │ └── feature_request.md ├── actions │ └── setup │ │ └── action.yml ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── ci.yml │ ├── pull_request.yml │ ├── release.yml │ └── stale.yml ├── .gitignore ├── .pylintrc ├── .vscode └── launch.json ├── CODEOWNERS ├── LICENSE ├── Makefile ├── README.md ├── README_CN.md ├── audio-labelmap.txt ├── benchmark.py ├── benchmark_motion.py ├── config └── config.yml.example ├── cspell.json ├── docker-compose.yml ├── docker ├── hailo8l │ └── user_installation.sh ├── main │ ├── Dockerfile │ ├── build_nginx.sh │ ├── build_ov_model.py │ ├── build_pysqlite3.sh │ ├── build_sqlite_vec.sh │ ├── fake_frigate_run │ ├── install_deps.sh │ ├── install_hailort.sh │ ├── install_s6_overlay.sh │ ├── install_tempio.sh │ ├── requirements-dev.txt │ ├── requirements-ov.txt │ ├── requirements-wheels.txt │ ├── requirements.txt │ └── rootfs │ │ ├── etc │ │ └── s6-overlay │ │ │ └── s6-rc.d │ │ │ ├── certsync-log │ │ │ ├── consumer-for │ │ │ ├── dependencies.d │ │ │ │ └── log-prepare │ │ │ ├── pipeline-name │ │ │ ├── run │ │ │ └── type │ │ │ ├── certsync │ │ │ ├── dependencies.d │ │ │ │ └── nginx │ │ │ ├── finish │ │ │ ├── producer-for │ │ │ ├── run │ │ │ ├── timeout-kill │ │ │ └── type │ │ │ ├── frigate-log │ │ │ ├── consumer-for │ │ │ ├── dependencies.d │ │ │ │ └── log-prepare │ │ │ ├── pipeline-name │ │ │ ├── run │ │ │ └── type │ │ │ ├── frigate │ │ │ ├── dependencies.d │ │ │ │ └── go2rtc │ │ │ ├── finish │ │ │ ├── producer-for │ │ │ ├── run │ │ │ ├── timeout-kill │ │ │ └── type │ │ │ ├── go2rtc-healthcheck │ │ │ ├── dependencies.d │ │ │ │ └── go2rtc │ │ │ ├── finish │ │ │ ├── producer-for │ │ │ ├── run │ │ │ ├── timeout-kill │ │ │ └── type │ │ │ ├── go2rtc-log │ │ │ ├── consumer-for │ │ │ ├── dependencies.d │ │ │ │ └── log-prepare │ │ │ ├── pipeline-name │ │ │ ├── run │ │ │ └── type │ │ │ ├── go2rtc │ │ │ ├── dependencies.d │ │ │ │ └── prepare │ │ │ ├── finish │ │ │ ├── producer-for │ │ │ ├── run │ │ │ ├── timeout-kill │ │ │ └── type │ │ │ ├── log-prepare │ │ │ ├── dependencies.d │ │ │ │ └── base │ │ │ ├── run │ │ │ ├── type │ │ │ └── up │ │ │ ├── nginx-log │ │ │ ├── consumer-for │ │ │ ├── dependencies.d │ │ │ │ └── log-prepare │ │ │ ├── pipeline-name │ │ │ ├── run │ │ │ └── type │ │ │ ├── nginx │ │ │ ├── data │ │ │ │ └── check │ │ │ ├── dependencies.d │ │ │ │ └── frigate │ │ │ ├── finish │ │ │ ├── notification-fd │ │ │ ├── producer-for │ │ │ ├── run │ │ │ ├── timeout-kill │ │ │ └── type │ │ │ ├── prepare │ │ │ ├── dependencies.d │ │ │ │ └── base │ │ │ ├── run │ │ │ ├── type │ │ │ └── up │ │ │ └── user │ │ │ └── contents.d │ │ │ ├── certsync-pipeline │ │ │ ├── frigate-pipeline │ │ │ ├── go2rtc-pipeline │ │ │ └── nginx-pipeline │ │ ├── labelmap │ │ ├── coco-80.txt │ │ └── coco.txt │ │ └── usr │ │ └── local │ │ ├── ffmpeg │ │ └── get_ffmpeg_path.py │ │ ├── go2rtc │ │ └── create_config.py │ │ └── nginx │ │ ├── conf │ │ ├── auth_location.conf │ │ ├── auth_request.conf │ │ ├── go2rtc_upstream.conf │ │ ├── nginx.conf │ │ ├── proxy.conf │ │ └── proxy_trusted_headers.conf │ │ ├── get_base_path.py │ │ ├── get_tls_settings.py │ │ └── templates │ │ ├── base_path.gotmpl │ │ └── listen.gotmpl ├── rockchip │ ├── COCO │ │ ├── coco_subset_20.txt │ │ └── subset │ │ │ ├── 000000005001.jpg │ │ │ ├── 000000038829.jpg │ │ │ ├── 000000052891.jpg │ │ │ ├── 000000075612.jpg │ │ │ ├── 000000098261.jpg │ │ │ ├── 000000181542.jpg │ │ │ ├── 000000215245.jpg │ │ │ ├── 000000277005.jpg │ │ │ ├── 000000288685.jpg │ │ │ ├── 000000301421.jpg │ │ │ ├── 000000334371.jpg │ │ │ ├── 000000348481.jpg │ │ │ ├── 000000373353.jpg │ │ │ ├── 000000397681.jpg │ │ │ ├── 000000414673.jpg │ │ │ ├── 000000419312.jpg │ │ │ ├── 000000465822.jpg │ │ │ ├── 000000475732.jpg │ │ │ ├── 000000559707.jpg │ │ │ └── 000000574315.jpg │ ├── Dockerfile │ ├── conv2rknn.py │ ├── requirements-wheels-rk.txt │ ├── rk.hcl │ └── rk.mk ├── rocm │ ├── Dockerfile │ ├── requirements-wheels-rocm.txt │ ├── rocm.hcl │ └── rocm.mk ├── rpi │ ├── Dockerfile │ ├── install_deps.sh │ ├── rpi.hcl │ └── rpi.mk └── tensorrt │ ├── Dockerfile.amd64 │ ├── Dockerfile.arm64 │ ├── build_jetson_ffmpeg.sh │ ├── detector │ ├── build_python_tensorrt.sh │ ├── rootfs │ │ └── etc │ │ │ ├── ld.so.conf.d │ │ │ └── cuda_tensorrt.conf │ │ │ └── s6-overlay │ │ │ └── s6-rc.d │ │ │ ├── frigate │ │ │ └── dependencies.d │ │ │ │ └── trt-model-prepare │ │ │ └── trt-model-prepare │ │ │ ├── dependencies.d │ │ │ └── base │ │ │ ├── run │ │ │ ├── type │ │ │ └── up │ └── tensorrt_libyolo.sh │ ├── requirements-amd64.txt │ ├── requirements-arm64.txt │ ├── requirements-models-arm64.txt │ ├── trt.hcl │ └── trt.mk ├── docs ├── .gitignore ├── README.md ├── babel.config.js ├── docs │ ├── configuration │ │ ├── advanced.md │ │ ├── audio_detectors.md │ │ ├── authentication.md │ │ ├── autotracking.md │ │ ├── bird_classification.md │ │ ├── birdseye.md │ │ ├── camera_specific.md │ │ ├── cameras.md │ │ ├── face_recognition.md │ │ ├── ffmpeg_presets.md │ │ ├── genai.md │ │ ├── hardware_acceleration_enrichments.md │ │ ├── hardware_acceleration_video.md │ │ ├── index.md │ │ ├── license_plate_recognition.md │ │ ├── live.md │ │ ├── masks.md │ │ ├── metrics.md │ │ ├── motion_detection.md │ │ ├── notifications.md │ │ ├── object_detectors.md │ │ ├── object_filters.md │ │ ├── objects.md │ │ ├── pwa.md │ │ ├── record.md │ │ ├── reference.md │ │ ├── restream.md │ │ ├── review.md │ │ ├── semantic_search.md │ │ ├── snapshots.md │ │ ├── stationary_objects.md │ │ ├── tls.md │ │ └── zones.md │ ├── development │ │ ├── contributing-boards.md │ │ └── contributing.md │ ├── frigate │ │ ├── camera_setup.md │ │ ├── glossary.md │ │ ├── hardware.md │ │ ├── index.md │ │ ├── installation.md │ │ ├── updating.md │ │ └── video_pipeline.md │ ├── guides │ │ ├── configuring_go2rtc.md │ │ ├── getting_started.md │ │ ├── ha_network_storage.md │ │ ├── ha_notifications.md │ │ └── reverse_proxy.md │ ├── integrations │ │ ├── api.md │ │ ├── home-assistant.md │ │ ├── mqtt.md │ │ ├── plus.md │ │ └── third_party_extensions.md │ ├── mdx.md │ ├── plus │ │ ├── annotating.md │ │ ├── faq.md │ │ ├── first_model.md │ │ └── index.md │ └── troubleshooting │ │ ├── edgetpu.md │ │ ├── faqs.md │ │ ├── gpu.md │ │ └── recordings.md ├── docusaurus.config.ts ├── package-lock.json ├── package.json ├── plugins │ └── raw-loader.js ├── sidebars.ts ├── src │ ├── components │ │ └── LanguageAlert │ │ │ ├── index.jsx │ │ │ └── styles.module.css │ ├── css │ │ └── custom.css │ └── theme │ │ └── Navbar │ │ └── index.js └── static │ ├── .nojekyll │ ├── frigate-api.yaml │ └── img │ ├── annotate.png │ ├── autotracking-debug.gif │ ├── bottom-center-mask.jpg │ ├── bottom-center.jpg │ ├── camera-ui.png │ ├── diagram.png │ ├── driveway_zones-min.png │ ├── driveway_zones.png │ ├── events-ui.png │ ├── example-mask-poly-min.png │ ├── example-mask-poly.png │ ├── favicon.ico │ ├── frigate-autotracking-example.gif │ ├── frigate.png │ ├── ground-plane.jpg │ ├── home-ui.png │ ├── live-view.png │ ├── logo-dark.svg │ ├── logo.svg │ ├── media_browser-min.png │ ├── media_browser.png │ ├── mismatched-resolution-min.jpg │ ├── mismatched-resolution.jpg │ ├── notification-min.png │ ├── notification.png │ ├── plus-api-key-min.png │ ├── plus │ ├── attribute-example-face.jpg │ ├── attribute-example-fedex.jpg │ ├── false-positive-overlap.jpg │ ├── false-positive.jpg │ ├── fedex-logo.jpg │ ├── model-ready-email.jpg │ ├── plus-models.jpg │ ├── send-to-plus.jpg │ ├── submit-to-plus.jpg │ └── suggestions.webp │ ├── resolutions-min.jpg │ ├── resolutions.png │ └── review-items.png ├── frigate ├── __init__.py ├── __main__.py ├── api │ ├── __init__.py │ ├── app.py │ ├── auth.py │ ├── classification.py │ ├── defs │ │ ├── __init__.py │ │ ├── query │ │ │ ├── app_query_parameters.py │ │ │ ├── events_query_parameters.py │ │ │ ├── media_query_parameters.py │ │ │ ├── regenerate_query_parameters.py │ │ │ └── review_query_parameters.py │ │ ├── request │ │ │ ├── __init__.py │ │ │ ├── app_body.py │ │ │ ├── classification_body.py │ │ │ ├── events_body.py │ │ │ ├── export_recordings_body.py │ │ │ ├── export_rename_body.py │ │ │ └── review_body.py │ │ ├── response │ │ │ ├── event_response.py │ │ │ ├── generic_response.py │ │ │ └── review_response.py │ │ └── tags.py │ ├── event.py │ ├── export.py │ ├── fastapi_app.py │ ├── media.py │ ├── notification.py │ ├── preview.py │ └── review.py ├── app.py ├── camera │ ├── __init__.py │ ├── activity_manager.py │ └── state.py ├── comms │ ├── base_communicator.py │ ├── config_updater.py │ ├── detections_updater.py │ ├── dispatcher.py │ ├── embeddings_updater.py │ ├── event_metadata_updater.py │ ├── events_updater.py │ ├── inter_process.py │ ├── mqtt.py │ ├── recordings_updater.py │ ├── webpush.py │ ├── ws.py │ └── zmq_proxy.py ├── config │ ├── __init__.py │ ├── auth.py │ ├── base.py │ ├── camera │ │ ├── __init__.py │ │ ├── audio.py │ │ ├── birdseye.py │ │ ├── camera.py │ │ ├── detect.py │ │ ├── ffmpeg.py │ │ ├── genai.py │ │ ├── live.py │ │ ├── motion.py │ │ ├── mqtt.py │ │ ├── notification.py │ │ ├── objects.py │ │ ├── onvif.py │ │ ├── record.py │ │ ├── review.py │ │ ├── snapshots.py │ │ ├── timestamp.py │ │ ├── ui.py │ │ └── zone.py │ ├── camera_group.py │ ├── classification.py │ ├── config.py │ ├── database.py │ ├── env.py │ ├── logger.py │ ├── mqtt.py │ ├── proxy.py │ ├── telemetry.py │ ├── tls.py │ └── ui.py ├── const.py ├── data_processing │ ├── common │ │ ├── face │ │ │ └── model.py │ │ └── license_plate │ │ │ ├── mixin.py │ │ │ └── model.py │ ├── post │ │ ├── api.py │ │ └── license_plate.py │ ├── real_time │ │ ├── api.py │ │ ├── bird.py │ │ ├── face.py │ │ └── license_plate.py │ └── types.py ├── db │ └── sqlitevecq.py ├── detectors │ ├── __init__.py │ ├── detection_api.py │ ├── detector_config.py │ ├── detector_types.py │ └── plugins │ │ ├── __init__.py │ │ ├── cpu_tfl.py │ │ ├── deepstack.py │ │ ├── edgetpu_tfl.py │ │ ├── hailo8l.py │ │ ├── onnx.py │ │ ├── openvino.py │ │ ├── rknn.py │ │ └── tensorrt.py ├── embeddings │ ├── __init__.py │ ├── embeddings.py │ ├── maintainer.py │ ├── onnx │ │ ├── base_embedding.py │ │ ├── face_embedding.py │ │ ├── jina_v1_embedding.py │ │ ├── jina_v2_embedding.py │ │ ├── lpr_embedding.py │ │ └── runner.py │ └── util.py ├── events │ ├── __init__.py │ ├── audio.py │ ├── cleanup.py │ ├── maintainer.py │ └── types.py ├── ffmpeg_presets.py ├── genai │ ├── __init__.py │ ├── azure-openai.py │ ├── gemini.py │ ├── ollama.py │ └── openai.py ├── images │ ├── birdseye.png │ └── camera-error.jpg ├── log.py ├── models.py ├── motion │ ├── __init__.py │ ├── frigate_motion.py │ └── improved_motion.py ├── mypy.ini ├── object_detection │ ├── base.py │ └── util.py ├── output │ ├── birdseye.py │ ├── camera.py │ ├── output.py │ └── preview.py ├── plus.py ├── ptz │ ├── autotrack.py │ └── onvif.py ├── record │ ├── __init__.py │ ├── cleanup.py │ ├── export.py │ ├── maintainer.py │ ├── record.py │ └── util.py ├── review │ ├── __init__.py │ ├── maintainer.py │ ├── review.py │ └── types.py ├── service_manager │ ├── __init__.py │ ├── multiprocessing.py │ ├── multiprocessing_waiter.py │ └── service.py ├── stats │ ├── __init__.py │ ├── emitter.py │ ├── prometheus.py │ └── util.py ├── storage.py ├── test │ ├── __init__.py │ ├── const.py │ ├── http_api │ │ ├── __init__.py │ │ ├── base_http_test.py │ │ ├── test_http_app.py │ │ ├── test_http_event.py │ │ └── test_http_review.py │ ├── test_birdseye.py │ ├── test_camera_pw.py │ ├── test_config.py │ ├── test_copy_yuv_to_position.py │ ├── test_ffmpeg_presets.py │ ├── test_gpu_stats.py │ ├── test_http.py │ ├── test_obects.py │ ├── test_object_detector.py │ ├── test_record_retention.py │ ├── test_reduce_boxes.py │ ├── test_storage.py │ ├── test_video.py │ └── test_yuv_region_2_rgb.py ├── timeline.py ├── track │ ├── __init__.py │ ├── centroid_tracker.py │ ├── norfair_tracker.py │ ├── object_processing.py │ └── tracked_object.py ├── types.py ├── util │ ├── __init__.py │ ├── builtin.py │ ├── config.py │ ├── downloader.py │ ├── image.py │ ├── model.py │ ├── object.py │ ├── path.py │ ├── process.py │ ├── services.py │ └── velocity.py ├── video.py └── watchdog.py ├── labelmap.txt ├── migrations ├── 001_create_events_table.py ├── 002_add_clip_snapshot.py ├── 003_create_recordings_table.py ├── 004_add_bbox_region_area.py ├── 005_make_end_time_nullable.py ├── 006_add_motion_active_objects.py ├── 007_add_retain_indefinitely.py ├── 008_add_sub_label.py ├── 009_add_object_filter_ratio.py ├── 010_add_plus_image_id.py ├── 011_update_indexes.py ├── 012_add_segment_size.py ├── 013_create_timeline_table.py ├── 014_event_updates_for_fp.py ├── 015_event_refactor.py ├── 016_sublabel_increase.py ├── 017_update_indexes.py ├── 018_add_dbfs.py ├── 019_create_regions_table.py ├── 020_update_index_recordings.py ├── 021_create_previews_table.py ├── 022_create_review_segment_table.py ├── 023_add_regions.py ├── 024_create_export_table.py ├── 025_create_user_table.py ├── 026_add_notification_tokens.py ├── 027_create_explore_index.py ├── 028_optional_event_thumbnail.py ├── 029_add_user_role.py └── 030_create_user_review_status.py ├── netlify.toml ├── notebooks ├── README.md └── YOLO_NAS_Pretrained_Export.ipynb ├── package-lock.json ├── process_clip.py ├── pyproject.toml └── web ├── .eslintrc.cjs ├── .gitignore ├── .prettierrc ├── .vscode └── extensions.json ├── README.md ├── components.json ├── images ├── apple-touch-icon.png ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon.ico ├── favicon.png ├── favicon.svg ├── marker.png └── mstile-150x150.png ├── index.html ├── login.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── fonts │ ├── Inter-Black.woff2 │ ├── Inter-BlackItalic.woff2 │ ├── Inter-Bold.woff2 │ ├── Inter-BoldItalic.woff2 │ ├── Inter-ExtraBold.woff2 │ ├── Inter-ExtraBoldItalic.woff2 │ ├── Inter-ExtraLight.woff2 │ ├── Inter-ExtraLightItalic.woff2 │ ├── Inter-Italic.woff2 │ ├── Inter-Light.woff2 │ ├── Inter-LightItalic.woff2 │ ├── Inter-Medium.woff2 │ ├── Inter-MediumItalic.woff2 │ ├── Inter-Regular.woff2 │ ├── Inter-SemiBold.woff2 │ ├── Inter-SemiBoldItalic.woff2 │ ├── Inter-Thin.woff2 │ └── Inter-ThinItalic.woff2 ├── images │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── maskable-badge.png │ └── maskable-icon.png ├── locales │ ├── ab │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ar │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── bg │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ca │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── cs │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── de │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── en │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── es │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── fa │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── fi │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── fr │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── he │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── hi │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── hu │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── id │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── it │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ja │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── nb-NO │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── nl │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── pl │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── pt │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ro │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ru │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── sl │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── sv │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── th │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── tr │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── uk │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── ur │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── vi │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ ├── yue-Hant │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ │ ├── auth.json │ │ │ ├── camera.json │ │ │ ├── dialog.json │ │ │ ├── filter.json │ │ │ ├── icons.json │ │ │ ├── input.json │ │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ │ ├── configEditor.json │ │ │ ├── events.json │ │ │ ├── explore.json │ │ │ ├── exports.json │ │ │ ├── faceLibrary.json │ │ │ ├── live.json │ │ │ ├── recording.json │ │ │ ├── search.json │ │ │ ├── settings.json │ │ │ └── system.json │ └── zh-CN │ │ ├── audio.json │ │ ├── common.json │ │ ├── components │ │ ├── auth.json │ │ ├── camera.json │ │ ├── dialog.json │ │ ├── filter.json │ │ ├── icons.json │ │ ├── input.json │ │ └── player.json │ │ ├── objects.json │ │ └── views │ │ ├── configEditor.json │ │ ├── events.json │ │ ├── explore.json │ │ ├── exports.json │ │ ├── faceLibrary.json │ │ ├── live.json │ │ ├── recording.json │ │ ├── search.json │ │ ├── settings.json │ │ └── system.json └── notifications-worker.js ├── site.webmanifest ├── src ├── App.tsx ├── api │ ├── baseUrl.ts │ ├── index.tsx │ └── ws.tsx ├── components │ ├── Logo.tsx │ ├── Statusbar.tsx │ ├── Wrapper.tsx │ ├── auth │ │ ├── AuthForm.tsx │ │ └── ProtectedRoute.tsx │ ├── button │ │ └── DownloadVideoButton.tsx │ ├── camera │ │ ├── AutoUpdatingCameraImage.tsx │ │ ├── CameraImage.tsx │ │ ├── DebugCameraImage.tsx │ │ └── ResizingCameraImage.tsx │ ├── card │ │ ├── AnimatedEventCard.tsx │ │ ├── ExportCard.tsx │ │ ├── ReviewCard.tsx │ │ ├── SearchThumbnail.tsx │ │ └── SearchThumbnailFooter.tsx │ ├── dynamic │ │ ├── CameraFeatureToggle.tsx │ │ ├── EnhancedScrollFollow.tsx │ │ ├── NewReviewData.tsx │ │ └── TimeAgo.tsx │ ├── filter │ │ ├── CalendarFilterButton.tsx │ │ ├── CameraGroupSelector.tsx │ │ ├── CamerasFilterButton.tsx │ │ ├── FilterSwitch.tsx │ │ ├── LogSettingsButton.tsx │ │ ├── ReviewActionGroup.tsx │ │ ├── ReviewFilterGroup.tsx │ │ ├── SearchActionGroup.tsx │ │ ├── SearchFilterGroup.tsx │ │ └── ZoneMaskFilter.tsx │ ├── graph │ │ ├── CombinedStorageGraph.tsx │ │ ├── LineGraph.tsx │ │ ├── StorageGraph.tsx │ │ └── SystemGraph.tsx │ ├── icons │ │ ├── AddFaceIcon.tsx │ │ ├── FrigatePlusIcon.tsx │ │ ├── IconPicker.tsx │ │ ├── LiveIcons.tsx │ │ ├── SearchSourceIcon.tsx │ │ └── SubFilterIcon.tsx │ ├── indicators │ │ ├── CameraActivityIndicator.tsx │ │ ├── Chip.tsx │ │ ├── ImageLoadingIndicator.tsx │ │ ├── StepIndicator.tsx │ │ └── activity-indicator.tsx │ ├── input │ │ ├── DeleteSearchDialog.tsx │ │ ├── ImageEntry.tsx │ │ ├── InputWithTags.tsx │ │ ├── SaveSearchDialog.tsx │ │ └── TextEntry.tsx │ ├── menu │ │ ├── AccountSettings.tsx │ │ ├── GeneralSettings.tsx │ │ ├── LiveContextMenu.tsx │ │ └── SearchResultActions.tsx │ ├── mobile │ │ └── MobilePage.tsx │ ├── navigation │ │ ├── Bottombar.tsx │ │ ├── NavItem.tsx │ │ ├── Redirect.tsx │ │ └── Sidebar.tsx │ ├── overlay │ │ ├── CameraInfoDialog.tsx │ │ ├── CreateUserDialog.tsx │ │ ├── DebugDrawingLayer.tsx │ │ ├── DeleteUserDialog.tsx │ │ ├── ExportDialog.tsx │ │ ├── FaceSelectionDialog.tsx │ │ ├── GPUInfoDialog.tsx │ │ ├── LogInfoDialog.tsx │ │ ├── MobileCameraDrawer.tsx │ │ ├── MobileReviewSettingsDrawer.tsx │ │ ├── MobileTimelineDrawer.tsx │ │ ├── ReviewActivityCalendar.tsx │ │ ├── RoleChangeDialog.tsx │ │ ├── SaveExportOverlay.tsx │ │ ├── SetPasswordDialog.tsx │ │ ├── TimelineDataOverlay.tsx │ │ ├── detail │ │ │ ├── AnnotationSettingsPane.tsx │ │ │ ├── FaceCreateWizardDialog.tsx │ │ │ ├── ObjectLifecycle.tsx │ │ │ ├── ObjectPath.tsx │ │ │ ├── ObjectPathPlotter.tsx │ │ │ ├── ReviewDetailDialog.tsx │ │ │ └── SearchDetailDialog.tsx │ │ └── dialog │ │ │ ├── FrigatePlusDialog.tsx │ │ │ ├── PlatformAwareDialog.tsx │ │ │ ├── RestartDialog.tsx │ │ │ ├── SearchFilterDialog.tsx │ │ │ ├── TextEntryDialog.tsx │ │ │ └── UploadImageDialog.tsx │ ├── player │ │ ├── BirdseyeLivePlayer.tsx │ │ ├── GenericVideoPlayer.tsx │ │ ├── HlsVideoPlayer.tsx │ │ ├── JSMpegPlayer.tsx │ │ ├── LivePlayer.tsx │ │ ├── MsePlayer.tsx │ │ ├── PlayerStats.tsx │ │ ├── PreviewPlayer.tsx │ │ ├── PreviewThumbnailPlayer.tsx │ │ ├── VideoControls.tsx │ │ ├── WebRTCPlayer.tsx │ │ └── dynamic │ │ │ ├── DynamicVideoController.ts │ │ │ └── DynamicVideoPlayer.tsx │ ├── preview │ │ └── ScrubbablePreview.tsx │ ├── settings │ │ ├── CameraStreamingDialog.tsx │ │ ├── MotionMaskEditPane.tsx │ │ ├── ObjectMaskEditPane.tsx │ │ ├── PolygonCanvas.tsx │ │ ├── PolygonDrawer.tsx │ │ ├── PolygonEditControls.tsx │ │ ├── PolygonItem.tsx │ │ ├── SearchSettings.tsx │ │ └── ZoneEditPane.tsx │ ├── timeline │ │ ├── EventReviewTimeline.tsx │ │ ├── EventSegment.tsx │ │ ├── MotionReviewTimeline.tsx │ │ ├── MotionSegment.tsx │ │ ├── ReviewTimeline.tsx │ │ ├── SummarySegment.tsx │ │ ├── SummaryTimeline.tsx │ │ ├── VirtualizedEventSegments.tsx │ │ ├── VirtualizedMotionSegments.tsx │ │ └── segment-metadata.tsx │ └── ui │ │ ├── alert-dialog.tsx │ │ ├── alert.tsx │ │ ├── aspect-ratio.tsx │ │ ├── badge.tsx │ │ ├── button.tsx │ │ ├── calendar-range.tsx │ │ ├── calendar.tsx │ │ ├── card.tsx │ │ ├── carousel.tsx │ │ ├── checkbox.tsx │ │ ├── circular-progress-bar.tsx │ │ ├── command.tsx │ │ ├── context-menu.tsx │ │ ├── dialog.tsx │ │ ├── drawer.tsx │ │ ├── dropdown-menu.tsx │ │ ├── form.tsx │ │ ├── heading.tsx │ │ ├── hover-card.tsx │ │ ├── icon-wrapper.tsx │ │ ├── input.tsx │ │ ├── label.tsx │ │ ├── pagination.tsx │ │ ├── popover.tsx │ │ ├── radio-group.tsx │ │ ├── scroll-area.tsx │ │ ├── select.tsx │ │ ├── separator.tsx │ │ ├── sheet.tsx │ │ ├── skeleton.tsx │ │ ├── slider.tsx │ │ ├── sonner.tsx │ │ ├── switch.tsx │ │ ├── table.tsx │ │ ├── tabs.tsx │ │ ├── text.tsx │ │ ├── textarea.tsx │ │ ├── toggle-group.tsx │ │ ├── toggle.tsx │ │ └── tooltip.tsx ├── context │ ├── auth-context.tsx │ ├── language-provider.tsx │ ├── providers.tsx │ ├── statusbar-provider.tsx │ ├── streaming-settings-provider.tsx │ └── theme-provider.tsx ├── env.ts ├── hooks │ ├── resize-observer.ts │ ├── use-api-filter.ts │ ├── use-camera-activity.ts │ ├── use-camera-live-mode.ts │ ├── use-camera-previews.ts │ ├── use-contextmenu.ts │ ├── use-date-locale.ts │ ├── use-date-utils.ts │ ├── use-deep-memo.ts │ ├── use-doc-domain.ts │ ├── use-draggable-element.ts │ ├── use-event-segment-utils.ts │ ├── use-fullscreen.ts │ ├── use-global-mutate.ts │ ├── use-image-loaded.ts │ ├── use-is-admin.ts │ ├── use-keyboard-listener.tsx │ ├── use-motion-segment-utils.ts │ ├── use-mouse-listener.ts │ ├── use-navigation.ts │ ├── use-optimistic-state.ts │ ├── use-overlay-state.tsx │ ├── use-persistence.ts │ ├── use-press.ts │ ├── use-session-persistence.ts │ ├── use-stats.ts │ ├── use-suggestions.ts │ ├── use-tap-utils.ts │ ├── use-timeline-utils.ts │ ├── use-timeline-zoom.ts │ └── use-video-dimensions.ts ├── index.css ├── lib │ ├── const.ts │ ├── formatTimeAgo.ts │ └── utils.ts ├── login.tsx ├── main.tsx ├── pages │ ├── AccessDenied.tsx │ ├── ConfigEditor.tsx │ ├── Events.tsx │ ├── Explore.tsx │ ├── Exports.tsx │ ├── FaceLibrary.tsx │ ├── Live.tsx │ ├── LoginPage.tsx │ ├── Logs.tsx │ ├── NoMatch.tsx │ ├── Settings.tsx │ ├── System.tsx │ └── UIPlayground.tsx ├── types │ ├── canvas.ts │ ├── draggable-element.ts │ ├── event.ts │ ├── export.ts │ ├── face.ts │ ├── filter.ts │ ├── frigateConfig.ts │ ├── graph.ts │ ├── live.ts │ ├── log.ts │ ├── navigation.ts │ ├── playback.ts │ ├── preview.ts │ ├── ptz.ts │ ├── record.ts │ ├── review.ts │ ├── search.ts │ ├── stats.ts │ ├── timeline.ts │ ├── user.ts │ └── ws.ts ├── utils │ ├── browserUtil.ts │ ├── canvasUtil.ts │ ├── colorUtil.ts │ ├── dateUtil.ts │ ├── i18n.ts │ ├── iconUtil.tsx │ ├── isIFrame.ts │ ├── isPWA.ts │ ├── lifecycleUtil.ts │ ├── logUtil.ts │ ├── storageUtil.ts │ ├── stringUtil.ts │ ├── timelineUtil.tsx │ ├── videoUtil.ts │ └── zoneEdutUtil.ts ├── views │ ├── events │ │ └── EventView.tsx │ ├── explore │ │ └── ExploreView.tsx │ ├── live │ │ ├── DraggableGridLayout.tsx │ │ ├── LiveBirdseyeView.tsx │ │ ├── LiveCameraView.tsx │ │ └── LiveDashboardView.tsx │ ├── recording │ │ └── RecordingView.tsx │ ├── search │ │ └── SearchView.tsx │ ├── settings │ │ ├── AuthenticationView.tsx │ │ ├── CameraSettingsView.tsx │ │ ├── EnrichmentsSettingsView.tsx │ │ ├── FrigatePlusSettingsView.tsx │ │ ├── MasksAndZonesView.tsx │ │ ├── MotionTunerView.tsx │ │ ├── NotificationsSettingsView.tsx │ │ ├── ObjectSettingsView.tsx │ │ └── UiSettingsView.tsx │ └── system │ │ ├── CameraMetrics.tsx │ │ ├── EnrichmentMetrics.tsx │ │ ├── GeneralMetrics.tsx │ │ └── StorageMetrics.tsx └── vite-env.d.ts ├── tailwind.config.cjs ├── themes ├── tailwind-base.css ├── theme-blue.css ├── theme-default.css ├── theme-green.css ├── theme-high-contrast.css ├── theme-nord.css └── theme-red.css ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.devcontainer/features/onnxruntime-gpu/install.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | VERSION=${VERSION} 6 | 7 | python3 -m pip config set global.break-system-packages true 8 | # if VERSION == "latest" or VERSION is empty, install the latest version 9 | if [ "$VERSION" == "latest" ] || [ -z "$VERSION" ]; then 10 | python3 -m pip install onnxruntime-gpu 11 | else 12 | python3 -m pip install onnxruntime-gpu==$VERSION 13 | fi 14 | 15 | echo "Done!" -------------------------------------------------------------------------------- /.devcontainer/initialize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euo pipefail 4 | 5 | # These folders needs to be created and owned by the host user 6 | mkdir -p debug web/dist 7 | 8 | if [[ -f "config/config.yml" ]]; then 9 | echo "config/config.yml already exists, skipping initialization" >&2 10 | else 11 | echo "initializing config/config.yml" >&2 12 | cp -fv config/config.yml.example config/config.yml 13 | fi 14 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | README.md 2 | docs/ 3 | .gitignore 4 | debug 5 | config/ 6 | *.pyc 7 | .git 8 | core 9 | *.mp4 10 | *.jpg 11 | *.db 12 | *.ts 13 | 14 | web/dist/ 15 | web/node_modules/ 16 | web/.npm 17 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: 2 | - blakeblackshear 3 | - NickM-27 4 | - hawkeye217 5 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Frigate Support 4 | url: https://github.com/blakeblackshear/frigate/discussions/new/choose 5 | about: Get support for setting up or troubleshooting Frigate. 6 | - name: Frigate Bug Report 7 | url: https://github.com/blakeblackshear/frigate/discussions/new/choose 8 | about: Report a specific UI or backend bug. 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | __pycache__ 3 | .mypy_cache 4 | *.swp 5 | debug 6 | .vscode/* 7 | !.vscode/launch.json 8 | config/* 9 | !config/*.example 10 | models 11 | *.mp4 12 | *.db 13 | *.csv 14 | frigate/version.py 15 | web/build 16 | web/node_modules 17 | web/coverage 18 | core 19 | !/web/**/*.ts 20 | .idea/* 21 | .ipynb_checkpoints -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2.0", 3 | "configurations": [ 4 | { 5 | "name": "Python: Launch Frigate", 6 | "type": "debugpy", 7 | "request": "launch", 8 | "module": "frigate" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Community-supported boards 2 | /docker/tensorrt/ @madsciencetist @NateMeyer 3 | /docker/tensorrt/*arm64* @madsciencetist 4 | /docker/tensorrt/*jetson* @madsciencetist 5 | /docker/rockchip/ @MarcA711 6 | /docker/rocm/ @harakas 7 | /docker/hailo8l/ @spanner3003 8 | -------------------------------------------------------------------------------- /config/config.yml.example: -------------------------------------------------------------------------------- 1 | mqtt: 2 | host: mqtt 3 | 4 | cameras: 5 | test: 6 | ffmpeg: 7 | inputs: 8 | - path: /media/frigate/car-stopping.mp4 9 | input_args: -re -stream_loop -1 -fflags +genpts 10 | roles: 11 | - detect 12 | - rtmp 13 | detect: 14 | height: 1080 15 | width: 1920 16 | fps: 5 17 | -------------------------------------------------------------------------------- /cspell.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.2", 3 | "ignorePaths": [ 4 | "Dockerfile", 5 | "Dockerfile.*", 6 | "CMakeLists.txt", 7 | "*.db", 8 | "node_modules", 9 | "__pycache__", 10 | "dist", 11 | "/audio-labelmap.txt" 12 | ], 13 | "language": "en", 14 | "dictionaryDefinitions": [ 15 | { 16 | "name": "frigate-dictionary", 17 | "path": "./.cspell/frigate-dictionary.txt", 18 | "addWords": true 19 | } 20 | ], 21 | "dictionaries": ["frigate-dictionary"] 22 | } 23 | -------------------------------------------------------------------------------- /docker/main/build_ov_model.py: -------------------------------------------------------------------------------- 1 | import openvino as ov 2 | from openvino.tools import mo 3 | 4 | ov_model = mo.convert_model( 5 | "/models/ssdlite_mobilenet_v2_coco_2018_05_09/frozen_inference_graph.pb", 6 | compress_to_fp16=True, 7 | transformations_config="/usr/local/lib/python3.11/dist-packages/openvino/tools/mo/front/tf/ssd_v2_support.json", 8 | tensorflow_object_detection_api_pipeline_config="/models/ssdlite_mobilenet_v2_coco_2018_05_09/pipeline.config", 9 | reverse_input_channels=True, 10 | ) 11 | ov.save_model(ov_model, "/models/ssdlite_mobilenet_v2.xml") 12 | -------------------------------------------------------------------------------- /docker/main/fake_frigate_run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | # Start the fake Frigate service 4 | 5 | set -o errexit -o nounset -o pipefail 6 | 7 | # Tell S6-Overlay not to restart this service 8 | s6-svc -O . 9 | 10 | while true; do 11 | echo "[INFO] The fake Frigate service is running..." 12 | sleep 5s 13 | done 14 | -------------------------------------------------------------------------------- /docker/main/install_hailort.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | hailo_version="4.21.0" 6 | 7 | if [[ "${TARGETARCH}" == "amd64" ]]; then 8 | arch="x86_64" 9 | elif [[ "${TARGETARCH}" == "arm64" ]]; then 10 | arch="aarch64" 11 | fi 12 | 13 | wget -qO- "https://github.com/frigate-nvr/hailort/releases/download/v${hailo_version}/hailort-debian12-${TARGETARCH}.tar.gz" | tar -C / -xzf - 14 | wget -P /wheels/ "https://github.com/frigate-nvr/hailort/releases/download/v${hailo_version}/hailort-${hailo_version}-cp311-cp311-linux_${arch}.whl" 15 | -------------------------------------------------------------------------------- /docker/main/install_s6_overlay.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | s6_version="3.2.1.0" 6 | 7 | if [[ "${TARGETARCH}" == "amd64" ]]; then 8 | s6_arch="x86_64" 9 | elif [[ "${TARGETARCH}" == "arm64" ]]; then 10 | s6_arch="aarch64" 11 | fi 12 | 13 | mkdir -p /rootfs/ 14 | 15 | wget -qO- "https://github.com/just-containers/s6-overlay/releases/download/v${s6_version}/s6-overlay-noarch.tar.xz" | 16 | tar -C /rootfs/ -Jxpf - 17 | 18 | wget -qO- "https://github.com/just-containers/s6-overlay/releases/download/v${s6_version}/s6-overlay-${s6_arch}.tar.xz" | 19 | tar -C /rootfs/ -Jxpf - 20 | -------------------------------------------------------------------------------- /docker/main/install_tempio.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -euxo pipefail 4 | 5 | tempio_version="2021.09.0" 6 | 7 | if [[ "${TARGETARCH}" == "amd64" ]]; then 8 | arch="amd64" 9 | elif [[ "${TARGETARCH}" == "arm64" ]]; then 10 | arch="aarch64" 11 | fi 12 | 13 | mkdir -p /rootfs/usr/local/tempio/bin 14 | 15 | wget -q -O /rootfs/usr/local/tempio/bin/tempio "https://github.com/home-assistant/tempio/releases/download/${tempio_version}/tempio_${arch}" 16 | chmod 755 /rootfs/usr/local/tempio/bin/tempio 17 | -------------------------------------------------------------------------------- /docker/main/requirements-dev.txt: -------------------------------------------------------------------------------- 1 | ruff 2 | -------------------------------------------------------------------------------- /docker/main/requirements-ov.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | tensorflow 3 | openvino-dev>=2024.0.0 -------------------------------------------------------------------------------- /docker/main/requirements.txt: -------------------------------------------------------------------------------- 1 | scikit-build == 0.18.* 2 | nvidia-pyindex 3 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/consumer-for: -------------------------------------------------------------------------------- 1 | certsync 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/dependencies.d/log-prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/dependencies.d/log-prepare -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/pipeline-name: -------------------------------------------------------------------------------- 1 | certsync-pipeline 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec logutil-service /dev/shm/logs/certsync 5 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync-log/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/dependencies.d/nginx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/dependencies.d/nginx -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/producer-for: -------------------------------------------------------------------------------- 1 | certsync-log 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/timeout-kill: -------------------------------------------------------------------------------- 1 | 30000 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/certsync/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/consumer-for: -------------------------------------------------------------------------------- 1 | frigate 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/dependencies.d/log-prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/dependencies.d/log-prepare -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/pipeline-name: -------------------------------------------------------------------------------- 1 | frigate-pipeline 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec logutil-service /dev/shm/logs/frigate 5 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate-log/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/go2rtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/go2rtc -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/producer-for: -------------------------------------------------------------------------------- 1 | frigate-log 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/timeout-kill: -------------------------------------------------------------------------------- 1 | 120000 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/frigate/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/dependencies.d/go2rtc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/dependencies.d/go2rtc -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/finish: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | set -o errexit -o nounset -o pipefail 5 | 6 | # Logs should be sent to stdout so that s6 can collect them 7 | 8 | readonly exit_code_service="${1}" 9 | readonly exit_code_signal="${2}" 10 | readonly service="go2rtc-healthcheck" 11 | 12 | echo "[INFO] The ${service} service exited with code ${exit_code_service} (by signal ${exit_code_signal})" 13 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/producer-for: -------------------------------------------------------------------------------- 1 | go2rtc-log 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/timeout-kill: -------------------------------------------------------------------------------- 1 | 5000 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-healthcheck/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/consumer-for: -------------------------------------------------------------------------------- 1 | go2rtc 2 | go2rtc-healthcheck 3 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/dependencies.d/log-prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/dependencies.d/log-prepare -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/pipeline-name: -------------------------------------------------------------------------------- 1 | go2rtc-pipeline 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec logutil-service /dev/shm/logs/go2rtc 5 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc-log/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/dependencies.d/prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/dependencies.d/prepare -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/finish: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | set -o errexit -o nounset -o pipefail 5 | 6 | # Logs should be sent to stdout so that s6 can collect them 7 | 8 | readonly exit_code_service="${1}" 9 | readonly exit_code_signal="${2}" 10 | readonly service="go2rtc" 11 | 12 | echo "[INFO] The ${service} service exited with code ${exit_code_service} (by signal ${exit_code_signal})" 13 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/producer-for: -------------------------------------------------------------------------------- 1 | go2rtc-log 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/timeout-kill: -------------------------------------------------------------------------------- 1 | 30000 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/go2rtc/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/dependencies.d/base: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/dependencies.d/base -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | # Prepare the logs folder for s6-log 4 | 5 | set -o errexit -o nounset -o pipefail 6 | 7 | dirs=(/dev/shm/logs/frigate /dev/shm/logs/go2rtc /dev/shm/logs/nginx /dev/shm/logs/certsync) 8 | 9 | mkdir -p "${dirs[@]}" 10 | chown nobody:nogroup "${dirs[@]}" 11 | chmod 02755 "${dirs[@]}" 12 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/type: -------------------------------------------------------------------------------- 1 | oneshot 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/log-prepare/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/log-prepare/run 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/consumer-for: -------------------------------------------------------------------------------- 1 | nginx 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/dependencies.d/log-prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/dependencies.d/log-prepare -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/pipeline-name: -------------------------------------------------------------------------------- 1 | nginx-pipeline 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/run: -------------------------------------------------------------------------------- 1 | #!/command/with-contenv bash 2 | # shellcheck shell=bash 3 | 4 | exec logutil-service /dev/shm/logs/nginx 5 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx-log/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/data/check: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | # Wait for PID file to exist. 5 | while ! test -f /run/nginx.pid; do sleep 1; done -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/dependencies.d/frigate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/dependencies.d/frigate -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/notification-fd: -------------------------------------------------------------------------------- 1 | 3 -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/producer-for: -------------------------------------------------------------------------------- 1 | nginx-log 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/timeout-kill: -------------------------------------------------------------------------------- 1 | 30000 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/nginx/type: -------------------------------------------------------------------------------- 1 | longrun 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/prepare/dependencies.d/base: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/prepare/dependencies.d/base -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/prepare/type: -------------------------------------------------------------------------------- 1 | oneshot 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/prepare/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/prepare/run 2 | -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/certsync-pipeline: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/certsync-pipeline -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/frigate-pipeline: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/frigate-pipeline -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/go2rtc-pipeline: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/go2rtc-pipeline -------------------------------------------------------------------------------- /docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nginx-pipeline: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/main/rootfs/etc/s6-overlay/s6-rc.d/user/contents.d/nginx-pipeline -------------------------------------------------------------------------------- /docker/main/rootfs/usr/local/nginx/conf/go2rtc_upstream.conf: -------------------------------------------------------------------------------- 1 | upstream go2rtc { 2 | server 127.0.0.1:1984; 3 | keepalive 1024; 4 | } -------------------------------------------------------------------------------- /docker/main/rootfs/usr/local/nginx/get_base_path.py: -------------------------------------------------------------------------------- 1 | """Prints the base path as json to stdout.""" 2 | 3 | import json 4 | import os 5 | from typing import Any 6 | 7 | base_path = os.environ.get("FRIGATE_BASE_PATH", "") 8 | 9 | result: dict[str, Any] = {"base_path": base_path} 10 | 11 | print(json.dumps(result)) 12 | -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000005001.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000005001.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000038829.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000038829.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000052891.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000052891.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000075612.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000075612.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000098261.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000098261.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000181542.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000181542.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000215245.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000215245.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000277005.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000277005.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000288685.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000288685.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000301421.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000301421.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000334371.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000334371.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000348481.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000348481.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000373353.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000373353.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000397681.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000397681.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000414673.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000414673.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000419312.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000419312.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000465822.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000465822.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000475732.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000475732.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000559707.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000559707.jpg -------------------------------------------------------------------------------- /docker/rockchip/COCO/subset/000000574315.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/rockchip/COCO/subset/000000574315.jpg -------------------------------------------------------------------------------- /docker/rockchip/requirements-wheels-rk.txt: -------------------------------------------------------------------------------- 1 | rknn-toolkit2 == 2.3.2 2 | rknn-toolkit-lite2 == 2.3.2 -------------------------------------------------------------------------------- /docker/rockchip/rk.mk: -------------------------------------------------------------------------------- 1 | BOARDS += rk 2 | 3 | local-rk: version 4 | docker buildx bake --file=docker/rockchip/rk.hcl rk \ 5 | --set rk.tags=frigate:latest-rk \ 6 | --load 7 | 8 | build-rk: version 9 | docker buildx bake --file=docker/rockchip/rk.hcl rk \ 10 | --set rk.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-rk 11 | 12 | push-rk: build-rk 13 | docker buildx bake --file=docker/rockchip/rk.hcl rk \ 14 | --set rk.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-rk \ 15 | --push -------------------------------------------------------------------------------- /docker/rocm/requirements-wheels-rocm.txt: -------------------------------------------------------------------------------- 1 | onnxruntime-rocm @ https://github.com/NickM-27/frigate-onnxruntime-rocm/releases/download/v6.3.3/onnxruntime_rocm-1.20.1-cp311-cp311-linux_x86_64.whl -------------------------------------------------------------------------------- /docker/rpi/Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1.4 2 | 3 | # https://askubuntu.com/questions/972516/debian-frontend-environment-variable 4 | ARG DEBIAN_FRONTEND=noninteractive 5 | 6 | FROM deps AS rpi-deps 7 | ARG TARGETARCH 8 | 9 | # Install dependencies 10 | RUN --mount=type=bind,source=docker/rpi/install_deps.sh,target=/deps/install_deps.sh \ 11 | /deps/install_deps.sh 12 | 13 | ENV DEFAULT_FFMPEG_VERSION="rpi" 14 | ENV INCLUDED_FFMPEG_VERSIONS="${DEFAULT_FFMPEG_VERSION}:${INCLUDED_FFMPEG_VERSIONS}" 15 | 16 | WORKDIR /opt/frigate/ 17 | COPY --from=rootfs / / 18 | -------------------------------------------------------------------------------- /docker/rpi/rpi.hcl: -------------------------------------------------------------------------------- 1 | target deps { 2 | dockerfile = "docker/main/Dockerfile" 3 | platforms = ["linux/arm64"] 4 | target = "deps" 5 | } 6 | 7 | target rootfs { 8 | dockerfile = "docker/main/Dockerfile" 9 | platforms = ["linux/arm64"] 10 | target = "rootfs" 11 | } 12 | 13 | target rpi { 14 | dockerfile = "docker/rpi/Dockerfile" 15 | contexts = { 16 | deps = "target:deps", 17 | rootfs = "target:rootfs" 18 | } 19 | platforms = ["linux/arm64"] 20 | } -------------------------------------------------------------------------------- /docker/rpi/rpi.mk: -------------------------------------------------------------------------------- 1 | BOARDS += rpi 2 | 3 | local-rpi: version 4 | docker buildx bake --file=docker/rpi/rpi.hcl rpi \ 5 | --set rpi.tags=frigate:latest-rpi \ 6 | --load 7 | 8 | build-rpi: version 9 | docker buildx bake --file=docker/rpi/rpi.hcl rpi \ 10 | --set rpi.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-rpi 11 | 12 | push-rpi: build-rpi 13 | docker buildx bake --file=docker/rpi/rpi.hcl rpi \ 14 | --set rpi.tags=$(IMAGE_REPO):${GITHUB_REF_NAME}-$(COMMIT_HASH)-rpi \ 15 | --push 16 | -------------------------------------------------------------------------------- /docker/tensorrt/detector/rootfs/etc/ld.so.conf.d/cuda_tensorrt.conf: -------------------------------------------------------------------------------- 1 | /usr/local/lib/python3.11/dist-packages/nvidia/cudnn/lib 2 | /usr/local/lib/python3.11/dist-packages/nvidia/cuda_runtime/lib 3 | /usr/local/lib/python3.11/dist-packages/nvidia/cublas/lib 4 | /usr/local/lib/python3.11/dist-packages/nvidia/cufft/lib 5 | /usr/local/lib/python3.11/dist-packages/nvidia/curand/lib/ 6 | /usr/local/lib/python3.11/dist-packages/nvidia/cuda_nvrtc/lib/ -------------------------------------------------------------------------------- /docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/trt-model-prepare: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/frigate/dependencies.d/trt-model-prepare -------------------------------------------------------------------------------- /docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/dependencies.d/base: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/dependencies.d/base -------------------------------------------------------------------------------- /docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/type: -------------------------------------------------------------------------------- 1 | oneshot 2 | -------------------------------------------------------------------------------- /docker/tensorrt/detector/rootfs/etc/s6-overlay/s6-rc.d/trt-model-prepare/up: -------------------------------------------------------------------------------- 1 | /etc/s6-overlay/s6-rc.d/trt-model-prepare/run 2 | -------------------------------------------------------------------------------- /docker/tensorrt/requirements-arm64.txt: -------------------------------------------------------------------------------- 1 | cuda-python == 12.6.*; platform_machine == 'aarch64' 2 | -------------------------------------------------------------------------------- /docker/tensorrt/requirements-models-arm64.txt: -------------------------------------------------------------------------------- 1 | onnx == 1.14.0; platform_machine == 'aarch64' 2 | protobuf == 3.20.3; platform_machine == 'aarch64' 3 | numpy == 1.23.*; platform_machine == 'aarch64' # required by python-tensorrt 8.2.1 (Jetpack 4.6) 4 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | 3 | This website is built using [Docusaurus 3.5](https://docusaurus.io/docs), a modern static website generator. 4 | 5 | For installation and contributing instructions, please follow the [Contributing Docs](https://docs.frigate.video/development/contributing). 6 | 7 | # Development 8 | 9 | 1. Run `npm i` to install dependencies 10 | 2. Run `npm run start` to start the website 11 | -------------------------------------------------------------------------------- /docs/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/docs/integrations/api.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/docs/integrations/api.md -------------------------------------------------------------------------------- /docs/docs/mdx.md: -------------------------------------------------------------------------------- 1 | --- 2 | id: mdx 3 | title: Powered by MDX 4 | --- 5 | 6 | You can write JSX and use React components within your Markdown thanks to [MDX](https://mdxjs.com/). 7 | 8 | export const Highlight = ({children, color}) => ( <span style={{ 9 | backgroundColor: color, 10 | borderRadius: '2px', 11 | color: '#fff', 12 | padding: '0.2rem', 13 | }}>{children}</span> ); 14 | 15 | <Highlight color="#25c2a0">Docusaurus green</Highlight> and <Highlight color="#1877F2">Facebook blue</Highlight> are my favorite colors. 16 | 17 | I can write **Markdown** alongside my _JSX_! 18 | -------------------------------------------------------------------------------- /docs/plugins/raw-loader.js: -------------------------------------------------------------------------------- 1 | module.exports = function (context, options) { 2 | return { 3 | name: 'labelmap', 4 | configureWebpack(config, isServer, utils) { 5 | return { 6 | module: { 7 | rules: [{ test: /\.txt$/, use: 'raw-loader' }], 8 | }, 9 | }; 10 | }, 11 | }; 12 | }; 13 | -------------------------------------------------------------------------------- /docs/src/components/LanguageAlert/styles.module.css: -------------------------------------------------------------------------------- 1 | .alert { 2 | padding: 12px; 3 | background: #fff8e6; 4 | border-bottom: 1px solid #ffd166; 5 | text-align: center; 6 | font-size: 15px; 7 | } 8 | 9 | .alert a { 10 | color: #1890ff; 11 | font-weight: 500; 12 | margin-left: 6px; 13 | } -------------------------------------------------------------------------------- /docs/src/theme/Navbar/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import NavbarLayout from '@theme/Navbar/Layout'; 3 | import NavbarContent from '@theme/Navbar/Content'; 4 | import LanguageAlert from '../../components/LanguageAlert'; 5 | 6 | export default function Navbar() { 7 | return ( 8 | <> 9 | <NavbarLayout> 10 | <NavbarContent /> 11 | </NavbarLayout> 12 | <LanguageAlert /> 13 | </> 14 | ); 15 | } -------------------------------------------------------------------------------- /docs/static/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/.nojekyll -------------------------------------------------------------------------------- /docs/static/img/annotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/annotate.png -------------------------------------------------------------------------------- /docs/static/img/autotracking-debug.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/autotracking-debug.gif -------------------------------------------------------------------------------- /docs/static/img/bottom-center-mask.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/bottom-center-mask.jpg -------------------------------------------------------------------------------- /docs/static/img/bottom-center.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/bottom-center.jpg -------------------------------------------------------------------------------- /docs/static/img/camera-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/camera-ui.png -------------------------------------------------------------------------------- /docs/static/img/diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/diagram.png -------------------------------------------------------------------------------- /docs/static/img/driveway_zones-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/driveway_zones-min.png -------------------------------------------------------------------------------- /docs/static/img/driveway_zones.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/driveway_zones.png -------------------------------------------------------------------------------- /docs/static/img/events-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/events-ui.png -------------------------------------------------------------------------------- /docs/static/img/example-mask-poly-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/example-mask-poly-min.png -------------------------------------------------------------------------------- /docs/static/img/example-mask-poly.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/example-mask-poly.png -------------------------------------------------------------------------------- /docs/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/favicon.ico -------------------------------------------------------------------------------- /docs/static/img/frigate-autotracking-example.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/frigate-autotracking-example.gif -------------------------------------------------------------------------------- /docs/static/img/frigate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/frigate.png -------------------------------------------------------------------------------- /docs/static/img/ground-plane.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/ground-plane.jpg -------------------------------------------------------------------------------- /docs/static/img/home-ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/home-ui.png -------------------------------------------------------------------------------- /docs/static/img/live-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/live-view.png -------------------------------------------------------------------------------- /docs/static/img/media_browser-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/media_browser-min.png -------------------------------------------------------------------------------- /docs/static/img/media_browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/media_browser.png -------------------------------------------------------------------------------- /docs/static/img/mismatched-resolution-min.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/mismatched-resolution-min.jpg -------------------------------------------------------------------------------- /docs/static/img/mismatched-resolution.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/mismatched-resolution.jpg -------------------------------------------------------------------------------- /docs/static/img/notification-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/notification-min.png -------------------------------------------------------------------------------- /docs/static/img/notification.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/notification.png -------------------------------------------------------------------------------- /docs/static/img/plus-api-key-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus-api-key-min.png -------------------------------------------------------------------------------- /docs/static/img/plus/attribute-example-face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/attribute-example-face.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/attribute-example-fedex.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/attribute-example-fedex.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/false-positive-overlap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/false-positive-overlap.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/false-positive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/false-positive.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/fedex-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/fedex-logo.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/model-ready-email.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/model-ready-email.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/plus-models.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/plus-models.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/send-to-plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/send-to-plus.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/submit-to-plus.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/submit-to-plus.jpg -------------------------------------------------------------------------------- /docs/static/img/plus/suggestions.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/plus/suggestions.webp -------------------------------------------------------------------------------- /docs/static/img/resolutions-min.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/resolutions-min.jpg -------------------------------------------------------------------------------- /docs/static/img/resolutions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/resolutions.png -------------------------------------------------------------------------------- /docs/static/img/review-items.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/docs/static/img/review-items.png -------------------------------------------------------------------------------- /frigate/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/__init__.py -------------------------------------------------------------------------------- /frigate/api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/api/__init__.py -------------------------------------------------------------------------------- /frigate/api/defs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/api/defs/__init__.py -------------------------------------------------------------------------------- /frigate/api/defs/query/app_query_parameters.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | from pydantic import BaseModel 4 | 5 | 6 | class AppTimelineHourlyQueryParameters(BaseModel): 7 | cameras: Optional[str] = "all" 8 | labels: Optional[str] = "all" 9 | after: Optional[float] = None 10 | before: Optional[float] = None 11 | limit: Optional[int] = 200 12 | timezone: Optional[str] = "utc" 13 | -------------------------------------------------------------------------------- /frigate/api/defs/query/regenerate_query_parameters.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | from pydantic import BaseModel 4 | 5 | from frigate.events.types import RegenerateDescriptionEnum 6 | 7 | 8 | class RegenerateQueryParameters(BaseModel): 9 | source: Optional[RegenerateDescriptionEnum] = RegenerateDescriptionEnum.thumbnails 10 | -------------------------------------------------------------------------------- /frigate/api/defs/request/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/api/defs/request/__init__.py -------------------------------------------------------------------------------- /frigate/api/defs/request/app_body.py: -------------------------------------------------------------------------------- 1 | from typing import Optional 2 | 3 | from pydantic import BaseModel 4 | 5 | 6 | class AppConfigSetBody(BaseModel): 7 | requires_restart: int = 1 8 | 9 | 10 | class AppPutPasswordBody(BaseModel): 11 | password: str 12 | 13 | 14 | class AppPostUsersBody(BaseModel): 15 | username: str 16 | password: str 17 | role: Optional[str] = "viewer" 18 | 19 | 20 | class AppPostLoginBody(BaseModel): 21 | user: str 22 | password: str 23 | 24 | 25 | class AppPutRoleBody(BaseModel): 26 | role: str 27 | -------------------------------------------------------------------------------- /frigate/api/defs/request/classification_body.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class RenameFaceBody(BaseModel): 5 | new_name: str 6 | -------------------------------------------------------------------------------- /frigate/api/defs/request/export_rename_body.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel, Field 2 | 3 | 4 | class ExportRenameBody(BaseModel): 5 | name: str = Field(title="Friendly name", max_length=256) 6 | -------------------------------------------------------------------------------- /frigate/api/defs/request/review_body.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel, conlist, constr 2 | 3 | 4 | class ReviewModifyMultipleBody(BaseModel): 5 | # List of string with at least one element and each element with at least one char 6 | ids: conlist(constr(min_length=1), min_length=1) 7 | -------------------------------------------------------------------------------- /frigate/api/defs/response/generic_response.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class GenericResponse(BaseModel): 5 | success: bool 6 | message: str 7 | -------------------------------------------------------------------------------- /frigate/api/defs/tags.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class Tags(Enum): 5 | app = "App" 6 | preview = "Preview" 7 | logs = "Logs" 8 | media = "Media" 9 | notifications = "Notifications" 10 | review = "Review" 11 | export = "Export" 12 | events = "Events" 13 | classification = "classification" 14 | auth = "Auth" 15 | -------------------------------------------------------------------------------- /frigate/config/__init__.py: -------------------------------------------------------------------------------- 1 | from frigate.detectors import DetectorConfig, ModelConfig # noqa: F401 2 | 3 | from .auth import * # noqa: F403 4 | from .camera import * # noqa: F403 5 | from .camera_group import * # noqa: F403 6 | from .classification import * # noqa: F403 7 | from .config import * # noqa: F403 8 | from .database import * # noqa: F403 9 | from .logger import * # noqa: F403 10 | from .mqtt import * # noqa: F403 11 | from .proxy import * # noqa: F403 12 | from .telemetry import * # noqa: F403 13 | from .tls import * # noqa: F403 14 | from .ui import * # noqa: F403 15 | -------------------------------------------------------------------------------- /frigate/config/base.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel, ConfigDict 2 | 3 | 4 | class FrigateBaseModel(BaseModel): 5 | model_config = ConfigDict(extra="forbid", protected_namespaces=()) 6 | -------------------------------------------------------------------------------- /frigate/config/camera/live.py: -------------------------------------------------------------------------------- 1 | from typing import Dict 2 | 3 | from pydantic import Field 4 | 5 | from ..base import FrigateBaseModel 6 | 7 | __all__ = ["CameraLiveConfig"] 8 | 9 | 10 | class CameraLiveConfig(FrigateBaseModel): 11 | streams: Dict[str, str] = Field( 12 | default_factory=list, 13 | title="Friendly names and restream names to use for live view.", 14 | ) 15 | height: int = Field(default=720, title="Live camera view height") 16 | quality: int = Field(default=8, ge=1, le=31, title="Live camera view quality") 17 | -------------------------------------------------------------------------------- /frigate/config/camera/ui.py: -------------------------------------------------------------------------------- 1 | from pydantic import Field 2 | 3 | from ..base import FrigateBaseModel 4 | 5 | __all__ = ["CameraUiConfig"] 6 | 7 | 8 | class CameraUiConfig(FrigateBaseModel): 9 | order: int = Field(default=0, title="Order of camera in UI.") 10 | dashboard: bool = Field( 11 | default=True, title="Show this camera in Frigate dashboard UI." 12 | ) 13 | -------------------------------------------------------------------------------- /frigate/config/database.py: -------------------------------------------------------------------------------- 1 | from pydantic import Field 2 | 3 | from frigate.const import DEFAULT_DB_PATH 4 | 5 | from .base import FrigateBaseModel 6 | 7 | __all__ = ["DatabaseConfig"] 8 | 9 | 10 | class DatabaseConfig(FrigateBaseModel): 11 | path: str = Field(default=DEFAULT_DB_PATH, title="Database path.") # noqa: F821 12 | -------------------------------------------------------------------------------- /frigate/config/tls.py: -------------------------------------------------------------------------------- 1 | from pydantic import Field 2 | 3 | from .base import FrigateBaseModel 4 | 5 | __all__ = ["TlsConfig"] 6 | 7 | 8 | class TlsConfig(FrigateBaseModel): 9 | enabled: bool = Field(default=True, title="Enable TLS for port 8971") 10 | -------------------------------------------------------------------------------- /frigate/detectors/plugins/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/detectors/plugins/__init__.py -------------------------------------------------------------------------------- /frigate/events/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/events/__init__.py -------------------------------------------------------------------------------- /frigate/events/types.py: -------------------------------------------------------------------------------- 1 | """Types for event management.""" 2 | 3 | from enum import Enum 4 | 5 | 6 | class EventTypeEnum(str, Enum): 7 | api = "api" 8 | tracked_object = "tracked_object" 9 | 10 | 11 | class EventStateEnum(str, Enum): 12 | start = "start" 13 | update = "update" 14 | end = "end" 15 | 16 | 17 | class RegenerateDescriptionEnum(str, Enum): 18 | thumbnails = "thumbnails" 19 | snapshot = "snapshot" 20 | -------------------------------------------------------------------------------- /frigate/images/birdseye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/images/birdseye.png -------------------------------------------------------------------------------- /frigate/images/camera-error.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/images/camera-error.jpg -------------------------------------------------------------------------------- /frigate/record/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/record/__init__.py -------------------------------------------------------------------------------- /frigate/review/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/review/__init__.py -------------------------------------------------------------------------------- /frigate/review/types.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class SeverityEnum(str, Enum): 5 | alert = "alert" 6 | detection = "detection" 7 | -------------------------------------------------------------------------------- /frigate/service_manager/__init__.py: -------------------------------------------------------------------------------- 1 | from .multiprocessing import ServiceProcess 2 | from .service import Service, ServiceManager 3 | 4 | __all__ = ["Service", "ServiceProcess", "ServiceManager"] 5 | -------------------------------------------------------------------------------- /frigate/stats/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/stats/__init__.py -------------------------------------------------------------------------------- /frigate/test/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/test/__init__.py -------------------------------------------------------------------------------- /frigate/test/const.py: -------------------------------------------------------------------------------- 1 | """Constants for testing.""" 2 | 3 | TEST_DB = "test.db" 4 | TEST_DB_CLEANUPS = ["test.db", "test.db-shm", "test.db-wal"] 5 | -------------------------------------------------------------------------------- /frigate/test/http_api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/frigate/test/http_api/__init__.py -------------------------------------------------------------------------------- /frigate/track/__init__.py: -------------------------------------------------------------------------------- 1 | from abc import ABC, abstractmethod 2 | from typing import Any 3 | 4 | from frigate.config import DetectConfig 5 | 6 | 7 | class ObjectTracker(ABC): 8 | @abstractmethod 9 | def __init__(self, config: DetectConfig) -> None: 10 | pass 11 | 12 | @abstractmethod 13 | def match_and_update( 14 | self, frame_name: str, frame_time: float, detections: list[dict[str, Any]] 15 | ) -> None: 16 | pass 17 | -------------------------------------------------------------------------------- /frigate/util/__init__.py: -------------------------------------------------------------------------------- 1 | from .process import Process 2 | 3 | __all__ = ["Process"] 4 | -------------------------------------------------------------------------------- /migrations/016_sublabel_increase.py: -------------------------------------------------------------------------------- 1 | import peewee as pw 2 | 3 | from frigate.models import Event 4 | 5 | 6 | def migrate(migrator, database, fake=False, **kwargs): 7 | migrator.change_columns(Event, sub_label=pw.CharField(max_length=100, null=True)) 8 | 9 | 10 | def rollback(migrator, database, fake=False, **kwargs): 11 | migrator.change_columns(Event, sub_label=pw.CharField(max_length=20, null=True)) 12 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | base = "docs/" 3 | publish = "build" 4 | command = "npm run build" 5 | environment = { NODE_VERSION = "20" } 6 | 7 | 8 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frigate", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.ruff.lint] 2 | ignore = ["E501","E711","E712"] 3 | extend-select = ["I"] 4 | -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | dist 12 | dist-ssr 13 | *.local 14 | 15 | # Editor directories and files 16 | .vscode/* 17 | !.vscode/extensions.json 18 | .idea 19 | .DS_Store 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | -------------------------------------------------------------------------------- /web/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["prettier-plugin-tailwindcss"] 3 | } 4 | -------------------------------------------------------------------------------- /web/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": [ 3 | "dbaeumer.vscode-eslint" 4 | ] 5 | } -------------------------------------------------------------------------------- /web/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": false, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.js", 8 | "css": "index.css", 9 | "baseColor": "slate", 10 | "cssVariables": true 11 | }, 12 | "aliases": { 13 | "components": "@/components", 14 | "utils": "@/lib/utils", 15 | "ui": "@/components/ui", 16 | "lib": "@/lib", 17 | "hooks": "@/hooks" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/apple-touch-icon.png -------------------------------------------------------------------------------- /web/images/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/favicon-16x16.png -------------------------------------------------------------------------------- /web/images/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/favicon-32x32.png -------------------------------------------------------------------------------- /web/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/favicon.ico -------------------------------------------------------------------------------- /web/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/favicon.png -------------------------------------------------------------------------------- /web/images/marker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/marker.png -------------------------------------------------------------------------------- /web/images/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/images/mstile-150x150.png -------------------------------------------------------------------------------- /web/postcss.config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /web/public/fonts/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Black.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Bold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Italic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Medium.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Regular.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-Thin.woff2 -------------------------------------------------------------------------------- /web/public/fonts/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/fonts/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /web/public/images/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/images/android-chrome-192x192.png -------------------------------------------------------------------------------- /web/public/images/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/images/android-chrome-512x512.png -------------------------------------------------------------------------------- /web/public/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/images/apple-touch-icon.png -------------------------------------------------------------------------------- /web/public/images/maskable-badge.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/images/maskable-badge.png -------------------------------------------------------------------------------- /web/public/images/maskable-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/blakeblackshear/frigate/cd54a8115084d0820f9f594a3e9b1e3d4fd07cd8/web/public/images/maskable-icon.png -------------------------------------------------------------------------------- /web/public/locales/ab/audio.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/auth.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/camera.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/dialog.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/filter.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/icons.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/input.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/components/player.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/objects.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/configEditor.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/events.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/explore.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/exports.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/live.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/recording.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/search.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ab/views/system.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/ar/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "time": { 3 | "untilForTime": "حتى {{time}}", 4 | "untilForRestart": "حتى يعاد تشغيل فرايجيت.", 5 | "untilRestart": "حتى إعادة التشغيل", 6 | "ago": "منذ {{timeAgo}}" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "كلمة السر", 4 | "user": "أسم المستخدم", 5 | "login": "تسجيل الدخول" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": { 3 | "label": "مجموعات الكاميرات", 4 | "add": "إضافة مجموعة الكاميرات", 5 | "edit": "تعديل مجموعة الكاميرات", 6 | "delete": { 7 | "label": "حذف مجموعة الكاميرات" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/dialog.json: -------------------------------------------------------------------------------- 1 | { 2 | "restart": { 3 | "title": "هل أنت متأكد أنك تريد إعادة تشغيل فرايجيت؟", 4 | "button": "إعادة التشغيل", 5 | "restarting": { 6 | "title": "يتم إعادة تشغيل فرايجيت" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "ترشيح", 3 | "labels": { 4 | "label": "التسميات", 5 | "all": { 6 | "title": "كل التسميات" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "اختر أيقونة", 4 | "search": { 5 | "placeholder": "ابحث عن أيقونة…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "تحميل الفيديو", 5 | "toast": { 6 | "success": "تم بدأ تحميل فيديو عنصر المراجعة." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ar/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noRecordingsFoundForThisTime": "لا يوجد تسجيلات في هذا التوقيت", 3 | "noPreviewFound": "لا يوجد معاينة", 4 | "noPreviewFoundFor": "لا يوجد معاينة لـ{{cameraName}}" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "dog": "كَلْب", 3 | "cat": "قِطّ", 4 | "horse": "حِصَان", 5 | "animal": "حَيَوَان", 6 | "bark": "نُبَاح", 7 | "person": "شخص", 8 | "bicycle": "دراجة هوائية", 9 | "car": "سيارة", 10 | "motorcycle": "دراجة نارية" 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "محرر الإعدادات - فرايجيت", 3 | "configEditor": "محرر الإعدادات", 4 | "copyConfig": "نسخ الإعدادات", 5 | "saveAndRestart": "حفظ وإعادة تشغيل" 6 | } 7 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "detections": "الإكتشافات", 3 | "alerts": "الإنذارات", 4 | "motion": { 5 | "label": "الحركة" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "exploreMore": "اكتشف المزيد من أجسام {{label}}", 3 | "documentTitle": "اكتشف - فرايجيت", 4 | "generativeAI": "ذكاء اصطناعي مولد" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "بحث", 3 | "noExports": "لا يوجد تصديرات", 4 | "documentTitle": "التصدير - فرايجيت" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "addFace": "قم بإضافة مجموعة جديدة لمكتبة الأوجه.", 4 | "invalidName": "أسم غير صالح. يجب أن يشمل الأسم فقط على الحروف، الأرقام، المسافات، الفاصلة العليا، الشرطة التحتية، والشرطة الواصلة.", 5 | "placeholder": "أدخل أسم لهذه المجموعة" 6 | }, 7 | "details": { 8 | "person": "شخص" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/live.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "بث حي - فرايجيت", 3 | "documentTitle.withCamera": "{{camera}} - بث حي - فرايجيت", 4 | "lowBandwidthMode": "وضع موفر للبيانات" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "ترشيح", 3 | "export": "إرسال", 4 | "calendar": "التقويم" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "بحث", 3 | "savedSearches": "عمليات البحث المحفوظة", 4 | "searchFor": "البحث عن {{inputValue}}" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "camera": "إعدادات الكاميرا - فرايجيت", 4 | "default": "الإعدادات - فرايجيت", 5 | "authentication": "إعدادات المصادقة - فرايجيت" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ar/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "cameras": "إحصاءات الكاميرات - فرايجيت", 4 | "storage": "إحصاءات التخزين - فرايجيت", 5 | "general": "إحصاءات عامة - فرايجيت" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/bg/audio.json: -------------------------------------------------------------------------------- 1 | { 2 | "babbling": "Бърборене" 3 | } 4 | -------------------------------------------------------------------------------- /web/public/locales/bg/components/auth.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/components/camera.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/components/dialog.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": { 3 | "name": { 4 | "placeholder": "Име на експорта" 5 | }, 6 | "time": { 7 | "lastHour_one": "Последният час", 8 | "lastHour_other": "Последните {{count}} часа" 9 | }, 10 | "select": "Избери" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/bg/components/icons.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/components/input.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/objects.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/configEditor.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "timeline.aria": "Избери хронология", 3 | "timeline": "Хронология", 4 | "calendarFilter": { 5 | "last24Hours": "Последните 24 часа" 6 | }, 7 | "events": { 8 | "label": "Събития", 9 | "aria": "Избери събития", 10 | "noFoundForTimePeriod": "Няма намерени събития за този времеви период." 11 | }, 12 | "allCameras": "Всички камери" 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/exports.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Филтър", 3 | "export": "Експорт", 4 | "calendar": "Календар", 5 | "filters": "Филтри", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Не е избран валиден времеви диапазон", 9 | "endTimeMustAfterStartTime": "Крайното време трябва да бъде след началеният час" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "save": "Запазване на търсенето" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "masksAndZones": { 3 | "motionMasks": { 4 | "point_one": "{{count}} точка", 5 | "point_other": "{{count}} точки" 6 | }, 7 | "objectMasks": { 8 | "point_one": "{{count}} точка", 9 | "point_other": "{{count}} точки" 10 | }, 11 | "zones": { 12 | "point_one": "{{count}} точка", 13 | "point_other": "{{count}} точки" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/bg/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "stats": { 3 | "healthy": "Системата е изправна" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ca/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Selecciona una icona", 4 | "search": { 5 | "placeholder": "Buscar icona…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ca/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Descarregar vídeo", 5 | "toast": { 6 | "success": "S’ha començat a descarregar el vídeo de l’element de revisió." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ca/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Editor de Configuració - Frigate", 3 | "configEditor": "Editor de configuració", 4 | "copyConfig": "Copiar configuració", 5 | "saveAndRestart": "Desa i reinicia", 6 | "saveOnly": "Només desar", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Configuració copiada al porta-retalls." 10 | }, 11 | "error": { 12 | "savingError": "Error al desar la configuració" 13 | } 14 | }, 15 | "confirm": "Sortir sense desar?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/ca/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Exportar - Frigate", 3 | "search": "Buscar", 4 | "noExports": "No s'han trobat exportacions", 5 | "deleteExport": "Suprimeix l'exportació", 6 | "deleteExport.desc": "Estàs segur que vols eliminar {{exportName}}?", 7 | "editExport": { 8 | "title": "Renombrar exportació", 9 | "desc": "Introdueix un nou nom per a aquesta exportació.", 10 | "saveExport": "Desar exportació" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Error al canviar el nom de l’exportació: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/ca/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filtre", 3 | "toast": { 4 | "error": { 5 | "noValidTimeSelected": "No s'ha seleccionat un rang de temps vàlid", 6 | "endTimeMustAfterStartTime": "L'hora de finalització ha de ser posterior a l'hora d'inici" 7 | } 8 | }, 9 | "export": "Exportar", 10 | "calendar": "Calendari", 11 | "filters": "Filtres" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/cs/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Uživatelské jméno", 4 | "password": "Heslo", 5 | "login": "Přihlášení", 6 | "errors": { 7 | "usernameRequired": "Uživatelské jméno je povinné", 8 | "passwordRequired": "Heslo je povinné", 9 | "loginFailed": "Přihlášení se nezdařilo", 10 | "unknownError": "Neznámá chyba. Zkontrolujte logy.", 11 | "webUnknownError": "Neznámá chuba. Zkontrolujte logy konzoly.", 12 | "rateLimit": "Limit požadavků překročen. Zkuste to znovu později." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/cs/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Zvolte ikonu", 4 | "search": { 5 | "placeholder": "Hledejte ikonu…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/cs/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Stáhnout video", 5 | "toast": { 6 | "success": "Vaše video se stahuje." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/cs/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Editor konfigurace - Frigate", 3 | "configEditor": "Editor konfigurace", 4 | "copyConfig": "Kopírovat konfiguraci", 5 | "saveAndRestart": "Uložit a restartovat", 6 | "saveOnly": "Jen uložit", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Konfigurace byla zkopírovaná do schránky." 10 | }, 11 | "error": { 12 | "savingError": "Chyba ukládání konfigurace" 13 | } 14 | }, 15 | "confirm": "Opustit bez uložení?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/cs/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Hledat", 3 | "documentTitle": "Exportovat - Frigate", 4 | "noExports": "Žádné exporty nenalezeny", 5 | "deleteExport": "Smazat export", 6 | "deleteExport.desc": "Opravdu chcete smazat {{exportName}}?", 7 | "editExport": { 8 | "title": "Přejmenovat export", 9 | "desc": "Zadejte nové jméno pro tento export.", 10 | "saveExport": "Uložit export" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Nepodařilo se přejmenovat export: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/cs/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Exportovat", 3 | "calendar": "Kalendář", 4 | "filter": "Filtrovat", 5 | "filters": "Filtry", 6 | "toast": { 7 | "error": { 8 | "endTimeMustAfterStartTime": "Čas konce musí být po čase začátku", 9 | "noValidTimeSelected": "Nebylo zvoleno platné časové období" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/de/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "login": "Anmeldung", 4 | "errors": { 5 | "passwordRequired": "Kennwort ist erforderlich", 6 | "loginFailed": "Anmeldung gescheitert", 7 | "webUnknownError": "Unbekannter Fehler. Prüfe Konsolenlogs.", 8 | "usernameRequired": "Benutzername ist erforderlich", 9 | "rateLimit": "Anmeldelimit überschritten. Bitte später erneut versuchen.", 10 | "unknownError": "Unbekannter Fehler. Prüfe Logs." 11 | }, 12 | "user": "Benutzername", 13 | "password": "Kennwort" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/de/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "Suche nach einem Icon…" 5 | }, 6 | "selectIcon": "Wähle ein Icon" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/de/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Video herunterladen", 5 | "toast": { 6 | "success": "Das Herunterladen des überprüften Videos wurde gestartet." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/de/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Konfigurationseditor", 3 | "copyConfig": "Konfiguration kopieren", 4 | "saveAndRestart": "Sichern und Neustarten", 5 | "saveOnly": "Nur Sichern", 6 | "toast": { 7 | "error": { 8 | "savingError": "Fehler beim Speichern der Konfiguration" 9 | }, 10 | "success": { 11 | "copyToClipboard": "Konfiguration in Zwischenablage kopiert." 12 | } 13 | }, 14 | "documentTitle": "Konfigurationseditor – Frigate", 15 | "confirm": "Verlassen ohne zu Speichern?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/de/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "deleteExport": "Export löschen", 3 | "editExport": { 4 | "title": "Export umbenennen", 5 | "desc": "Gib einen neuen Namen für diesen Export an.", 6 | "saveExport": "Export speichern" 7 | }, 8 | "documentTitle": "Exportieren - Frigate", 9 | "deleteExport.desc": "Soll {{exportName}} wirklich gelöscht werden?", 10 | "search": "Suche", 11 | "noExports": "Keine Exporte gefunden", 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Umbenennen des Exports fehlgeschlagen: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/de/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Export", 3 | "calendar": "Kalender", 4 | "filters": "Filter", 5 | "toast": { 6 | "error": { 7 | "endTimeMustAfterStartTime": "Endzeit muss nach Startzeit liegen", 8 | "noValidTimeSelected": "Gewählter Zeitraum ist ungültig" 9 | } 10 | }, 11 | "filter": "Filter" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/en/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Username", 4 | "password": "Password", 5 | "login": "Login", 6 | "errors": { 7 | "usernameRequired": "Username is required", 8 | "passwordRequired": "Password is required", 9 | "rateLimit": "Exceeded rate limit. Try again later.", 10 | "loginFailed": "Login failed", 11 | "unknownError": "Unknown error. Check logs.", 12 | "webUnknownError": "Unknown error. Check console logs." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/en/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Select an icon", 4 | "search": { 5 | "placeholder": "Search for an icon…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/en/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Download Video", 5 | "toast": { 6 | "success": "Your review item video has started downloading." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/en/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Config Editor - Frigate", 3 | "configEditor": "Config Editor", 4 | "copyConfig": "Copy Config", 5 | "saveAndRestart": "Save & Restart", 6 | "saveOnly": "Save Only", 7 | "confirm": "Exit without saving?", 8 | "toast": { 9 | "success": { 10 | "copyToClipboard": "Config copied to clipboard." 11 | }, 12 | "error": { 13 | "savingError": "Error saving config" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/en/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Export - Frigate", 3 | "search": "Search", 4 | "noExports": "No exports found", 5 | "deleteExport": "Delete Export", 6 | "deleteExport.desc": "Are you sure you want to delete {{exportName}}?", 7 | "editExport": { 8 | "title": "Rename Export", 9 | "desc": "Enter a new name for this export.", 10 | "saveExport": "Save Export" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Failed to rename export: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/en/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Export", 3 | "calendar": "Calendar", 4 | "filter": "Filter", 5 | "filters": "Filters", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "No valid time range selected", 9 | "endTimeMustAfterStartTime": "End time must be after start time" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/es/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Selecciona un icono", 4 | "search": { 5 | "placeholder": "Buscar un icono…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/es/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Descargar vídeo", 5 | "toast": { 6 | "success": "El vídeo de tu elemento de revisión ha comenzado a descargarse." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/es/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Editor de Configuración", 3 | "copyConfig": "Copiar configuración", 4 | "saveAndRestart": "Guardar y reiniciar", 5 | "saveOnly": "Guardar solo", 6 | "toast": { 7 | "success": { 8 | "copyToClipboard": "Configuración copiada al portapapeles." 9 | }, 10 | "error": { 11 | "savingError": "Error al guardar la configuración" 12 | } 13 | }, 14 | "documentTitle": "Editor de Configuración - Frigate", 15 | "confirm": "¿Salir sin guardar?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/es/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Exportar", 3 | "calendar": "Calendario", 4 | "filter": "Filtro", 5 | "filters": "Filtros", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "No se ha seleccionado un rango de tiempo válido", 9 | "endTimeMustAfterStartTime": "La hora de finalización debe ser posterior a la hora de inicio" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/fa/common.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/auth.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/camera.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/dialog.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/filter.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/icons.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/input.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/components/player.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "person": "شخص", 3 | "bicycle": "دوچرخه", 4 | "car": "ماشین", 5 | "airplane": "هواپیما", 6 | "bus": "اتوبوس", 7 | "train": "قطار", 8 | "boat": "قایق", 9 | "traffic_light": "چراغ راهنمایی", 10 | "motorcycle": "موتور سیکلت", 11 | "fire_hydrant": "شیر آتشنشانی", 12 | "street_sign": "تابلو راهنمایی رانندگی", 13 | "stop_sign": "تابلو ایست", 14 | "parking_meter": "پارکومتر", 15 | "bench": "نیمکت", 16 | "bird": "پرنده", 17 | "cat": "گربه", 18 | "dog": "سگ", 19 | "horse": "اسب" 20 | } 21 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/configEditor.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/events.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/explore.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/exports.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/live.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/recording.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/search.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/settings.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fa/views/system.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /web/public/locales/fi/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "Salasana", 4 | "user": "Käyttäjä", 5 | "login": "Kirjaudu", 6 | "errors": { 7 | "usernameRequired": "Käyttäjänimi vaaditaan", 8 | "passwordRequired": "Salasana vaaditaan", 9 | "rateLimit": "Käyttöraja ylitetty. Yritä myöhemmin uudelleen.", 10 | "loginFailed": "Kirjautuminen epäonnistui", 11 | "unknownError": "Tuntematon virhe. Tarkista logit.", 12 | "webUnknownError": "Tuntematon virhe. Tarkista konsolilogi." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/fi/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Valitse kuvake", 4 | "search": { 5 | "placeholder": "Etsi kuvaketta…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/fi/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Lataa Video", 5 | "toast": { 6 | "success": "Tarkistettavan kohteen videon lataus on aloitettu." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/fi/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Frigaten konfiguraatioeditori", 3 | "confirm": "Poistu tallentamatta?", 4 | "saveOnly": "Vain tallennus", 5 | "toast": { 6 | "error": { 7 | "savingError": "Virhe tallennettaessa konfiguraatiota" 8 | }, 9 | "success": { 10 | "copyToClipboard": "Konfiguraatio kopioitu leikepöydälle." 11 | } 12 | }, 13 | "configEditor": "Konfiguraatioeditori", 14 | "copyConfig": "Kopioi konfiguraatio", 15 | "saveAndRestart": "Tallenna & uudelleenkäynnistä" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/fi/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Etsi", 3 | "documentTitle": "Vie", 4 | "deleteExport.desc": "Oletko varma että haluat poistaa kohteen {{exportName}}?", 5 | "toast": { 6 | "error": { 7 | "renameExportFailed": "Viedyn kohteen uudelleennimeäminen epäonnistui: {{errorMessage}}" 8 | } 9 | }, 10 | "noExports": "Ei vietyjä kohteita", 11 | "deleteExport": "Poista viety kohde", 12 | "editExport": { 13 | "title": "Nimeä uudelleen", 14 | "desc": "Anna uusi nimi viedylle kohteelle.", 15 | "saveExport": "Tallenna vienti" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/fi/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendar": "Kalenteri", 3 | "filter": "Suodatin", 4 | "filters": "Suodattimet", 5 | "toast": { 6 | "error": { 7 | "noValidTimeSelected": "Sopimaton aikaväli valittu", 8 | "endTimeMustAfterStartTime": "Loppuaika täytyy olla aloituksen jälkeen" 9 | } 10 | }, 11 | "export": "Vie" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/fr/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "Mot de passe", 4 | "login": "Identifiant", 5 | "user": "Nom d'utilisateur", 6 | "errors": { 7 | "unknownError": "Erreur inconnue. Vérifiez les journaux.", 8 | "webUnknownError": "Erreur inconnue. Vérifiez les journaux de la console.", 9 | "passwordRequired": "Un mot de passe est requis", 10 | "loginFailed": "Échec de l'authentification", 11 | "usernameRequired": "Un nom d'utilisateur est requis", 12 | "rateLimit": "Nombre d'essais dépassé. Réessayez plus tard." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/fr/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "Rechercher une icône…" 5 | }, 6 | "selectIcon": "Sélectionnez une icône" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/fr/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Télécharger la vidéo", 5 | "toast": { 6 | "success": "Le téléchargement de la vidéo de votre élément de la revue d'événements a commencé." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/fr/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Éditeur de configuration", 3 | "documentTitle": "Éditeur de configuration - Frigate", 4 | "copyConfig": "Copier la configuration", 5 | "saveOnly": "Enregistrer seulement", 6 | "saveAndRestart": "Enregistrer et redémarrer", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Configuration copiée dans le presse-papiers" 10 | }, 11 | "error": { 12 | "savingError": "Erreur lors de l'enregistrement de la configuration" 13 | } 14 | }, 15 | "confirm": "Quitter sans enregistrer ?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/fr/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Exporter - Frigate", 3 | "search": "Rechercher", 4 | "noExports": "Aucun export trouvé", 5 | "deleteExport": "Supprimer l'export", 6 | "deleteExport.desc": "Êtes-vous sûr de vouloir supprimer {{exportName}}?", 7 | "editExport": { 8 | "title": "Renommer l'export", 9 | "desc": "Saisissez un nouveau nom pour cet export.", 10 | "saveExport": "Enregistrer l'export" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Échec du renommage de l'export : {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/fr/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Exporter", 3 | "calendar": "Calendrier", 4 | "filter": "Filtre", 5 | "filters": "Filtres", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Pas de période valide sélectionnée", 9 | "endTimeMustAfterStartTime": "L'heure de fin doit être après l'heure de début" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/he/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "שם משתמש", 4 | "password": "סיסמה", 5 | "login": "התחברות", 6 | "errors": { 7 | "usernameRequired": "נדרש שם משתמש", 8 | "passwordRequired": "דרושה סיסמה", 9 | "unknownError": "שגיאה לא ידועה. בדוק את הלוגים.", 10 | "webUnknownError": "שגיאה לא ידועה, בדוק את הלוגים.", 11 | "rateLimit": "חרגת מהמגבלת בקשות. נסה שוב מאוחר יותר.", 12 | "loginFailed": "ההתחברות נכשלה" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/he/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "בחר סמל", 4 | "search": { 5 | "placeholder": "חפש אייקון…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/he/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "הורד וידאו", 5 | "toast": { 6 | "success": "הורדת סרטון הסקירה שלך החלה." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/he/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "עורך הגדרות - פריגטה", 3 | "configEditor": "עורך תצורה", 4 | "copyConfig": "העתקת הגדרות", 5 | "saveAndRestart": "שמירה והפעלה מחדש", 6 | "saveOnly": "שמירה בלבד", 7 | "confirm": "לצאת ללא שמירה?", 8 | "toast": { 9 | "success": { 10 | "copyToClipboard": "התצורה הועתקה ללוח." 11 | }, 12 | "error": { 13 | "savingError": "שגיאה בשמירת ההגדרות" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/he/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "חיפוש", 3 | "toast": { 4 | "error": { 5 | "renameExportFailed": "שינוי שם הייצוא נכשל: {{errorMessage}}" 6 | } 7 | }, 8 | "documentTitle": "ייצוא - Frigate", 9 | "noExports": "לא נמצא יצוא", 10 | "deleteExport": "מחיקת ייצוא", 11 | "deleteExport.desc": "האם אתה בטוח שברצונך למחוק את {{exportName}}?", 12 | "editExport": { 13 | "title": "שנה שם ייצוא", 14 | "desc": "הכנס שם חדש עבור הייצוא הזה.", 15 | "saveExport": "שמירת ייצוא" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/he/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "לסנן", 3 | "export": "ייצוא", 4 | "calendar": "לוח שנה", 5 | "filters": "מסננים", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "לא נבחר טווח זמן תקף", 9 | "endTimeMustAfterStartTime": "שעת הסיום חייבת להיות אחרי שעת ההתחלה" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/hi/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "time": { 3 | "untilForTime": "{{time}} तक", 4 | "untilForRestart": "जब तक फ्रिगेट पुनः रीस्टार्ट नहीं हो जाता।", 5 | "untilRestart": "रीस्टार्ट होने में" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "पासवर्ड", 4 | "login": "प्रवेश करें", 5 | "errors": { 6 | "passwordRequired": "पासवर्ड आवश्यक है", 7 | "rateLimit": "दर सीमा पार हो गई है। बाद में पुनः प्रयास करें।", 8 | "unknownError": "अज्ञात त्रुटि। प्रविष्टियाँ जांचें।", 9 | "usernameRequired": "प्रयोक्ता नाम आवश्यक है", 10 | "webUnknownError": "अज्ञात त्रुटि। कंसोल प्रविष्टियाँ जांचें।", 11 | "loginFailed": "लॉगिन असफल हुआ" 12 | }, 13 | "user": "प्रयोक्ता नाम" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": { 3 | "label": "कैमरा समूह", 4 | "add": "कैमरा समूह जोड़ें", 5 | "edit": "कैमरा समूह संपादित करें" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/dialog.json: -------------------------------------------------------------------------------- 1 | { 2 | "restart": { 3 | "title": "क्या आप निश्चित हैं कि आप फ्रिगेट को रीस्टार्ट करना चाहते हैं?", 4 | "button": "रीस्टार्ट", 5 | "restarting": { 6 | "title": "फ्रिगेट रीस्टार्ट हो रहा है" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "फ़िल्टर", 3 | "labels": { 4 | "label": "लेबल", 5 | "all": { 6 | "title": "सभी लेबल" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "चिह्न चुनें", 4 | "search": { 5 | "placeholder": "चिह्न खोजें..।" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "वीडियो डाउनलोड करें", 5 | "toast": { 6 | "success": "आपकी समीक्षा वीडियो डाउनलोड होना शुरू हो गई है।" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/hi/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noRecordingsFoundForThisTime": "इस समय का कोई रिकॉर्डिंग नहीं मिला", 3 | "noPreviewFound": "कोई प्रीव्यू नहीं मिला", 4 | "noPreviewFoundFor": "{{cameraName}} के लिए कोई पूर्वावलोकन नहीं मिला" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/hi/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "horse": "घोड़ा", 3 | "sheep": "भेड़", 4 | "bark": "भौंकना", 5 | "animal": "जानवर", 6 | "dog": "कुत्ता", 7 | "cat": "बिल्ली", 8 | "goat": "बकरी", 9 | "boat": "नाव", 10 | "bus": "बस", 11 | "bird": "पक्षी", 12 | "mouse": "चूहा", 13 | "vehicle": "वाहन", 14 | "car": "गाड़ी", 15 | "person": "व्यक्ति", 16 | "bicycle": "साइकिल" 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "saveOnly": "केवल सहेजें", 3 | "saveAndRestart": "सहेजें और पुनः प्रारंभ करें", 4 | "configEditor": "विन्यास संपादक", 5 | "copyConfig": "विन्यास कॉपी करें", 6 | "toast": { 7 | "error": { 8 | "savingError": "विन्यास सहेजने में त्रुटि हुई" 9 | }, 10 | "success": { 11 | "copyToClipboard": "विन्यास क्लिपबोर्ड पर कॉपी कर लिया गया है।" 12 | } 13 | }, 14 | "documentTitle": "विन्यास संपादक - Frigate" 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "alerts": "अलर्टस", 3 | "detections": "खोजें" 4 | } 5 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "अन्वेषण करें - फ्रिगेट", 3 | "generativeAI": "जनरेटिव ए आई" 4 | } 5 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "निर्यात - फ्रिगेट", 3 | "search": "खोजें" 4 | } 5 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "addFace": "फेस लाइब्रेरी में नया संग्रह जोड़ने की प्रक्रिया को आगे बढ़ाएं।", 4 | "placeholder": "इस संग्रह का नाम बताएं" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/live.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "लाइव - फ्रिगेट", 3 | "documentTitle.withCamera": "{{camera}} - लाइव - फ्रिगेट" 4 | } 5 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendar": "पंचांग", 3 | "toast": { 4 | "error": { 5 | "noValidTimeSelected": "कोई मान्य समय सीमा चयनित नहीं है", 6 | "endTimeMustAfterStartTime": "समाप्ति समय प्रारंभ समय के बाद होना चाहिए" 7 | } 8 | }, 9 | "export": "निर्यात", 10 | "filter": "फ़िल्टर" 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "खोजें", 3 | "savedSearches": "सहेजी गई खोजें" 4 | } 5 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "default": "सेटिंग्स - फ्रिगेट", 4 | "authentication": "प्रमाणीकरण सेटिंग्स - फ्रिगेट" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /web/public/locales/hi/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "cameras": "कैमरा आँकड़े - फ्रिगेट", 4 | "storage": "भंडारण आँकड़े - फ्रिगेट" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /web/public/locales/hu/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Felhasználói név", 4 | "password": "Jelszó", 5 | "login": "Bejelentkezés", 6 | "errors": { 7 | "usernameRequired": "Felhasználónév szükséges", 8 | "passwordRequired": "Jelszó szükséges", 9 | "loginFailed": "Sikertelen bejelentkezés", 10 | "unknownError": "Ismeretlen hiba. Ellenőrizze a naplókat.", 11 | "webUnknownError": "Ismeretlen hiba. Ellenőrizze a konzol naplókat." 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web/public/locales/hu/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Szűrő", 3 | "labels": { 4 | "label": "Cimkék", 5 | "all": { 6 | "title": "Minden cimke", 7 | "short": "Cimkék" 8 | }, 9 | "count_other": "{{count}} cimke", 10 | "count_one": "{{count}} Cimke" 11 | }, 12 | "zones": { 13 | "label": "Zónák", 14 | "all": { 15 | "title": "Minden zóna", 16 | "short": "Zónák" 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/public/locales/hu/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Válassz ikont", 4 | "search": { 5 | "placeholder": "Ikon keresése…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/hu/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Videó Letöltése" 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/hu/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noRecordingsFoundForThisTime": "Ebben az időpontban nem található felvétel", 3 | "noPreviewFound": "Nincs elérhető előkép", 4 | "submitFrigatePlus": { 5 | "title": "Elküldi ezt a képet a Frigate+-nak?", 6 | "submit": "Küldés" 7 | }, 8 | "noPreviewFoundFor": "Nem található előnézet {{cameraName}}-hoz/-hez/-höz", 9 | "livePlayerRequiredIOSVersion": "iOS 17.1 vagy újabb szükséges ehhez az élő adás típushoz.", 10 | "streamOffline": { 11 | "title": "Adás Nem Elérhető" 12 | }, 13 | "cameraDisabled": "Kamera kikapcsolva" 14 | } 15 | -------------------------------------------------------------------------------- /web/public/locales/hu/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "person": "Személy", 3 | "bicycle": "Bicikli", 4 | "car": "Autó", 5 | "motorcycle": "Motor", 6 | "airplane": "Repülőgép", 7 | "bus": "Busz", 8 | "train": "Vonat", 9 | "boat": "Hajó", 10 | "dog": "Kutya", 11 | "cat": "Macska", 12 | "horse": "Ló", 13 | "sheep": "Juh", 14 | "bird": "Madár", 15 | "mouse": "Egér", 16 | "keyboard": "Szintetizátor", 17 | "animal": "Állat", 18 | "bark": "Ugatás", 19 | "goat": "Kecske", 20 | "traffic_light": "Jelzőlámpa" 21 | } 22 | -------------------------------------------------------------------------------- /web/public/locales/hu/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Konfiguráció Szerkesztő - Frigate", 3 | "configEditor": "Konfiguráció szerkesztő", 4 | "copyConfig": "Konfiguráció másolása", 5 | "saveAndRestart": "Mentés és Újraindítás", 6 | "saveOnly": "Csak mentés", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Konfiguráció átmásolva a vágólapra." 10 | }, 11 | "error": { 12 | "savingError": "Hiba a konfiguráció mentésekor" 13 | } 14 | }, 15 | "confirm": "Kilép mentés nélkül?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/hu/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "alerts": "Riasztások", 3 | "empty": { 4 | "detection": "Nincs megnézendő észlelés", 5 | "alert": "Nincs megnézendő riasztás", 6 | "motion": "Nem található mozgás" 7 | }, 8 | "detections": "Észlelések", 9 | "motion": { 10 | "label": "Mozgás", 11 | "only": "Csak mozgások" 12 | }, 13 | "allCameras": "Összes kamera", 14 | "timeline": "Idővonal" 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/hu/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Exportálás - Frigate", 3 | "search": "Keresés", 4 | "noExports": "Export nem található", 5 | "deleteExport.desc": "Biztos, hogy törölni akarja {{exportName}}-t?", 6 | "deleteExport": "Export törlése", 7 | "editExport": { 8 | "title": "Exportálás átnevezése" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/hu/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Szűrő", 3 | "calendar": "Naptár", 4 | "export": "Exportálás", 5 | "filters": "Szűrők", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Nem megfelelő idősáv kiválasztva", 9 | "endTimeMustAfterStartTime": "A végpontnak később kell lennie, mint a kezdőpontnak" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/hu/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Keresés", 3 | "savedSearches": "Mentett keresések", 4 | "searchFor": "{{inputValue}} keresése", 5 | "button": { 6 | "clear": "Keresés törlése", 7 | "filterInformation": "Szűrő információ", 8 | "save": "Keresés mentése", 9 | "delete": "Mentett keresések törlése" 10 | }, 11 | "trackedObjectId": "Követett Tárgy Azonosító" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/id/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "time": { 3 | "untilForRestart": "Hingga Frigate memulai ulang.", 4 | "untilRestart": "Sampai memulai ulang", 5 | "ago": "{{timeAgo}} Lalu", 6 | "justNow": "Sekarang", 7 | "today": "Hari ini", 8 | "yesterday": "Kemarin", 9 | "untilForTime": "Hingga {{time}}" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/id/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Nama pengguna", 4 | "password": "Kata sandi", 5 | "login": "Masuk", 6 | "errors": { 7 | "usernameRequired": "Wajib Menggunakan Username", 8 | "passwordRequired": "Wajib memakai Password", 9 | "rateLimit": "Melewati batas permintaan. Coba lagi nanti.", 10 | "loginFailed": "Gagal Masuk" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/id/components/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": { 3 | "label": "Grup Kamera", 4 | "add": "Tambah Grup Kamera", 5 | "edit": "Edit Grup kamera", 6 | "delete": { 7 | "label": "Hapus Grup Kamera", 8 | "confirm": { 9 | "title": "Yakin Hapus", 10 | "desc": "Apakah Anda yakin ingin menghapus grup kamera <em>{{name}}</em>?" 11 | } 12 | }, 13 | "name": { 14 | "label": "Nama" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/id/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Saring", 3 | "labels": { 4 | "label": "Label", 5 | "all": { 6 | "title": "Semua Label", 7 | "short": "Label" 8 | }, 9 | "count_one": "{{count}} Label", 10 | "count_other": "{{count}} Label" 11 | }, 12 | "zones": { 13 | "label": "Zona" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/id/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Pilih ikon", 4 | "search": { 5 | "placeholder": "Cari Icon…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/id/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Unduh Video", 5 | "toast": { 6 | "success": "Video yang yang anda lihat sudah mulai di unduh." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/id/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noPreviewFound": "Pratinjau Tidak Ditemukan", 3 | "noPreviewFoundFor": "Tidak ada Pratinjau untuk {{cameraName}}", 4 | "submitFrigatePlus": { 5 | "submit": "Kirim", 6 | "title": "Kirim frame ini ke Frigate+?" 7 | }, 8 | "noRecordingsFoundForThisTime": "Tidak ada Rekaman pada waktu ini", 9 | "livePlayerRequiredIOSVersion": "iOS 17.1 atau yang lebih tinggi diperlukan untuk tipe siaran langsung ini.", 10 | "streamOffline": { 11 | "title": "Stream Tidak Aktif" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/id/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "person": "Orang", 3 | "bicycle": "Sepeda", 4 | "car": "Mobil", 5 | "motorcycle": "Motor", 6 | "airplane": "Pesawat", 7 | "bus": "Bis", 8 | "train": "Kereta" 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/id/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Editor Konfigurasi - Frigate", 3 | "configEditor": "Editor Konfigurasi", 4 | "copyConfig": "Salin Konfigurasi", 5 | "saveAndRestart": "Simpan dan Mulai ulang", 6 | "saveOnly": "Hanya simpan", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Konfigurasi disalin ke papan klip." 10 | }, 11 | "error": { 12 | "savingError": "Gagal menyimpan konfigurasi" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/id/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "alerts": "Peringatan", 3 | "detections": "Deteksi", 4 | "motion": { 5 | "label": "Gerakan", 6 | "only": "Hanya Gerakan" 7 | }, 8 | "allCameras": "Semua Kamera", 9 | "empty": { 10 | "detection": "Tidak ada deteksi untuk ditinjau", 11 | "alert": "Tidak ada peringatan untuk ditinjau" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/id/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Jelajahi - Frigate", 3 | "generativeAI": "AI Generatif", 4 | "exploreIsUnavailable": { 5 | "title": "Penelusuran tidak tersedia", 6 | "embeddingsReindexing": { 7 | "context": "Jelajahi dapat digunakan setelah embedding objek yang dilacak selesai di-reindex.", 8 | "startingUp": "Sedang memulai…", 9 | "estimatedTime": "Perkiraan waktu tersisa:" 10 | } 11 | }, 12 | "details": { 13 | "timestamp": "Stempel waktu" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/id/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Expor - Frigate", 3 | "search": "Cari", 4 | "noExports": "Tidak bisa mengekspor", 5 | "deleteExport": "Hapus Ekspor", 6 | "deleteExport.desc": "Apakah Anda yakin ingin menghapus {{exportName}}?", 7 | "editExport": { 8 | "title": "Ganti Nama saat Ekspor" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/id/views/live.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle.withCamera": "{{camera}} - Langsung - Frigate", 3 | "documentTitle": "Langsung - Frigate", 4 | "lowBandwidthMode": "Mode Bandwith-Rendah", 5 | "twoWayTalk": { 6 | "enable": "Nyalakan Komunikasi dua arah", 7 | "disable": "Nonaktifkan Komunikasi Dua Arah" 8 | }, 9 | "cameraAudio": { 10 | "enable": "Nyalakan Audio Kamera" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/id/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Saring", 3 | "export": "Expor", 4 | "calendar": "Kalender", 5 | "filters": "Penyaring", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Rentan Waktu yang dipilih tidak valid", 9 | "endTimeMustAfterStartTime": "Waktu akhir harus setelah waktu mulai" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/id/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Cari", 3 | "savedSearches": "Simpan Pencarian", 4 | "searchFor": "Cari untuk {{inputValue}}", 5 | "button": { 6 | "clear": "Bersihkan pencarian", 7 | "save": "Simpan Pencarian", 8 | "delete": "Hapus pencarian yang disimpan" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/id/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "default": "Pengaturan - Frigate", 4 | "camera": "Pengaturan Kamera - Frigate", 5 | "classification": "Pengaturan Klasifikasi - Frigate", 6 | "authentication": "Pengaturan Autentikasi - Frigate", 7 | "masksAndZones": "Editor Mask dan Zona - Frigate", 8 | "motionTuner": "Penyetel Gerakan - Frigate" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/id/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "cameras": "Status kamera - Frigate", 4 | "storage": "Status Penyimpanan - Frigate", 5 | "general": "Status umum - Frigate", 6 | "enrichments": "Statistik Enrichment - Frigate", 7 | "logs": { 8 | "frigate": "Log Frigate - Frigate", 9 | "go2rtc": "Log Go2RTC - Frigate" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/it/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Nome utente", 4 | "password": "Password", 5 | "login": "Accedi", 6 | "errors": { 7 | "usernameRequired": "Il nome utente è obbligatorio", 8 | "passwordRequired": "La password è obbligatoria", 9 | "rateLimit": "Superato il limite di tentativi. Riprova più tardi.", 10 | "unknownError": "Errore sconosciuto. Controlla i registri.", 11 | "webUnknownError": "Errore sconosciuto. Controlla i registri della console.", 12 | "loginFailed": "Accesso non riuscito" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/it/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "Cerca un'icona…" 5 | }, 6 | "selectIcon": "Seleziona un'icona" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/it/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "toast": { 5 | "success": "Il video dell'oggetto da te visto ha iniziato a scaricarsi." 6 | }, 7 | "label": "Scarica video" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/it/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Editor di configurazione", 3 | "documentTitle": "Editor di configurazione - Frigate", 4 | "copyConfig": "Copia configurazione", 5 | "saveAndRestart": "Salva e riavvia", 6 | "saveOnly": "Salva soltanto", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Configurazione copiata negli appunti." 10 | }, 11 | "error": { 12 | "savingError": "Errore durante il salvataggio della configurazione" 13 | } 14 | }, 15 | "confirm": "Vuoi uscire senza salvare?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/it/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Esporta - Frigate", 3 | "search": "Cerca", 4 | "noExports": "Nessuna esportazione trovata", 5 | "deleteExport": "Elimina esportazione", 6 | "deleteExport.desc": "Sei sicuro di voler eliminare {{exportName}}?", 7 | "editExport": { 8 | "desc": "Inserisci un nuovo nome per questa esportazione.", 9 | "title": "Rinomina esportazione", 10 | "saveExport": "Salva esportazione" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Impossibile rinominare l'esportazione: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/it/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "calendar": "Calendario", 3 | "export": "Esporta", 4 | "filter": "Filtro", 5 | "filters": "Filtri", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Nessun intervallo di tempo valido selezionato", 9 | "endTimeMustAfterStartTime": "L'ora di fine deve essere successiva all'ora di inizio" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/ja/audio.json: -------------------------------------------------------------------------------- 1 | { 2 | "speech": "スピーチ", 3 | "car": "自動車", 4 | "bicycle": "自転車" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/common.json: -------------------------------------------------------------------------------- 1 | { 2 | "time": { 3 | "untilForRestart": "Frigateが再起動するまで.", 4 | "untilRestart": "再起動まで", 5 | "untilForTime": "{{time}} まで" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "ユーザー名", 4 | "password": "パスワード", 5 | "login": "ログイン" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": { 3 | "label": "カメラグループ", 4 | "add": "カメラグループを追加", 5 | "edit": "カメラグループを編集" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/dialog.json: -------------------------------------------------------------------------------- 1 | { 2 | "restart": { 3 | "title": "Frigateを再起動しますか?", 4 | "restarting": { 5 | "title": "Frigateは再起動中です" 6 | }, 7 | "button": "再起動" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "labels": { 3 | "label": "ラベル", 4 | "all": { 5 | "title": "すべてのラベル" 6 | } 7 | }, 8 | "filter": "フィルタ" 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "アイコンを検索…" 5 | }, 6 | "selectIcon": "アイコンを選択" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "ビデオをダウンロード", 5 | "toast": { 6 | "success": "あなたのレビュー項目ビデオのダウンロードを開始しました." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ja/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noPreviewFound": "プレビューが見つかりません", 3 | "noRecordingsFoundForThisTime": "この時間帯に録画は見つかりませんでした", 4 | "noPreviewFoundFor": "{{cameraName}} のプレビューが見つかりません" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "bicycle": "自転車", 3 | "car": "自動車", 4 | "person": "人物" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "copyConfig": "設定をコピー", 3 | "configEditor": "Configエディタ", 4 | "saveAndRestart": "保存後再起動", 5 | "saveOnly": "保存", 6 | "confirm": "保存せずに終了しますか?" 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "detections": "検出", 3 | "motion": { 4 | "label": "動作" 5 | }, 6 | "alerts": "アラート" 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "generativeAI": "生成AI" 3 | } 4 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "エクスポート - Frigate", 3 | "noExports": "エクスポートがありません", 4 | "search": "検索" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "placeholder": "このコレクションの名前を入力してください" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/live.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "ライブ - Frigate", 3 | "documentTitle.withCamera": "{{camera}} - ライブ - Frigate", 4 | "lowBandwidthMode": "低帯域幅モード" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "フィルタ", 3 | "calendar": "カレンダー", 4 | "export": "エクスポート" 5 | } 6 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "searchFor": "{{inputValue}} を検索", 3 | "button": { 4 | "save": "検索を保存", 5 | "delete": "保存した検索を削除", 6 | "filterInformation": "フィルタ情報", 7 | "clear": "検索をクリア" 8 | }, 9 | "search": "検索", 10 | "savedSearches": "保存した検索" 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "authentication": "認証設定 - Frigate", 4 | "camera": "カメラの設定 - Frigate", 5 | "default": "設定 - Frigate" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/ja/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "cameras": "カメラ統計 - Frigate", 4 | "general": "一般統計 - Frigate", 5 | "storage": "ストレージ統計 - Frigate" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Brukernavn", 4 | "password": "Passord", 5 | "login": "Logg inn", 6 | "errors": { 7 | "usernameRequired": "Brukernavn er påkrevd", 8 | "passwordRequired": "Passord er påkrevd", 9 | "rateLimit": "Grense for antall forsøk overskredet. Prøv igjen senere.", 10 | "loginFailed": "Innlogging mislyktes", 11 | "unknownError": "Ukjent feil. Sjekk loggene.", 12 | "webUnknownError": "Ukjent feil. Sjekk konsoll-loggene." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Velg et ikon", 4 | "search": { 5 | "placeholder": "Søk etter et ikon…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Last ned video", 5 | "toast": { 6 | "success": "Videoen for inspeksjonselementet ditt har startet nedlasting." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Konfigurasjonsredigering - Frigate", 3 | "toast": { 4 | "error": { 5 | "savingError": "Feil ved lagring av konfigurasjon" 6 | }, 7 | "success": { 8 | "copyToClipboard": "Konfigurasjonen ble kopiert til utklippstavlen." 9 | } 10 | }, 11 | "configEditor": "Konfigurasjonsredigering", 12 | "copyConfig": "Kopier konfigurasjonen", 13 | "saveAndRestart": "Lagre og omstart", 14 | "saveOnly": "Kun lagre", 15 | "confirm": "Avslutt uten å lagre?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Eksport - Frigate", 3 | "search": "Søk", 4 | "noExports": "Ingen eksporter funnet", 5 | "deleteExport": "Slett eksport", 6 | "deleteExport.desc": "Er du sikker på at du vil slette {{exportName}}?", 7 | "editExport": { 8 | "title": "Gi nytt navn til eksport", 9 | "desc": "Skriv inn et nytt navn for denne eksporten.", 10 | "saveExport": "Lagre eksport" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Kunne ikke gi nytt navn til eksport: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/nb-NO/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filter", 3 | "export": "Eksporter", 4 | "calendar": "Kalender", 5 | "filters": "Filtre", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Ingen gyldig tidsperiode valgt", 9 | "endTimeMustAfterStartTime": "Sluttid må være etter starttid" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/nl/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "Wachtwoord", 4 | "login": "Inloggen", 5 | "errors": { 6 | "rateLimit": "Limiet overschreden. Probeer het later opnieuw.", 7 | "loginFailed": "Inloggen mislukt", 8 | "usernameRequired": "Gebruikersnaam is vereist", 9 | "passwordRequired": "Wachtwoord is vereist", 10 | "unknownError": "Onbekende fout. Bekijk de logs.", 11 | "webUnknownError": "Onbekende fout. Controleer consolelogboeken." 12 | }, 13 | "user": "Gebruikersnaam" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/nl/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Selecteer een pictogram", 4 | "search": { 5 | "placeholder": "Zoek naar een pictogram…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/nl/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Video downloaden", 5 | "toast": { 6 | "success": "Het downloaden van uw beoordelingsvideo is gestart." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/nl/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Configuratie-bewerken - Frigate", 3 | "copyConfig": "Configuratie kopiëren", 4 | "saveAndRestart": "Opslaan en opnieuw opstarten", 5 | "toast": { 6 | "error": { 7 | "savingError": "Fout bij het opslaan van de configuratie" 8 | }, 9 | "success": { 10 | "copyToClipboard": "Configuratie gekopieerd naar klembord." 11 | } 12 | }, 13 | "configEditor": "Configuratie Bewerken", 14 | "saveOnly": "Alleen opslaan", 15 | "confirm": "Afsluiten zonder op te slaan?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/nl/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Exporteren - Frigate", 3 | "search": "Zoek", 4 | "toast": { 5 | "error": { 6 | "renameExportFailed": "Het is niet gelukt om de export te hernoemen: {{errorMessage}}" 7 | } 8 | }, 9 | "editExport": { 10 | "title": "Hernoemen Export", 11 | "saveExport": "Export opslaan", 12 | "desc": "Voer een nieuwe naam in voor deze export." 13 | }, 14 | "noExports": "Geen export gevonden", 15 | "deleteExport": "Verwijder Export", 16 | "deleteExport.desc": "Weet je zeker dat je dit wilt wissen: {{exportName}}?" 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/nl/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Exporteren", 3 | "toast": { 4 | "error": { 5 | "endTimeMustAfterStartTime": "De eindtijd moet na de starttijd zijn", 6 | "noValidTimeSelected": "Er is geen geldig tijdsbereik geselecteerd" 7 | } 8 | }, 9 | "filter": "Filter", 10 | "calendar": "Kalender", 11 | "filters": "Filters" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/pl/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Nazwa użytkownika", 4 | "password": "Hasło", 5 | "login": "Login", 6 | "errors": { 7 | "usernameRequired": "Nazwa użytkownika jest wymagana", 8 | "passwordRequired": "Hasło jest wymagane", 9 | "loginFailed": "Logowanie nieudane", 10 | "unknownError": "Nieznany błąd. Sprawdź logi.", 11 | "webUnknownError": "Nieznany błąd. Sprawdź konsolę.", 12 | "rateLimit": "Przekroczono limit częstotliwości. Spróbuj ponownie później." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/pl/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Wybierz ikonę", 4 | "search": { 5 | "placeholder": "Wyszukaj ikonę…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/pl/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Pobierz Wideo", 5 | "toast": { 6 | "success": "Rozpoczęto pobieranie nagrania do przeglądu." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/pl/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Edytor konfiguracji - Frigate", 3 | "configEditor": "Edytor konfiguracji", 4 | "copyConfig": "Skopiuj konfigurację", 5 | "toast": { 6 | "success": { 7 | "copyToClipboard": "Konfiguracja skopiowana do schowka." 8 | }, 9 | "error": { 10 | "savingError": "Błąd podczas zapisywanie konfiguracji" 11 | } 12 | }, 13 | "saveOnly": "Tylko zapisz", 14 | "saveAndRestart": "Zapisz i uruchom ponownie", 15 | "confirm": "Zamknąć bez zapisu?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/pl/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Szukaj", 3 | "documentTitle": "Eksportuj - Frigate", 4 | "noExports": "Nie znaleziono eksportów", 5 | "deleteExport": "Usuń eksport", 6 | "deleteExport.desc": "Czy na pewno chcesz usunąć {{exportName}}?", 7 | "editExport": { 8 | "title": "Zmień nazwę eksportu", 9 | "desc": "Wprowadź nową nazwę dla tego eksportu.", 10 | "saveExport": "Zapisz eksport" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Nie udało się zmienić nazwy eksportu: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/pl/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filtr", 3 | "export": "Eksportuj", 4 | "calendar": "Kalendarz", 5 | "filters": "Filtry", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Nie wybrano poprawnego zakresu czasu", 9 | "endTimeMustAfterStartTime": "Czas końca musi być po czasie początku" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/pt/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Nome do utilizador", 4 | "login": "Login", 5 | "errors": { 6 | "usernameRequired": "O nome do utilizador é obrigatório", 7 | "passwordRequired": "Senha é necessária", 8 | "rateLimit": "Limite de taxa excedido. Tente novamente mais tarde.", 9 | "loginFailed": "Falha no login", 10 | "unknownError": "Erro desconhecido. Verifique os logs.", 11 | "webUnknownError": "Erro desconhecido. Verifique os logs da consola." 12 | }, 13 | "password": "Senha" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/pt/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Selecione um ícone", 4 | "search": { 5 | "placeholder": "Pesquisar por um ícone…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/pt/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Descarregar vídeo", 5 | "toast": { 6 | "success": "O vídeo do seu item de análise começou a ser descarregado." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/pt/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Editor de configuração", 3 | "copyConfig": "Copiar configuração", 4 | "saveAndRestart": "Salvar e reiniciar", 5 | "saveOnly": "Salvar Apenas", 6 | "toast": { 7 | "success": { 8 | "copyToClipboard": "Configuração copiada para a área de transferência." 9 | }, 10 | "error": { 11 | "savingError": "Erro ao salvar configuração" 12 | } 13 | }, 14 | "documentTitle": "Editor de configuração - Frigate", 15 | "confirm": "Sair sem salvar?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/pt/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Exportar - Frigate", 3 | "search": "Pesquisar", 4 | "noExports": "Nenhuma exportação encontrada", 5 | "deleteExport": "Excluir exportação", 6 | "editExport": { 7 | "title": "Renomear exportação", 8 | "desc": "Digite um novo nome para esta exportação.", 9 | "saveExport": "Salvar exportação" 10 | }, 11 | "toast": { 12 | "error": { 13 | "renameExportFailed": "Falha ao renomear exportação: {{errorMessage}}" 14 | } 15 | }, 16 | "deleteExport.desc": "Tem certeza de que deseja excluir {{exportName}}?" 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/pt/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Exportar", 3 | "calendar": "Calendário", 4 | "filter": "Filtro", 5 | "filters": "Filtros", 6 | "toast": { 7 | "error": { 8 | "endTimeMustAfterStartTime": "O horário de término deve ser posterior ao horário de início", 9 | "noValidTimeSelected": "Nenhum intervalo de tempo válido selecionado" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/ro/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Nume utilizator", 4 | "password": "Parola", 5 | "login": "Logare", 6 | "errors": { 7 | "passwordRequired": "Parola este necesara", 8 | "rateLimit": "Limita a fost depasita. Reincearca mai tarziu.", 9 | "loginFailed": "Logare esuata", 10 | "webUnknownError": "Eroare necunoscuta. Verifica logurile din consola.", 11 | "usernameRequired": "Utilizatorul este necesar", 12 | "unknownError": "Eroare necunoscuta. Verifica logurile." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/ro/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Selecteaza o pictograma", 4 | "search": { 5 | "placeholder": "Cauta o pictograma…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ro/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Descarca Video", 5 | "toast": { 6 | "success": "A inceput descarcarea clipului ce contine articolul revizuit." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ro/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Editor Setari - Frigate", 3 | "configEditor": "Editor Setari", 4 | "copyConfig": "Copiaza Setarile", 5 | "saveAndRestart": "Salveaza & Reporneste", 6 | "saveOnly": "Doar Salveaza", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Setari copiate in clipboard." 10 | }, 11 | "error": { 12 | "savingError": "Eroare la salvarea setarilor" 13 | } 14 | }, 15 | "confirm": "Ieși fără să salvezi?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/ro/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Cauta", 3 | "documentTitle": "Export - Frigate", 4 | "noExports": "Nu au fost gasite exporturi", 5 | "deleteExport": "Sterge Export", 6 | "deleteExport.desc": "Esti sigur ca vrei sa stergi {{exportName}}?", 7 | "editExport": { 8 | "title": "Redenumeste Exportul", 9 | "saveExport": "Salveaza Export", 10 | "desc": "Introdu un nume nou pentru acest Export." 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Eroare redenumire export: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/ro/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filtru", 3 | "export": "Exporta", 4 | "calendar": "Calendar", 5 | "filters": "Filtre", 6 | "toast": { 7 | "error": { 8 | "endTimeMustAfterStartTime": "Timpul de sfarsit trebuie sa fie dupa cel de start", 9 | "noValidTimeSelected": "Niciun interval de timp valid nu a fost selectat" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/ru/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Имя пользователя", 4 | "password": "Пароль", 5 | "login": "Логин", 6 | "errors": { 7 | "usernameRequired": "Необходимо ввести имя пользователя", 8 | "passwordRequired": "Необходимо ввести пароль", 9 | "rateLimit": "Превышение числа попыток. Попробуй еще раз позже.", 10 | "loginFailed": "Ошибка входа", 11 | "unknownError": "Неизвестная ошибка. Проверьте логи.", 12 | "webUnknownError": "Неизвестная ошибка. Проверьте логи консоли." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/ru/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Выберите иконку", 4 | "search": { 5 | "placeholder": "Поиск иконки…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ru/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Скачать видео", 5 | "toast": { 6 | "success": "Загрузка видео начата." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ru/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "configEditor": "Редактор конфигурации", 3 | "copyConfig": "Скопировать конфигурацию", 4 | "saveAndRestart": "Сохранить и перезапустить", 5 | "saveOnly": "Только сохранить", 6 | "documentTitle": "Редактор конфигурации - Frigate", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Конфигурация скопирована в буфер обмена." 10 | }, 11 | "error": { 12 | "savingError": "Ошибка сохранения конфигурации" 13 | } 14 | }, 15 | "confirm": "Выйти без сохранения?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/ru/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Экспорт - Frigate", 3 | "search": "Поиск", 4 | "noExports": "Не найдено файлов экспорта", 5 | "deleteExport": "Удалить экспорт", 6 | "deleteExport.desc": "Вы уверены, что хотите удалить {{exportName}}?", 7 | "editExport": { 8 | "title": "Переименовать экспорт", 9 | "desc": "Введите новое имя для этого экспорта.", 10 | "saveExport": "Сохранить экспорт" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Не удалось переименовать экспорт: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/ru/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Фильтр", 3 | "export": "Экспорт", 4 | "calendar": "Календарь", 5 | "filters": "Фильтры", 6 | "toast": { 7 | "error": { 8 | "endTimeMustAfterStartTime": "Конечное время должно быть позже начального", 9 | "noValidTimeSelected": "Выбран недопустимый временной диапазон" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/sl/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Uporabniško ime", 4 | "password": "Geslo", 5 | "login": "Prijava", 6 | "errors": { 7 | "usernameRequired": "Uporabniško ime je potrebno", 8 | "passwordRequired": "Geslo je zahtevano", 9 | "rateLimit": "Preveč poskusov, poskusite znova kasneje.", 10 | "loginFailed": "Prijava ni uspela", 11 | "unknownError": "Neznana napaka. Preverite dnevnike.", 12 | "webUnknownError": "Neznana napaka. Preverite dnevnike konzole." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/sl/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Izberite ikono", 4 | "search": { 5 | "placeholder": "Išči ikono .…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/sl/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Prenesi video", 5 | "toast": { 6 | "success": "Izbrani posnetek se je začel prenašati." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/sl/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Urejevalnik konfiguracij - Frigate", 3 | "configEditor": "Urejevalnik konfiguracij", 4 | "copyConfig": "Kopiraj konfiguracijo", 5 | "saveAndRestart": "Shrani & ponovno zaženi", 6 | "saveOnly": "Shani", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "Konfiguracija kopirana v odložišče." 10 | }, 11 | "error": { 12 | "savingError": "Napaka pri shranjevanju konfiguracije" 13 | } 14 | }, 15 | "confirm": "Izhod brez shranjevanja?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/sl/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Izvoz - Frigate", 3 | "search": "Iskanje", 4 | "noExports": "Izovzi niso najdeni", 5 | "deleteExport": "Izbriši izvoz", 6 | "deleteExport.desc": "Ali ste prepričani, da želite izbrisati {{exportName}}?", 7 | "editExport": { 8 | "title": "Preimenuj izvoz", 9 | "desc": "Vpišite novo ime za ta izvoz.", 10 | "saveExport": "Shrani izvoz" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Napaka pri preimenovanju izvoza: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/sl/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filter", 3 | "export": "Izvoz", 4 | "calendar": "Koledar", 5 | "filters": "Filtri", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Izbrano časovno obdobje ni veljavno", 9 | "endTimeMustAfterStartTime": "Končen čas mora biti po začetnem času" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/sv/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "Lösenord", 4 | "user": "Användarnamn", 5 | "login": "Logga in", 6 | "errors": { 7 | "usernameRequired": "Användarnamn är obligatoriskt", 8 | "passwordRequired": "Lösenord är obligatoriskt", 9 | "loginFailed": "Inloggning misslyckades", 10 | "unknownError": "Okänt fel. Kontrollera loggarna.", 11 | "webUnknownError": "Okänt fel. Kontrollera konsol loggarna.", 12 | "rateLimit": "Överskriden anropsgräns. Försök igen senare." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/sv/components/dialog.json: -------------------------------------------------------------------------------- 1 | { 2 | "restart": { 3 | "button": "Starta om", 4 | "restarting": { 5 | "title": "Frigate startar om", 6 | "content": "Sidan uppdateras om {{countdown}} seconds.", 7 | "button": "Tvinga uppdatering nu" 8 | }, 9 | "title": "Är du säker på att du vill starta om Frigate?" 10 | }, 11 | "explore": { 12 | "plus": { 13 | "submitToPlus": { 14 | "label": "Skicka till Frigate+" 15 | } 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /web/public/locales/sv/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "Sök efter ikon…" 5 | }, 6 | "selectIcon": "Välj en ikon" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/sv/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Ladda ner Video", 5 | "toast": { 6 | "success": "Din video laddas ner." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/sv/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "copyConfig": "Kopiera konfiguration", 3 | "saveAndRestart": "Spara & Starta om", 4 | "saveOnly": "Spara", 5 | "toast": { 6 | "success": { 7 | "copyToClipboard": "Konfiguration kopierad till urklipp." 8 | }, 9 | "error": { 10 | "savingError": "Problem att spara konfiguration" 11 | } 12 | }, 13 | "documentTitle": "Ändra konfiguration - Frigate", 14 | "configEditor": "Ändra konfiguration", 15 | "confirm": "Avsluta utan att spara?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/sv/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "generativeAI": "Generativ AI", 3 | "documentTitle": "Utforska - Frigate", 4 | "exploreIsUnavailable": { 5 | "embeddingsReindexing": { 6 | "startingUp": "Startar upp…", 7 | "estimatedTime": "Beräknad återstående tid:", 8 | "finishingShortly": "Snart klar" 9 | }, 10 | "title": "Utforska är inte tillgänglig" 11 | }, 12 | "details": { 13 | "timestamp": "tidsstämpel" 14 | }, 15 | "exploreMore": "Utforska fler {{label}} objekt" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/sv/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Sök", 3 | "documentTitle": "Export - Frigate", 4 | "noExports": "Inga exporter hittade", 5 | "deleteExport": "Radera export", 6 | "deleteExport.desc": "Är du säker att du vill radera {{exportName}}?", 7 | "editExport": { 8 | "desc": "Ange ett nytt namn för denna export.", 9 | "title": "Byt namn på Export", 10 | "saveExport": "Spara Export" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Misslyckades att byta namn på export: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/sv/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Export", 3 | "filter": "Filter", 4 | "calendar": "Kalender", 5 | "filters": "Filter", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Inget giltigt tidsintervall valt", 9 | "endTimeMustAfterStartTime": "Sluttid måste vara efter starttid" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/sv/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "storage": "Lagringsstatistik - Frigate", 4 | "general": "Allmän statistik - Frigate", 5 | "cameras": "Kamerastatistik - Frigate", 6 | "logs": { 7 | "frigate": "Frigate loggar - Frigate" 8 | } 9 | }, 10 | "logs": { 11 | "copy": { 12 | "label": "Kopiera till urklipp" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/th/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "ชื่อผู้ใช้", 4 | "errors": { 5 | "webUnknownError": "ข้อผิดพลาดที่ไม่รู้จัก. ตรวจสอบที่ console logs.", 6 | "rateLimit": "เกินขีดจำกัด. โปรดลองอีกครั้งในภายหลัง.", 7 | "loginFailed": "ล็อกอินไม่สำเร็จ", 8 | "unknownError": "ข้อผิดพลาดที่ไม่รู้จัก. ตรวจสอบที่ logs.", 9 | "passwordRequired": "ต้องการรหัสผ่าน", 10 | "usernameRequired": "ต้องการชื่อผู้ใช้" 11 | }, 12 | "login": "ล็อกอิน", 13 | "password": "รหัสผ่าน" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/th/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "เลือกไอคอน", 4 | "search": { 5 | "placeholder": "ค้นหาไอคอน" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/th/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "ดาวน์โหลดวิดีโอ", 5 | "toast": { 6 | "success": "วิดีโอรายการรีวิวของคุณเริ่มดาวน์โหลดแล้ว." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/th/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "copyConfig": "คัดลอกการกำหนดค่า", 3 | "saveOnly": "บันทึกเท่านั้น", 4 | "confirm": "ออกโดยที่ไม่บันทึก?", 5 | "toast": { 6 | "error": { 7 | "savingError": "เกิดข้อผิดพลาดในการบันทึกการกำหนดค่า" 8 | }, 9 | "success": { 10 | "copyToClipboard": "คัดลอกการกำหนดค่าไปยังคลิปบอร์ดแล้ว." 11 | } 12 | }, 13 | "saveAndRestart": "บันทึก และ รีสตาร์ท", 14 | "documentTitle": "ตัวแก้ไขการกำหนดค่า - Frigate", 15 | "configEditor": "ตัวแก้ไขการกำหนดค่า" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/th/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "ส่งออก - Frigate", 3 | "search": "ค้นหา", 4 | "noExports": "ไม่เจอการส่งออก", 5 | "deleteExport": "ลบส่งออก", 6 | "deleteExport.desc": "คุณแน่ใจหรอที่จะลบ {{exportName}}?", 7 | "editExport": { 8 | "title": "แก้ชื่อส่งออก", 9 | "desc": "ใส่ชื่อใหม่สำหรับการส่งออกนี้", 10 | "saveExport": "บันทึกการส่งออก" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "ผิดพลาดในการแก้ไขชื่อการส่งออก: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/th/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "ส่งออก", 3 | "calendar": "ปฎิทิน", 4 | "filter": "กรอง", 5 | "filters": "ตัวกรอง", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "ไม่ได้เลือกช่วงเวลาที่ถูกต้อง", 9 | "endTimeMustAfterStartTime": "เวลาสิ้นสุดต้องอยู่หลังเวลาเริ่มต้น" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/tr/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "password": "Parola", 4 | "login": "Oturum Aç", 5 | "errors": { 6 | "webUnknownError": "Bilinmeyen hata. Konsol günlüklerini kontrol edin.", 7 | "usernameRequired": "Kullanıcı adı gereklidir", 8 | "loginFailed": "Oturum açma başarısız", 9 | "passwordRequired": "Parola gereklidir", 10 | "rateLimit": "İstek sınırı aşıldı. Daha sonra tekrar deneyin.", 11 | "unknownError": "Bilinmeyen hata. Günlükleri kontrol edin." 12 | }, 13 | "user": "Kullanıcı Adı" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/tr/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "search": { 4 | "placeholder": "Bir simge arayın…" 5 | }, 6 | "selectIcon": "Bir simge belirleyin" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/tr/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Videoyu İndir", 5 | "toast": { 6 | "success": "İncele öğesinin videosu indirilmeye başlandı." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/tr/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "saveOnly": "Sadece Kaydet", 3 | "toast": { 4 | "error": { 5 | "savingError": "Yapılandırma kaydedilirken hata" 6 | }, 7 | "success": { 8 | "copyToClipboard": "Yapılandırma panoya kopyalandı." 9 | } 10 | }, 11 | "copyConfig": "Yapılandırmayı Kopyala", 12 | "configEditor": "Yapılandırma Düzenleyicisi", 13 | "documentTitle": "Yapılandırma Düzenleyicisi - Frigate", 14 | "saveAndRestart": "Kaydet & Yeniden Başlat", 15 | "confirm": "Kaydetmeden çıkılsın mı?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/tr/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Filtre", 3 | "export": "Dışa Aktar", 4 | "filters": "Filtreler", 5 | "toast": { 6 | "error": { 7 | "noValidTimeSelected": "Geçerli bir zaman aralığı seçilmedi", 8 | "endTimeMustAfterStartTime": "Bitiş zamanı başlangıç zamanında sonra olmalıdır" 9 | } 10 | }, 11 | "calendar": "Takvim" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/uk/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "errors": { 4 | "webUnknownError": "Невідома помилка. Перевірте журнали консолi.", 5 | "usernameRequired": "Ви повинні ввести ім'я користувача", 6 | "passwordRequired": "Необхідно ввести пароль", 7 | "rateLimit": "Перевищення кількості спроб. Спробуйте пізніше.", 8 | "loginFailed": "Спроба входу зазнала невдачі", 9 | "unknownError": "Невідома помилка. Перевірте журнали." 10 | }, 11 | "user": "Iм'я користувача", 12 | "password": "Пароль", 13 | "login": "Логiн" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/uk/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Оберіть іконку", 4 | "search": { 5 | "placeholder": "Пошук значка…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/uk/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Завантажити відео", 5 | "toast": { 6 | "success": "Розпочата завантаження відео." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/uk/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "saveAndRestart": "Зберегти та перезавантажити", 3 | "toast": { 4 | "error": { 5 | "savingError": "Помилка збереження конфігурації" 6 | }, 7 | "success": { 8 | "copyToClipboard": "Налаштування було скопійовано до буфера обміну даними." 9 | } 10 | }, 11 | "documentTitle": "Редактор конфігурації - Frigate", 12 | "copyConfig": "Скопіювати конфігурацію", 13 | "saveOnly": "Тільки зберегти", 14 | "configEditor": "Налаштування редактора", 15 | "confirm": "Вийти без збереження?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/uk/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "Експорта - Frigate", 3 | "search": "Пошук", 4 | "noExports": "Не знайдено експортованих файлів", 5 | "deleteExport": "Видалити експортування", 6 | "deleteExport.desc": "Ви справді бажаєте вилучити {{exportName}}?", 7 | "editExport": { 8 | "title": "Перейменувати експорт", 9 | "desc": "Введіть нову назву для цього експорту.", 10 | "saveExport": "Зберегти експорт" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Не вдалося перейменувати експорт: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/uk/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "Експорт", 3 | "toast": { 4 | "error": { 5 | "noValidTimeSelected": "Вибраний діапазон часу не є коректним", 6 | "endTimeMustAfterStartTime": "Час закінчення повинен бути пізніше часу початку" 7 | } 8 | }, 9 | "calendar": "Календар", 10 | "filter": "Фiльтр", 11 | "filters": "Фiльтри" 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "صارف نام", 4 | "password": "پاسورڈ", 5 | "login": "لاگ ان", 6 | "errors": { 7 | "usernameRequired": "صارف نام درکار ہے", 8 | "passwordRequired": "پاس ورڈ درکار ہے", 9 | "rateLimit": "شرح کی حد سے تجاوز کر گیا۔ بعد میں دوبارہ کوشش کریں۔", 10 | "loginFailed": "لاگ ان ناکام ہو گیا", 11 | "unknownError": "نامعلوم خرابی۔ لاگز چیک کریں۔" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/camera.json: -------------------------------------------------------------------------------- 1 | { 2 | "group": { 3 | "delete": { 4 | "confirm": { 5 | "desc": "کیا آپ واقعی کیمرہ گروپ <em>{{name}}</em> کو حذف کرنا چاہتے ہیں؟", 6 | "title": "حذف کی تصدیق کریں" 7 | }, 8 | "label": "کیمرہ گروپ کو حذف کریں" 9 | }, 10 | "label": "کیمرہ گروپس", 11 | "add": "کیمرہ گروپ شامل کریں", 12 | "edit": "کیمرہ گروپ میں ترمیم کریں", 13 | "name": { 14 | "label": "نام" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/filter.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "فلٹر", 3 | "labels": { 4 | "label": "لیبلز", 5 | "all": { 6 | "title": "تمام لیبلز", 7 | "short": "لیبلز" 8 | }, 9 | "count_one": "{{count}} لیبل", 10 | "count_other": "{{count}} لیبلز" 11 | }, 12 | "zones": { 13 | "label": "زونز", 14 | "all": { 15 | "title": "تمام زونز" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "آئیکن منتخب کریں", 4 | "search": { 5 | "placeholder": "آئیکن تلاش کریں…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "ویڈیو ڈاؤن لوڈ کریں", 5 | "toast": { 6 | "success": "آپ کی جائزے کی ویڈیو ڈاؤن لوڈ ہونا شروع ہو گئی ہے۔" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/ur/components/player.json: -------------------------------------------------------------------------------- 1 | { 2 | "noRecordingsFoundForThisTime": "اس وقت کے لیے کوئی ریکارڈنگ نہیں ملی", 3 | "noPreviewFound": "کوئی پیش نظارہ نہیں ملا", 4 | "noPreviewFoundFor": "{{cameraName}} کے لیے کوئی پیش نظارہ نہیں ملا", 5 | "submitFrigatePlus": { 6 | "title": "اس فریم کو فریگیٹ+ میں جمع کرائیں؟", 7 | "submit": "جمع کروائیں" 8 | }, 9 | "livePlayerRequiredIOSVersion": "اس لائیو اسٹریم کی قسم کے لیے iOS 17.1 یا اس سے جدید ورژن درکار ہے۔", 10 | "streamOffline": { 11 | "title": "آف لائن اسٹریم" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/ur/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "person": "شخص", 3 | "bicycle": "سائیکل", 4 | "car": "گاڑی", 5 | "motorcycle": "موٹر سائیکل", 6 | "airplane": "ہوائی جہاز", 7 | "bus": "بس", 8 | "train": "ٹرین" 9 | } 10 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "toast": { 3 | "error": { 4 | "savingError": "کنفیگریشن محفوظ کرنے میں خرابی" 5 | }, 6 | "success": { 7 | "copyToClipboard": "کنفیگ کلپ بورڈ پر کاپی ہو گیا۔" 8 | } 9 | }, 10 | "documentTitle": "کنفیگریشن ایڈیٹر - Frigate", 11 | "configEditor": "کنفیگریشن ایڈیٹر", 12 | "copyConfig": "کنفیگریشن نقل کریں", 13 | "saveAndRestart": "محفوظ کریں اور دوبارہ شروع کریں", 14 | "saveOnly": "صرف محفوظ کریں", 15 | "confirm": "محفوظ کیے بغیر باہر نکلیں؟" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/events.json: -------------------------------------------------------------------------------- 1 | { 2 | "alerts": "انتباہات", 3 | "detections": "کھوج", 4 | "motion": { 5 | "label": "حرکت", 6 | "only": "صرف حرکت" 7 | }, 8 | "allCameras": "تمام کیمرے", 9 | "empty": { 10 | "alert": "جائزہ لینے کے لیے کوئی انتباہات نہیں ہیں", 11 | "detection": "جائزہ لینے کے لیے کوئی ڈیٹیکشن موجود نہیں ہے", 12 | "motion": "کوئی موشن ڈیٹا نہیں ملا" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/explore.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "جائزہ لیں - فریگیٹ", 3 | "generativeAI": "جنریٹو اے آئی", 4 | "exploreIsUnavailable": { 5 | "title": "جائزہ لینا دستیاب نہیں ہے", 6 | "embeddingsReindexing": { 7 | "context": "جب ٹریک کیے گئے آبجیکٹ ایمبیڈنگز کی دوبارہ انڈیکسنگ مکمل ہو جائےتو \"جائزہ لیں\" استعمال کیا جا سکتا ہے۔", 8 | "startingUp": "شروع ہو رہا ہے…", 9 | "estimatedTime": "متوقع باقی وقت:" 10 | } 11 | }, 12 | "exploreMore": "مزید {{label}} اشیاء کو دریافت کریں" 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "برآمد - فریگیٹ", 3 | "search": "تلاش", 4 | "noExports": "کوئی برآمدات نہیں ملے", 5 | "deleteExport": "برآمد کو حذف کریں", 6 | "deleteExport.desc": "کیا آپ واقعی {{exportName}} کو حذف کرنا چاہتے ہیں؟", 7 | "editExport": { 8 | "title": "برآمد کا نام تبدیل کریں", 9 | "desc": "اس برآمد کے لیے ایک نیا نام درج کریں۔" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/faceLibrary.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": { 3 | "addFace": "فیس لائبریری میں نئی کلیکشن شامل کرنے کا طریقہ بتائیں۔", 4 | "placeholder": "اس مجموعہ کے لیے ایک نام درج کریں", 5 | "invalidName": "غلط نام۔ ناموں میں صرف حروف، اعداد، فاصلے، اپوسٹروف، انڈر اسکور، اور ہائفن شامل ہو سکتے ہیں۔" 6 | }, 7 | "details": { 8 | "face": "چہرے کی تفصیلات", 9 | "person": "شخص", 10 | "subLabelScore": "سب لیبل سکور", 11 | "scoreInfo": "سب لیبل سکور تمام تسلیم شدہ چہرے کے اعتماد کے لیے وزنی سکور ہے، اس لیے یہ سنیپ شاٹ پر دکھائے گئے سکور سے مختلف ہو سکتا ہے۔" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/live.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "لائیو - فریگیٹ", 3 | "documentTitle.withCamera": "{{camera}} -براہِ راست - فریگیٹ", 4 | "lowBandwidthMode": "کم بینڈوتھ موڈ", 5 | "twoWayTalk": { 6 | "enable": "دو طرفہ گفتگو کو فعال کریں", 7 | "disable": "دو طرفہ گفتگو کو غیر فعال کریں" 8 | }, 9 | "cameraAudio": { 10 | "enable": "کیمرہ آڈیو فعال کریں", 11 | "disable": "کیمرہ آڈیو کو غیر فعال کریں" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "فلٹر", 3 | "export": "برآمد", 4 | "calendar": "کیلنڈر", 5 | "filters": "فلٹرز", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "درست وقت کی حد منتخب نہیں کی گئی", 9 | "endTimeMustAfterStartTime": "اختتامی وقت آغاز کے وقت کے بعد ہونا چاہیے" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/search.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "تلاش", 3 | "savedSearches": "محفوظ شدہ تلاشیں", 4 | "searchFor": "{{inputValue}} تلاش کریں", 5 | "button": { 6 | "clear": "تلاش صاف کریں", 7 | "save": "تلاش کو محفوظ کریں", 8 | "delete": "محفوظ کردہ تلاش کو حذف کریں", 9 | "filterInformation": "معلومات کو فلٹر کریں" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "default": "ترتیبات - فریگیٹ", 4 | "authentication": "تصدیق کی ترتیبات - فریگیٹ", 5 | "camera": "کیمرے کی ترتیبات - فریگیٹ", 6 | "masksAndZones": "ماسک اور زون ایڈیٹر - فریگیٹ", 7 | "motionTuner": "موشن ٹونر - فریگیٹ", 8 | "object": "ڈی بگ - فریگیٹ", 9 | "enrichments": "افزودگی کی ترتیبات - فریگیٹ" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /web/public/locales/ur/views/system.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": { 3 | "cameras": "کیمروں کے اعدادوشمار - فریگیٹ", 4 | "storage": "اسٹوریج کے اعدادوشمار - فریگیٹ", 5 | "general": "عمومی اعدادوشمار - فریگیٹ", 6 | "enrichments": "افزودگی کے اعدادوشمار - فریگیٹ", 7 | "logs": { 8 | "frigate": "فریگیٹ لاگز - فریگیٹ", 9 | "go2rtc": "Go2RTC لاگز - فریگیٹ", 10 | "nginx": "Nginx لاگز - فریگیٹ" 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /web/public/locales/vi/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "Tên người dùng", 4 | "password": "Mật khẩu", 5 | "login": "Đăng nhập", 6 | "errors": { 7 | "usernameRequired": "Tên người dùng là bắt buộc", 8 | "passwordRequired": "Mật khẩu là bắt buộc", 9 | "rateLimit": "Đã vượt quá giới hạn tốc độ. Hãy thử lại sau.", 10 | "loginFailed": "Đăng nhập không thành công", 11 | "unknownError": "Lỗi không xác định. Kiểm tra nhật ký.", 12 | "webUnknownError": "Lỗi không xác định. Kiểm tra nhật ký bảng điều khiển." 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/vi/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "Chọn một biểu tượng", 4 | "search": { 5 | "placeholder": "Tìm kiếm một biểu tượng…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/vi/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "Tải xuống video", 5 | "toast": { 6 | "success": "Video trong mục xem lại của bạn đã bắt đầu tải xuống." 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/vi/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "copyConfig": "Sao chép cấu hình", 3 | "saveAndRestart": "Lưu & Khởi động lại", 4 | "saveOnly": "Chỉ lưu", 5 | "confirm": "Thoát mà không lưu?", 6 | "toast": { 7 | "error": { 8 | "savingError": "Lỗi khi lưu cấu hình" 9 | }, 10 | "success": { 11 | "copyToClipboard": "Đã sao chép cấu hình vào bộ nhớ tạm." 12 | } 13 | }, 14 | "configEditor": "Trình chỉnh sửa Cấu hình", 15 | "documentTitle": "Trình chỉnh sửa Cấu hình - Frigate" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/vi/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "search": "Tìm kiếm", 3 | "documentTitle": "Xuất tệp - Frigate", 4 | "noExports": "Không tìm thấy tệp xuất nào", 5 | "deleteExport": "Xóa tệp xuất", 6 | "deleteExport.desc": "Bạn có chắc chắn muốn xóa {{exportName}} không?", 7 | "editExport": { 8 | "title": "Đổi tên tệp xuất", 9 | "desc": "Nhập tên mới cho tệp xuất này.", 10 | "saveExport": "Lưu tệp xuất" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "Đổi tên tệp xuất thất bại: {{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/vi/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "Lọc", 3 | "export": "Xuất", 4 | "calendar": "Lịch", 5 | "filters": "Bộ lọc", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "Thời gian chọn không hợp lệ", 9 | "endTimeMustAfterStartTime": "Thời gian kết thúc phải sau thời gian bắt đầu" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "errors": { 4 | "webUnknownError": "未知錯誤。請檢查控制台日誌。", 5 | "rateLimit": "超過速率限制。請稍後再試。", 6 | "usernameRequired": "必須填寫用戶名", 7 | "passwordRequired": "必須填寫密碼", 8 | "loginFailed": "登入失敗", 9 | "unknownError": "未知錯誤。請檢查日誌。" 10 | }, 11 | "user": "用戶名", 12 | "password": "密碼", 13 | "login": "登入" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "選擇圖示", 4 | "search": { 5 | "placeholder": "搜尋圖示…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "下載影片", 5 | "toast": { 6 | "success": "你的審查項目影片已開始下載。" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "設定編輯器 - Frigate", 3 | "configEditor": "設定編輯器", 4 | "copyConfig": "複製設定", 5 | "saveAndRestart": "儲存並重新啟動", 6 | "saveOnly": "只儲存", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "設定已複製到剪貼簿。" 10 | }, 11 | "error": { 12 | "savingError": "儲存設定時出錯" 13 | } 14 | }, 15 | "confirm": "是否不儲存就離開?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "匯出 - Frigate", 3 | "search": "搜尋", 4 | "noExports": "未找到匯出項目", 5 | "deleteExport": "刪除匯出", 6 | "editExport": { 7 | "title": "重新命名匯出", 8 | "desc": "請輸入新的匯出名稱。", 9 | "saveExport": "儲存匯出" 10 | }, 11 | "toast": { 12 | "error": { 13 | "renameExportFailed": "重新命名匯出失敗:{{errorMessage}}" 14 | } 15 | }, 16 | "deleteExport.desc": "你確定要刪除 {{exportName}} 嗎?" 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/yue-Hant/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "filter": "篩選", 3 | "export": "匯出", 4 | "calendar": "日曆", 5 | "filters": "篩選條件", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "未選擇有效的時間範圍", 9 | "endTimeMustAfterStartTime": "結束時間必須在開始時間之後" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/components/auth.json: -------------------------------------------------------------------------------- 1 | { 2 | "form": { 3 | "user": "用户名", 4 | "password": "密码", 5 | "login": "登录", 6 | "errors": { 7 | "usernameRequired": "用户名不能为空", 8 | "passwordRequired": "密码不能为空", 9 | "rateLimit": "超出请求限制,请稍后再试。", 10 | "loginFailed": "登录失败", 11 | "unknownError": "未知错误,请检查日志。", 12 | "webUnknownError": "未知错误,请检查控制台日志。" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/components/icons.json: -------------------------------------------------------------------------------- 1 | { 2 | "iconPicker": { 3 | "selectIcon": "选择图标", 4 | "search": { 5 | "placeholder": "搜索图标…" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/components/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "button": { 3 | "downloadVideo": { 4 | "label": "下载视频", 5 | "toast": { 6 | "success": "你的核查视频已开始下载。" 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/views/configEditor.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "配置编辑器 - Frigate", 3 | "configEditor": "配置编辑器", 4 | "copyConfig": "复制配置", 5 | "saveAndRestart": "保存并重启", 6 | "saveOnly": "只保存", 7 | "toast": { 8 | "success": { 9 | "copyToClipboard": "配置已复制到剪贴板。" 10 | }, 11 | "error": { 12 | "savingError": "保存配置时出错" 13 | } 14 | }, 15 | "confirm": "是否退出并不保存?" 16 | } 17 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/views/exports.json: -------------------------------------------------------------------------------- 1 | { 2 | "documentTitle": "导出 - Frigate", 3 | "search": "搜索", 4 | "noExports": "没有找到导出的项目", 5 | "deleteExport": "删除导出的项目", 6 | "deleteExport.desc": "你确定要删除 {{exportName}} 吗?", 7 | "editExport": { 8 | "title": "重命名导出", 9 | "desc": "为此导出项目输入新名称。", 10 | "saveExport": "保存导出" 11 | }, 12 | "toast": { 13 | "error": { 14 | "renameExportFailed": "重命名导出失败:{{errorMessage}}" 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/public/locales/zh-CN/views/recording.json: -------------------------------------------------------------------------------- 1 | { 2 | "export": "导出", 3 | "calendar": "日历", 4 | "filter": "过滤器", 5 | "filters": "筛选条件", 6 | "toast": { 7 | "error": { 8 | "noValidTimeSelected": "未选择有效的时间范围", 9 | "endTimeMustAfterStartTime": "结束时间必须晚于开始时间" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /web/src/api/baseUrl.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | interface Window { 3 | baseUrl?: string; 4 | } 5 | } 6 | 7 | export const baseUrl = `${window.location.protocol}//${window.location.host}${window.baseUrl || "/"}`; 8 | -------------------------------------------------------------------------------- /web/src/components/Wrapper.tsx: -------------------------------------------------------------------------------- 1 | import { ReactNode } from "react"; 2 | 3 | type TWrapperProps = { 4 | children: ReactNode; 5 | }; 6 | 7 | const Wrapper = ({ children }: TWrapperProps) => { 8 | return <main className="h-dvh w-full overflow-hidden">{children}</main>; 9 | }; 10 | 11 | export default Wrapper; 12 | -------------------------------------------------------------------------------- /web/src/components/indicators/ImageLoadingIndicator.tsx: -------------------------------------------------------------------------------- 1 | import { isSafari } from "react-device-detect"; 2 | import { Skeleton } from "../ui/skeleton"; 3 | import { cn } from "@/lib/utils"; 4 | 5 | export default function ImageLoadingIndicator({ 6 | className, 7 | imgLoaded, 8 | }: { 9 | className?: string; 10 | imgLoaded: boolean; 11 | }) { 12 | if (imgLoaded) { 13 | return; 14 | } 15 | 16 | return isSafari ? ( 17 | <div className={cn("pointer-events-none bg-background_alt", className)} /> 18 | ) : ( 19 | <Skeleton className={cn("pointer-events-none", className)} /> 20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /web/src/components/indicators/activity-indicator.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils"; 2 | import { AiOutlineLoading3Quarters } from "react-icons/ai"; 3 | 4 | export default function ActivityIndicator({ className = "w-full", size = 30 }) { 5 | return ( 6 | <div 7 | className={cn("flex items-center justify-center", className)} 8 | aria-label="Loading…" 9 | > 10 | <AiOutlineLoading3Quarters className="animate-spin" size={size} /> 11 | </div> 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /web/src/components/navigation/Redirect.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect } from "react"; 2 | import { useNavigate } from "react-router-dom"; 3 | 4 | type RedirectProps = { 5 | to: string; 6 | }; 7 | export function Redirect({ to }: RedirectProps) { 8 | const navigate = useNavigate(); 9 | 10 | useEffect(() => { 11 | navigate(to); 12 | }, [to, navigate]); 13 | return <div />; 14 | } 15 | -------------------------------------------------------------------------------- /web/src/components/ui/aspect-ratio.tsx: -------------------------------------------------------------------------------- 1 | import * as AspectRatioPrimitive from "@radix-ui/react-aspect-ratio" 2 | 3 | const AspectRatio = AspectRatioPrimitive.Root 4 | 5 | export { AspectRatio } 6 | -------------------------------------------------------------------------------- /web/src/components/ui/icon-wrapper.tsx: -------------------------------------------------------------------------------- 1 | import { ForwardedRef, forwardRef } from "react"; 2 | import { IconType } from "react-icons"; 3 | 4 | interface IconWrapperProps { 5 | icon: IconType; 6 | className?: string; 7 | [key: string]: any; 8 | } 9 | 10 | const IconWrapper = forwardRef( 11 | ( 12 | { icon: Icon, className, ...props }: IconWrapperProps, 13 | ref: ForwardedRef<HTMLDivElement>, 14 | ) => ( 15 | <div {...props} ref={ref}> 16 | <Icon className={className} /> 17 | </div> 18 | ), 19 | ); 20 | 21 | export default IconWrapper; 22 | -------------------------------------------------------------------------------- /web/src/components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes<HTMLDivElement>) { 7 | return ( 8 | <div 9 | className={cn("animate-pulse rounded-md bg-muted", className)} 10 | {...props} 11 | /> 12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /web/src/env.ts: -------------------------------------------------------------------------------- 1 | export const ENV = import.meta.env.MODE; 2 | -------------------------------------------------------------------------------- /web/src/hooks/use-deep-memo.ts: -------------------------------------------------------------------------------- 1 | import { useRef } from "react"; 2 | import { isEqual } from "lodash"; 3 | 4 | export default function useDeepMemo<T>(value: T) { 5 | const ref = useRef<T | undefined>(undefined); 6 | 7 | if (!isEqual(ref.current, value)) { 8 | ref.current = value; 9 | } 10 | 11 | return ref.current; 12 | } 13 | -------------------------------------------------------------------------------- /web/src/hooks/use-image-loaded.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState } from "react"; 2 | 3 | const useImageLoaded = (): [ 4 | React.RefObject<HTMLImageElement>, 5 | boolean, 6 | () => void, 7 | ] => { 8 | const [loaded, setLoaded] = useState(false); 9 | const ref = useRef<HTMLImageElement>(null); 10 | 11 | const onLoad = () => { 12 | setLoaded(true); 13 | }; 14 | 15 | useEffect(() => { 16 | if (ref.current && ref.current?.complete) { 17 | onLoad(); 18 | } 19 | }); 20 | 21 | return [ref, loaded, onLoad]; 22 | }; 23 | 24 | export default useImageLoaded; 25 | -------------------------------------------------------------------------------- /web/src/hooks/use-is-admin.ts: -------------------------------------------------------------------------------- 1 | import { useContext } from "react"; 2 | import { AuthContext } from "@/context/auth-context"; 3 | 4 | export function useIsAdmin() { 5 | const { auth } = useContext(AuthContext); 6 | const isAdmin = 7 | (auth.isAuthenticated && auth.user?.role === "admin") || 8 | auth.user?.role === undefined; 9 | return isAdmin; 10 | } 11 | -------------------------------------------------------------------------------- /web/src/lib/const.ts: -------------------------------------------------------------------------------- 1 | export const supportedLanguageKeys = [ 2 | "en", 3 | "es", 4 | "pt", 5 | "fr", 6 | "de", 7 | "it", 8 | "ca", 9 | "ro", 10 | "nl", 11 | "nb-NO", 12 | "zh-CN", 13 | "yue-Hant", 14 | "vi", 15 | "th", 16 | "he", 17 | "ru", 18 | "tr", 19 | "pl", 20 | "uk", 21 | "cs", 22 | "hu", 23 | ]; 24 | -------------------------------------------------------------------------------- /web/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /web/src/login.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import LoginPage from "@/pages/LoginPage.tsx"; 4 | import "@/api"; 5 | import "./index.css"; 6 | 7 | ReactDOM.createRoot(document.getElementById("root")!).render( 8 | <React.StrictMode> 9 | <LoginPage /> 10 | </React.StrictMode>, 11 | ); 12 | -------------------------------------------------------------------------------- /web/src/main.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom/client"; 3 | import App from "./App.tsx"; 4 | import "./index.css"; 5 | import "@/utils/i18n"; 6 | import "react-i18next"; 7 | 8 | ReactDOM.createRoot(document.getElementById("root")!).render( 9 | <React.StrictMode> 10 | <App /> 11 | </React.StrictMode>, 12 | ); 13 | -------------------------------------------------------------------------------- /web/src/pages/NoMatch.tsx: -------------------------------------------------------------------------------- 1 | import Heading from "@/components/ui/heading"; 2 | import { useEffect } from "react"; 3 | import { useTranslation } from "react-i18next"; 4 | 5 | function NoMatch() { 6 | const { t } = useTranslation(["common"]); 7 | useEffect(() => { 8 | document.title = t("notFound.documentTitle"); 9 | }, [t]); 10 | 11 | return ( 12 | <> 13 | <Heading as="h2">{t("notFound.title")}</Heading> 14 | <p>{t("notFound.desc")}</p> 15 | </> 16 | ); 17 | } 18 | 19 | export default NoMatch; 20 | -------------------------------------------------------------------------------- /web/src/types/draggable-element.ts: -------------------------------------------------------------------------------- 1 | export type DraggableElement = "handlebar" | "export_start" | "export_end"; 2 | -------------------------------------------------------------------------------- /web/src/types/export.ts: -------------------------------------------------------------------------------- 1 | export type Export = { 2 | id: string; 3 | camera: string; 4 | name: string; 5 | date: number; 6 | video_path: string; 7 | thumb_path: string; 8 | in_progress: boolean; 9 | }; 10 | 11 | export type DeleteClipType = { 12 | file: string; 13 | exportName: string; 14 | }; 15 | -------------------------------------------------------------------------------- /web/src/types/face.ts: -------------------------------------------------------------------------------- 1 | export type FaceLibraryData = { 2 | [faceName: string]: string[]; 3 | }; 4 | 5 | export type RecognizedFaceData = { 6 | filename: string; 7 | timestamp: number; 8 | eventId: string; 9 | name: string; 10 | score: number; 11 | }; 12 | -------------------------------------------------------------------------------- /web/src/types/filter.ts: -------------------------------------------------------------------------------- 1 | // allow any 2 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 3 | export type FilterType = { [searchKey: string]: any }; 4 | 5 | export type ExportMode = "select" | "timeline" | "none"; 6 | 7 | export type FilterList = { 8 | labels?: string[]; 9 | zones?: string[]; 10 | }; 11 | 12 | export const LAST_24_HOURS_KEY = "last24Hours"; 13 | 14 | export type GeneralFilter = { 15 | showAll?: boolean; 16 | labels?: string[]; 17 | zones?: string[]; 18 | }; 19 | -------------------------------------------------------------------------------- /web/src/types/log.ts: -------------------------------------------------------------------------------- 1 | export type LogData = { 2 | totalLines: number; 3 | lines: string[]; 4 | }; 5 | 6 | export type LogSeverity = "info" | "warning" | "error" | "debug"; 7 | 8 | export type LogLine = { 9 | dateStamp: string; 10 | severity: LogSeverity; 11 | section: string; 12 | content: string; 13 | }; 14 | 15 | export const logTypes = ["frigate", "go2rtc", "nginx"] as const; 16 | export type LogType = (typeof logTypes)[number]; 17 | 18 | export type LogSettingsType = { 19 | disableStreaming: boolean; 20 | }; 21 | -------------------------------------------------------------------------------- /web/src/types/navigation.ts: -------------------------------------------------------------------------------- 1 | import { IconType } from "react-icons"; 2 | 3 | export type NavData = { 4 | id: number; 5 | variant?: "primary" | "secondary"; 6 | icon: IconType; 7 | title: string; 8 | url: string; 9 | enabled?: boolean; 10 | }; 11 | -------------------------------------------------------------------------------- /web/src/types/playback.ts: -------------------------------------------------------------------------------- 1 | import { Preview } from "./preview"; 2 | import { Recording } from "./record"; 3 | import { TimeRange } from "./timeline"; 4 | 5 | export type DynamicPlayback = { 6 | recordings: Recording[]; 7 | timeRange: TimeRange; 8 | }; 9 | 10 | export type PreviewPlayback = { 11 | preview: Preview | undefined; 12 | timeRange: TimeRange; 13 | }; 14 | -------------------------------------------------------------------------------- /web/src/types/preview.ts: -------------------------------------------------------------------------------- 1 | import { REVIEW_PADDING } from "./review"; 2 | 3 | export type Preview = { 4 | camera: string; 5 | src: string; 6 | type: string; 7 | start: number; 8 | end: number; 9 | }; 10 | 11 | export const PREVIEW_FPS = 8; 12 | export const PREVIEW_PADDING = REVIEW_PADDING * PREVIEW_FPS; 13 | -------------------------------------------------------------------------------- /web/src/types/ptz.ts: -------------------------------------------------------------------------------- 1 | type PtzFeature = "pt" | "zoom" | "pt-r" | "zoom-r" | "zoom-a" | "pt-r-fov"; 2 | 3 | export type CameraPtzInfo = { 4 | name: string; 5 | features: PtzFeature[]; 6 | presets: string[]; 7 | }; 8 | -------------------------------------------------------------------------------- /web/src/types/user.ts: -------------------------------------------------------------------------------- 1 | export type User = { 2 | username: string; 3 | role: string; 4 | }; 5 | -------------------------------------------------------------------------------- /web/src/utils/browserUtil.ts: -------------------------------------------------------------------------------- 1 | import copy from "copy-to-clipboard"; 2 | import { t } from "i18next"; 3 | import { toast } from "sonner"; 4 | 5 | export function shareOrCopy(url: string, title?: string) { 6 | if (window.isSecureContext && "share" in navigator) { 7 | navigator.share({ 8 | url: url, 9 | title: title, 10 | }); 11 | } else { 12 | copy(url); 13 | toast.success(t("toast.copyUrlToClipboard", { ns: "common" }), { 14 | position: "top-center", 15 | }); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /web/src/utils/isIFrame.ts: -------------------------------------------------------------------------------- 1 | export const isInIframe = (() => { 2 | try { 3 | return window.self !== window.top; 4 | } catch (e) { 5 | // If we get a security error, we're definitely in an iframe 6 | return true; 7 | } 8 | })(); 9 | -------------------------------------------------------------------------------- /web/src/utils/isPWA.ts: -------------------------------------------------------------------------------- 1 | export const isPWA = 2 | ("standalone" in window.navigator && window.navigator.standalone) || 3 | window.matchMedia("(display-mode: standalone)").matches; 4 | -------------------------------------------------------------------------------- /web/src/utils/storageUtil.ts: -------------------------------------------------------------------------------- 1 | export const getUnitSize = (MB: number) => { 2 | if (MB === null || isNaN(MB) || MB < 0) return "Invalid number"; 3 | if (MB < 1024) return `${MB.toFixed(2)} MiB`; 4 | if (MB < 1048576) return `${(MB / 1024).toFixed(2)} GiB`; 5 | 6 | return `${(MB / 1048576).toFixed(2)} TiB`; 7 | }; 8 | -------------------------------------------------------------------------------- /web/src/utils/stringUtil.ts: -------------------------------------------------------------------------------- 1 | export const capitalizeFirstLetter = (text: string): string => { 2 | return text.charAt(0).toUpperCase() + text.slice(1); 3 | }; 4 | 5 | export const capitalizeAll = (text: string): string => { 6 | return text 7 | .replaceAll("_", " ") 8 | .split(" ") 9 | .map((word) => word.charAt(0).toUpperCase() + word.slice(1)) 10 | .join(" "); 11 | }; 12 | -------------------------------------------------------------------------------- /web/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// <reference types="vite/client" /> 2 | -------------------------------------------------------------------------------- /web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "skipLibCheck": true, 5 | "module": "ESNext", 6 | "moduleResolution": "bundler", 7 | "allowSyntheticDefaultImports": true 8 | }, 9 | "include": ["vite.config.ts"] 10 | } 11 | --------------------------------------------------------------------------------