MediaHelp媒体库管理项目实现对飞牛影视和Emby的集成

0 阅读6分钟

🎬 ​​告别资源混乱!MediaHelp:追剧党的终极网盘管理神器​🎬 ​​告别资源混乱!MediaHelp:追剧党 - 掘金

还在为影视资源散落在不同媒体库而烦恼吗?下载的电影躺在飞牛网盘,珍藏剧集却又在自建 Emby 服务器里?切换平台、重复刮削、管理割裂,这些痛点严重影响追剧体验!

MediaHelp 应运而生! 这是一个旨在 统一管理 Emby 和飞牛影视 的自动化平台,让你在一个界面下轻松掌控所有影视资源,真正实现"一站式追剧"。

🤯 痛点:自动化追剧平台的割裂管理

许多追剧爱好者会同时使用像 Emby/Jellyfin 这样的自建媒体库平台和像飞牛网盘自带影视库这样便捷的云端服务。然而:

  1. 资源分散管理:内容分布在两个独立系统,无法统一浏览、搜索。
  2. 体验不一致:海报墙展示、任务管理、API调用方式完全不同。
  3. 管理负担加重:需要在两个平台分别进行刮削、分类、状态查看(如下载/转码进度)。
  4. 自动化流程复杂:想在两个库之间同步状态或触发操作非常麻烦。

🛠️ MediaHelp 的解决方案:无缝集成 Emby & 飞牛影视

MediaHelp 的核心目标就是解决上述痛点,通过开发统一的中间层 API 和应用界面,桥接两大主流媒体库:开源自建王者 Emby易用便捷的飞牛影视

核心挑战与突破:如何让"两家人"变成"一家人"?

  1. 权限认证 - 叩开两家大门

    • Emby (相对简单)

      • Emby 提供了完善的 API Key 机制。
      • 流程:在 Emby 后台 设置 -> API 密钥 中创建 Key 即可。
      • MediaHelp 实现:通过 API Key,MediaHelp 拥有安全、稳定的访问权限。
      # Emby API Key 使用示意 (连接参数)
      EMBY_URL = "http://your_emby_server:8096"
      EMBY_API_KEY = "your_emby_api_key_here"
      
    • 飞牛影视 (无官方文档的挑战)

      • 飞牛影视缺乏公开 API 文档。
      • MediaHelp 突破:通过分析飞牛影视 Web 端行为,逆向工程出其登录接口和关键流程。
      • 登录流程模拟
      async def get_token(self):
          """飞牛影视登录获取 Token (关键破解点)"""
          response = await self._make_request('/v/api/v1/login', 'POST', data={
            "app_name": "trimemedia-we",  # 分析得到的固定标识
            "username": self.fn_account,  # 用户账号
            "password": self.fn_password  # 用户密码
          })
          if response.get('code') == 0:  # 成功响应码
              self.token = response.get('data').get('token')  # 解析出 Token
          else:
              logger.error(f"FN登录失败: {response.get('msg')}")
              raise Exception(f"FN登录失败: {response.get('msg')}")
      
      • 依赖Token:后续所有飞牛影视 API 调用都需要在 Header 中附带此 Token (Authorization: Bearer <token>)。
  2. 统一海报墙 - 汇聚"媒体海洋"

    • 目标:在一个界面展示来自 Emby 和飞牛的所有影视资源,如同一个整合的媒体库。

    • 集成策略

      • 调用各自平台获取媒体库/文件夹列表的 API。
      • 对返回数据进行标准化处理(如图片 URL、标题、ID、类型等)。
      • Emby API (/Items):功能强大,参数丰富(按类型过滤、递归获取等)。
      async def get_emby_items(self, parent_id: str = None, item_type: str = None):
          """获取 Emby 媒体库内容"""
          params = {
              'ParentId': parent_id,
              'Recursive': 'true',
              'IncludeItemTypes': item_type,  # e.g., 'Movie', 'Series'
              'Fields': 'PrimaryImageAspectRatio,BasicSyncInfo'  # 常用字段
          }
          # 清理空参数并调用
          params = {k: v for k, v in params.items() if v is not None}
          return await self._make_request('/Items', params=params)
      
      • 飞牛影视 API (/v/api/v1/item/list POST):需要模拟 Web 请求,传递 JSON body。
      async def get_fn_media_items(self, library_id: str):
          """获取飞牛指定媒体库内容"""
          if not self.token: await self.get_token()  # 确保有Token
          payload = {
              "ancestor_guid": library_id,     # 媒体库ID
              "tags": {"type": ["Movie", "TV"]}, # 过滤类型
              "sort_type": "DESC",
              "sort_column": "create_time",
              "exclude_grouped_video": 1,
              "page": 1,
              "page_size": 50
          }
          response = await self._make_request('/v/api/v1/item/list', 'POST', data=payload)
          if response.get('code') == 0:
              return response.get('data', {}).get('list', [])
          else:
              raise Exception(f"FN获取内容失败: {response.get('msg')}")
      
      • MediaHelp UI:将 Emby 返回的 Items 和 飞牛返回的 list 集合渲染在一个美观的、可分类/搜索的海报墙上。
  3. 任务监控 - 全局掌控后台进程

    • 价值:实时了解资源刷新、入库刮削、转码等耗时任务的状态(成功/失败/进度)。

    • 集成策略

      • Emby API (/ScheduledTasks):返回所有调度任务,需过滤 State == 'Running' 的任务。
      async def get_running_emby_tasks(self):
          """获取 Emby 运行中任务"""
          tasks = await self._make_request('/ScheduledTasks')
          return [task for task in tasks if task.get('State') == 'Running']
      
      • 飞牛影视 API (/v/api/v1/task/running GET):直接返回当前运行中的任务列表。
      async def get_running_fn_tasks(self):
          """获取飞牛运行中任务"""
          if not self.token: await self.get_token()
          response = await self._make_request('/v/api/v1/task/running', 'GET')
          if response.get('code') == 0:
              return response.get('data', [])
          else:
              raise Exception(f"FN获取任务失败: {response.get('msg')}")
      
      • MediaHelp 任务中心:将所有运行中的 Emby 任务和飞牛任务聚合在一个仪表盘,展示名称、进度、耗时、状态等关键信息,方便统一监控。

