feat: 支持嵌套格式元数据(kb-bilibili-metadata 输出)

This commit is contained in:
OpenClaw Agent
2026-02-11 01:04:18 +08:00
parent 8b7371feed
commit 06f279451a
2 changed files with 93 additions and 25 deletions
+66 -1
View File
@@ -751,6 +751,70 @@ def load_json(file_path: str) -> Dict:
return json.load(f)
def normalize_metadata(metadata: Dict) -> Dict:
"""
标准化元数据格式,支持嵌套和平面两种结构
支持以下输入格式:
1. 扁平结构: {"title": "xxx", "author": "yyy", "duration": 619}
2. 嵌套结构: {"data": {"metadata": {"title": "xxx", "author": "yyy", "duration": "10:19"}}}
输出: 扁平结构,duration 转换为秒数
"""
if not metadata:
return {}
# 如果已经包含 title 字段,认为是扁平结构
if 'title' in metadata:
# 处理 duration 格式(可能是 "10:19" 字符串或数字)
duration = metadata.get('duration', 0)
if isinstance(duration, str) and ':' in duration:
parts = duration.split(':')
try:
seconds = int(parts[0]) * 60 + int(parts[1])
metadata['duration'] = seconds
except (ValueError, IndexError):
pass
return metadata
# 如果是嵌套结构,提取 data.metadata
data = metadata.get('data', {})
meta = data.get('metadata', {})
# 提取扁平化字段
normalized = {
'title': meta.get('title', metadata.get('title', '未知')),
'author': meta.get('author', metadata.get('author', '')),
'bvid': meta.get('bvid', metadata.get('bvid', '')),
'aid': meta.get('aid', metadata.get('aid', 0)),
'pubtime': meta.get('pubtime', metadata.get('pubtime', '')),
'platform': meta.get('platform', 'unknown'),
'url': meta.get('url', ''),
}
# 处理 duration
duration = meta.get('duration', 0)
if isinstance(duration, str):
if ':' in duration:
# "10:19" 格式
parts = duration.split(':')
try:
normalized['duration'] = int(parts[0]) * 60 + int(parts[1])
except (ValueError, IndexError):
normalized['duration'] = 0
else:
try:
normalized['duration'] = int(duration)
except ValueError:
normalized['duration'] = 0
elif isinstance(duration, (int, float)):
normalized['duration'] = int(duration)
else:
normalized['duration'] = 0
return normalized
def format_duration(seconds: int) -> str:
"""格式化时长"""
h = seconds // 3600
@@ -827,7 +891,8 @@ def main():
# 加载数据
print(f"[Main] 加载元数据: {args.metadata}")
metadata = load_json(args.metadata)
raw_metadata = load_json(args.metadata)
metadata = normalize_metadata(raw_metadata)
print(f"[Main] 加载内容: {args.content}")
content = load_json(args.content)