def snatch_episode(result, end_status=SNATCHED): """ Contains the internal logic necessary to actually "snatch" a result that has been found. :param result: SearchResult instance to be snatched. :param end_status: the episode status that should be used for the episode object once it's snatched. :return: boolean, True on success """ if result is None: return False show_object = find_show(result.show_id) result.priority = 0 # -1 = low, 0 = normal, 1 = high if sickrage.app.config.allow_high_priority: # if it aired recently make it high priority for episode_number in result.episodes: if date.today() - show_object.get_episode( result.season, episode_number).airdate <= timedelta( days=7): result.priority = 1 if re.search(r'(^|[. _-])(proper|repack)([. _-]|$)', result.name, re.I) is not None: end_status = SNATCHED_PROPER # get result content result.content = result.provider.get_content(result.url) dlResult = False if result.type in ("nzb", "nzbdata"): if sickrage.app.config.nzb_method == "blackhole": dlResult = result.provider.download_result(result) elif sickrage.app.config.nzb_method == "sabnzbd": dlResult = SabNZBd.sendNZB(result) elif sickrage.app.config.nzb_method == "nzbget": is_proper = True if end_status == SNATCHED_PROPER else False dlResult = NZBGet.sendNZB(result, is_proper) elif sickrage.app.config.nzb_method == "download_station": client = get_client_instance(sickrage.app.config.nzb_method, client_type='nzb')() dlResult = client.sendNZB(result) else: sickrage.app.log.error("Unknown NZB action specified in config: " + sickrage.app.config.nzb_method) elif result.type in ("torrent", "torznab"): # add public trackers to torrent result if not result.provider.private: result = result.provider.add_trackers(result) if sickrage.app.config.torrent_method == "blackhole": dlResult = result.provider.download_result(result) else: if any([result.content, result.url.startswith('magnet:')]): client = get_client_instance( sickrage.app.config.torrent_method, client_type='torrent')() dlResult = client.send_torrent(result) else: sickrage.app.log.warning("Torrent file content is empty") else: sickrage.app.log.error( "Unknown result type, unable to download it (%r)" % result.type) # no download results found if not dlResult: return False FailedHistory.log_snatch(result) History.log_snatch(result) sickrage.app.alerts.message(_('Episode snatched'), result.name) trakt_data = [] for episode_number in result.episodes: episode_obj = show_object.get_episode(result.season, episode_number) if is_first_best_match(result): episode_obj.status = Quality.composite_status( SNATCHED_BEST, result.quality) else: episode_obj.status = Quality.composite_status( end_status, result.quality) episode_obj.save() # don't notify when we re-download an episode if episode_obj.status not in Quality.DOWNLOADED: try: Notifiers.mass_notify_snatch( episode_obj._format_pattern('%SN - %Sx%0E - %EN - %QN') + " from " + result.provider.name) except Exception: sickrage.app.log.debug("Failed to send snatch notification") trakt_data.append((episode_obj.season, episode_obj.episode)) data = sickrage.app.notifier_providers[ 'trakt'].trakt_episode_data_generate(trakt_data) if sickrage.app.config.use_trakt and sickrage.app.config.trakt_sync_watchlist: if data: sickrage.app.notifier_providers['trakt'].update_watchlist( show_object, data_episode=data, update="add") return True