🚀 MediaHelp 带来的革命性体验

  • 统一资源视图:无需切换应用,在一个地方尽览所有影视资源(本地+云端)。
  • 无缝媒体管理:尝试跨平台操作(如:将飞牛资源添加到 Emby 刮削队列)。
  • 全局任务监控:实时掌握所有后台运作状态,进度一目了然。
  • 提升自动化效率:为更复杂的自动化流程(如飞牛下载完成自动入库 Emby)提供基础。
  • 开发者友好:封装了处理 Emby 标准 API 和飞牛影视"私有"API 的复杂性,提供简洁一致的操作接口。

🔍 技术要点与注意事项

  • 异步高效:代码示例基于 Python asyncio,确保高效处理大量 API 请求。
  • 飞牛逆向工程:飞牛影视的 API 基于 Web 行为分析,存在官方更新导致失效的风险。MediaHelp 会持续跟进适配。
  • 安全性:妥善保管 Emby API Key 和飞牛账户密码。MediaHelp 在实现时应考虑安全的凭据存储方式(如加密配置文件)。
  • 错误处理:代码中加入了必要的异常捕获和日志记录,保证稳定性。

效果展示

image.png

image.png

🌈 展望未来

MediaHelp 集成 Emby 和飞牛影视只是第一步!未来可以探索:

  1. 集成更多平台:如 Jellyfin, Plex 等。
  2. 深度自动化:实现真正的跨平台自动整理(下载 -> 转移/重命名 -> 入库刮削)。
  3. 智能资源发现:跨库搜索、统一收藏夹、推荐相似内容。
  4. 状态同步:跨平台标记已观看、收藏等状态。

✨ 开始使用

想告别资源管理混乱,拥抱统一的影音体验?MediaHelp 是你的理想解决方案!

立即尝试 MediaHelp,让追剧回归纯粹乐趣!🎉
(项目链接:(JieWSOFT/MediaHelp: 网盘资源搜索订阅、夸克天翼网盘一键转存、定时任务自动转存、emby自动刷新全套流程方案落地))