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