fix Playback section

This commit is contained in:
2026-05-05 14:59:00 +07:00
parent b2d3d09eb0
commit 419e91523a
2 changed files with 31 additions and 13 deletions
+19 -13
View File
@@ -15,13 +15,18 @@ class RecordingItem:
def _parse_filename(filename: str) -> Optional[datetime]: def _parse_filename(filename: str) -> Optional[datetime]:
if not filename.endswith(".fmp4"): if filename.endswith(".fmp4"):
return None stem = filename[:-5]
stem = filename[:-5] elif filename.endswith(".mp4"):
try: stem = filename[:-4]
return datetime.strptime(stem, "%Y-%m-%d_%H-%M-%S-%f") else:
except ValueError:
return None return None
for fmt in ("%Y-%m-%d_%H-%M-%S-%f", "%Y-%m-%d_%H-%M-%S"):
try:
return datetime.strptime(stem, fmt)
except ValueError:
continue
return None
def list_recordings( def list_recordings(
@@ -36,28 +41,29 @@ def list_recordings(
if not cam_dir.exists() or not cam_dir.is_dir(): if not cam_dir.exists() or not cam_dir.is_dir():
return [] return []
items: list[tuple[datetime, str]] = [] items: list[tuple[datetime, str, str]] = []
for p in cam_dir.iterdir(): for p in cam_dir.rglob("*"):
if not p.is_file(): if not p.is_file():
continue continue
dt = _parse_filename(p.name) if not (p.name.endswith(".fmp4") or p.name.endswith(".mp4")):
if dt is None:
continue continue
dt = _parse_filename(p.name) or datetime.fromtimestamp(p.stat().st_mtime)
if date is not None and dt.strftime("%Y-%m-%d") != date: if date is not None and dt.strftime("%Y-%m-%d") != date:
continue continue
items.append((dt, p.name)) rel = p.relative_to(base).as_posix()
items.append((dt, p.name, rel))
items.sort(key=lambda x: x[0], reverse=True) items.sort(key=lambda x: x[0], reverse=True)
sliced = items[offset : offset + limit] sliced = items[offset : offset + limit]
out: list[RecordingItem] = [] out: list[RecordingItem] = []
for dt, name in sliced: for dt, name, rel in sliced:
out.append( out.append(
RecordingItem( RecordingItem(
camera=camera, camera=camera,
filename=name, filename=name,
timestamp=dt.isoformat(), timestamp=dt.isoformat(),
url=f"/videos/{camera}/{name}", url=f"/videos/{rel}",
) )
) )
return out return out
+12
View File
@@ -0,0 +1,12 @@
[Unit]
Description=IPCam Dashboard Backend
After=network.target
[Service]
WorkingDirectory=/mnt/ssd/IPCam_OrangePi_Dashboard
ExecStart=/mnt/ssd/IPCam_OrangePi_Dashboard/api/.venv/bin/python /mnt/ssd/IPCam_OrangePi_Dashboard/api/run.py
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target