shortcuts

This commit is contained in:
2026-04-02 22:07:11 -03:00
parent 8c1138c746
commit 0b5575f3b3
4 changed files with 306 additions and 17 deletions

View File

@@ -26,6 +26,17 @@ from cht.stream import ffmpeg as ff
log = logging.getLogger(__name__)
def list_sessions():
"""Return list of (session_id, session_dir) sorted newest first."""
if not SESSIONS_DIR.exists():
return []
sessions = []
for d in sorted(SESSIONS_DIR.iterdir(), reverse=True):
if d.is_dir() and (d / "frames").exists():
sessions.append((d.name, d))
return sessions
class StreamManager:
def __init__(self, session_id=None):
if session_id is None:
@@ -42,8 +53,55 @@ class StreamManager:
self._stop_flags = set()
self._segment = 0
self.scene_threshold = SCENE_THRESHOLD
self.readonly = False # True when loaded from existing session
log.info("Session: %s", session_id)
@classmethod
def from_existing(cls, session_id):
"""Load an existing session without starting any ffmpeg processes."""
mgr = cls(session_id=session_id)
if not mgr.session_dir.exists():
raise FileNotFoundError(f"Session not found: {session_id}")
mgr.readonly = True
# Point _segment to last recording segment
segments = mgr.recording_segments
if segments:
mgr._segment = len(segments) - 1
log.info("Loaded existing session: %s (%d segments, %d frames)",
session_id, len(segments), mgr.frame_count)
return mgr
@property
def frame_count(self):
index_path = self.frames_dir / "index.json"
if index_path.exists():
try:
return len(json.loads(index_path.read_text()))
except Exception:
pass
return 0
def total_duration(self):
"""Probe total duration across all segments (for completed sessions)."""
total = 0.0
for seg in self.recording_segments:
try:
import ffmpeg as ffmpeg_lib
info = ffmpeg_lib.probe(str(seg))
dur = float(info.get("format", {}).get("duration", 0))
if dur <= 0:
for s in info.get("streams", []):
sdur = float(s.get("duration", 0))
if sdur > 0:
dur = sdur
break
if dur <= 0:
dur = seg.stat().st_size / 65_000
total += dur
except Exception:
total += seg.stat().st_size / 65_000
return total
def setup_dirs(self):
for d in (self.stream_dir, self.frames_dir, self.transcript_dir, self.agent_dir):
d.mkdir(parents=True, exist_ok=True)