feat(plugins): add source-aware evidence and recording timelines
This commit is contained in:
1 parent
72ff342605
commit
ef7af9988e
61 files changed
+3847
-108
No files matched your search
@@ -115,6 +115,74 @@ async def get_session_video(session_id: str):
|
||||
|
||||
|
||||
def _get_session_video_sync(session_id: str):
|
||||
from apps.admin_console.services.evidence_service import plugin_sources
|
||||
from apps.admin_console.services.report_export import session_videos
|
||||
|
||||
legacy = _get_legacy_session_video_sync(session_id)
|
||||
sources = []
|
||||
if legacy.get("video_segments") or legacy.get("video_url"):
|
||||
segments = legacy.get("video_segments") or []
|
||||
# Pauses create sibling resume directories. Only collect files already
|
||||
# attached to this task; unrelated recordings never enter its timeline.
|
||||
if segments and all("offset_ms" in segment for segment in segments):
|
||||
combined = {}
|
||||
for path, _ in session_videos({"id": session_id}):
|
||||
for segment in media_service.resolve_video_segments(
|
||||
media_service.path_to_video_url(path)
|
||||
):
|
||||
if "offset_ms" in segment:
|
||||
combined[segment["url"]] = segment
|
||||
if combined:
|
||||
segments = sorted(combined.values(), key=lambda segment: segment["offset_ms"])
|
||||
sources.append(
|
||||
{
|
||||
"id": "android",
|
||||
"kind": "android",
|
||||
"label": "安卓",
|
||||
"target_ids": ["android"],
|
||||
"status": "ready",
|
||||
"message": "",
|
||||
"segments": [
|
||||
{**s, "start": float(s.get("offset_ms", s["start"] * 1000)) / 1000}
|
||||
for s in segments
|
||||
],
|
||||
"url": legacy.get("video_url"),
|
||||
}
|
||||
)
|
||||
sources += plugin_sources(session_id)
|
||||
legacy["sources"] = sources
|
||||
legacy["session_timeline"] = any(source["segments"] for source in sources)
|
||||
row = dict(session_repo.get_session_by_id(session_id) or {})
|
||||
legacy["session_duration"] = max(
|
||||
max(
|
||||
0.0,
|
||||
float(row.get("end_time") or row.get("start_time") or 0)
|
||||
- float(row.get("start_time") or 0),
|
||||
),
|
||||
max(
|
||||
(s["start"] + s["duration"] for source in sources for s in source["segments"]),
|
||||
default=0,
|
||||
),
|
||||
)
|
||||
ready = next((s for s in sources if s.get("segments") or s.get("url")), None)
|
||||
if ready:
|
||||
legacy.update(
|
||||
status="ready",
|
||||
has_video=True,
|
||||
video_url=ready.get("url") or ready["segments"][0]["url"],
|
||||
video_segments=ready["segments"],
|
||||
)
|
||||
elif any(s.get("status") == "recording" for s in sources):
|
||||
legacy.update(status="processing", retry_after_ms=1000)
|
||||
elif sources:
|
||||
legacy.update(
|
||||
status="failed",
|
||||
message=";".join(str(s.get("message") or "录像不可用") for s in sources),
|
||||
)
|
||||
return legacy
|
||||
|
||||
|
||||
def _get_legacy_session_video_sync(session_id: str):
|
||||
video_rec_map = session_repo.get_video_recordings_map()
|
||||
video_idx = media_service.build_video_index()
|
||||
row = session_repo.get_session_by_id(session_id)
|
||||
|
||||
Reference in new issue
Block a user