1from loguru import logger
2from requests.exceptions import RequestException
3
4from flexget import plugin
5from flexget.config_schema import one_or_more
6from flexget.event import event
7from flexget.plugin import PluginWarning
8from flexget.utils.requests import Session as RequestSession
9from flexget.utils.requests import TimedLimiter
10
11plugin_name = 'pushsafer'
12logger = logger.bind(name=plugin_name)
13
14PUSHSAFER_URL = 'https://www.pushsafer.com/api'
15
16requests = RequestSession(max_retries=3)
17requests.add_domain_limiter(TimedLimiter('pushsafer.com', '5 seconds'))
18
19
20class PushsaferNotifier:
21    """
22    Example::
23
24      notify:
25        entries:
26          via:
27            - pushsafer:
28                private_key: <string> your private key (can also be a alias key) - Required
29                url: <string> (default: '{{imdb_url}}')
30                url_title: <string> (default: (none))
31                device: <string> ypur device or device group id (default: (none))
32                icon: <integer> (default is 1)
33                sound: <integer> (default is (none))
34                vibration: <integer> (default is 0)
35                timetolive: <integer> (default: (none))
36
37    """
38
39    schema = {
40        'type': 'object',
41        'properties': {
42            'private_key': one_or_more({'type': 'string'}),
43            'url': {'type': 'string'},
44            'url_title': {'type': 'string'},
45            'device': {'type': 'string'},
46            'icon': {'type': 'integer', 'default': 1, 'maximum': 98, 'minimum': 1},
47            'sound': {'type': 'integer', 'maximum': 28, 'minimum': 0},
48            'vibration': {'type': 'integer', 'default': 0},
49            'timetolive': {'type': 'integer', 'maximum': 43200, 'minimum': 0},
50        },
51        'required': ['private_key'],
52        'additionalProperties': False,
53    }
54
55    def notify(self, title, message, config):
56        """
57        Send a Pushsafer notification
58        """
59        notification = {
60            't': title,
61            'm': message,
62            'ut': config.get('url_title'),
63            'u': config.get('url'),
64            's': config.get('sound'),
65            'i': config.get('icon'),
66            'v': config.get('vibration'),
67            'd': config.get('device'),
68            'l': config.get('timetolive'),
69        }
70
71        if not isinstance(config['private_key'], list):
72            config['private_key'] = [config['private_key']]
73
74        for key in config['private_key']:
75            notification['k'] = key
76            try:
77                requests.post(PUSHSAFER_URL, data=notification)
78            except RequestException as e:
79                raise PluginWarning(repr(e))
80
81
82@event('plugin.register')
83def register_plugin():
84    plugin.register(PushsaferNotifier, plugin_name, api_ver=2, interfaces=['notifiers'])
85