From 419e91523a2af919afed8238022a165db9a6cb75 Mon Sep 17 00:00:00 2001 From: Tony Tran Date: Tue, 5 May 2026 14:59:00 +0700 Subject: [PATCH] fix Playback section --- api/app/recordings.py | 32 +++++++++++++++++++------------- ipcam-dashboard.service | 12 ++++++++++++ 2 files changed, 31 insertions(+), 13 deletions(-) create mode 100644 ipcam-dashboard.service diff --git a/api/app/recordings.py b/api/app/recordings.py index 1677a86..6e34f82 100644 --- a/api/app/recordings.py +++ b/api/app/recordings.py @@ -15,13 +15,18 @@ class RecordingItem: def _parse_filename(filename: str) -> Optional[datetime]: - if not filename.endswith(".fmp4"): - return None - stem = filename[:-5] - try: - return datetime.strptime(stem, "%Y-%m-%d_%H-%M-%S-%f") - except ValueError: + if filename.endswith(".fmp4"): + stem = filename[:-5] + elif filename.endswith(".mp4"): + stem = filename[:-4] + else: 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( @@ -36,28 +41,29 @@ def list_recordings( if not cam_dir.exists() or not cam_dir.is_dir(): return [] - items: list[tuple[datetime, str]] = [] - for p in cam_dir.iterdir(): + items: list[tuple[datetime, str, str]] = [] + for p in cam_dir.rglob("*"): if not p.is_file(): continue - dt = _parse_filename(p.name) - if dt is None: + if not (p.name.endswith(".fmp4") or p.name.endswith(".mp4")): 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: 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) sliced = items[offset : offset + limit] out: list[RecordingItem] = [] - for dt, name in sliced: + for dt, name, rel in sliced: out.append( RecordingItem( camera=camera, filename=name, timestamp=dt.isoformat(), - url=f"/videos/{camera}/{name}", + url=f"/videos/{rel}", ) ) return out diff --git a/ipcam-dashboard.service b/ipcam-dashboard.service new file mode 100644 index 0000000..0d6e51b --- /dev/null +++ b/ipcam-dashboard.service @@ -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 \ No newline at end of file