2023-01-12 01:04:47 +00:00
|
|
|
# coding=utf-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/>.
|
|
|
|
|
|
|
|
import sickgear
|
|
|
|
from .. import logger
|
|
|
|
|
|
|
|
notify_strings = dict(
|
|
|
|
snatch='Started download',
|
|
|
|
download='Download finished',
|
|
|
|
subtitle_download='Subtitle download finished',
|
|
|
|
git_updated='SickGear updated',
|
|
|
|
git_updated_text='SickGear updated to commit#: ',
|
|
|
|
test_title='SickGear notification test',
|
2023-03-08 13:44:20 +00:00
|
|
|
test_body='Success testing %s settings from SickGear ʕ•ᴥ•ʔ',
|
2023-01-12 01:04:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
class BaseNotifier(object):
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
self.sg_logo_file = 'apple-touch-icon-precomposed.png'
|
|
|
|
self._testing = False
|
|
|
|
|
|
|
|
@property
|
|
|
|
def _sg_logo_url(self):
|
|
|
|
return 'https://raw.githubusercontent.com/SickGear/SickGear/main/gui/slick/images/ico/' + self.sg_logo_file
|
|
|
|
|
|
|
|
def _log(self, msg, level=logger.MESSAGE):
|
2023-03-08 13:44:20 +00:00
|
|
|
logger.log(f'{self.name}: {msg}', level)
|
2023-01-12 01:04:47 +00:00
|
|
|
|
|
|
|
def _log_debug(self, msg):
|
|
|
|
self._log(msg, logger.DEBUG)
|
|
|
|
|
|
|
|
def _log_error(self, msg):
|
|
|
|
self._log(msg, logger.ERROR)
|
|
|
|
|
|
|
|
def _log_warning(self, msg):
|
|
|
|
self._log(msg, logger.WARNING)
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def id(cls):
|
|
|
|
return cls.__name__.replace('Notifier', '').upper()
|
|
|
|
|
|
|
|
@property
|
|
|
|
def name(self):
|
|
|
|
return self.__class__.__name__.replace('Notifier', '')
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def is_enabled_onsnatch(cls):
|
|
|
|
return cls.is_enabled('NOTIFY_ONSNATCH')
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def is_enabled_ondownload(cls):
|
|
|
|
return cls.is_enabled('NOTIFY_ONDOWNLOAD')
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def is_enabled_onsubtitledownload(cls):
|
|
|
|
return cls.is_enabled('NOTIFY_ONSUBTITLEDOWNLOAD')
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def is_enabled_library(cls):
|
|
|
|
return cls.is_enabled('UPDATE_LIBRARY')
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
def is_enabled(cls, action=None):
|
|
|
|
return getattr(sickgear, action and '%s_%s' % (cls.id(), action) or 'USE_%s' % cls.id(), False)
|
|
|
|
|
|
|
|
def notify_snatch(self, *args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def notify_download(self, *args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def notify_subtitle_download(self, *args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def notify_git_update(self, *args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def update_library(self, **kwargs):
|
|
|
|
"""
|
|
|
|
note: nmj_notifier fires its library update when the notify_download is issued (inside notifiers)
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
def _notify(self, *args, **kwargs):
|
|
|
|
pass
|
|
|
|
|
|
|
|
def _choose(self, current=True, saved=True):
|
|
|
|
if self._testing:
|
|
|
|
return current
|
|
|
|
return saved
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def _body_only(title, body):
|
|
|
|
# don't use title with updates or testing, as only one str is used
|
2023-03-08 13:44:20 +00:00
|
|
|
return body if 'SickGear' in title else f'{title}: {body.replace("#: ", "# ")}'
|
2023-01-12 01:04:47 +00:00
|
|
|
|
|
|
|
|
|
|
|
class Notifier(BaseNotifier):
|
|
|
|
|
|
|
|
def test_notify(self, *args, **kwargs):
|
|
|
|
self._testing = True
|
|
|
|
r = self._pre_notify('test_title', notify_strings['test_body'] % (self.name + ' notifier'), *args, **kwargs)
|
|
|
|
return (r, (('Success, notification sent.', 'Failed to send notification.')[not r]))[r in (True, False)]
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
def pretty_name(ep_obj):
|
|
|
|
# noinspection PyProtectedMember
|
|
|
|
return ('%s%s' % (ep_obj.pretty_name(), ep_obj._format_pattern(' - %QN'))).replace(' - N-A', '')
|
|
|
|
|
|
|
|
def notify_snatch(self, ep_obj, **kwargs):
|
|
|
|
self._pre_notify('snatch', self.pretty_name(ep_obj), ep_obj=ep_obj, **kwargs)
|
|
|
|
|
|
|
|
def notify_download(self, ep_obj, **kwargs):
|
|
|
|
self._pre_notify('download', self.pretty_name(ep_obj), ep_obj=ep_obj, **kwargs)
|
|
|
|
|
|
|
|
def notify_subtitle_download(self, ep_obj, lang, **kwargs):
|
|
|
|
self._pre_notify('subtitle_download', '%s : %s' % (ep_obj.pretty_name(), lang), ep_obj=ep_obj, **kwargs)
|
|
|
|
|
|
|
|
def notify_git_update(self, new_version='??', **kwargs):
|
|
|
|
self._pre_notify('git_updated', notify_strings['git_updated_text'] + new_version, **kwargs)
|
|
|
|
|
|
|
|
def _pre_notify(self, notify_string, message, *args, **kwargs):
|
2023-03-08 13:44:20 +00:00
|
|
|
self._log_debug(f'Sending notification "{self._body_only(notify_strings[notify_string], message)}"')
|
2023-01-12 01:04:47 +00:00
|
|
|
try:
|
|
|
|
return self._notify(notify_strings[notify_string], message, *args, **kwargs)
|
|
|
|
except (BaseException, Exception):
|
|
|
|
return False
|