SickGear插件开发入门:构建你的第一个自定义通知模块

📅 2026/7/5 19:39:25
SickGear插件开发入门:构建你的第一个自定义通知模块
SickGear插件开发入门构建你的第一个自定义通知模块【免费下载链接】SickGearSickGear has proven the most reliable stable TV fork of the great Sick-Beard to fully automate TV enjoyment with innovation.项目地址: https://gitcode.com/gh_mirrors/si/SickGearSickGear是一款功能强大的电视节目自动化管理工具它能够自动下载、整理和更新你的电视节目库。作为一个开源项目SickGear提供了灵活的插件系统允许开发者扩展其功能特别是通知模块。本文将为你详细介绍如何从零开始构建一个自定义通知插件让你能够将SickGear的事件通知发送到你喜欢的任何平台为什么需要自定义通知插件SickGear已经内置了许多流行的通知服务如电子邮件、Slack、Telegram等。但有时你可能需要将通知发送到特定的企业内部系统、自定义的Webhook接口或者整合一些新兴的即时通讯工具。这时候开发一个自定义通知插件就显得尤为重要。通知插件基础知识在SickGear中所有通知插件都位于sickgear/notifiers/目录下。每个插件都是一个Python类继承自Notifier基类。让我们先了解一下通知系统的核心结构核心文件结构sickgear/notifiers/__init__.py- 通知工厂和调度器sickgear/notifiers/generic.py- 通知基类定义sickgear/notifiers/emailnotify.py- 电子邮件通知实现sickgear/notifiers/slack.py- Slack通知实现sickgear/notifiers/telegram.py- Telegram通知实现构建你的第一个通知插件Webhook通知让我们创建一个简单的Webhook通知插件它将SickGear的事件发送到自定义的HTTP端点。步骤1创建插件文件首先在sickgear/notifiers/目录下创建一个新文件webhook.py# codingutf-8 # # This file is part of SickGear. # # SickGear is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # SickGear is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with SickGear. If not, see http://www.gnu.org/licenses/. from .generic import Notifier import sickgear from sg_helpers import get_url class WebhookNotifier(Notifier): def __init__(self): super(WebhookNotifier, self).__init__() def _notify(self, title, body, webhook_url, **kwargs): # 获取配置参数 url self._choose(webhook_url, sickgear.WEBHOOK_URL) if not url: self._log_error(Webhook URL未配置) return False # 构建通知数据 payload { title: title, body: body, event_type: kwargs.get(event_type, generic), timestamp: sickgear.sgdatetime.sgdatetime.now().isoformat() } # 如果有剧集对象添加详细信息 ep_obj kwargs.get(ep_obj) if ep_obj: payload.update({ show_name: ep_obj.show_obj.name, season: ep_obj.season, episode: ep_obj.episode, episode_name: ep_obj.name }) # 发送HTTP POST请求 try: response get_url( urlurl, post_datapayload, jsonTrue, timeout30 ) if response and response.get(status) success: self._log_debug(Webhook通知发送成功) return True else: self._log_error(fWebhook请求失败: {response}) return False except Exception as e: self._log_error(f发送Webhook通知时出错: {str(e)}) return False notifier WebhookNotifier步骤2注册插件到系统在sickgear/notifiers/__init__.py文件中添加你的新插件。找到NotifierFactory类的__init__方法在适当的位置添加from . import webhook # 添加这行 class NotifierFactory(object): def __init__(self): self.notifiers dict( # ... 其他通知器 ... WEBHOOKwebhook.WebhookNotifier, # 添加这行 # ... 其他通知器 ... )步骤3添加配置参数在sickgear/__init__.py文件中添加配置变量# Webhook通知配置 USE_WEBHOOK False WEBHOOK_NOTIFY_ONSNATCH False WEBHOOK_NOTIFY_ONDOWNLOAD False WEBHOOK_NOTIFY_ONSUBTITLEDOWNLOAD False WEBHOOK_URL None然后在配置加载部分添加相应的配置读取代码。步骤4配置界面集成为了让用户能够在Web界面中配置你的插件需要在sickgear/webserve.py文件中添加相应的配置处理代码。这包括配置页面渲染配置保存逻辑配置验证插件开发最佳实践1. 错误处理与日志记录始终使用SickGear的日志系统记录插件活动def _notify(self, title, body, **kwargs): try: # 你的通知逻辑 self._log_debug(开始发送通知) # ... self._log(通知发送成功) return True except Exception as e: self._log_error(f通知发送失败: {str(e)}) return False2. 配置管理使用self._choose()方法来处理配置参数def _notify(self, title, body, custom_param, **kwargs): # 优先使用传入参数否则使用全局配置 param_value self._choose(custom_param, sickgear.MY_PLUGIN_PARAM)3. 事件处理SickGear支持多种事件类型notify_snatch- 开始下载时触发notify_download- 下载完成时触发notify_subtitle_download- 字幕下载完成时触发notify_git_update- SickGear更新时触发update_library- 媒体库更新时触发高级功能带重试机制的通知插件让我们创建一个更健壮的Webhook插件包含重试机制和更丰富的功能import time from .generic import Notifier import sickgear from sg_helpers import get_url class AdvancedWebhookNotifier(Notifier): def __init__(self): super(AdvancedWebhookNotifier, self).__init__() self.max_retries 3 self.retry_delay 5 # 秒 def _notify(self, title, body, webhook_url, **kwargs): url self._choose(webhook_url, sickgear.WEBHOOK_URL) if not url: self._log_error(Webhook URL未配置) return False # 构建丰富的通知数据 payload self._build_payload(title, body, kwargs) # 带重试机制的发送 for attempt in range(self.max_retries): try: response self._send_webhook(url, payload) if self._is_successful(response): self._log_debug(fWebhook通知发送成功 (尝试 {attempt 1})) return True else: self._log_warning(fWebhook请求失败准备重试 (尝试 {attempt 1})) except Exception as e: self._log_warning(f发送Webhook时出错: {str(e)} (尝试 {attempt 1})) if attempt self.max_retries - 1: time.sleep(self.retry_delay) self._log_error(Webhook通知发送失败已达到最大重试次数) return False def _build_payload(self, title, body, kwargs): 构建通知载荷 payload { title: title, body: body, timestamp: sickgear.sgdatetime.sgdatetime.now().isoformat(), source: SickGear, version: sickgear.version_checker.get_version() } # 添加剧集信息 ep_obj kwargs.get(ep_obj) if ep_obj: payload[episode] { show_name: ep_obj.show_obj.name, season: ep_obj.season, episode: ep_obj.episode, episode_name: ep_obj.name, quality: str(ep_obj.quality), status: str(ep_obj.status) } return payload def _send_webhook(self, url, payload): 发送Webhook请求 headers { User-Agent: SickGear-Webhook-Notifier/1.0, Content-Type: application/json } return get_url( urlurl, post_datapayload, headersheaders, jsonTrue, timeout30 ) def _is_successful(self, response): 检查响应是否成功 if not response: return False # 根据你的Webhook服务调整成功条件 status_code response.get(status_code, 0) return 200 status_code 300 notifier AdvancedWebhookNotifier调试与测试你的插件1. 启用调试日志在SickGear配置中启用调试模式查看插件的详细日志输出。2. 使用测试功能所有通知插件都应该实现test_notify方法允许用户在Web界面中测试配置def test_notify(self, *args, **kwargs): self._testing True result self._notify(测试标题, 这是一条测试消息, *args, **kwargs) return (测试成功, 测试失败)[not result]3. 本地测试你可以在不修改SickGear核心文件的情况下测试插件# test_webhook.py import sys sys.path.append(/path/to/sickgear) from sickgear.notifiers.webhook import WebhookNotifier notifier WebhookNotifier() result notifier.test_notify(webhook_urlhttp://your-webhook-url.com) print(f测试结果: {result})插件发布与分享1. 文档编写为你的插件编写清晰的README文档包括功能描述安装步骤配置说明使用示例2. 代码规范遵循SickGear项目的代码规范使用PEP 8代码风格添加适当的注释包含完整的许可证声明3. 提交贡献如果你希望将插件贡献给SickGear项目Fork项目仓库创建功能分支提交Pull Request等待代码审查实际应用场景场景1企业微信机器人通知你可以创建一个企业微信机器人通知插件将SickGear的下载状态推送到团队群聊中。场景2自定义监控面板通过Webhook插件你可以将SickGear事件推送到Grafana、Prometheus等监控系统创建实时的下载统计面板。场景3自动化工作流集成将SickGear与IFTTT、Zapier或n8n等自动化工具集成创建复杂的媒体管理自动化工作流。常见问题与解决方案Q1插件不工作怎么办检查日志文件中的错误信息确认配置参数正确验证网络连接和API密钥Q2如何添加新的通知事件在插件类中添加相应的方法如notify_custom_event然后在SickGear的事件触发点调用它。Q3插件性能优化建议使用异步请求避免阻塞主线程实现请求缓存机制批量处理多个通知总结通过本文的学习你已经掌握了SickGear通知插件开发的核心知识。从简单的Webhook插件到带重试机制的高级插件你可以根据自己的需求创建各种自定义通知解决方案。记住良好的错误处理、详细的日志记录和清晰的配置界面是优秀插件的关键特征。现在就开始动手构建你的第一个SickGear通知插件吧提示在实际开发中建议先从一个简单的插件开始逐步添加复杂功能。参考现有的通知插件实现如sickgear/notifiers/slack.py和sickgear/notifiers/telegram.py可以让你更快地上手。【免费下载链接】SickGearSickGear has proven the most reliable stable TV fork of the great Sick-Beard to fully automate TV enjoyment with innovation.项目地址: https://gitcode.com/gh_mirrors/si/SickGear创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考