Home
Softono
YiMao

YiMao

Open source Go
53
Stars
4
Forks
1
Issues
1
Watchers
1 week
Last Commit

About YiMao

# YiMao · Telegram 影视求片助手 <div align="center"> **在 Telegram 内完成「搜片 → 求片 → 查进度 → 收通知」的完整闭环** 配合 MoviePilot + Emby/Jellyfin 使用,求片众筹、追剧进度一站搞定,无需切换 App [![Go Version](https://img.shields.io/badge/Go-1.24-00ADD8?logo=go)](https://golang.org) [![Docker](https://img.shields.io/badge/Docker-Ready-2496ED?logo=docker)](https://www.docker.com) [![Docker Pull](https://img.shields.io/badge/docker-xzb177%2Fyimao-blue?logo=docker)](https://hub.docker.com/r/xzb177/yimao) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) [![Stars](https://img.shields.io/github/stars/xzb177/YiMao?style=social)](https://github.com/xzb177/YiMao/stargazers) [核心功能](#-核心功能) · [命令速查](#-命令速查) · [快速开始](#-快速开始) · [配置说明](#%EF%B8%8F-配置说明) · [部署指南](#-部署指南) </div> --- ## ⚠️ 更新提示 **更新前请务必阅读 [更新指南](docs/UPDATE.md),避免数据丢失。** --- ## 简介 YiMao(云海影视助手)是一个 Telegram Bot,把"找片—求片—等片—看片"这条链路全 ...

Platforms

Web Self-hosted Docker

Languages

Go

Links

YiMao · Telegram 影视求片助手

在 Telegram 内完成「搜片 → 求片 → 查进度 → 收通知」的完整闭环

配合 MoviePilot + Emby/Jellyfin 使用,求片众筹、追剧进度一站搞定,无需切换 App

Go Version Docker Docker Pull License Stars

核心功能 · 命令速查 · 快速开始 · 配置说明 · 部署指南


⚠️ 更新提示

更新前请务必阅读 更新指南,避免数据丢失。


简介

YiMao(云海影视助手)是一个 Telegram Bot,把"找片—求片—等片—看片"这条链路全部搬进聊天窗口:

  • 搜片:直接发片名,Bot 返回 TMDB 候选,点进去看详情。
  • 求片:详情页一键发起,走管理员审核 + 配额控制,通过后由 MoviePilot 自动下载。
  • 等片:候选列表有"预产期灯牌"给心理预期;搜不到的片可以丢进许愿池,找到源主动私信通知;多人想看的同一部片可以拼车 +1
  • 看片:入库后自动推送通知;追剧能看到集数进度条;还有每日入库汇总、每周观影周报。

下载、刮削、入库由 MoviePilot 负责,媒体库与入库回调由 Emby / Jellyfin 提供,YiMao 是把这套后端能力包装成"人话"交互的前台。

隐私保护:搜片、求片、进度、配额等个人操作在私聊中进行;群组仅用于接收入库通知、拼车到货提醒和公告。


✨ 核心功能

🔍 智能搜片

私聊直接发送片名(中英文均可),返回 TMDB 候选列表;点击进入详情页查看简介、年份、海报,并决定是否求片。也支持 🔥 本周热门 / 📺 热门剧集 / ⭐ 必看神作 / 🆕 最新上映 / 🎲 随机探索 等精选入口。

🎬 求片(审核流 + 配额)

详情页点「求片」即可发起请求:

  • 绑定校验:首次需用 /link 用户名 密码 绑定 MoviePilot 账号。
  • 配额扣减:电影扣 1,剧集扣 3(一整季对服务器资源消耗更大),每日 00:00 重置(按访问惰性刷新)。默认电影/剧集各 2 个/天。
  • 去重提醒:媒体库已存在或已有相同请求时会提示,可选择"仍要订阅"。
  • 审核流:请求进入管理员审核,管理员可 ✅ 批准 / ❌ 拒绝。批准后调用 MoviePilot 下单;若下单失败会标记为 stuck(兜底保留,可重试,不会丢单);拒绝时自动返还配额

🚦 候选预产期灯牌

浏览某部片的候选资源列表时,根据已扫到的站点做种情况给出一个轻量"状态灯牌"(只给预期、不承诺精确时间):

灯牌 含义 判定(去重后"有做种"的站点数)
资源充足,很快到货 ETA_THRESHOLD_HIGH(默认 3)
🔄 已有源,需等做种 1 ~ 阈值−1
🐢 暂无站点出源 0
数据不足,仍在找源 候选为空 / 数据缺失

📈 剧集进度条

追剧时在入库通知里展示集数进度条,如 📈 已更 S03E07/S03E16 ▓▓▓▓░░░░ 44%(距完结还差 9 集),完结显示 100%(已完结)。分母取自 TMDB 当季实际集数,支持本季 / 全剧双口径。

🙋 拼车 +1

