137 lines
4.5 KiB
Python
137 lines
4.5 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
为现有项目生成缩略图的脚本
|
|
"""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
# 添加项目根目录到Python路径
|
|
project_root = Path(__file__).parent.parent.parent
|
|
if str(project_root) not in sys.path:
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
from backend.core.database import SessionLocal
|
|
from backend.models.project import Project
|
|
from backend.utils.thumbnail_generator import generate_project_thumbnail
|
|
from sqlalchemy import text
|
|
|
|
def generate_thumbnails_for_projects():
|
|
"""为所有没有缩略图的项目生成缩略图"""
|
|
db = SessionLocal()
|
|
try:
|
|
# 查找所有没有缩略图但有视频文件的项目
|
|
projects = db.query(Project).filter(
|
|
Project.thumbnail.is_(None),
|
|
Project.video_path.isnot(None)
|
|
).all()
|
|
|
|
if not projects:
|
|
print("✅ 所有项目都已有缩略图")
|
|
return True
|
|
|
|
print(f"📋 找到 {len(projects)} 个需要生成缩略图的项目")
|
|
|
|
success_count = 0
|
|
for project in projects:
|
|
try:
|
|
print(f"🎬 正在为项目 '{project.name}' ({project.id}) 生成缩略图...")
|
|
|
|
# 检查视频文件是否存在
|
|
video_path = Path(project.video_path)
|
|
if not video_path.exists():
|
|
print(f"⚠️ 视频文件不存在: {video_path}")
|
|
continue
|
|
|
|
# 生成缩略图
|
|
thumbnail_data = generate_project_thumbnail(project.id, video_path)
|
|
|
|
if thumbnail_data:
|
|
# 保存到数据库
|
|
project.thumbnail = thumbnail_data
|
|
db.commit()
|
|
print(f"✅ 项目 '{project.name}' 缩略图生成成功")
|
|
success_count += 1
|
|
else:
|
|
print(f"❌ 项目 '{project.name}' 缩略图生成失败")
|
|
|
|
except Exception as e:
|
|
print(f"❌ 项目 '{project.name}' 处理失败: {e}")
|
|
db.rollback()
|
|
continue
|
|
|
|
print(f"🎉 完成!成功为 {success_count}/{len(projects)} 个项目生成缩略图")
|
|
return True
|
|
|
|
except Exception as e:
|
|
print(f"❌ 生成缩略图过程中发生错误: {e}")
|
|
db.rollback()
|
|
return False
|
|
finally:
|
|
db.close()
|
|
|
|
def generate_thumbnail_for_project(project_id: str):
|
|
"""为指定项目生成缩略图"""
|
|
db = SessionLocal()
|
|
try:
|
|
project = db.query(Project).filter(Project.id == project_id).first()
|
|
|
|
if not project:
|
|
print(f"❌ 项目 {project_id} 不存在")
|
|
return False
|
|
|
|
if not project.video_path:
|
|
print(f"❌ 项目 {project_id} 没有视频文件")
|
|
return False
|
|
|
|
# 检查视频文件是否存在
|
|
video_path = Path(project.video_path)
|
|
if not video_path.exists():
|
|
print(f"❌ 视频文件不存在: {video_path}")
|
|
return False
|
|
|
|
print(f"🎬 正在为项目 '{project.name}' ({project.id}) 生成缩略图...")
|
|
|
|
# 生成缩略图
|
|
thumbnail_data = generate_project_thumbnail(project.id, video_path)
|
|
|
|
if thumbnail_data:
|
|
# 保存到数据库
|
|
project.thumbnail = thumbnail_data
|
|
db.commit()
|
|
print(f"✅ 项目 '{project.name}' 缩略图生成成功")
|
|
return True
|
|
else:
|
|
print(f"❌ 项目 '{project.name}' 缩略图生成失败")
|
|
return False
|
|
|
|
except Exception as e:
|
|
print(f"❌ 处理项目 {project_id} 时发生错误: {e}")
|
|
db.rollback()
|
|
return False
|
|
finally:
|
|
db.close()
|
|
|
|
def main():
|
|
"""主函数"""
|
|
if len(sys.argv) > 1:
|
|
# 为指定项目生成缩略图
|
|
project_id = sys.argv[1]
|
|
print(f"🚀 开始为项目 {project_id} 生成缩略图...")
|
|
if generate_thumbnail_for_project(project_id):
|
|
print("🎉 缩略图生成完成!")
|
|
else:
|
|
print("❌ 缩略图生成失败")
|
|
sys.exit(1)
|
|
else:
|
|
# 为所有项目生成缩略图
|
|
print("🚀 开始为所有项目生成缩略图...")
|
|
if generate_thumbnails_for_projects():
|
|
print("🎉 所有缩略图生成完成!")
|
|
else:
|
|
print("❌ 缩略图生成失败")
|
|
sys.exit(1)
|
|
|
|
if __name__ == "__main__":
|
|
main()
|