新增素材列表判断
This commit is contained in:
@@ -30,6 +30,7 @@ async def get_resources_material_list_api(
|
|||||||
page: int = Query(1, description="页码"),
|
page: int = Query(1, description="页码"),
|
||||||
page_size: int = Query(20, description="每页数量"),
|
page_size: int = Query(20, description="每页数量"),
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
|
current_user: dict = Depends(get_current_user),
|
||||||
) -> Any | dict:
|
) -> Any | dict:
|
||||||
items, total = await get_resources_material_list(
|
items, total = await get_resources_material_list(
|
||||||
db=db,
|
db=db,
|
||||||
@@ -40,6 +41,7 @@ async def get_resources_material_list_api(
|
|||||||
resource_type=resource_type,
|
resource_type=resource_type,
|
||||||
page=page,
|
page=page,
|
||||||
page_size=page_size,
|
page_size=page_size,
|
||||||
|
user_id=current_user.id,
|
||||||
)
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -357,51 +357,25 @@ async def batch_update_filename(
|
|||||||
.where(GeneratedResource.file_name.is_not(None))
|
.where(GeneratedResource.file_name.is_not(None))
|
||||||
)
|
)
|
||||||
result = await db.execute(query)
|
result = await db.execute(query)
|
||||||
db_existing_names = set(row[0] for row in result.all())
|
existing_names = set(row[0] for row in result.all())
|
||||||
|
|
||||||
name_counters = {}
|
|
||||||
|
|
||||||
for item in valid_items:
|
for item in valid_items:
|
||||||
file_name = item["file_name"]
|
file_name = item["file_name"]
|
||||||
resource = item["resource"]
|
resource = item["resource"]
|
||||||
base_name, ext = os.path.splitext(file_name)
|
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:
|
if resource.file_name and resource.file_name in existing_names:
|
||||||
existing_names.remove(resource.file_name)
|
existing_names.remove(resource.file_name)
|
||||||
|
|
||||||
if file_name not in name_counters:
|
counter = 1
|
||||||
counter = 1
|
new_file_name = file_name
|
||||||
new_file_name = file_name
|
|
||||||
|
while new_file_name in existing_names:
|
||||||
while new_file_name in existing_names:
|
new_file_name = f"{base_name}_{counter}{ext}"
|
||||||
new_file_name = f"{base_name}{counter}{ext}"
|
counter += 1
|
||||||
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)
|
|
||||||
|
|
||||||
item["resource"].file_name = new_file_name
|
item["resource"].file_name = new_file_name
|
||||||
db.add(item["resource"])
|
existing_names.add(new_file_name)
|
||||||
|
|
||||||
results.append({
|
results.append({
|
||||||
"source_id": item["source_id"],
|
"source_id": item["source_id"],
|
||||||
@@ -423,7 +397,7 @@ async def batch_update_filename(
|
|||||||
}
|
}
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return {
|
return {
|
||||||
"code": 0,
|
"code": 1,
|
||||||
"message": f"批量修改文件名失败:{str(e)}",
|
"message": f"批量修改文件名失败:{str(e)}",
|
||||||
"success_count": 0,
|
"success_count": 0,
|
||||||
"fail_count": 0,
|
"fail_count": 0,
|
||||||
@@ -463,69 +437,3 @@ async def get_upload_history(
|
|||||||
"code": 0,
|
"code": 0,
|
||||||
"message": f"查询上传任务历史失败:{str(e)}",
|
"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,
|
resource_type: Optional[str] = None,
|
||||||
page: int = 1,
|
page: int = 1,
|
||||||
page_size: int = 20,
|
page_size: int = 20,
|
||||||
|
user_id: Optional[str] = None,
|
||||||
) -> Tuple[list[ResourcesMaterialOut], int]:
|
) -> Tuple[list[ResourcesMaterialOut], int]:
|
||||||
resource_alias = aliased(GeneratedResource)
|
resource_alias = aliased(GeneratedResource)
|
||||||
|
|
||||||
query = select(ResourcesMaterial).where(ResourcesMaterial.deleted_at.is_(None))
|
query = select(ResourcesMaterial).where(ResourcesMaterial.deleted_at.is_(None))
|
||||||
|
|
||||||
|
if user_id:
|
||||||
|
query = query.where(ResourcesMaterial.user_id == user_id)
|
||||||
if advertiser_id:
|
if advertiser_id:
|
||||||
query = query.where(ResourcesMaterial.advertiser_id == advertiser_id)
|
query = query.where(ResourcesMaterial.advertiser_id == advertiser_id)
|
||||||
if material_id:
|
if material_id:
|
||||||
|
|||||||
Reference in New Issue
Block a user