pmdb 是一个自动化电影信息收集与展示工具,工作流程如下:
- 🎯 多源抓取:使用
Playwright从 The Pirate Bay 等多个备用镜像获取 Top 100 热门电影,支持自动 Fallback。 - 🔍 智能查询:调用
OMDb API获取电影详情(评分、简介、海报),多阶段搜索策略(精确 → 模糊 → AI 兜底)。 - 🌐 多AI翻译:支持 Mistral / OpenAI / Groq / Nvidia / Gemini 五大提供商,通过配置一键切换。
- 📄 美观呈现:基于
Jinja2模板生成含海报、双语简介和评分的精美 HTML。 - ⚡ 高效并发:多线程并行处理,显著缩短数据获取时间。
| 特性 | 说明 |
|---|---|
| 多源 Fallback | 内置 TPB 镜像列表,源站宕机自动降级,无需人工干预 |
| 智能去重 | 大小写无关 + &/And 标准化,避免同部电影重复 |
| 多阶段搜索 | 精确匹配 → 年份±1 → 模糊搜索 → AI 推理,命中率最大化 |
| 多AI翻译 | 5 大提供商可配置,ansible/secrets.yml 中一键切换 |
| 安全配置 | API 密钥存 ansible/secrets.yml,Ansible 渲染生成 config.ini,不进版本控制 |
- Python 3.8+
playwright、requests、beautifulsoup4、jinja2- Ansible(部署时需要)
pmdb/
├── ansible/
│ ├── playbook.yml # 主 Playbook
│ ├── inventory/hosts.ini # 本地清单
│ └── roles/pmdb/
│ ├── tasks/main.yml # 部署任务
│ ├── templates/config.ini.j2 # 配置模板(Jinja2)
│ └── vars/main.yml # 角色变量
├── ansible/secrets.yml # ⚠️ 真实密钥(.gitignore,不提交)
├── ansible/secrets.yml.example # ✅ 密钥示例(提交)
├── config.ini # ⚠️ Ansible 生成(.gitignore,不提交)
├── run.sh # 运行脚本
├── main.py # 主程序入口
├── scraper.py # 抓取模块(多源 Fallback)
├── movie_api_service.py # OMDb 查询(多变体搜索)
├── translate_service.py # 多AI翻译服务
├── config_reader.py # 配置文件解析
├── html_generator.py # HTML 生成
├── retry.py # 指数退避重试工具
└── requirements.txt
# Ubuntu/Debian
sudo apt-get install ansible
# 或 pip
pip install ansiblecp ansible/secrets.yml.example ansible/secrets.yml
vim ansible/secrets.yml # 填入 API 密钥# 部署到当前目录(默认)
ansible-playbook ansible/playbook.yml -e @ansible/secrets.yml
# 指定安装目录(可选)
ansible-playbook ansible/playbook.yml -e @ansible/secrets.yml -e "deploy_dir=/opt/pmdb"部署会自动:创建 venv、安装依赖、安装 Chromium、生成 config.ini(权限 0600)。
./run.sh所有配置均在 ansible/secrets.yml 中管理,Ansible 部署后渲染生成 config.ini。
# 翻译提供商(mistral / openai / groq / nvidia / gemini)
translate_provider: "mistral"
# 对应提供商的 API 密钥
mistral_api_key: "YOUR_MISTRAL_KEY"
# OMDb API 密钥(免费注册:https://www.omdbapi.com/apikey.aspx)
omdb_api_key: "YOUR_OMDB_KEY"# 翻译模型(各提供商默认值)
mistral_translate_model: "mistral-large-latest"
openai_translate_model: "gpt-4o-mini"
groq_translate_model: "llama-3.3-70b-versatile"
nvidia_translate_model: "meta/llama-3.3-70b-instruct"
gemini_translate_model: "gemini-2.5-flash"
# IMDb AI 兜底查询(固定用 Mistral)
imdb_lookup_model: "mistral-small-latest"
# 运行参数
max_workers: 10 # 并发线程数
max_movies: 100 # 最大处理数量
request_timeout: 15 # 网络超时(秒)
# 自定义爬虫源(可选,内置 TPB 镜像已足够)
# scraper_urls:
# - "https://thepiratebay.org/search.php?q=top100:207"
# - "https://piratebay.live/search.php?q=top100:207"
# - "https://tpb.party/search.php?q=top100:207"| 变量 | 配置値 | 说明 |
|---|---|---|
deploy_user |
david |
部署目标用户 |
deploy_dir |
/home/david/Programs/PMDB |
程序安装目录(venv、config.ini 均在此目录下) |
pmdb_venv_dir |
{{ deploy_dir }}/venv |
Python 虚拟环境路径 |
pmdb_config_output |
{{ deploy_dir }}/config.ini |
生成的配置文件路径 |
修改部署目录: 编辑 ansible/roles/pmdb/vars/main.yml 中的 deploy_user 和 deploy_dir 即可。
| 文件 | 提交版本控制? | 说明 |
|---|---|---|
ansible/playbook.yml |
✅ | 主 Playbook |
ansible/roles/pmdb/templates/config.ini.j2 |
✅ | 配置模板 |
ansible/secrets.yml |
❌ | 真实 API 密钥 |
ansible/secrets.yml.example |
✅ | 密钥示例模板 |
config.ini |
❌ | Ansible 生成,权限 0600 |
venv/ |
❌ | Python 虚拟环境 |
vim ansible/secrets.yml
ansible-playbook ansible/playbook.yml -e @ansible/secrets.ymltail -f pmdb.logtest -d venv && echo "✅ venv OK"
test -f config.ini && echo "✅ config.ini OK"
grep "translate_provider" config.inirm -rf venv/ config.ini
ansible-playbook ansible/playbook.yml -e @ansible/secrets.ymlQ: Ansible 未安装?
pip install ansibleQ: Playwright Chromium 安装失败?
scraper.py 会自动寻找系统中的 google-chrome 或 chromium-browser,无需手动处理。
Q: 某些电影找不到信息? 程序有四阶段搜索(精确 → 年份±1 → 模糊 → AI 兜底),找不到的自动跳过,不影响其他电影。
Q: 如何切换翻译提供商?
修改 ansible/secrets.yml 中的 translate_provider 和对应密钥,重新运行 Ansible 即可。
Q: config.ini 误删怎么办?
重新运行 ansible-playbook ansible/playbook.yml -e @ansible/secrets.yml 即可重新生成。
欢迎提交 Issue 和 Pull Request!
TODO:
- 本地缓存,避免重复调用 OMDb API
- 增加豆瓣/TMDB 等备用数据源
- 支持 CSV/JSON 导出
