新增素材列表判断

This commit is contained in:
18610128193
2026-07-01 14:43:17 +08:00
parent cf16ed8dfe
commit efe92c4c2c
3 changed files with 15 additions and 102 deletions
@@ -30,6 +30,7 @@ async def get_resources_material_list_api(
page: int = Query(1, description="页码"),
page_size: int = Query(20, description="每页数量"),
db: AsyncSession = Depends(get_db),
current_user: dict = Depends(get_current_user),
) -> Any | dict:
items, total = await get_resources_material_list(
db=db,
@@ -40,6 +41,7 @@ async def get_resources_material_list_api(
resource_type=resource_type,
page=page,
page_size=page_size,
user_id=current_user.id,
)
return {
+9 -101
View File
@@ -357,51 +357,25 @@ async def batch_update_filename(
.where(GeneratedResource.file_name.is_not(None))
)
result = await db.execute(query)
db_existing_names = set(row[0] for row in result.all())
name_counters = {}
existing_names = set(row[0] for row in result.all())
for item in valid_items:
file_name = item["file_name"]
resource = item["resource"]
base_name, ext = os.path.splitext(file_name)
existing_names = db_existing_names.copy()
if resource.file_name and resource.file_name in existing_names:
existing_names.remove(resource.file_name)
if file_name not in name_counters:
counter = 1
new_file_name = file_name
while new_file_name in existing_names:
new_file_name = f"{base_name}{counter}{ext}"
counter += 1
name_counters[file_name] = {
"base_name": base_name,
"ext": ext,
"counter": counter,
}
existing_names.add(new_file_name)
db_existing_names.add(new_file_name)
else:
counter = name_counters[file_name]["counter"]
base_name = name_counters[file_name]["base_name"]
ext = name_counters[file_name]["ext"]
new_file_name = f"{base_name}{counter}{ext}"
while new_file_name in existing_names:
counter += 1
new_file_name = f"{base_name}{counter}{ext}"
name_counters[file_name]["counter"] = counter + 1
existing_names.add(new_file_name)
db_existing_names.add(new_file_name)
counter = 1
new_file_name = file_name
while new_file_name in existing_names:
new_file_name = f"{base_name}_{counter}{ext}"
counter += 1
item["resource"].file_name = new_file_name
db.add(item["resource"])
existing_names.add(new_file_name)
results.append({
"source_id": item["source_id"],
@@ -423,7 +397,7 @@ async def batch_update_filename(
}
except Exception as e:
return {
"code": 0,
"code": 1,
"message": f"批量修改文件名失败:{str(e)}",
"success_count": 0,
"fail_count": 0,
@@ -463,69 +437,3 @@ async def get_upload_history(
"code": 0,
"message": f"查询上传任务历史失败:{str(e)}",
}
#读取指定资源id的素材信息,包括size大小,尺寸,帧率,编码格式,码率,高宽比例
@router.get(
"/upload-material/{resource_id}",
summary="查询上传素材信息",
description="查询指定上传素材的详细信息",
)
async def get_upload_material_info(
resource_id: str,
db: AsyncSession = Depends(get_db),
) -> Any | dict:
try:
upload_material = await db.execute(
select(GeneratedResource)
.where(
GeneratedResource.id == resource_id,
)
)
upload_material = upload_material.scalar_one_or_none()
if not upload_material:
return {"code": 1, "message": f"素材{resource_id}不存在"}
storage_path = upload_material.storage_path
import ffmpeg
# 使用 ffmpeg.probe 获取视频的元数据[reference:20]
probe = ffmpeg.probe(storage_path)
# 从 'format' 中获取文件信息和码率[reference:21]
format_info = probe['format']
bit_rate = int(format_info.get('bit_rate', 0)) # 码率,单位 bps[reference:22]
file_size = int(format_info.get('size', 0)) # 文件大小,单位 bytes[reference:23]
duration = float(format_info.get('duration', 0)) # 时长,单位秒[reference:24]
# 从 'streams' 中查找视频流(通常是第一个视频流)
video_stream = next((stream for stream in probe['streams'] if stream['codec_type'] == 'video'), None)
if video_stream is None:
return None
width = int(video_stream['width'])
height = int(video_stream['height'])
# 帧率可能以分数形式表示,如 "30000/1001"[reference:25]
r_frame_rate = video_stream.get('r_frame_rate', '0/0')
if '/' in r_frame_rate:
num, den = map(int, r_frame_rate.split('/'))
fps = num / den if den != 0 else 0
else:
fps = float(r_frame_rate)
codec_name = video_stream.get('codec_name', 'unknown') # 编码格式名称,如 h264[reference:26]
return {
"width": width,
"height": height,
"fps": fps,
"codec": codec_name,
"bit_rate": bit_rate, # 单位 bps
"file_size": file_size, # 单位 bytes
"duration": duration,
"aspect_ratio": width / height
}
except Exception as e:
return {
"code": 0,
"message": f"查询上传素材信息失败:{str(e)}",
}
@@ -18,11 +18,14 @@ async def get_resources_material_list(
resource_type: Optional[str] = None,
page: int = 1,
page_size: int = 20,
user_id: Optional[str] = None,
) -> Tuple[list[ResourcesMaterialOut], int]:
resource_alias = aliased(GeneratedResource)
query = select(ResourcesMaterial).where(ResourcesMaterial.deleted_at.is_(None))
if user_id:
query = query.where(ResourcesMaterial.user_id == user_id)
if advertiser_id:
query = query.where(ResourcesMaterial.advertiser_id == advertiser_id)
if material_id: