SickGear/sickgear/notifiers/growl.py

102 lines
4 KiB
Python
Raw Permalink Normal View History

#
# 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 re
from .generic import Notifier, notify_strings
from exceptions_helper import ex
from lib.apprise.plugins.gntp import notifier as growl_notifier
import sickgear
from six import string_types
class GrowlNotifier(Notifier):
def __init__(self):
super(GrowlNotifier, self).__init__()
def _send_growl_msg(self, options, message=None):
notice = growl_notifier.GrowlNotifier(applicationName=options['app'],
applicationIcon=self._sg_logo_url,
hostname=options['host'],
password=None if not options['password'] else options['password'],
port=options['port'],
notifications=['Test'] + [notify_strings[s] for s in
('snatch', 'download', 'git_updated',
'subtitle_download', 'test_title')]
)
def _send_growl():
try:
r = notice.notify(noteType=options['name'], title=options['title'], sticky=bool(options['sticky']),
priority=options['priority'],
description=message if isinstance(message, string_types) and 0 < len(message.strip())
else 'Test')
except (BaseException, Exception):
return False
return r
result = _send_growl()
if isinstance(result, bool):
return result
# check if growl is not yet registered with the app
if isinstance(result, tuple) and '401' == result[0]:
try:
notice.register()
except (BaseException, Exception):
return False
result = _send_growl()
if isinstance(result, bool):
return result
return False
def _notify(self, title, body, name=None, host=None, password=None, **kwargs):
name = name or title or 'SickGear Notification'
hosts = [h.strip() for h in self._choose(host, sickgear.GROWL_HOST).split(',')]
growl_hosts = []
host_re = re.compile(r'^(?:(?P<password>[^@]+?)@)?(?P<host>[^:]+?)(?::(?P<port>\d+))?$')
for h in hosts:
host_parts = host_re.match(h)
if host_parts:
host, port, password = host_parts.group('host'), host_parts.group('port'), host_parts.group('password')
if host:
growl_hosts += [(host, 23053 if not port else int(port), None if not password else password)]
opts = dict(title=title, name=name, app='SickGear', sticky=None, priority=None,
icon=True, debug=False)
success = False
for pc in growl_hosts:
opts['host'] = pc[0]
opts['port'] = pc[1]
opts['password'] = pc[2]
try:
if self._send_growl_msg(opts, body):
success = True
except (BaseException, Exception) as e:
self._log_warning(f'Unable to send growl to {opts["host"]}:{opts["port"]} - {ex(e)}')
return success
notifier = GrowlNotifier