def run(self): QueueItem.run(self) self.started = True try: for epObj in self.segment: sickrage.srLogger.info("Marking episode as bad: [" + epObj.prettyName() + "]") FailedHistory.markFailed(epObj) (release, provider) = FailedHistory.findFailedRelease(epObj) if release: FailedHistory.logFailed(release) History.logFailed(epObj, release, provider) FailedHistory.revertFailedEpisode(epObj) sickrage.srLogger.info( "Beginning failed download search for: [" + epObj.prettyName() + "]") # If it is wanted, self.downCurQuality doesnt matter # if it isnt wanted, we need to make sure to not overwrite the existing ep that we reverted to! searchResult = searchProviders(self.show, self.segment, True, False) if searchResult: for result in searchResult: # just use the first result for now sickrage.srLogger.info("Downloading " + result.name + " from " + result.provider.name) snatchEpisode(result) # give the CPU a break time.sleep(cpu_presets[sickrage.srConfig.CPU_PRESET]) else: pass # LOGGER.info(u"No valid episode found to retry for: [" + self.segment.prettyName() + "]") except Exception: sickrage.srLogger.debug(traceback.format_exc()) ### Keep a list with the 100 last executed searches fifo(MANUAL_SEARCH_HISTORY, self, MANUAL_SEARCH_HISTORY_SIZE) if self.success is None: self.success = False
def run(self): QueueItem.run(self) self.started = True try: for epObj in self.segment: sickrage.srLogger.info("Marking episode as bad: [" + epObj.prettyName() + "]") FailedHistory.markFailed(epObj) (release, provider) = FailedHistory.findFailedRelease(epObj) if release: FailedHistory.logFailed(release) History.logFailed(epObj, release, provider) FailedHistory.revertFailedEpisode(epObj) sickrage.srLogger.info("Beginning failed download search for: [" + epObj.prettyName() + "]") # If it is wanted, self.downCurQuality doesnt matter # if it isnt wanted, we need to make sure to not overwrite the existing ep that we reverted to! searchResult = searchProviders(self.show, self.segment, True, False) if searchResult: for result in searchResult: # just use the first result for now sickrage.srLogger.info("Downloading " + result.name + " from " + result.provider.name) snatchEpisode(result) # give the CPU a break gen.sleep(cpu_presets[sickrage.srConfig.CPU_PRESET]) else: pass # LOGGER.info(u"No valid episode found to retry for: [" + self.segment.prettyName() + "]") except Exception: sickrage.srLogger.debug(traceback.format_exc()) ### Keep a list with the 100 last executed searches fifo(MANUAL_SEARCH_HISTORY, self, MANUAL_SEARCH_HISTORY_SIZE) if self.success is None: self.success = False self.finish()
def snatchEpisode(result, endStatus=SNATCHED): """ Contains the internal logic necessary to actually "snatch" a result that has been found. :param result: SearchResult instance to be snatched. :param endStatus: 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 result.priority = 0 # -1 = low, 0 = normal, 1 = high if sickrage.srConfig.ALLOW_HIGH_PRIORITY: # if it aired recently make it high priority for curEp in result.episodes: if date.today() - curEp.airdate <= timedelta(days=7): result.priority = 1 if re.search(r'(^|[\. _-])(proper|repack)([\. _-]|$)', result.name, re.I) is not None: endStatus = SNATCHED_PROPER if result.url.startswith('magnet') or result.url.endswith('torrent'): result.resultType = 'torrent' # NZBs can be sent straight to SAB or saved to disk if result.resultType in ("nzb", "nzbdata"): if sickrage.srConfig.NZB_METHOD == "blackhole": dlResult = _downloadResult(result) elif sickrage.srConfig.NZB_METHOD == "sabnzbd": dlResult = SabNZBd.sendNZB(result) elif sickrage.srConfig.NZB_METHOD == "nzbget": is_proper = True if endStatus == SNATCHED_PROPER else False dlResult = NZBGet.sendNZB(result, is_proper) else: sickrage.srLogger.error("Unknown NZB action specified in config: " + sickrage.srConfig.NZB_METHOD) dlResult = False # TORRENTs can be sent to clients or saved to disk elif result.resultType == "torrent": # torrents are saved to disk when blackhole mode if sickrage.srConfig.TORRENT_METHOD == "blackhole": dlResult = _downloadResult(result) else: if not result.content and not result.url.startswith('magnet'): result.content = result.provider.getURL(result.url, needBytes=True) if result.content or result.url.startswith('magnet'): client = getClientIstance(sickrage.srConfig.TORRENT_METHOD)() dlResult = client.sendTORRENT(result) else: sickrage.srLogger.warning("Torrent file content is empty") dlResult = False else: sickrage.srLogger.error("Unknown result type, unable to download it (%r)" % result.resultType) dlResult = False if not dlResult: return False if sickrage.srConfig.USE_FAILED_DOWNLOADS: FailedHistory.logSnatch(result) notifications.message('Episode snatched', result.name) History.logSnatch(result) # don't notify when we re-download an episode sql_l = [] trakt_data = [] for curEpObj in result.episodes: with curEpObj.lock: if isFirstBestMatch(result): curEpObj.status = Quality.compositeStatus(SNATCHED_BEST, result.quality) else: curEpObj.status = Quality.compositeStatus(endStatus, result.quality) sql_q = curEpObj.saveToDB(False) if sql_q: sql_l.append(sql_q) del sql_q # cleanup if curEpObj.status not in Quality.DOWNLOADED: try: srNotifiers.notify_snatch( curEpObj._format_pattern('%SN - %Sx%0E - %EN - %QN') + " from " + result.provider.name) except: sickrage.srLogger.debug("Failed to send snatch notification") trakt_data.append((curEpObj.season, curEpObj.episode)) data = sickrage.srCore.NOTIFIERS.trakt_notifier.trakt_episode_data_generate(trakt_data) if sickrage.srConfig.USE_TRAKT and sickrage.srConfig.TRAKT_SYNC_WATCHLIST: sickrage.srLogger.debug("Add episodes, showid: indexerid " + str(result.show.indexerid) + ", Title " + str( result.show.name) + " to Traktv Watchlist") if data: sickrage.srCore.NOTIFIERS.trakt_notifier.update_watchlist(result.show, data_episode=data, update="add") if len(sql_l) > 0: main_db.MainDB().mass_upsert(sql_l) del sql_l # cleanup return True
def downloadSubtitles(subtitles_info): existing_subtitles = subtitles_info[b'subtitles'] # First of all, check if we need subtitles languages = getNeededLanguages(existing_subtitles) if not languages: sickrage.srLogger.debug('%s: No missing subtitles for S%02dE%02d' % ( subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None subtitles_path = getSubtitlesPath(subtitles_info[b'location']).encode(sickrage.srCore.SYS_ENCODING) video_path = subtitles_info[b'location'].encode(sickrage.srCore.SYS_ENCODING) providers = getEnabledServiceList() try: video = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=False) except Exception: sickrage.srLogger.debug('%s: Exception caught in subliminal.scan_video for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None provider_configs = {'addic7ed': {'username': sickrage.srConfig.ADDIC7ED_USER, 'password': sickrage.srConfig.ADDIC7ED_PASS}, 'legendastv': {'username': sickrage.srConfig.LEGENDASTV_USER, 'password': sickrage.srConfig.LEGENDASTV_PASS}, 'opensubtitles': {'username': sickrage.srConfig.OPENSUBTITLES_USER, 'password': sickrage.srConfig.OPENSUBTITLES_PASS}} pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: sickrage.srLogger.debug('%s: No subtitles found for S%02dE%02d on any provider' % ( subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None found_subtitles = pool.download_best_subtitles(subtitles_list, video, languages=languages, hearing_impaired=sickrage.srConfig.SUBTITLES_HEARING_IMPAIRED, only_one=not sickrage.srConfig.SUBTITLES_MULTI) save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickrage.srConfig.SUBTITLES_MULTI) if not sickrage.srConfig.EMBEDDED_SUBTITLES_ALL and sickrage.srConfig.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith( ('.mkv', '.mp4')): run_subs_extra_scripts(subtitles_info, found_subtitles, video, single=not sickrage.srConfig.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference(existing_subtitles) except Exception: sickrage.srLogger.info("Error occurred when downloading subtitles for: %s" % video_path) sickrage.srLogger.error(traceback.format_exc()) return existing_subtitles, None if sickrage.srConfig.SUBTITLES_HISTORY: from core.tv.show.history import History for subtitle in found_subtitles: sickrage.srLogger.debug('history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles)) History.logSubtitle(subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'], subtitles_info[b'status'], subtitle) return current_subtitles, new_subtitles
def downloadSubtitles(subtitles_info): existing_subtitles = subtitles_info[b'subtitles'] # First of all, check if we need subtitles languages = getNeededLanguages(existing_subtitles) if not languages: sickrage.srLogger.debug( '%s: No missing subtitles for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None subtitles_path = getSubtitlesPath(subtitles_info[b'location']).encode( sickrage.srCore.SYS_ENCODING) video_path = subtitles_info[b'location'].encode( sickrage.srCore.SYS_ENCODING) providers = getEnabledServiceList() try: video = subliminal.scan_video(video_path, subtitles=False, embedded_subtitles=False) except Exception: sickrage.srLogger.debug( '%s: Exception caught in subliminal.scan_video for S%02dE%02d' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None provider_configs = { 'addic7ed': { 'username': sickrage.srConfig.ADDIC7ED_USER, 'password': sickrage.srConfig.ADDIC7ED_PASS }, 'legendastv': { 'username': sickrage.srConfig.LEGENDASTV_USER, 'password': sickrage.srConfig.LEGENDASTV_PASS }, 'opensubtitles': { 'username': sickrage.srConfig.OPENSUBTITLES_USER, 'password': sickrage.srConfig.OPENSUBTITLES_PASS } } pool = subliminal.api.ProviderPool(providers=providers, provider_configs=provider_configs) try: subtitles_list = pool.list_subtitles(video, languages) if not subtitles_list: sickrage.srLogger.debug( '%s: No subtitles found for S%02dE%02d on any provider' % (subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'])) return existing_subtitles, None found_subtitles = pool.download_best_subtitles( subtitles_list, video, languages=languages, hearing_impaired=sickrage.srConfig.SUBTITLES_HEARING_IMPAIRED, only_one=not sickrage.srConfig.SUBTITLES_MULTI) save_subtitles(video, found_subtitles, directory=subtitles_path, single=not sickrage.srConfig.SUBTITLES_MULTI) if not sickrage.srConfig.EMBEDDED_SUBTITLES_ALL and sickrage.srConfig.SUBTITLES_EXTRA_SCRIPTS and video_path.endswith( ('.mkv', '.mp4')): run_subs_extra_scripts( subtitles_info, found_subtitles, video, single=not sickrage.srConfig.SUBTITLES_MULTI) current_subtitles = subtitlesLanguages(video_path)[0] new_subtitles = frozenset(current_subtitles).difference( existing_subtitles) except Exception: sickrage.srLogger.info( "Error occurred when downloading subtitles for: %s" % video_path) sickrage.srLogger.error(traceback.format_exc()) return existing_subtitles, None if sickrage.srConfig.SUBTITLES_HISTORY: from core.tv.show.history import History for subtitle in found_subtitles: sickrage.srLogger.debug( 'history.logSubtitle %s, %s' % (subtitle.provider_name, subtitle.language.opensubtitles)) History.logSubtitle(subtitles_info[b'show.indexerid'], subtitles_info[b'season'], subtitles_info[b'episode'], subtitles_info[b'status'], subtitle) return current_subtitles, new_subtitles