from __future__ import annotations from dataclasses import dataclass from datetime import datetime from pathlib import Path from typing import Optional @dataclass(frozen=True) class RecordingItem: camera: str filename: str timestamp: str url: str 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: return None def list_recordings( recordings_dir: str, camera: str, date: Optional[str], limit: int, offset: int, ) -> list[RecordingItem]: base = Path(recordings_dir) cam_dir = base / camera if not cam_dir.exists() or not cam_dir.is_dir(): return [] items: list[tuple[datetime, str]] = [] for p in cam_dir.iterdir(): if not p.is_file(): continue dt = _parse_filename(p.name) if dt is None: continue if date is not None and dt.strftime("%Y-%m-%d") != date: continue items.append((dt, p.name)) items.sort(key=lambda x: x[0], reverse=True) sliced = items[offset : offset + limit] out: list[RecordingItem] = [] for dt, name in sliced: out.append( RecordingItem( camera=camera, filename=name, timestamp=dt.isoformat(), url=f"/videos/{camera}/{name}", ) ) return out