Source code for flexget.plugins.input.sickbeard

from urllib.parse import urlparse

from loguru import logger
from requests import RequestException

from flexget import plugin
from flexget.entry import Entry
from flexget.event import event

logger = logger.bind(name='sickbeard')


[docs] class Sickbeard: """Return ALL of the shows monitored by Sickbeard. This includes both ongoing and ended. Syntax:: sickbeard: base_url=<value> port=<value> api_key=<value> Options base_url and api_key are required. Use with input plugin like discover and/or configure_series. Example:: download-tv-task: configure_series: settings: quality: - 720p from: sickbeard: base_url: http://localhost port: 8531 api_key: MYAPIKEY1123 discover: what: - next_series_episodes: yes from: torrentz: any download: /download/tv Note that when using the configure_series plugin with Sickbeard you are basically synced to it, so removing a show in Sickbeard will remove it in flexget as well, which could be positive or negative, depending on your usage. """ schema = { 'type': 'object', 'properties': { 'base_url': {'type': 'string'}, 'port': {'type': 'number', 'default': 80}, 'api_key': {'type': 'string'}, 'include_ended': {'type': 'boolean', 'default': True}, 'only_monitored': {'type': 'boolean', 'default': False}, 'include_data': {'type': 'boolean', 'default': False}, }, 'required': ['api_key', 'base_url'], 'additionalProperties': False, }
[docs] def quality_requirement_builder(self, quality_list): """Translate sickbeards' qualities into format used by Flexget.""" sb_to_fg = { 'sdtv': 'sdtv', 'sddvd': 'dvdrip', 'hdtv': '720p hdtv', 'rawhdtv': '1080p hdtv', 'fullhdtv': '1080p hdtv', 'hdwebdl': '720p webdl', 'fullhdwebdl': '1080p webdl', 'hdbluray': '720p bluray', 'fullhdbluray': '1080p bluray', 'unknown': 'any', } return [sb_to_fg[quality] for quality in quality_list]
[docs] def on_task_input(self, task, config): parsedurl = urlparse(config.get('base_url')) url = '{}://{}:{}{}/api/{}/?cmd=shows'.format( parsedurl.scheme, parsedurl.netloc, config.get('port'), parsedurl.path, config.get('api_key'), ) try: json = task.requests.get(url).json() except RequestException as e: raise plugin.PluginError( 'Unable to connect to Sickbeard at {}://{}:{}{}. Error: {}'.format( parsedurl.scheme, parsedurl.netloc, config.get('port'), parsedurl.path, e ) ) entries = [] for _, show in list(json['data'].items()): logger.debug('processing show: {}', show) fg_qualities = '' # Initializes the quality parameter if show['paused'] and config.get('only_monitored'): continue if show['status'] == 'Ended' and not config.get('include_ended'): continue if config.get('include_data'): show_url = '{}:{}/api/{}/?cmd=show&tvdbid={}'.format( config['base_url'], config['port'], config['api_key'], show['tvdbid'], ) show_json = task.requests.get(show_url).json() logger.debug('processing show data: {}', show_json['data']) if 'quality_details' not in show_json['data']: logger.error('Corrupt data returned, skipping: {}', show_json['data']) continue fg_qualities = self.quality_requirement_builder( show_json['data']['quality_details']['initial'] ) entry = Entry( title=show['show_name'], url='', series_name=show['show_name'], tvdb_id=show.get('tvdbid'), tvrage_id=show.get('tvrage_id'), ) if len(fg_qualities) > 1: entry['configure_series_qualities'] = fg_qualities elif len(fg_qualities) == 1: entry['configure_series_quality'] = fg_qualities[0] else: entry['configure_series_quality'] = fg_qualities if entry.isvalid(): entries.append(entry) else: logger.error('Invalid entry created? {}', entry) continue # Test mode logging if task.options.test: logger.info('Test mode. Entry includes:') for key, value in list(entry.items()): logger.info(' {}: {}', key.capitalize(), value) return entries
[docs] @event('plugin.register') def register_plugin(): plugin.register(Sickbeard, 'sickbeard', api_ver=2)