uiprotect 7.15.0__tar.gz → 7.16.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of uiprotect might be problematic. Click here for more details.

Files changed (38) hide show
  1. {uiprotect-7.15.0 → uiprotect-7.16.0}/PKG-INFO +1 -1
  2. {uiprotect-7.15.0 → uiprotect-7.16.0}/pyproject.toml +1 -1
  3. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/api.py +9 -7
  4. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/devices.py +7 -0
  5. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/test_util/__init__.py +9 -0
  6. {uiprotect-7.15.0 → uiprotect-7.16.0}/LICENSE +0 -0
  7. {uiprotect-7.15.0 → uiprotect-7.16.0}/README.md +0 -0
  8. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/__init__.py +0 -0
  9. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/__main__.py +0 -0
  10. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/_compat.py +0 -0
  11. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/__init__.py +0 -0
  12. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/aiports.py +0 -0
  13. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/backup.py +0 -0
  14. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/base.py +0 -0
  15. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/cameras.py +0 -0
  16. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/chimes.py +0 -0
  17. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/doorlocks.py +0 -0
  18. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/events.py +0 -0
  19. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/lights.py +0 -0
  20. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/liveviews.py +0 -0
  21. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/nvr.py +0 -0
  22. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/sensors.py +0 -0
  23. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/cli/viewers.py +0 -0
  24. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/__init__.py +0 -0
  25. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/base.py +0 -0
  26. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/bootstrap.py +0 -0
  27. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/convert.py +0 -0
  28. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/nvr.py +0 -0
  29. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/types.py +0 -0
  30. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/user.py +0 -0
  31. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/data/websocket.py +0 -0
  32. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/exceptions.py +0 -0
  33. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/py.typed +0 -0
  34. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/release_cache.json +0 -0
  35. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/stream.py +0 -0
  36. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/test_util/anonymize.py +0 -0
  37. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/utils.py +0 -0
  38. {uiprotect-7.15.0 → uiprotect-7.16.0}/src/uiprotect/websocket.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: uiprotect
3
- Version: 7.15.0
3
+ Version: 7.16.0
4
4
  Summary: Python API for Unifi Protect (Unofficial)
5
5
  License: MIT
6
6
  Author: UI Protect Maintainers
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "uiprotect"
3
- version = "7.15.0"
3
+ version = "7.16.0"
4
4
  license = "MIT"
5
5
  description = "Python API for Unifi Protect (Unofficial)"
6
6
  authors = [{ name = "UI Protect Maintainers", email = "ui@koston.org" }]
@@ -1519,6 +1519,14 @@ class ProtectApiClient(BaseApiClient):
1519
1519
  raise_exception=False,
1520
1520
  )
1521
1521
 
1522
+ async def get_public_api_camera_snapshot(self, camera_id: str) -> bytes | None:
1523
+ """Gets snapshot for a camera using public api."""
1524
+ return await self.api_request_raw(
1525
+ public_api=True,
1526
+ url=f"v1/cameras/{camera_id}/snapshot",
1527
+ params={"highQuality": "true"},
1528
+ )
1529
+
1522
1530
  async def get_package_camera_snapshot(
1523
1531
  self,
1524
1532
  camera_id: str,
@@ -2089,15 +2097,9 @@ class ProtectApiClient(BaseApiClient):
2089
2097
  if not name:
2090
2098
  raise BadRequest("API key name cannot be empty")
2091
2099
 
2092
- user_id = None
2093
- if self._last_token_cookie_decode is not None:
2094
- user_id = self._last_token_cookie_decode.get("userId")
2095
- if not user_id:
2096
- raise BadRequest("User ID not available for API key creation")
2097
-
2098
2100
  response = await self.api_request(
2099
2101
  api_path="/proxy/users/api/v2",
2100
- url=f"/user/{user_id}/keys",
2102
+ url="/user/self/keys",
2101
2103
  method="post",
2102
2104
  json={"name": name},
2103
2105
  )
@@ -2085,6 +2085,13 @@ class Camera(ProtectMotionDeviceModel):
2085
2085
 
2086
2086
  return await self._api.get_camera_snapshot(self.id, width, height, dt=dt)
2087
2087
 
2088
+ async def get_public_api_snapshot(self) -> bytes | None:
2089
+ """Gets snapshot for camera using public API."""
2090
+ if self._api._api_key is None:
2091
+ raise NotAuthorized("Cannot get public API snapshot without an API key.")
2092
+
2093
+ return await self._api.get_public_api_camera_snapshot(self.id)
2094
+
2088
2095
  async def get_package_snapshot(
2089
2096
  self,
2090
2097
  width: int | None = None,
@@ -325,6 +325,15 @@ class SampleDataGenerator:
325
325
  snapshot = await self.client.get_camera_snapshot(obj["id"], width, height)
326
326
  await self.write_image_file(filename, snapshot)
327
327
 
328
+ # public api snapshot
329
+ pub_filename = "sample_camera_public_api_snapshot"
330
+ if self.anonymize:
331
+ self.log(f"Writing {pub_filename}...")
332
+ placeholder_image(self.output_folder / f"{pub_filename}.png", width, height)
333
+ else:
334
+ pub_snapshot = await self.client.get_public_api_camera_snapshot(obj["id"])
335
+ await self.write_image_file(pub_filename, pub_snapshot)
336
+
328
337
  async def generate_motion_data(
329
338
  self,
330
339
  motion_event: dict[str, Any] | None,
File without changes
File without changes