Fix incorrectly return type on bad_identifier in UniFi Protect (#85050)

This commit is contained in:
Franck Nijhof 2023-01-03 20:10:27 +01:00 committed by GitHub
parent 171e114ec1
commit c1a6f83f12
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -5,7 +5,7 @@ from __future__ import annotations
import asyncio import asyncio
from datetime import date, datetime, timedelta from datetime import date, datetime, timedelta
from enum import Enum from enum import Enum
from typing import Any, cast from typing import Any, NoReturn, cast
from pyunifiprotect.data import ( from pyunifiprotect.data import (
Camera, Camera,
@ -107,18 +107,13 @@ def _get_month_start_end(start: datetime) -> tuple[datetime, datetime]:
@callback @callback
def _bad_identifier(identifier: str, err: Exception | None = None) -> BrowseMediaSource: def _bad_identifier(identifier: str, err: Exception | None = None) -> NoReturn:
msg = f"Unexpected identifier: {identifier}" msg = f"Unexpected identifier: {identifier}"
if err is None: if err is None:
raise BrowseError(msg) raise BrowseError(msg)
raise BrowseError(msg) from err raise BrowseError(msg) from err
@callback
def _bad_identifier_media(identifier: str, err: Exception | None = None) -> PlayMedia:
return cast(PlayMedia, _bad_identifier(identifier, err))
@callback @callback
def _format_duration(duration: timedelta) -> str: def _format_duration(duration: timedelta) -> str:
formatted = "" formatted = ""
@ -164,20 +159,20 @@ class ProtectMediaSource(MediaSource):
parts = item.identifier.split(":") parts = item.identifier.split(":")
if len(parts) != 3 or parts[1] not in ("event", "eventthumb"): if len(parts) != 3 or parts[1] not in ("event", "eventthumb"):
return _bad_identifier_media(item.identifier) _bad_identifier(item.identifier)
thumbnail_only = parts[1] == "eventthumb" thumbnail_only = parts[1] == "eventthumb"
try: try:
data = self.data_sources[parts[0]] data = self.data_sources[parts[0]]
except (KeyError, IndexError) as err: except (KeyError, IndexError) as err:
return _bad_identifier_media(item.identifier, err) _bad_identifier(item.identifier, err)
event = data.api.bootstrap.events.get(parts[2]) event = data.api.bootstrap.events.get(parts[2])
if event is None: if event is None:
try: try:
event = await data.api.get_event(parts[2]) event = await data.api.get_event(parts[2])
except NvrError as err: except NvrError as err:
return _bad_identifier_media(item.identifier, err) _bad_identifier(item.identifier, err)
else: else:
# cache the event for later # cache the event for later
data.api.bootstrap.events[event.id] = event data.api.bootstrap.events[event.id] = event
@ -241,15 +236,15 @@ class ProtectMediaSource(MediaSource):
try: try:
data = self.data_sources[parts[0]] data = self.data_sources[parts[0]]
except (KeyError, IndexError) as err: except (KeyError, IndexError) as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
if len(parts) < 2: if len(parts) < 2:
return _bad_identifier(item.identifier) _bad_identifier(item.identifier)
try: try:
identifier_type = IdentifierType(parts[1]) identifier_type = IdentifierType(parts[1])
except ValueError as err: except ValueError as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
if identifier_type in (IdentifierType.EVENT, IdentifierType.EVENT_THUMB): if identifier_type in (IdentifierType.EVENT, IdentifierType.EVENT_THUMB):
thumbnail_only = identifier_type == IdentifierType.EVENT_THUMB thumbnail_only = identifier_type == IdentifierType.EVENT_THUMB
@ -271,7 +266,7 @@ class ProtectMediaSource(MediaSource):
try: try:
event_type = SimpleEventType(parts.pop(0).lower()) event_type = SimpleEventType(parts.pop(0).lower())
except (IndexError, ValueError) as err: except (IndexError, ValueError) as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
if len(parts) == 0: if len(parts) == 0:
return await self._build_events_type( return await self._build_events_type(
@ -281,17 +276,17 @@ class ProtectMediaSource(MediaSource):
try: try:
time_type = IdentifierTimeType(parts.pop(0)) time_type = IdentifierTimeType(parts.pop(0))
except ValueError as err: except ValueError as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
if len(parts) == 0: if len(parts) == 0:
return _bad_identifier(item.identifier) _bad_identifier(item.identifier)
# {nvr_id}:browse:all|{camera_id}:all|{event_type}:recent:{day_count} # {nvr_id}:browse:all|{camera_id}:all|{event_type}:recent:{day_count}
if time_type == IdentifierTimeType.RECENT: if time_type == IdentifierTimeType.RECENT:
try: try:
days = int(parts.pop(0)) days = int(parts.pop(0))
except (IndexError, ValueError) as err: except (IndexError, ValueError) as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
return await self._build_recent( return await self._build_recent(
data, camera_id, event_type, days, build_children=True data, camera_id, event_type, days, build_children=True
@ -302,7 +297,7 @@ class ProtectMediaSource(MediaSource):
try: try:
start, is_month, is_all = self._parse_range(parts) start, is_month, is_all = self._parse_range(parts)
except (IndexError, ValueError) as err: except (IndexError, ValueError) as err:
return _bad_identifier(item.identifier, err) _bad_identifier(item.identifier, err)
if is_month: if is_month:
return await self._build_month( return await self._build_month(
@ -336,9 +331,7 @@ class ProtectMediaSource(MediaSource):
try: try:
event = await data.api.get_event(event_id) event = await data.api.get_event(event_id)
except NvrError as err: except NvrError as err:
return _bad_identifier( _bad_identifier(f"{data.api.bootstrap.nvr.id}:{subtype}:{event_id}", err)
f"{data.api.bootstrap.nvr.id}:{subtype}:{event_id}", err
)
if event.start is None or event.end is None: if event.start is None or event.end is None:
raise BrowseError("Event is still ongoing") raise BrowseError("Event is still ongoing")