fix(kb-workflow): 修正路径管理和子技能逻辑

- kb_workflow.py: 修复目录查询命令(--pending, --metadata等)
- bilibili_metadata.py: headless默认True,逻辑保持纯净
- deep_analyzer.py: 添加缺失的pathlib.Path导入
- SKILL.md: 更新步骤说明,明确由workflow提供路径给子技能

fix: 修复Playwright启动失败(NameError)和路径自动获取问题
This commit is contained in:
OpenClaw Agent
2026-02-11 01:35:43 +08:00
parent 4794f3e914
commit 672a811c54
6 changed files with 95 additions and 25 deletions
+36
View File
@@ -0,0 +1,36 @@
# 新加坡分区漫游指南
## 视频信息
- **标题**:新加坡分区漫游指南:中心区打卡暴走丨圣淘沙度假丨动物园亲子,行程规划一目了然
- **来源**:哔哩哔哩
- **链接**:https://b23.tv/Tpa9SG7
## 内容概述
新加坡旅游行程规划,分三个主要区域:
### 1. 中心区(City Walk打卡)
- 滨海湾花园(花穹、云雾林)
- 超级树灯光秀
- 鱼尾狮公园
- 滨海艺术中心
- 克拉码头
- 福康宁山
### 2. 圣淘沙度假
- 环球影城
- SEA海洋馆
- 圣淘沙缆车(花柏山线进岛)
- 沙滩 beaches
### 3. 动物园亲子游
- 新加坡日间动物园
- 河川生态园
- 夜间野生动物园(Night Safari)
- 飞禽公园
## 交通提示
- 市区→圣淘沙:港湾站(Harbourfront)换乘
- 动物园:地铁+公交前往
## 标签
#新加坡 #旅游攻略 #圣淘沙 #动物园 #行程规划 #亲子游
+9 -12
View File
@@ -12,14 +12,14 @@
## Commands ## Commands
```bash ```bash
# Download video # Download video (传入 --output 指定完整路径)
python bilibili_content.py --id "BV1xx411c7mD" --type video --quality 480 python bilibili_content.py --id "BV1xx411c7mD" --type video --quality 480 --output "/path/to/downloads/BV1xx.mp4"
# Extract subtitle # Extract subtitle (传入 --output 指定完整路径)
python bilibili_content.py --id "BV1xx411c7mD" --type subtitle python bilibili_content.py --id "BV1xx411c7mD" --type subtitle --output "/path/to/subtitles/BV1xx.srt"
# Get article content # Get article content (传入 --output 指定完整路径)
python bilibili_content.py --id "cv43780186" --type article python bilibili_content.py --id "cv43780186" --type article --output "/path/to/article.md"
``` ```
## Output ## Output
@@ -27,13 +27,10 @@ python bilibili_content.py --id "cv43780186" --type article
```json ```json
{ {
"success": true, "success": true,
"data": {
"platform": "bilibili",
"type": "video", "type": "video",
"id": "BV1xx411c7mD", "filename": "BV1xx.mp4",
"video_file": {"path": "output/BV1xx.mp4", "quality": "480p"}, "filepath": "/path/to/downloads/BV1xx.mp4",
"subtitle": {"path": "output/BV1xx.srt"} "message": "下载完成"
}
} }
``` ```
@@ -9,7 +9,9 @@ B站元数据提取 CLI 工具
import argparse import argparse
import asyncio import asyncio
import json import json
import os
import sys import sys
from pathlib import Path
from typing import Dict, Any from typing import Dict, Any
from bilibili_extractor import BilibiliExtractor from bilibili_extractor import BilibiliExtractor
@@ -145,8 +147,8 @@ def main():
parser.add_argument( parser.add_argument(
'--headless', '--headless',
action='store_true', action='store_true',
default=False, default=True,
help='使用无头模式(浏览器,默认关闭,使用API)' help='使用无头模式(浏览器,默认开启,使用API)'
) )
parser.add_argument( parser.add_argument(
'--timeout', '--timeout',
@@ -208,6 +210,11 @@ def main():
print(json.dumps(output, ensure_ascii=False, indent=2)) print(json.dumps(output, ensure_ascii=False, indent=2))
# 如果指定了输出路径,则写入文件
if args.output:
with open(args.output, 'w', encoding='utf-8') as f:
json.dump(result, f, ensure_ascii=False, indent=2)
except Exception as e: except Exception as e:
print(json.dumps({ print(json.dumps({
"success": False, "success": False,
+1
View File
@@ -16,6 +16,7 @@ import os
import sys import sys
import re import re
from datetime import datetime from datetime import datetime
from pathlib import Path
from typing import Dict, Any, List, Optional, Tuple from typing import Dict, Any, List, Optional, Tuple
from dataclasses import dataclass, field, asdict from dataclasses import dataclass, field, asdict
+8 -5
View File
@@ -67,21 +67,24 @@ python3 /path/to/link-parser.py --url "[URL]"
### 步骤 3: 元数据提取 ### 步骤 3: 元数据提取
1. 获取目录路径: 1. 获取元数据目录路径:
```bash ```bash
python3 kb_workflow.py --metadata python3 kb_workflow.py --metadata
# 返回: {"path": "/home/admin/work/knowledge-base/metadata"}
``` ```
2. 启动子代理调用对应平台的 metadata 技能: 2. 构建输出文件路径:`${metadata_dir}/${platform}_${id}.meta.json`
3. 启动子代理调用对应平台的 metadata 技能(传入 `--output`):
```bash ```bash
# Bilibili # Bilibili
python3 /path/to/bilibili_metadata.py --id "[ID]" --type video python3 /path/to/bilibili_metadata.py --id "[ID]" --type video --output "${metadata_dir}/bilibili_[ID].meta.json"
# Zhihu # Zhihu
python3 /path/to/zhihu_metadata.py --id "[ID]" --type question python3 /path/to/zhihu_metadata.py --id "[ID]" --type question --output "${metadata_dir}/zhihu_[ID].meta.json"
``` ```
3. 解析输出 JSON,提取 filename 4. 解析输出 JSON,提取 filename
### 步骤 4: 内容下载 ### 步骤 4: 内容下载
+30 -4
View File
@@ -258,6 +258,7 @@ def main():
args = parser.parse_args() args = parser.parse_args()
base_path = Path(args.base_path) if args.base_path else None base_path = Path(args.base_path) if args.base_path else None
dirs = ensure_directories(base_path)
if args.check and args.url: if args.check and args.url:
result = check_duplicate(base_path, args.url) result = check_duplicate(base_path, args.url)
@@ -267,11 +268,36 @@ def main():
result = archive_and_git(args.archive_file, base_path) result = archive_and_git(args.archive_file, base_path)
print(json.dumps(result, ensure_ascii=False, indent=2)) print(json.dumps(result, ensure_ascii=False, indent=2))
elif args.pending:
print(json.dumps({"path": str(dirs["pending"])}, ensure_ascii=False, indent=2))
elif args.metadata:
print(json.dumps({"path": str(dirs["metadata"])}, ensure_ascii=False, indent=2))
elif args.content:
print(json.dumps({"path": str(dirs["content"])}, ensure_ascii=False, indent=2))
elif args.content_downloads:
print(json.dumps({"path": str(dirs["content_downloads"])}, ensure_ascii=False, indent=2))
elif args.content_subtitles:
print(json.dumps({"path": str(dirs["content_subtitles"])}, ensure_ascii=False, indent=2))
elif args.analyzed:
print(json.dumps({"path": str(dirs["analyzed"])}, ensure_ascii=False, indent=2))
elif args.archive_dir: elif args.archive_dir:
path = dirs.get("archive") print(json.dumps({"path": str(dirs["archive"])}, ensure_ascii=False, indent=2))
if path:
print(json.dumps({"path": str(path)}, ensure_ascii=False, indent=2)) elif args.archive_subscriptions:
return print(json.dumps({"path": str(dirs["archive_subscriptions"])}, ensure_ascii=False, indent=2))
elif args.extract_platform:
platform = extract_platform(args.extract_platform)
print(json.dumps({"platform": platform}, ensure_ascii=False, indent=2))
elif args.base_path:
print(json.dumps({"path": str(dirs["base"])}, ensure_ascii=False, indent=2))
else: else:
parser.print_help() parser.print_help()