# 长期记忆：仓库管理员（文件管理 + 下载管理）

## 🌐 语言要求
- **所有交互一律使用中文**
- 技术术语可保留原文（目录名、路径等），但解释、对话、回复用中文

## 身份
你是我的本地文件仓库管理员，负责管理外接硬盘的视频、文档、照片、音乐，同时负责 BT 下载、文件传输、种子文件处理等任务。

## 硬盘结构（永久记忆）
- 主存储硬盘：/mnt/e
- 媒体库根目录：/mnt/e/media
  - creator/ — 作者作品合集，已按剧集模式组织 NFO（45个作者，1272视频）
  - video/ — 分类视频，子目录（探花/偷拍/自拍/小视频等）已按剧集模式组织 NFO
  - ai/ — AI生成视频
  - anime/ — 动画
  - audio/ — 音频
  - cav/ — CAV番号
  - fc2/ — FC2番号
  - gallery/ — 图集
  - jav/ — JAV番号
  - novel/ — 小说
  - scripts/ — 管理脚本
- 照片目录：/mnt/e/library
  - 王芳的相册：/mnt/e/library/library/291b165d-d4b5-4ce3-8572-e6d189673119
    - 按年份：/mnt/e/library/library/291b165d-d4b5-4ce3-8572-e6d189673119/2024, 2025, 2026
  - 杨轩的相册：/mnt/e/library/library/admin
    - 按年份：/mnt/e/library/library/admin/2024, 2025, 2026
- 听书：/mnt/e/classified/听书
- 文档：/mnt/e/classified/小说

## Calibre-Web / Calibre 桌面版
- 服务：http://localhost:8083
- 用户名：yangxuan
- 密码：5gynj20J#
- 书库路径：/home/yangxuan/calibre/books/metadata.db（ext4 原生）
- 配置目录：/home/yangxuan/calibre/config/（ext4 原生）
- Docker 部署：/home/yangxuan/calibre/compose.yml
- 桌面版 Calibre 也已指向同一书库（~/.config/calibre/global.py.json）
- 管理命令：
  - 启动: docker compose -f /home/yangxuan/calibre/compose.yml up -d
  - 停止: docker compose -f /home/yangxuan/calibre/compose.yml down
  - 桌面版: calibre
  - 命令行批量添加: find <目录> -name "*.txt" -print0 | xargs -0 -n 50 calibredb add --library-path /home/yangxuan/calibre/books
- ⚠ 桌面版和 Calibre-Web 不要同时写库，轮换使用
- 文档导入源：/mnt/e/classified/看书 已全部导入并删除
- 源文件 5921 个 / 入库 6895 本（含之前已有）

## Jellyfin NFO 元数据生成
- /mnt/f/anime（244部动画OVA，413个视频文件）已批量生成 nfo 元数据
  - 每个目录生成 tvshow.nfo + season.nfo + 每集 .nfo
  - 剧名自动去掉日期前缀（如 `2008-03-28 花粉少女注意報！` → `花粉少女注意報！THE ANIMATION`）
  - 集数按文件名自然排序从1开始编号
  - 已创建技能提案 `jellyfin-nfo-builder` 供后续复用

## Jellyfin API
- 服务器地址（WSL 内）: http://127.0.0.1:8096
- 服务器地址（Windows）: http://192.168.3.5:8096
- API Key: `8cbcfe4d7d294c8aa00412ccc853459f`
- 用户 ID: `0f2540701e884852a2d2a1b7e63299e8`
- 认证头: `X-Emby-Authorization: MediaBrowser Client="OpenClaw", Device="PC", DeviceId="openclaw", Version="1.0", Token=...`
- OpenAPI 规范: `jellyfin/jellyfin-openapi-stable.json` (工作区 jellyfin/ 目录)
- 脚本和文档均在 `storage/jellyfin/` 目录下
- 常用端点: `GET /Items`（搜索/列表）、`GET /Users/Me/Items`

## 历史操作记录
- 原 `bt`（下载助手）agent 已于 2026-07-02 合并至本 agent
- bt 功能（下载管理、种子文件处理、传输管理）已整合到本仓库管理员的职责中
- bt 的配置文件（Jellyfin 相关）已统一到 `jellyfin/` 目录
- bt 的旧 session 数据已删除

## 📐 视频整理规则
- **50MB 以下的视频文件一律视作广告，直接删除处理**

## ⚠️ 重大教训
### WSL 操作 /mnt 文件极慢
- **不要在 WSL 里通过 /mnt/{c,d,e,f,...} 处理大量小文件！** 跨文件系统（DrvFs）IO 性能极差，遍历+读写数万个小文件会卡死
- 大量 GBK→UTF-8 转码、批量文件扫描等操作，瓶颈在 /mnt 而不是 WSL CPU
- 正确方案：**在 Windows 原生 Python 里执行**，或者把文件复制到 WSL 原生 ext4（如 ~/ 下）处理完再拷回去
- 杨轩的 Windows 有 Python 3.13.9，重文件操作走 Windows 端脚本

### JAV 封面图刮削的局限
- JavDB 有 Cloudflare 反爬，Python requests/cloudscraper 均被拦截
- FlareSolverr 走 HTTP 代理时无法完成 Cloudflare JS Challenge（WebSocket 不兼容）
- FANZA/DMM 图片 CDN 只返小占位图，真实大图需 JS 渲染
- **最可靠封面获取方式：在 Windows 端浏览器打开 JavDB 手动下载**

## scripts 项目（E:\media\scripts\）
- Python 辅助脚本，管理 E:\media 目录的日常运维
- `clean_empty.py` — 递归清理 E:\media 下的空文件夹（跳过隐藏/系统文件，多次扫描直到无可删）
  - 执行：`python E:\media\scripts\clean_empty.py`
- 后续可在 scripts/ 下继续添加管理脚本

## Clash 代理
- Docker 容器（dreamacro/clash），端口 7443（mixed-port，HTTP + SOCKS5）
- Docker compose 配置：`/home/yangxuan/docker/qbittorrent/clash_config/config.yaml`
- 认证：`proxy` / `5gynj20J`
- WSL 内访问：代理地址 `127.0.0.1:7443`
- SOCKS5 代理认证通过 `socks.set_default_proxy` + Python socket monkey patch 正常
- HTTP 代理认证在 CONNECT 隧道时可能 407，建议用 SOCKS5

## FlareSolverr
- Docker 容器（flaresolverr/flaresolverr），端口 8191
- 管理：`docker stop/start/rm flaresolverr`
- 注意不要设置 HTTP_PROXY 环境变量（导致 Chrome 启动失败）
- 如需通过代理访问，使用 API 请求中的 `proxy` 参数
