1. 为什么需要Emby媒体库监控每次打开Emby服务器发现又有新电影入库却不知道具体内容作为影视爱好者我经常遇到这种情况。手动检查不仅耗时还容易错过精彩内容。这就是为什么我们需要一个自动化监控方案。Python的watchdog模块就像个尽职的看门狗它能实时监控Emby媒体库目录的变化。当有新影片入库时Emby会自动生成NFO文件包含影片元数据的信息文件这时watchdog就能立即捕捉到这个变化。我曾经手动检查媒体库的日子一去不复返了现在所有新入库内容都会自动推送到我的Telegram频道。这个方案特别适合家庭媒体服务器管理员影视收藏爱好者需要实时掌握媒体库更新的团队相比传统方案我们的实现有几个明显优势轻量级基于Python实现资源占用极低实时性文件变化立即触发响应速度在毫秒级自动化从监控到推送全流程无需人工干预可扩展轻松支持电影、剧集等多种媒体类型2. 环境准备与依赖安装2.1 Python环境配置我推荐使用Python 3.10或更高版本因为v2.x版本使用了match...case语法Python 3.10引入的模式匹配功能。安装Python后需要这几个核心模块pip install watchdog requests如果你像我一样喜欢干净的环境可以使用virtualenv创建隔离环境python -m venv emby-watchdog source emby-watchdog/bin/activate # Linux/macOS emby-watchdog\Scripts\activate # Windows2.2 获取必要的API密钥这个方案需要两个关键APITelegram Bot Token通过BotFather创建机器人获取TMDB API Key在TMDB官网开发者页面申请我建议将这些敏感信息保存在环境变量中而不是硬编码在脚本里。这是我的.env文件示例BOT_TOKEN你的Telegram机器人Token CHAT_ID你的Telegram频道Chat ID TMDB_API你的TMDB API Key MEDIA_PATH/path/to/your/emby/media2.3 媒体库路径设置确保你设置了正确的媒体库路径。Emby通常会在这些目录生成NFO文件电影/media/movies/电影名 (年份)/剧集/media/tvshows/剧集名/Season XX/我建议先用命令行测试路径是否有效ls -la /path/to/your/emby/media3. 核心代码实现解析3.1 Watchdog监控逻辑Watchdog的核心是继承FileSystemEventHandler类。这是我优化后的监控类实现from watchdog.events import FileSystemEventHandler class EmbyEventHandler(FileSystemEventHandler): def __init__(self, bot, tmdb_api): self.bot bot self.tmdb_api tmdb_api def on_created(self, event): if not event.is_directory and event.src_path.endswith(.nfo): try: media_info self.parse_nfo(event.src_path) if media_info[type] movie: details self.get_tmdb_movie_details(media_info[tmdbid]) else: details self.get_tmdb_tv_details(media_info[tmdbid]) self.bot.send_media_info(media_info, details) except Exception as e: logging.error(f处理NFO文件失败: {str(e)})这个实现有几个关键改进增加了异常处理避免单个文件处理失败影响整体监控区分电影和剧集类型分别调用不同TMDB接口使用logging模块记录错误便于后期排查3.2 NFO文件解析技巧Emby生成的NFO文件是XML格式包含丰富元数据。这是我的解析函数import xml.etree.ElementTree as ET def parse_nfo(nfo_path): tree ET.parse(nfo_path) root tree.getroot() result { title: root.find(title).text, year: root.find(year).text, type: movie if root.find(type).text movie else tvshow, tmdbid: root.find(tmdbid).text, path: os.path.dirname(nfo_path) } # 处理剧集特殊字段 if result[type] tvshow: result[season] root.find(season).text result[episode] root.find(episode).text return result实际使用中我发现几个注意事项NFO文件可能不会立即包含完整信息需要重试机制某些老电影可能没有tmdbid需要备用方案XML解析要考虑编码问题特别是非英语内容3.3 TMDB元数据补全TMDB API能补全封面、评分等NFO中不包含的信息。这是我的封装实现def get_tmdb_movie_details(tmdb_id): url fhttps://api.themoviedb.org/3/movie/{tmdb_id} params { api_key: self.tmdb_api, language: zh-CN, append_to_response: images } response requests.get(url, paramsparams) data response.json() return { poster: fhttps://image.tmdb.org/t/p/w500{data[poster_path]}, backdrop: fhttps://image.tmdb.org/t/p/original{data[backdrop_path]}, rating: data[vote_average], overview: data[overview], genres: [g[name] for g in data[genres]] }对于剧集接口稍有不同def get_tmdb_tv_details(tmdb_id): url fhttps://api.themoviedb.org/3/tv/{tmdb_id} params { api_key: self.tmdb_api, language: zh-CN } # 其他实现类似电影接口4. Telegram Bot消息推送4.1 消息内容组装Telegram Bot API支持丰富的消息格式。这是我设计的媒体信息卡片def format_movie_message(media_info, details): return f *{media_info[title]}* ({media_info[year]}) ⭐ 评分: {details[rating]}/10 类型: {, .join(details[genres])} 简介: {details[overview]} 对于剧集格式略有不同def format_tv_message(media_info, details): return f *{media_info[title]}* - S{media_info[season]}E{media_info[episode]} ⭐ 评分: {details[rating]}/10 类型: {, .join(details[genres])} 剧情: {details[overview]} 4.2 图片与消息一起发送Telegram支持发送带图片的消息。这是发送函数的实现def send_media_message(chat_id, text, image_url): params { chat_id: chat_id, photo: image_url, caption: text, parse_mode: Markdown } url fhttps://api.telegram.org/bot{self.token}/sendPhoto requests.post(url, jsonparams)实际使用中我发现几个优化点图片URL需要预先验证可用性消息长度有限制最长1024字符需要截断处理支持Markdown格式可以增强可读性5. Docker化部署实践5.1 Docker镜像优化原始版本使用Ubuntu基础镜像体积达231MB。我改用Alpine Linux后镜像缩小到69.5MB。这是优化后的DockerfileFROM python:3.10-alpine WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, watchdog_emby.py]构建命令docker build -t emby-watchdog .5.2 容器运行配置这是推荐的docker run命令包含所有必要参数docker run -d --nameemby-watchdog \ --restartunless-stopped \ -v /path/on/host:/path/in/container \ --env-file .env \ emby-watchdog关键参数说明--restartunless-stopped确保容器意外退出后自动重启-v将主机媒体库路径映射到容器内--env-file从文件加载环境变量更安全方便5.3 日志与故障排查建议将日志输出到文件方便后期检查import logging logging.basicConfig( filenameos.getenv(LOG_PATH, /var/log/emby-watchdog.log), levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s )常见问题排查权限问题确保容器用户有媒体库读取权限网络问题检查容器能否访问TMDB API和Telegram路径问题确认容器内外路径映射正确6. 实际效果与进阶优化在我的媒体服务器上运行这套系统后每当有新电影或剧集入库Telegram频道就会收到精美通知卡片包含影片海报中文标题和年份TMDB评分剧情简介类型标签进阶优化建议去重机制记录已处理文件避免重复通知本地缓存缓存TMDB查询结果减少API调用多语言支持根据NFO语言自动切换消息语言用户偏好实现基于用户的内容过滤这套系统已经稳定运行6个月处理了超过1200部电影和剧集更新成为我媒体库管理不可或缺的工具。如果你也厌倦了手动检查媒体库更新不妨试试这个自动化方案。