def snatch_episode(result): """ Snatch a result that has been found. :param result: SearchResult instance to be snatched. :return: boolean, True on success """ if result is None: return False result.priority = 0 # -1 = low, 0 = normal, 1 = high is_proper = False if app.ALLOW_HIGH_PRIORITY: # if it aired recently make it high priority for cur_ep in result.episodes: if datetime.date.today() - cur_ep.airdate <= datetime.timedelta( days=7): result.priority = 1 if result.proper_tags: log.debug(u'Found proper tags for {0}. Snatching as PROPER', result.name) is_proper = True end_status = SNATCHED_PROPER else: end_status = SNATCHED # Binsearch.info requires you to download the nzb through a post. if result.provider.kind() == 'BinSearchProvider': result.result_type = 'nzbdata' nzb_data = result.provider.download_nzb_for_post(result) result.extra_info.append(nzb_data) if not nzb_data: log.warning( 'Error trying to get the nzb data from provider binsearch, no data returned' ) return False # NZBs can be sent straight to SAB or saved to disk if result.result_type in (u'nzb', u'nzbdata'): if app.NZB_METHOD == u'blackhole': result_downloaded = _download_result(result) elif app.NZB_METHOD == u'sabnzbd': result_downloaded = sab.send_nzb(result) elif app.NZB_METHOD == u'nzbget': result_downloaded = nzbget.sendNZB(result, is_proper) else: log.error(u'Unknown NZB action specified in config: {0}', app.NZB_METHOD) result_downloaded = False # Torrents can be sent to clients or saved to disk elif result.result_type == u'torrent': # torrents are saved to disk when blackhole mode if app.TORRENT_METHOD == u'blackhole': result_downloaded = _download_result(result) else: if not result.content and not result.url.startswith(u'magnet:'): if result.provider.login(): if result.provider.kind() == 'TorznabProvider': result.url = result.provider.get_redirect_url( result.url) if not result.url.startswith(u'magnet:'): result.content = result.provider.get_content( result.url) if result.content or result.url.startswith(u'magnet:'): client = torrent.get_client_class(app.TORRENT_METHOD)() result_downloaded = client.send_torrent(result) else: log.warning(u'Torrent file content is empty: {0}', result.name) result_downloaded = False else: log.error(u'Unknown result type, unable to download it: {0!r}', result.result_type) result_downloaded = False if not result_downloaded: return False if app.USE_FAILED_DOWNLOADS: failed_history.log_snatch(result) ui.notifications.message(u'Episode snatched', result.name) history.log_snatch(result) # don't notify when we re-download an episode sql_l = [] trakt_data = [] for curEpObj in result.episodes: with curEpObj.lock: if is_first_best_match(result): curEpObj.status = SNATCHED_BEST curEpObj.quality = result.quality else: curEpObj.status = end_status curEpObj.quality = result.quality # Reset all others fields to the snatched status # New snatch by default doesn't have nfo/tbn curEpObj.hasnfo = False curEpObj.hastbn = False # We can't reset location because we need to know what we are replacing # curEpObj.location = '' # Release name and group are parsed in PP curEpObj.release_name = '' curEpObj.release_group = '' # Need to reset subtitle settings because it's a different file curEpObj.subtitles = list() curEpObj.subtitles_searchcount = 0 curEpObj.subtitles_lastsearch = u'0001-01-01 00:00:00' # Need to store the correct is_proper. Not use the old one curEpObj.is_proper = True if result.proper_tags else False curEpObj.version = 0 curEpObj.manually_searched = result.manually_searched sql_l.append(curEpObj.get_sql()) if curEpObj.status != common.DOWNLOADED: notify_message = curEpObj.formatted_filename( u'%SN - %Sx%0E - %EN - %QN') if all([ app.SEEDERS_LEECHERS_IN_NOTIFY, result.seeders not in (-1, None), result.leechers not in (-1, None) ]): notifiers.notify_snatch( u'{0} with {1} seeders and {2} leechers from {3}'.format( notify_message, result.seeders, result.leechers, result.provider.name), is_proper) else: notifiers.notify_snatch( u'{0} from {1}'.format(notify_message, result.provider.name), is_proper) if app.USE_TRAKT and app.TRAKT_SYNC_WATCHLIST: trakt_data.append((curEpObj.season, curEpObj.episode)) log.info( u'Adding {0} {1} to Trakt watchlist', result.series.name, episode_num(curEpObj.season, curEpObj.episode), ) if trakt_data: data_episode = notifiers.trakt_notifier.trakt_episode_data_generate( trakt_data) if data_episode: notifiers.trakt_notifier.update_watchlist( result.series, data_episode=data_episode, update=u'add') if sql_l: main_db_con = db.DBConnection() main_db_con.mass_action(sql_l) return True
def snatch_episode(result): """ Snatch a result that has been found. :param result: SearchResult instance to be snatched. :return: boolean, True on success """ if result is None: return False result.priority = 0 # -1 = low, 0 = normal, 1 = high is_proper = False if app.ALLOW_HIGH_PRIORITY: # if it aired recently make it high priority for cur_ep in result.episodes: if datetime.date.today() - cur_ep.airdate <= datetime.timedelta(days=7): result.priority = 1 if result.proper_tags: log.debug(u'Found proper tags for {0}. Snatching as PROPER', result.name) is_proper = True end_status = SNATCHED_PROPER else: end_status = SNATCHED # Binsearch.info requires you to download the nzb through a post. if result.provider.kind() == 'BinSearchProvider': result.result_type = 'nzbdata' nzb_data = result.provider.download_nzb_for_post(result) result.extra_info.append(nzb_data) if not nzb_data: log.warning('Error trying to get the nzb data from provider binsearch, no data returned') return False # NZBs can be sent straight to SAB or saved to disk if result.result_type in (u'nzb', u'nzbdata'): if app.NZB_METHOD == u'blackhole': result_downloaded = _download_result(result) elif app.NZB_METHOD == u'sabnzbd': result_downloaded = sab.send_nzb(result) elif app.NZB_METHOD == u'nzbget': result_downloaded = nzbget.sendNZB(result, is_proper) else: log.error(u'Unknown NZB action specified in config: {0}', app.NZB_METHOD) result_downloaded = False # Torrents can be sent to clients or saved to disk elif result.result_type == u'torrent': # torrents are saved to disk when blackhole mode if app.TORRENT_METHOD == u'blackhole': result_downloaded = _download_result(result) else: if not result.content and not result.url.startswith(u'magnet:'): if result.provider.login(): if result.provider.kind() == 'TorznabProvider': result.url = result.provider.get_redirect_url(result.url) if not result.url.startswith(u'magnet:'): result.content = result.provider.get_content(result.url) if result.content or result.url.startswith(u'magnet:'): client = torrent.get_client_class(app.TORRENT_METHOD)() result_downloaded = client.send_torrent(result) else: log.warning(u'Torrent file content is empty: {0}', result.name) result_downloaded = False else: log.error(u'Unknown result type, unable to download it: {0!r}', result.result_type) result_downloaded = False if not result_downloaded: return False if app.USE_FAILED_DOWNLOADS: failed_history.log_snatch(result) ui.notifications.message(u'Episode snatched', result.name) history.log_snatch(result) # don't notify when we re-download an episode sql_l = [] trakt_data = [] for cur_ep_obj in result.episodes: with cur_ep_obj.lock: if is_first_best_match(result): cur_ep_obj.status = SNATCHED_BEST cur_ep_obj.quality = result.quality else: cur_ep_obj.status = end_status cur_ep_obj.quality = result.quality # Reset all others fields to the snatched status # New snatch by default doesn't have nfo/tbn cur_ep_obj.hasnfo = False cur_ep_obj.hastbn = False # We can't reset location because we need to know what we are replacing # cur_ep_obj.location = '' # Release name and group are parsed in PP cur_ep_obj.release_name = '' cur_ep_obj.release_group = '' # Need to reset subtitle settings because it's a different file cur_ep_obj.subtitles = list() cur_ep_obj.subtitles_searchcount = 0 cur_ep_obj.subtitles_lastsearch = u'0001-01-01 00:00:00' # Need to store the correct is_proper. Not use the old one cur_ep_obj.is_proper = is_proper cur_ep_obj.version = 0 cur_ep_obj.manually_searched = result.manually_searched sql_l.append(cur_ep_obj.get_sql()) if cur_ep_obj.status != common.DOWNLOADED: notifiers.notify_snatch(cur_ep_obj, result) if app.USE_TRAKT and app.TRAKT_SYNC_WATCHLIST: trakt_data.append((cur_ep_obj.season, cur_ep_obj.episode)) log.info( u'Adding {0} {1} to Trakt watchlist', result.series.name, episode_num(cur_ep_obj.season, cur_ep_obj.episode), ) if trakt_data: data_episode = notifiers.trakt_notifier.trakt_episode_data_generate(trakt_data) if data_episode: notifiers.trakt_notifier.update_watchlist(result.series, data_episode=data_episode, update=u'add') if sql_l: main_db_con = db.DBConnection() main_db_con.mass_action(sql_l) return True