详情页点「我也想看」,把自己加入这部片的拼车列表,并提示"已加入,共 N 人想看"。该片到货时会在群里 @ 拼过车的用户。

🌟 许愿池(/wish

搜不到的片可以许愿,找到源第一时间通知你:

  • /wish 片名 入池:TMDB 强校验匹配、与现有订阅去重、容量上限(每人 20 条 / 全局 500 条)。
  • /wish(无参)列出"我的许愿",可取消。
  • 众筹计数:同一部片多人许愿会合并,重复许愿时提示"目前 N 人在等,出源会自动通知你"。
  • 定时重搜:调度器约每天对每条许愿重搜一次(错峰),命中(做种数 ≥ WISH_MIN_SEEDERS)后主动私信许愿人"🎉 你许愿的影片出源啦!"并附「🎬 立即求片」按钮;其他许愿者也会收到提醒。出源后仅通知不自动求片,需用户点按钮确认后才走求片流程。
  • 超期处理:入池 WISH_EXPIRE_DAYS(默认 30)天仍无源会做一次最终重搜,仍无源则取消并私信发起人。

状态机:PENDING → SEARCHING → FOUND → NOTIFIED → FULFILLED,旁路 EXPIRED(超期/放弃)/ ORPHANED(用户退群/不可达)。

📋 我的请求(聚合视图)

/requests(或 /watchlist)把分散的状态聚合成一页,按状态分组展示并标出计数:

  • 【进行中】:审核中 / 下载中 / 搜索中等
  • 【许愿中】:许愿池里待出源的条目
  • 【已完成】:已入库
  • 【异常/失败】:失败 / 已取消

数据同时来自 MoviePilot 订阅、待处理的审核单和许愿池,避免来回切界面查状态。

🎬 AI 推荐 · 今晚看什么

点「🎬 今晚看什么」或发送 /ai,进入一次性 AI 对话模式,把口味/心情用一句话告诉 Bot(如"想看烧脑悬疑、别太长"),由 AI 帮你挑片。需配置 AI Key 或将 AI_ENABLED=true

说明:AI 推荐是按钮/命令触发的交互,不存在"AI 电台主动定时推送"。系统自带的每日 9:00 推荐是基于 MoviePilot 热门榜(非 AI 生成),且受用户通知开关控制。

📊 观影周报

每周一 9:00 自动生成并按用户通知开关推送(也可在通知设置中开关)。内容包括本周搜索/求片/通过数、剩余配额、行为标签、热搜关键词、类型偏好与专属建议。

🔔 通知设置与每日汇总

「设置 → 通知设置」可单独开关:入库通知 / 每日推荐 / 周报 / 公告。每日 DAILY_SUMMARY_HOUR(默认 21:00)推送当天的入库汇总。

🤖 /status

查看 Bot 运行状态:版本、服务端时间、当前用户 ID、聊天类型、是否管理员。


⌨️ 命令速查

命令 作用 权限
/start 打开主菜单 所有人
/search 提示进入搜片(直接发片名即可) 所有人
/ai [描述] 今晚看什么 · AI 推荐(需启用 AI) 所有人
/wish [片名] 许愿入池 / 查看我的许愿 所有人
/requests 我的请求聚合视图(私聊) 所有人
/watchlist 我的片单(同 /requests,私聊) 所有人
/quota 查看今日配额(私聊) 所有人
/link 用户名 密码 绑定 MoviePilot 账号 所有人
/status 查看 Bot 运行状态 所有人
/id 查看当前聊天 / 用户 ID 所有人
/help 功能与命令帮助 所有人

管理操作(审核、配额管理等)通过菜单内「🛠️ 管理」入口进入,仅管理员可见。


🚀 快速开始

方式一:Docker(推荐)

# 1. 准备配置
cp .env.example .env
vim .env        # 至少填写 TELEGRAM_BOT_TOKEN / MOVIEPILOT_URL / MOVIEPILOT_API_KEY

# 2. 拉起(host 网络,便于访问内网 MoviePilot / Emby)
docker compose up -d

# 3. 查看日志
docker compose logs -f

docker-compose.yml 默认使用 network_mode: host,数据持久化到 ./data

方式二:本地构建运行

# 需要 Go 1.24
go build -o yimao ./cmd/bot
export $(grep -v '^#' .env | xargs)
./yimao

服务默认监听 :8080,提供 /health 健康检查。首次部署后,用 /link 绑定的第一个用户会自动成为管理员,也可用 ADMIN_USER_IDS 预先指定。


⚙️ 配置说明

所有配置通过环境变量提供,完整示例见 .env.example

核心(必需)

变量 必填 默认 说明
TELEGRAM_BOT_TOKEN 从 @BotFather 获取的 Bot Token
ADMIN_USER_IDS 推荐 管理员 TG ID,逗号分隔;留空则首个 /link 用户成为管理员
TELEGRAM_CHAT_ID 群组 Chat ID,用于群组通知;留空则不发群通知
PORT 8080 服务监听端口
TZ Asia/Shanghai 时区

MoviePilot(必需)

变量 必填 默认 说明
MOVIEPILOT_URL http://localhost:4500 MoviePilot 地址
MOVIEPILOT_API_KEY MoviePilot API Key(候选资源列表依赖此项)
DOWNLOAD_SAVE_PATH 自定义下载目录,多实例共用一个 MoviePilot 时区分用

Emby / Jellyfin(可选但推荐)

变量 必填 默认 说明
EMBY_URL Emby / Jellyfin 地址(用于媒体库查重与入库通知)
EMBY_API_KEY 条件 设置了 EMBY_URL 时必填
EMBY_SKIP_TLS_VERIFY false 跳过 Emby TLS 校验(仅信任的自签名证书)
NOTIFICATION_FORMAT detailed 通知格式:simple / detailed

配额 / 会话

变量 必填 默认 说明
MAX_SESSIONS 1000 最大并发会话数(1–10000)
MAX_SESSION_AGE 24 会话最大存活时长(小时,1–168)

配额额度(电影/剧集每人每日上限)由服务在运行时管理(默认各 2,电影扣 1、剧集扣 3),并可与 MoviePilot 同步。

许愿池(WISH_*

变量 必填 默认 说明
WISH_RESEARCH_INTERVAL_HOURS 24 重搜调度间隔 / 锁定窗口(小时),旧锁超期自动自愈
WISH_EXPIRE_DAYS 30 入池后无源自动过期天数
WISH_MIN_SEEDERS 1 重搜"命中"判定的最低做种数
WISH_SEARCH_LOCK_TTL_MINUTES 60 searching_at 自愈锁 TTL(分钟)

预产期灯牌(ETA_*

变量 必填 默认 说明
ETA_THRESHOLD_HIGH 3 ⚡"资源充足"档位的站点做种数阈值

AI(可选)

变量 必填 默认 说明
AI_ENABLED false 设为 true 显示 AI 推荐按钮(适用于 Mimo 等非 Zhipu/Claude 提供商)
ZHIPU_API_KEY 智谱 AI API Key
CLAUDE_API_KEY / ANTHROPIC_API_KEY Anthropic/Claude API Key(二选一)
TMDB_API_KEY 内置默认 TMDB API Key

通知 / 调度

变量 必填 默认 说明
DAILY_SUMMARY_HOUR 21 每日入库汇总推送时间(0–23)

其他

变量 必填 默认 说明
WEBHOOK_SECRET 设置后入站 Webhook 须携带有效签名(X-Webhook-Signature: sha256=<hex>
WEBHOOK_URL 设置后 Bot 使用 Webhook 模式接收 Telegram 更新(否则轮询)
UI_STYLE card 菜单风格:neon / film / pop / card / cinema
LOG_LEVEL info 日志级别:debug / info / warn / error
LOG_PREFIX YiMao 日志前缀
LOG_COLOR false 彩色日志输出
PUID / PGID 0 / 0 容器内运行用户 UID/GID(与 data 目录权限匹配)

📦 部署指南

服务端点

  • GET /healthGET /api/health:健康检查
  • POST /webhook/telegram-webhook:Telegram 更新(Webhook 模式)
  • POST /webhook/emby/webhook/moviepilot/webhook/mp/webhook/jellyseerr/api/summary:媒体后端入库回调

在 Emby/Jellyfin 与 MoviePilot 中配置对应 Webhook 指向上述地址,YiMao 即可在入库时推送通知、更新剧集进度、触发拼车与许愿出源逻辑。若设置了 WEBHOOK_SECRET,回调请求需携带签名。

数据持久化

运行数据(配额、管理员、偏好、反馈、许愿池 SQLite 等)保存在 DATA_DIR(容器内默认 /app/data,已挂载到 ./data)。升级前请备份该目录。

更新

更新前务必阅读 docs/UPDATE.md,按指引迁移数据后再拉取新镜像 / 重新构建。


🧱 技术栈与架构

  • 语言/运行时:Go 1.24,单二进制,Docker 多阶段构建(alpine 运行)
  • 存储:本地 JSON(配额/管理员/偏好等)+ SQLite(modernc.org/sqlite,纯 Go,免 CGO;许愿池、搜索历史等)
  • 交互:Telegram Bot API(轮询 / Webhook 双模式)
  • 后端集成:MoviePilot(搜索、订阅下载、热门榜)、Emby/Jellyfin(媒体库查重、入库回调)、TMDB(元数据)
  • 后台任务:每日推荐(9:00,热门榜)、每日入库汇总(DAILY_SUMMARY_HOUR)、每周周报(周一 9:00)、许愿池每分钟错峰重搜与过期清理

更多设计细节见 docs/ARCHITECTURE.mdFEATURES.mdCOMMANDS.mdDEPLOY.md 等)。


License

MIT