Files
IPCam_OrangePi_Dashboard/api/app/recordings.py
T
2026-04-26 21:27:00 +07:00

65 lines
1.3 KiB
Python

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