SickGear/sickgear/notifiers/generic.py

148 lines
5 KiB
Python
Raw Permalink Normal View History

# 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',
test_body='Success testing %s settings from SickGear ʕ•ᴥ•ʔ',
)
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):
logger.log(f'{self.name}: {msg}', level)
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, include_online=True, **kwargs):
"""
note: nmj_notifier fires its library update when the notify_download is issued (inside notifiers)
:param include_online: Set False if to exclude derived notifiers from library updates.
For example, Trakt doesn't need to be updated when renaming the episode name part of a filename,
therefore, this is set False for that specific notification use case update.
"""
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
return body if 'SickGear' in title else f'{title}: {body.replace("#: ", "# ")}'
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):
self._log_debug(f'Sending notification "{self._body_only(notify_strings[notify_string], message)}"')
try:
return self._notify(notify_strings[notify_string], message, *args, **kwargs)
except (BaseException, Exception):
return False