ffmpeg video cover add file

This commit is contained in:
2026-06-02 14:28:26 +08:00
parent 06d583c9f7
commit a2d7a59182
16 changed files with 284 additions and 48 deletions
+5
View File
@@ -1018,6 +1018,7 @@ async def admin_list_generation_records(
"resolution": record.resolution,
"status": record.status,
"video_url": build_resource_signed_url(record.video_url) if record.video_url else '',
"video_cover_url": build_resource_signed_url(record.video_cover_url) if record.video_cover_url else '',
"references": refs,
"credits_cost": record.credits_cost or 0,
"text_credits_cost": record.text_credits_cost or 0,
@@ -1064,6 +1065,8 @@ async def admin_update_generation_status(
record.status = new_status
if body.get("video_url"):
record.video_url = body["video_url"]
if body.get("video_cover_url"):
record.video_cover_url = body["video_cover_url"]
if new_status == "completed":
record.generated_at = datetime.now()
await db.flush()
@@ -1123,6 +1126,8 @@ async def admin_generate_video(
record.credits_cost = (record.credits_cost or 0) + video_credits
record.status = "generating"
record.error_message = None
record.video_url = None
record.video_cover_url = None
await db.flush()
try:
+18 -2
View File
@@ -34,6 +34,7 @@ from app.services.resource_accounting_service import (
safe_file_size,
)
from app.services.resource_signed_url_service import build_resource_signed_url
from app.services.video_cover_service import async_create_video_cover_for_local_video
from app.utils.id_gen import generate_id
from app.utils.exceptions import InsufficientCreditsError, RecordNotFoundError, InvalidStatusError
@@ -78,6 +79,7 @@ def _record_to_out(record: GenerationRecord, project_name: str) -> GenerationRec
image_px=record.image_px,
status=record.status,
video_url=build_resource_signed_url(record.video_url) if record.video_url else '',
video_cover_url=build_resource_signed_url(record.video_cover_url) if record.video_cover_url else '',
image_url=build_resource_signed_url(record.image_url) if record.image_url else '',
references=refs,
text_credits_cost=round(record.text_credits_cost or 0.00, 2),
@@ -345,6 +347,8 @@ async def generate(
record.credits_cost = round(video_credits, 2)
record.status = "generating"
record.error_message = None
record.video_url = None
record.video_cover_url = None
await db.flush()
try:
@@ -422,6 +426,8 @@ async def retry_generation(
record.status = "generating"
record.error_message = None
record.video_url = None
record.video_cover_url = None
await db.flush()
try:
@@ -556,9 +562,19 @@ async def seedance_callback(request: Request, db: AsyncSession = Depends(get_db)
if settings.STORAGE_TYPE == "local" and remote_url:
try:
from app.services.video_gen import download_video
dest = os.path.join(settings.STORAGE_LOCAL_PATH, f"{record.id}.mp4")
date_dir = datetime.now().strftime("%Y/%m/%d")
dest_dir = os.path.join(settings.STORAGE_LOCAL_PATH, date_dir)
os.makedirs(dest_dir, exist_ok=True)
dest = os.path.join(dest_dir, f"{record.id}.mp4")
await download_video(remote_url, dest)
record.video_url = f"/generate/videos/{record.id}.mp4"
record.video_url = f"/generate/videos/{date_dir}/{record.id}.mp4"
cover_url, _cover_storage_path = await async_create_video_cover_for_local_video(
record_id=record.id,
video_path=dest,
date_dir=date_dir,
log_prefix=f"SeedanceCallback视频封面生成 record_id={record.id}",
)
record.video_cover_url = cover_url
storage_path = dest
file_size_bytes = safe_file_size(dest)
except Exception as e: