Compare commits

..

No commits in common. "9cdc10008da02bbf80c910461ae520fe8e137077" and "dfd837cfb0c84ed6abf7753732037c12c84690b5" have entirely different histories.

11 changed files with 32 additions and 73 deletions

View File

@ -23,7 +23,7 @@ jobs:
name: AMD64 Build
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
@ -47,7 +47,7 @@ jobs:
name: ARM Build
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
@ -82,7 +82,7 @@ jobs:
name: Jetson Jetpack 6
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
@ -113,7 +113,7 @@ jobs:
- amd64_build
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
@ -154,7 +154,7 @@ jobs:
- arm64_build
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx
@ -179,7 +179,7 @@ jobs:
- arm64_build
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up QEMU and Buildx

View File

@ -16,7 +16,7 @@ jobs:
name: Web - Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@master
@ -32,7 +32,7 @@ jobs:
name: Web - Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@master
@ -52,7 +52,7 @@ jobs:
name: Python Checks
steps:
- name: Check out the repository
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- name: Set up Python ${{ env.DEFAULT_PYTHON }}
@ -75,7 +75,7 @@ jobs:
name: Python Tests
steps:
- name: Check out code
uses: actions/checkout@v6
uses: actions/checkout@v5
with:
persist-credentials: false
- uses: actions/setup-node@master

View File

@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v5
with:
persist-credentials: false
- id: lowercaseRepo

View File

