update at 2026-06-04 14:09:16
This commit is contained in:
@@ -33,11 +33,16 @@ class DeviceManager:
|
||||
if device_num not in {device.device_num for device in self.devices}:
|
||||
raise ValueError("设备不在 devicelist.env 中")
|
||||
with self.lock:
|
||||
old_device_num = self.current_device_num
|
||||
self.current_device_num = device_num
|
||||
self.current_url = ""
|
||||
self.timings = {}
|
||||
self.updated_at = time.time()
|
||||
self.version += 1
|
||||
print(
|
||||
f"[device-switch] manager set old={old_device_num} new={device_num} version={self.version}",
|
||||
flush=True,
|
||||
)
|
||||
return self.version
|
||||
|
||||
def resolve_stream_url(self) -> str:
|
||||
@@ -49,16 +54,38 @@ class DeviceManager:
|
||||
return self.fallback_url
|
||||
raise RuntimeError("devicelist.env 中没有可用设备号")
|
||||
|
||||
result = self.api_client.get_stream_url_details(device_num)
|
||||
print(f"[device-switch] resolve start device={device_num} version={version}", flush=True)
|
||||
try:
|
||||
result = self.api_client.get_stream_url_details(device_num)
|
||||
except Exception as exc:
|
||||
print(
|
||||
f"[device-switch] resolve failed device={device_num} version={version} error={exc}",
|
||||
flush=True,
|
||||
)
|
||||
raise
|
||||
with self.lock:
|
||||
# 避免旧摄像头的慢接口响应覆盖用户刚切换的新选择。
|
||||
if version != self.version or device_num != self.current_device_num:
|
||||
print(
|
||||
f"[device-switch] resolve stale device={device_num} version={version} current={self.current_device_num} current_version={self.version}",
|
||||
flush=True,
|
||||
)
|
||||
return self.current_url
|
||||
self.current_url = result.url
|
||||
self.timings = dict(result.timings)
|
||||
self.updated_at = time.time()
|
||||
print(f"[device-switch] resolve success device={device_num} version={version}", flush=True)
|
||||
return result.url
|
||||
|
||||
def resolve_stream_url_for(self, device_num: str) -> str:
|
||||
if device_num not in {device.device_num for device in self.devices}:
|
||||
raise ValueError("设备不在 devicelist.env 中")
|
||||
result = self.api_client.get_stream_url_details(device_num)
|
||||
return result.url
|
||||
|
||||
def get_video_grid_devices(self, limit: int = 4) -> list[Device]:
|
||||
return self.devices[:limit]
|
||||
|
||||
def get_snapshot(self) -> dict[str, Any]:
|
||||
with self.lock:
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user