Skip to content

Latest commit

 

History

History
149 lines (127 loc) · 5.45 KB

MP-README.md

File metadata and controls

149 lines (127 loc) · 5.45 KB

MoviePilot-Plugins

MoviePilot官方插件市场:https://github.com/jxxghp/MoviePilot-Plugins

第三方插件库开发说明

请不要开发用于破解MoviePilot用户认证、色情、赌博等违法违规内容的插件,共同维护健康的开发环境!

1. 目录结构

  • 插件仓库需要保持与本项目一致的目录结构(建议fork后修改),仅支持Github仓库,plugins存放插件代码,一个插件一个子目录,子目录名必须为插件类名的小写,插件主类在__init__.py中编写。
  • package.json为插件仓库中所有插件概要信息,用于在MoviePilot的插件市场显示,其中版本号等需与插件代码保持一致,通过修改版本号可触发MoviePilot显示插件更新。

2. 插件图标

  • 插件图标可复用官方插件库中icons下已有图标,否则需使用完整的http格式的url图片链接(包括package.json中的icon和插件代码中的plugin_icon)。
  • 插件的背景颜色会自动提取使用图标的主色调。

3. 插件命名

  • 插件命名请勿与官方库插件中的插件冲突,否则会在MoviePilot版本升级时被官方插件覆盖。

4. 依赖

  • 可在插件目录中放置requirement.txt文件,用于指定插件依赖的第三方库,MoviePilot会在插件安装时自动安装依赖库。

5. 界面开发

  • 插件支持插件配置详情展示两个展示页面,通过配置化的方式组装,使用Vuetify组件库,所有该组件库有的组件都可以通过Json配置使用。

常见问题

1. 如何扩展消息推送渠道?

  • 注册 NoticeMessage 事件响应,event_data 包含消息中的所有数据,参考 IYUU消息通知 插件:

    注册事件:

    @eventmanager.register(EventType.NoticeMessage)
  • 事件对象:

    {
         "channel": MessageChannel|None,
         "type": NotificationType|None,
         "title": str,
         "text": str,
         "image": str,
         "userid": str|int,
    }

PS:MoviePilot中的其它事件也是同样方法实现响应:

class EventType(Enum):
    # 插件重载
    PluginReload = "plugin.reload"
    # 插件动作
    PluginAction = "plugin.action"
    # 执行命令
    CommandExcute = "command.excute"
    # 站点删除
    SiteDeleted = "site.deleted"
    # Webhook消息
    WebhookMessage = "webhook.message"
    # 转移完成
    TransferComplete = "transfer.complete"
    # 添加下载
    DownloadAdded = "download.added"
    # 删除历史记录
    HistoryDeleted = "history.deleted"
    # 删除下载源文件
    DownloadFileDeleted = "downloadfile.deleted"
    # 用户外来消息
    UserMessage = "user.message"
    # 通知消息
    NoticeMessage = "notice.message"
    # 名称识别请求
    NameRecognize = "name.recognize"
    # 名称识别结果
    NameRecognizeResult = "name.recognize.result"

2. 如何在插件中实现远程命令响应?

  • 实现 get_command() 方法,按以下格式返回命令列表:

    [{
        "cmd": "/douban_sync", // 动作ID,必须以/开始
        "event": EventType.PluginAction,// 事件类型,固定值
        "desc": "命令名称",
        "category": "命令菜单(微信)",
        "data": {
            "action": "douban_sync" // 动作标识
        }
    }]
  • 注册 PluginAction 事件响应,根据 event_data.action 是否为插件设定的动作标识来判断是否为本插件事件:

    注册事件:

    @eventmanager.register(EventType.PluginAction)

    事件判定:

    event_data = event.event_data
    if not event_data or event_data.get("action") != "douban_sync":
        return

3. 如何在插件中对外暴露API?

  • 实现 get_api() 方法,按以下格式返回API列表:

    [{
        "path": "/refresh_by_domain", // API路径,必须以/开始
        "endpoint": self.refresh_by_domain, // API响应方法
        "methods": ["GET"], // 请求方式:GET/POST/PUT/DELETE
        "summary": "刷新站点数据", // API名称
        "description": "刷新对应域名的站点数据", // API描述
    }]
  • 在对应的方法中实现API响应方法逻辑,通过 http://localhost:3001/docs 查看API文档和调试

4. 如何通过插件增强MoviePilot的识别功能?

  • 注册 NameRecognize 事件,实现识别逻辑(参考ChatGPT插件),注意:只有主程序无法识别时才会触发该事件

    @eventmanager.register(EventType.NameRecognize)
  • 完成识别后发送 NameRecognizeResult 事件,将识别结果注入主程序

    eventmanager.send_event(
        EventType.NameRecognizeResult,
        {
            'title': title, # 原传入标题
            'name': str, # 识别的名称
            'year': str, # 识别的年份
            'season': int, # 识别的季号
            'episode': int, # 识别的集号
        }
    )
  • 注意:识别请求需要在15秒内响应,否则结果会被丢弃;插件未启用或参数不完整时应立即回复空结果事件,避免主程序等待; 多个插件开启识别功能时,以先收到的识别结果事件为准。

    eventmanager.send_event(
        EventType.NameRecognizeResult,
        {
            'title': title # 结果只含原标题,代表空识别结果事件
        }
    )