shortcuts
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user