feat: init media-center skill

资源中心——从多渠道获取资源链接,转存到夸克网盘并整理归档。
- sources/tencent-doc: 腾讯文档读取
- sources/search: 网盘搜索
- storage/quark: 夸克网盘操作
- ref/: 来源 skill 参考归档

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-16 18:28:23 +08:00
commit 750f981c7e
37 changed files with 7847 additions and 0 deletions
+58
View File
@@ -0,0 +1,58 @@
---
name: resource-pipeline
description: 资源自动化工作流——从腾讯文档/搜索找到资源链接,转存到夸克网盘,并整理归档。串联 tencent-docs、netdisk-mcp-server、tx-doc-large-reader、quark-netdisk-helper 四个技能的完整管线。
---
# 资源自动化工作流
## 场景路由表
| 场景 | 入口工作流 | 典型输入 |
|------|-----------|---------|
| 腾讯文档里找链接→存夸克 | `workflows/from-tencent-doc.md` | 文档 URL + 搜索关键词(如"遮天" |
| 直接搜索资源→存夸克 | `workflows/from-search.md` | 搜索关键词(如"流浪地球 4K" |
| 整理夸克网盘已有文件 | `workflows/organize-quark.md` | 要整理的目录路径 |
## 核心规则
### 操作规范
1. **转存前必须先确认目录存在**`netdisk.transfer` 不会自动创建目录,目标不存在则报错
2. **转存后必须验证**:列出目标目录确认文件正确,清理杂文件
3. **函数式语法**:所有 `netdisk.*` 调用必须用 `'netdisk.xxx(y: "v")'` 格式
4. **每次操作输出摘要**:让用户清楚每个步骤的结果
### 调用语法速查
```bash
# ✅ 正确(函数式语法)
mcporter call 'netdisk.list(cloud: "quark", path: "/")'
mcporter call 'netdisk.view(share_link: "https://pan.quark.cn/s/xxx")'
mcporter call 'netdisk.transfer(share_link: "https://pan.quark.cn/s/xxx", source_pattern: "/*", target_path: "/目标")'
mcporter call 'netdisk.search(query: "关键词", cloud_types: ["quark"])'
# ❌ 错误(key=value 语法会报路径错误)
mcporter call netdisk.list cloud=quark path=/
```
### Quark API 补全
MCP 缺失的创建文件夹/移动/删除,通过直调 API 实现,详见 `references/quark-api.md`
## 前置条件
- `tencent-docs` MCP 已配置(腾讯文档 OAuth 授权)
- `netdisk` MCP 已配置(夸克 Cookie
- `mcporter` 可用
## 依赖关联
```
资源来源 中转/处理 目的地
───────── ────────── ──────
腾讯文档 ──→ tx-doc-large-reader ──→ 解析出链接 ─┐
├──→ netdisk.transfer ──→ 夸克网盘
直接搜索 ──→ netdisk.search ──→ 获取链接 ────┘ │
整理归档 ← quark-api (创建/移动/删除)
```
@@ -0,0 +1,46 @@
# 文件组织规范
## 目录结构推荐
```
资源大类/
├── 子类1/
│ ├── 分段区间1/
│ │ ├── 文件
│ │ └── ...
│ └── 分段区间2/
└── 子类2/
└── ...
```
## 命名规范
| 资源类型 | 推荐目录结构 | 示例 |
|---------|-------------|------|
| 动漫/国漫 | `/动漫/国漫<年份>/<作品名(年份)>/集数分段/` | `/动漫/国漫2024/遮.天(2023/101-120/` |
| 电视剧 | `/电视剧/<年份>-<季度>/<剧名>/` | `/电视剧/2026-1/爱情没有神话/` |
| 电影 | `/电影/<年份>/<片名(年份)>/` | `/电影/2026/星河入梦(2026/` |
| 综艺 | `/综艺/<综艺名>/` | `/综艺/乘风2026/` |
| 短剧 | `/短剧/<分类>/` | `/短剧/经典/` |
## 分段策略
| 总集数 | 推荐分段 |
|-------|---------|
| ≤30 | 不分段,直接放一起 |
| 30-60 | 按 30 集一段:1-30, 31-60 |
| 60-100 | 按 20-30 集一段 |
| 100+ | 按 20 集一段:1-20, 21-40, ...
## 文件名清洗建议
从分享链接转存后可能遇到的命名问题:
| 问题 | 示例 | 建议 |
|------|------|------|
| 大小写不统一 | `4K` vs `4k` | 统一为 `4K` |
| 分隔符乱用 | `空格` vs `.` vs `-` | 统一用空格 |
| 无意义前缀 | `Z 4K 130.mp4` | 去除 `Z` 前缀 |
| 格式混用 | `.mp4` vs `.mkv` | 保持原格式不动 |
> **注意**:当前夸克 API 不支持重命名文件,清洗工作需在下载后本地处理或用文件名更丰富的工具。
@@ -0,0 +1,111 @@
# Quark API 补全方案
`netdisk-mcp-server` 缺失的创建/移动/删除功能,通过直接调用夸克内部 API 实现。
> **警告**:这些 API 是夸克网页版的内部接口,非官方公开 API,可能随时变更。
## 通用参数
```bash
COOKIE="你的夸克网盘Cookie"
BASE_CURL="curl -s --max-time 15 \
-H \"cookie: $COOKIE\" \
-H \"accept: application/json\" \
-H \"content-type: application/json\" \
-H \"origin: https://pan.quark.cn\" \
-H \"referer: https://pan.quark.cn/\""
```
## API 列表
### 1. 创建文件夹
```bash
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file?pr=ucpro&fr=pc&__t=$(date +%s)000" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"pdir_fid":"<父文件夹FID>","file_name":"<文件夹名>","file_type":0,"dir_init":true}'
```
**参数**
- `pdir_fid`:父文件夹 FID(根目录为 `0`
- `file_name`:文件夹名称
- `file_type`:固定为 `0`(目录)
- `dir_init`:固定为 `true`
**返回**`data.fid` 是新文件夹的 FID
### 2. 获取文件夹 FID
方式一:从 `netdisk.list` 的输出中提取
```
3. [dir] 遮.天(2023 (ID: 1ffc622be174429fa36de460856cad05)
↑ 这就是 FID
```
方式二:逐层 API 查询
```bash
# 查根目录
curl -s "https://drive-h.quark.cn/1/clouddrive/file/sort?pr=ucpro&fr=pc&pdir_fid=0" \
-H "cookie: $COOKIE" | python -X utf8 -c "
import json,sys
data = json.load(sys.stdin)
for item in data.get('data',{}).get('list',[]):
if item.get('file_type')==0:
print(f'{item[\"file_name\"]} -> {item[\"fid\"]}')
"
```
### 3. 移动文件
```bash
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file/move?pr=ucpro&fr=pc&__t=$(date +%s)000" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"action_type":1,"filelist":["<FID1>","<FID2>"],"to_pdir_fid":"<目标FID>"}'
```
**参数**
- `action_type`:固定为 `1`(移动)
- `filelist`:要移动的文件/文件夹 FID 数组(建议 ≤30 个)
- `to_pdir_fid`:目标文件夹 FID
**返回**`data.finish: true` 表示完成
### 4. 删除文件
```bash
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file/delete?pr=ucpro&fr=pc&__t=$(date +%s)000" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"action_type":2,"filelist":["<FID1>","<FID2>"]}'
```
**参数**
- `action_type`:固定为 `2`(删除)
- `filelist`:要删除的文件 FID 数组
**返回**`data.task_id` 异步任务 ID`data.finish: true` 表示已完成
## API 端点速查
| 操作 | 方法 | 端点 |
|------|------|------|
| 列出目录 | GET | `/1/clouddrive/file/sort` |
| 创建文件夹 | POST | `/1/clouddrive/file` |
| 移动 | POST | `/1/clouddrive/file/move` |
| 删除 | POST | `/1/clouddrive/file/delete` |
## 注意事项
- **FID 每次都会变**:不能硬编码 FID,每次操作前重新获取
- **异步操作**`finish: false` 表示任务还在进行,需要等待
- **频率限制**:连续请求间隔至少 500ms(返回中有 `tq_gap` 提示)
- **Cookie 有效期**:夸克 Cookie 有效期不定,失效时返回 `401/403`
@@ -0,0 +1,73 @@
# 工作流:搜索 → 夸克网盘
通过 `netdisk.search` 跨平台搜索资源,找到分享链接后转存到夸克网盘。
## 步骤
### Step 1: 搜索资源
```bash
# 基本搜索
mcporter call 'netdisk.search(query: "流浪地球 4K")'
# 指定平台(夸克+磁力)
mcporter call 'netdisk.search(query: "流浪地球", cloud_types: ["quark", "magnet"])'
# 高级搜索:包含/排除关键词
mcporter call 'netdisk.search(query: "电视剧", include: ["合集"], exclude: ["预告"])'
```
支持的 `cloud_types`
| 类型 | 平台 |
|------|------|
| `quark` | 夸克网盘 |
| `baidu` | 百度网盘 |
| `aliyun` | 阿里云盘 |
| `115` | 115网盘 |
| `xunlei` | 迅雷网盘 |
| `magnet` | 磁力链接 |
| `pikpak` | PikPak |
### Step 2: 查看分享链接
用户选择结果中的一条链接后:
```bash
mcporter call 'netdisk.view(share_link: "https://pan.quark.cn/s/xxx")'
```
确认文件内容、大小是否符合预期。
### Step 3: 创建/确认目标目录
```bash
mcporter call 'netdisk.list(cloud: "quark", path: "/")'
```
如果目标目录不存在,参考 `references/quark-api.md` 创建。
### Step 4: 转存
```bash
mcporter call 'netdisk.transfer(share_link: "https://pan.quark.cn/s/xxx", source_pattern: "/*", target_path: "/目标路径")'
```
### Step 5: 验证
```bash
mcporter call 'netdisk.list(cloud: "quark", path: "/目标路径")'
```
如有杂文件用 Quark API 删除。
## 典型场景:找电影
```
1. search("奥本海默 4K", cloud_types=["quark"])
2. 用户选择一条结果
3. view() 确认是否为目标电影
4. 创建 /电影/2024 目录(如不存在)
5. transfer 到该目录
6. 验证
```
@@ -0,0 +1,148 @@
# 工作流:腾讯文档 → 夸克网盘
从腾讯文档(如 Tacit0924 的资源分享文档)中搜索关键词找到分享链接,转存到夸克网盘。
## 步骤
### Step 1: 读取腾讯文档内容
从 URL 中提取 `file_id``/doc/<file_id>` 部分):
```bash
# 获取文档结构
mcporter call tencent-docs doc.resolve_document_structure file_id=<FILE_ID> > doc_raw.json
# 提取文本内容到本地文件
python -X utf8 -c "
import json
with open('doc_raw.json','r',encoding='utf-8') as f:
data=json.load(f)
texts=[]
for n in data.get('nodes',[]):
p=n.get('text_preview','')
hl=n.get('heading_level',0)
if p:
texts.append(('#'*hl+' '+p) if hl>0 else p)
with open('doc_content.txt','w',encoding='utf-8') as f:
f.write('\n'.join(texts))
print(f'{len(texts)} paragraphs extracted')
"
# 清理中间文件(可选)
rm doc_raw.json
```
> **注意**:文档是 tencentdoc 类型用以上方法,smartcanvas 类型用 `smartcanvas.read`。
### Step 2: 搜索关键词匹配链接
```bash
# 在提取的文本中搜索关键词,找到分享链接
grep -n "关键词" doc_content.txt
# 或
python -X utf8 -c "
with open('doc_content.txt','r',encoding='utf-8') as f:
lines=f.readlines()
kw='关键词'
for i,line in enumerate(lines):
if kw in line:
# 打印上下文:前后3行
start=max(0,i-3)
end=min(len(lines),i+4)
print(f'--- Line {i+1} ---')
for j in range(start,end):
marker='>' if j==i else ' '
print(f'{marker} {lines[j].strip()[:150]}')
"
```
夸克链接格式:`https://pan.quark.cn/s/<id>`
### Step 3: 查看分享链接内容
```bash
mcporter call 'netdisk.view(share_link: "https://pan.quark.cn/s/xxx")'
```
可选:用 `file_pattern` 过滤特定格式:
```bash
mcporter call 'netdisk.view(share_link: "https://pan.quark.cn/s/xxx", file_pattern: "*.mp4")'
```
### Step 4: 确定/创建目标目录
先看看夸克网盘上是否已有该资源的目录:
```bash
mcporter call 'netdisk.list(cloud: "quark", path: "/动漫")'
```
如果已存在则复用,否则创建新目录:
```bash
# 创建目录需要父文件夹 FID,先获取
# 方式1:从 netdisk.list 输出中提取 (ID: xxx)
# 方式2:直接调用 API
# 创建子目录
COOKIE="你的夸克Cookie"
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file?pr=ucpro&fr=pc" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"pdir_fid":"<父FID>","file_name":"<新目录名>","file_type":0,"dir_init":true}'
```
> API 详情见 `references/quark-api.md`
### Step 5: 转存
```bash
mcporter call 'netdisk.transfer(share_link: "https://pan.quark.cn/s/xxx", source_pattern: "/*", target_path: "/目标路径")'
```
> **注意**`source_pattern` 的 glob 跨所有文件夹匹配,转存后需要验证并清理。
### Step 6: 验证并清理
```bash
# 列出目标目录
mcporter call 'netdisk.list(cloud: "quark", path: "/目标路径")'
# 如果有混入的不相关文件,用 Quark API 删除
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file/delete?pr=ucpro&fr=pc" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"action_type":2,"filelist":["<杂文件FID1>","<杂文件FID2>"]}'
```
### Step 7: 输出结果摘要
列出最终目录结构,让用户确认。
## 完整示例(遮天动画版)
参见 `resource-pipeline/SKILL.md` 的实际对话记录,关键节点:
```
输入: 腾讯文档 URL DR2xUcFdrSVhJTkZu + 关键词 "遮天"
1. doc.resolve_document_structure → 提取全文(853231字/28449段)
2. grep "遮天" → 找到链接 https://pan.quark.cn/s/0762b0d500f3
3. netdisk.view → 205文件/191GB,含1-162集4K
4. 发现已有目录 /动漫/国漫2024/遮.天(2023
→ 创建子目录 151-162
5. netdisk.transfer × 2 → 转存151-162集
6. Quark API delete → 清理混入的杂文件(Z 4K 15/16等)
结果: 遮.天(2023/151-162/ 含11集新内容
```
## 注意事项
- **get_content 大文档超时**:改用 `doc.resolve_document_structure`
- **目录必须存在**:转存前先用 API 创建不存在的目录
- **glob 跨文件夹**:验证后再清理杂文件
- **Windows 编码**:用 `python -X utf8` 处理 emoji
@@ -0,0 +1,88 @@
# 工作流:整理夸克网盘文件
对夸克网盘中已有的文件按规则分段整理归档。
## 步骤
### Step 1: 列出目标目录
```bash
mcporter call 'netdisk.list(cloud: "quark", path: "/要整理的目录")'
```
观察文件命名规律,确定分段方案。
### Step 2: 分析命名并确定分段规则
常见命名模式与分组建议:
| 文件命名示例 | 建议分段 | 说明 |
|-------------|---------|------|
| 第01集.mp4 ~ 第100集.mp4 | 01-30, 31-60, 61-90, 91-100 | 按30集一段 |
| E01.mp4 ~ E162.mp4 | 1-50, 51-100, 101-150, 151-162 | 按50集一段 |
| 遮天104 4K ~ 遮天162 4K | 101-120, 121-140, 141-150, 151-162 | 按20集一段 |
### Step 3: 创建分段文件夹
需要父目录的 FID(从 `netdisk.list` 输出的 `(ID: xxx)` 获取):
```bash
COOKIE="你的夸克Cookie"
# 批量创建目录
for name in "101-120" "121-140" "141-150"; do
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file?pr=ucpro&fr=pc" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d "{\"pdir_fid\":\"<父FID>\",\"file_name\":\"$name\",\"file_type\":0,\"dir_init\":true}"
done
```
### Step 4: 移动文件到对应文件夹
按文件 FID 分组移动到各自的目标目录:
```bash
# 移动一批文件到目标目录
curl -s -X POST "https://drive-h.quark.cn/1/clouddrive/file/move?pr=ucpro&fr=pc" \
-H "cookie: $COOKIE" \
-H "content-type: application/json" \
-H "origin: https://pan.quark.cn" \
-H "referer: https://pan.quark.cn/" \
-d '{"action_type":1,"filelist":["<FID1>","<FID2>"],"to_pdir_fid":"<目标目录FID>"}'
```
> 注意:`filelist` 每次建议不超过 30 个 FID。
### Step 5: 验证最终结构
```bash
# 查看根目录(只剩子文件夹)
mcporter call 'netdisk.list(cloud: "quark", path: "/要整理的目录")'
# 抽查子目录内容
mcporter call 'netdisk.list(cloud: "quark", path: "/要整理的目录/101-120")'
```
## 完整示例(遮天整理)
```
整理前:遮.天(2023)/ ← 37个文件平铺(104-150集)
├── 104 4K.mp4
├── 108 4K.mp4
├── ...(37个文件散落)
整理后:遮.天(2023/
├── 101-120/ ← 104, 108, 109, 117-1207集)
├── 121-140/ ← 121-14020集)
├── 141-150/ ← 141-15010集)
└── 151-162/ ← 151-16211集,后续新增)
```
## 注意事项
- **FID 总在变**:每次列出目录时都要重新获取 FID,不要硬编码
- **移动是异步的**API 返回 `finish: true` 才能确认完成
- **先创建再移动**:文件夹不存在时 move 会失败