@ -710,7 +710,7 @@ def delete_classification_dataset_images(
if os.path.isfile(file_path):
os.unlink(file_path)
if os.path.exists(folder) and not os.listdir(folder) and category.lower() != "none":
if os.path.exists(folder) and not os.listdir(folder):
os.rmdir(folder)
return JSONResponse(

View File

@ -607,27 +607,23 @@ class Dispatcher:
)
self.publish(f"{camera_name}/snapshots/state", payload, retain=True)
def _on_ptz_command(self, camera_name: str, payload: str | bytes) -> None:
def _on_ptz_command(self, camera_name: str, payload: str) -> None:
"""Callback for ptz topic."""
try:
preset: str = (
payload.decode("utf-8") if isinstance(payload, bytes) else payload
).lower()
if "preset" in preset:
if "preset" in payload.lower():
command = OnvifCommandEnum.preset
param = preset[preset.index("_") + 1 :]
elif "move_relative" in preset:
param = payload.lower()[payload.index("_") + 1 :]
elif "move_relative" in payload.lower():
command = OnvifCommandEnum.move_relative
param = preset[preset.index("_") + 1 :]
param = payload.lower()[payload.index("_") + 1 :]
else:
command = OnvifCommandEnum[preset]
command = OnvifCommandEnum[payload.lower()]
param = ""
self.onvif.handle_command(camera_name, command, param)
logger.info(f"Setting ptz command to {command} for {camera_name}")
except KeyError as k:
logger.error(f"Invalid PTZ command {preset}: {k}")
logger.error(f"Invalid PTZ command {payload}: {k}")
def _on_birdseye_command(self, camera_name: str, payload: str) -> None:
"""Callback for birdseye topic."""

View File

@ -95,21 +95,12 @@ class OnvifController:
cam = self.camera_configs[cam_name]
try:
user = cam.onvif.user
password = cam.onvif.password
if user is not None and isinstance(user, bytes):
user = user.decode("utf-8")
if password is not None and isinstance(password, bytes):
password = password.decode("utf-8")
self.cams[cam_name] = {
"onvif": ONVIFCamera(
cam.onvif.host,
cam.onvif.port,
user,
password,
cam.onvif.user,
cam.onvif.password,
wsdl_dir=str(Path(find_spec("onvif").origin).parent / "wsdl"),
adjust_time=cam.onvif.ignore_time_mismatch,
encrypt=not cam.onvif.tls_insecure,
@ -334,15 +325,9 @@ class OnvifController:
presets = []
for preset in presets:
# Ensure preset name is a Unicode string and handle UTF-8 characters correctly
preset_name = getattr(preset, "Name") or f"preset {preset['token']}"
if isinstance(preset_name, bytes):
preset_name = preset_name.decode("utf-8")
# Convert to lowercase while preserving UTF-8 characters
preset_name_lower = preset_name.lower()
self.cams[camera_name]["presets"][preset_name_lower] = preset["token"]
self.cams[camera_name]["presets"][
(getattr(preset, "Name") or f"preset {preset['token']}").lower()
] = preset["token"]
# get list of supported features
supported_features = []
@ -578,11 +563,6 @@ class OnvifController:
self.cams[camera_name]["active"] = False
async def _move_to_preset(self, camera_name: str, preset: str) -> None:
if isinstance(preset, bytes):
preset = preset.decode("utf-8")
preset = preset.lower()
if preset not in self.cams[camera_name]["presets"]:
logger.error(f"{preset} is not a valid preset for {camera_name}")
return

View File

@ -441,7 +441,7 @@ export default function ZoneEditPane({
}
let friendlyNameQuery = "";
if (friendly_name && friendly_name !== zoneName) {
if (friendly_name) {
friendlyNameQuery = `&cameras.${polygon?.camera}.zones.${zoneName}.friendly_name=${encodeURIComponent(friendly_name)}`;
}

View File

@ -316,7 +316,7 @@ function ReviewGroup({
date_style: "medium",
});
const shouldFetchEvents = open && review?.data?.detections?.length > 0;
const shouldFetchEvents = review?.data?.detections?.length > 0;
const { data: fetchedEvents, isValidating } = useSWR<Event[]>(
shouldFetchEvents

View File

@ -134,20 +134,10 @@ function Live() {
.sort((aConf, bConf) => aConf.ui.order - bConf.ui.order);
}, [config, cameraGroup, allowedCameras]);
const selectedCamera = useMemo(() => {
if (!config || !selectedCameraName || selectedCameraName === "birdseye") {
return undefined;
}
const camera = config.cameras[selectedCameraName];
if (
camera &&
allowedCameras.includes(selectedCameraName) &&
camera.enabled_in_config
) {
return camera;
}
return undefined;
}, [config, selectedCameraName, allowedCameras]);
const selectedCamera = useMemo(
() => cameras.find((cam) => cam.name == selectedCameraName),
[cameras, selectedCameraName],
);
return (
<div className="size-full" ref={mainRef}>
@ -156,7 +146,6 @@ function Live() {
supportsFullscreen={supportsFullScreen}
fullscreen={fullscreen}
toggleFullscreen={toggleFullscreen}
onSelectCamera={setSelectedCameraName}
/>
) : selectedCamera ? (
<LiveCameraView

View File

@ -28,14 +28,12 @@ type LiveBirdseyeViewProps = {
supportsFullscreen: boolean;
fullscreen: boolean;
toggleFullscreen: () => void;
onSelectCamera?: (cameraName: string) => void;
};
export default function LiveBirdseyeView({
supportsFullscreen,
fullscreen,
toggleFullscreen,
onSelectCamera,
}: LiveBirdseyeViewProps) {
const { t } = useTranslation(["views/live"]);
const { data: config } = useSWR<FrigateConfig>("config");
@ -183,13 +181,13 @@ export default function LiveBirdseyeView({
canvasY >= parsedCoords.y &&
canvasY < parsedCoords.y + parsedCoords.height
) {
onSelectCamera?.(cameraName);
navigate(`/#${cameraName}`);
break;
}
}
}
},
[playerRef, config, birdseyeLayout, onSelectCamera],
[playerRef, config, birdseyeLayout, navigate],
);
if (!config) {

View File

@ -252,10 +252,6 @@ export default function ObjectSettingsView({
className="ml-1"
id={param}
checked={options && options[param]}
disabled={
param === "paths" &&
cameraConfig?.onvif?.autotracking?.enabled_in_config
}
onCheckedChange={(isChecked) => {
handleSetOption(param, isChecked);
}}