85 lines
2.5 KiB
Python
85 lines
2.5 KiB
Python
"""Persistence helpers for Web-only generation workflows."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import subprocess
|
|
from datetime import datetime
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
from loguru import logger
|
|
|
|
|
|
def _probe_video_duration(video_path: str) -> float:
|
|
cmd = [
|
|
"ffprobe",
|
|
"-v",
|
|
"error",
|
|
"-show_entries",
|
|
"format=duration",
|
|
"-of",
|
|
"default=noprint_wrappers=1:nokey=1",
|
|
video_path,
|
|
]
|
|
try:
|
|
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
|
return float(result.stdout.strip())
|
|
except Exception as exc:
|
|
logger.warning(f"Failed to probe video duration for {video_path}: {exc}")
|
|
return 0.0
|
|
|
|
|
|
async def save_web_generation_history(
|
|
pixelle_video: Any,
|
|
*,
|
|
task_id: str,
|
|
video_path: str,
|
|
pipeline: str,
|
|
input_params: dict,
|
|
title: str | None = None,
|
|
n_frames: int = 1,
|
|
) -> None:
|
|
"""Save a minimal history record for workflows implemented directly in Web UI."""
|
|
if not getattr(pixelle_video, "persistence", None):
|
|
logger.warning("Pixelle persistence service is not initialized; skipping history save")
|
|
return
|
|
|
|
path = Path(video_path)
|
|
if not task_id:
|
|
task_id = path.parent.name
|
|
if not path.exists():
|
|
logger.warning(f"Cannot save history; video file does not exist: {video_path}")
|
|
return
|
|
|
|
created_at = datetime.fromtimestamp(path.parent.stat().st_ctime).isoformat()
|
|
completed_at = datetime.fromtimestamp(path.stat().st_mtime).isoformat()
|
|
duration = _probe_video_duration(str(path))
|
|
|
|
normalized_input = dict(input_params)
|
|
normalized_input.setdefault("mode", pipeline)
|
|
normalized_input.setdefault("title", title or pipeline)
|
|
if title:
|
|
normalized_input["title"] = title
|
|
|
|
metadata = {
|
|
"task_id": task_id,
|
|
"created_at": created_at,
|
|
"completed_at": completed_at,
|
|
"status": "completed",
|
|
"input": normalized_input,
|
|
"result": {
|
|
"video_path": str(path),
|
|
"duration": duration,
|
|
"file_size": path.stat().st_size,
|
|
"n_frames": n_frames,
|
|
},
|
|
"config": {
|
|
"llm_model": pixelle_video.config.get("llm", {}).get("model", "unknown"),
|
|
"llm_base_url": pixelle_video.config.get("llm", {}).get("base_url", "unknown"),
|
|
"source": "web",
|
|
},
|
|
}
|
|
|
|
await pixelle_video.persistence.save_task_metadata(task_id, metadata)
|
|
logger.info(f"Saved web workflow history: {task_id}")
|