def setEpisodeToWanted(show, s, e): """ Sets an episode to wanted, only if it is currently skipped """ epObj = show.getEpisode(int(s), int(e)) if epObj: with epObj.lock: if epObj.status != SKIPPED or epObj.airdate == datetime.date.fromordinal( 1): return sickrage.LOGGER.info("Setting episode %s S%02dE%02d to wanted" % (show.name, s, e)) # figure out what segment the episode is in and remember it so we can backlog it epObj.status = WANTED epObj.saveToDB() cur_backlog_queue_item = BacklogQueueItem(show, [epObj]) sickrage.SEARCHQUEUE.add_item(cur_backlog_queue_item) sickrage.LOGGER.info( "Starting backlog search for %s S%02dE%02d because some episodes were set to wanted" % (show.name, s, e))
def search_backlog(self, which_shows=None): if self.amActive: sickrage.app.log.debug( "Backlog is still running, not starting it again") return self.amActive = True self.amPaused = False show_list = sickrage.app.showlist if which_shows: show_list = which_shows cur_date = datetime.date.today().toordinal() from_date = datetime.date.fromordinal(1) if not which_shows and self.forced: sickrage.app.log.info( "Running limited backlog on missed episodes " + str(sickrage.app.config.backlog_days) + " day(s) old") from_date = datetime.date.today() - datetime.timedelta( days=sickrage.app.config.backlog_days) else: sickrage.app.log.info( 'Running full backlog search on missed episodes for selected shows' ) # find new released episodes and update their statuses new_episode_finder() # go through non air-by-date shows and see if they need any episodes for curShow in show_list: if curShow.paused: sickrage.app.log.debug( "Skipping search for {} because the show is paused".format( curShow.name)) continue self._last_backlog_search = self._get_last_backlog_search( curShow.indexerid) segments = self._get_segments(curShow, from_date) if segments: sickrage.app.search_queue.put( BacklogQueueItem(curShow, segments)) else: sickrage.app.log.debug( "Nothing needs to be downloaded for {}, skipping".format( curShow.name)) # don't consider this an actual backlog search if we only did recent eps # or if we only did certain shows if from_date == datetime.date.fromordinal(1) and not which_shows: self._set_last_backlog_search(curShow.indexerid, cur_date) self.amActive = False
def searchBacklog(self, which_shows=None): if self.amActive: sickrage.srCore.srLogger.debug( "Backlog is still running, not starting it again") return self.amActive = True self.amPaused = False if which_shows: show_list = which_shows else: show_list = sickrage.srCore.SHOWLIST self._lastBacklog = self._get_lastBacklog() curDate = datetime.date.today().toordinal() fromDate = datetime.date.fromordinal(1) if not which_shows and not ( (curDate - self._lastBacklog) >= self.cycleTime): sickrage.srCore.srLogger.info( "Running limited backlog on missed episodes " + str(sickrage.srCore.srConfig.BACKLOG_DAYS) + " day(s) and older only") fromDate = datetime.date.today() - datetime.timedelta( days=sickrage.srCore.srConfig.BACKLOG_DAYS) # go through non air-by-date shows and see if they need any episodes for curShow in show_list: if curShow.paused: continue segments = self._get_segments(curShow, fromDate) for season, segment in segments.items(): self.currentSearchInfo = { 'title': curShow.name + " Season " + str(season) } sickrage.srCore.SEARCHQUEUE.put( BacklogQueueItem(curShow, segment)) # @UndefinedVariable else: sickrage.srCore.srLogger.debug( "Nothing needs to be downloaded for {show_name}, skipping". format(show_name=curShow.name)) # don't consider this an actual backlog search if we only did recent eps # or if we only did certain shows if fromDate == datetime.date.fromordinal(1) and not which_shows: self._set_lastBacklog(curDate) self.amActive = False self._resetPI()
def search_backlog(self, show_id=None, session=None): if self.amActive: sickrage.app.log.debug( "Backlog is still running, not starting it again") return self.amActive = True self.amPaused = False show_list = [find_show(show_id, session=session) ] if show_id else get_show_list(session=session) cur_date = datetime.date.today() from_date = datetime.date.min if not show_id and self.forced: sickrage.app.log.info( "Running limited backlog on missed episodes " + str(sickrage.app.config.backlog_days) + " day(s) old") from_date = datetime.date.today() - datetime.timedelta( days=sickrage.app.config.backlog_days) else: sickrage.app.log.info( 'Running full backlog search on missed episodes for selected shows' ) # go through non air-by-date shows and see if they need any episodes for curShow in show_list: if curShow.paused: sickrage.app.log.debug( "Skipping search for {} because the show is paused".format( curShow.name)) continue wanted = self._get_wanted(curShow, from_date) if not wanted: sickrage.app.log.debug( "Nothing needs to be downloaded for {}, skipping".format( curShow.name)) continue for season, episode in wanted: if (curShow.indexer_id, season, episode) in sickrage.app.search_queue.SNATCH_HISTORY: sickrage.app.search_queue.SNATCH_HISTORY.remove( (curShow.indexer_id, season, episode)) sickrage.app.io_loop.add_callback( sickrage.app.search_queue.put, BacklogQueueItem(curShow.indexer_id, season, episode)) if from_date == datetime.date.min and not show_id: self._set_last_backlog_search(curShow, cur_date) self.amActive = False
def setEpisodeToWanted(show, s, e): """ Sets an episode to wanted, only if it is currently skipped """ epObj = show.get_episode(int(s), int(e)) if epObj: with epObj.lock: if epObj.status != SKIPPED or epObj.airdate == date.fromordinal(1): return sickrage.app.log.info("Setting episode %s S%02dE%02d to wanted" % (show.name, s, e)) # figure out what segment the episode is in and remember it so we can backlog it epObj.status = WANTED epObj.save_to_db() sickrage.app.search_queue.put(BacklogQueueItem(show, [epObj])) sickrage.app.log.info( "Starting backlog search for %s S%02dE%02d because some episodes were set to wanted" % (show.name, s, e))
def set_episode_to_wanted(show, s, e): """ Sets an episode to wanted, only if it is currently skipped """ try: epObj = show.get_episode(s, e) if epObj.status != SKIPPED or not epObj.airdate > datetime.date.min: return sickrage.app.log.info("Setting episode %s S%02dE%02d to wanted" % (show.name, s, e)) epObj.status = WANTED sickrage.app.io_loop.add_callback( sickrage.app.search_queue.put, BacklogQueueItem(show.indexer_id, epObj.season, epObj.episode)) sickrage.app.log.info( "Starting backlog search for %s S%02dE%02d because some episodes were set to wanted" % (show.name, s, e)) except EpisodeNotFoundException as e: pass
def set_episode_status(show, eps, status, direct=None, session=None): if int(status) not in statusStrings: err_msg = _("Invalid status") if direct: sickrage.app.alerts.error(_('Error'), err_msg) return False, err_msg show_obj = find_show(int(show), session=session) if not show_obj: err_msg = _("Error", "Show not in show list") if direct: sickrage.app.alerts.error(_('Error'), err_msg) return False, err_msg wanted = [] trakt_data = [] if eps: for curEp in eps.split('|'): if not curEp: sickrage.app.log.debug("curEp was empty when trying to setStatus") sickrage.app.log.debug("Attempting to set status on episode " + curEp + " to " + status) ep_info = curEp.split('x') if not all(ep_info): sickrage.app.log.debug("Something went wrong when trying to setStatus, epInfo[0]: %s, epInfo[1]: %s" % (ep_info[0], ep_info[1])) continue try: episode_object = show_obj.get_episode(int(ep_info[0]), int(ep_info[1])) except EpisodeNotFoundException as e: return False, _("Episode couldn't be retrieved") if int(status) in [WANTED, FAILED]: # figure out what episodes are wanted so we can backlog them wanted += [(episode_object.season, episode_object.episode)] # don't let them mess up UNAIRED episodes if episode_object.status == UNAIRED: sickrage.app.log.warning("Refusing to change status of " + curEp + " because it is UNAIRED") continue if int(status) in Quality.DOWNLOADED and episode_object.status not in Quality.SNATCHED + \ Quality.SNATCHED_PROPER + Quality.SNATCHED_BEST + Quality.DOWNLOADED + [IGNORED] and not os.path.isfile(episode_object.location): sickrage.app.log.warning("Refusing to change status of " + curEp + " to DOWNLOADED because it's not SNATCHED/DOWNLOADED") continue if int(status) == FAILED and episode_object.status not in Quality.SNATCHED + Quality.SNATCHED_PROPER + \ Quality.SNATCHED_BEST + Quality.DOWNLOADED + Quality.ARCHIVED: sickrage.app.log.warning("Refusing to change status of " + curEp + " to FAILED because it's not SNATCHED/DOWNLOADED") continue if episode_object.status in Quality.DOWNLOADED + Quality.ARCHIVED and int(status) == WANTED: sickrage.app.log.info("Removing release_name for episode as you want to set a downloaded " "episode back to wanted, so obviously you want it replaced") episode_object.release_name = "" episode_object.status = int(status) trakt_data += [(episode_object.season, episode_object.episode)] data = sickrage.app.notifier_providers['trakt'].trakt_episode_data_generate(trakt_data) if data and sickrage.app.config.use_trakt and sickrage.app.config.trakt_sync_watchlist: if int(status) in [WANTED, FAILED]: sickrage.app.log.debug( "Add episodes, showid: indexer_id " + str(show_obj.indexer_id) + ", Title " + str(show_obj.name) + " to Watchlist") sickrage.app.notifier_providers['trakt'].update_watchlist(show_obj, data_episode=data, update="add") elif int(status) in [IGNORED, SKIPPED] + Quality.DOWNLOADED + Quality.ARCHIVED: sickrage.app.log.debug( "Remove episodes, showid: indexer_id " + str(show_obj.indexer_id) + ", Title " + str(show_obj.name) + " from Watchlist") sickrage.app.notifier_providers['trakt'].update_watchlist(show_obj, data_episode=data, update="remove") if int(status) == WANTED and not show_obj.paused: msg = _("Backlog was automatically started for the following seasons of ") + "<b>" + show_obj.name + "</b>:<br>" msg += '<ul>' for season, episode in wanted: if (show_obj.indexer_id, season, episode) in sickrage.app.search_queue.SNATCH_HISTORY: sickrage.app.search_queue.SNATCH_HISTORY.remove((show_obj.indexer_id, season, episode)) sickrage.app.io_loop.add_callback(sickrage.app.search_queue.put, BacklogQueueItem(show_obj.indexer_id, season, episode)) msg += "<li>" + _("Season ") + str(season) + "</li>" sickrage.app.log.info("Sending backlog for " + show_obj.name + " season " + str(season) + " because some eps were set to wanted") msg += "</ul>" if wanted: sickrage.app.alerts.message(_("Backlog started"), msg) elif int(status) == WANTED and show_obj.paused: sickrage.app.log.info("Some episodes were set to wanted, but {} is paused. Not adding to Backlog until " "show is unpaused".format(show_obj.name)) if int(status) == FAILED: msg = _( "Retrying Search was automatically started for the following season of ") + "<b>" + show_obj.name + "</b>:<br>" msg += '<ul>' for season, episode in wanted: if (show_obj.indexer_id, season, episode) in sickrage.app.search_queue.SNATCH_HISTORY: sickrage.app.search_queue.SNATCH_HISTORY.remove((show_obj.indexer_id, season, episode)) sickrage.app.io_loop.add_callback(sickrage.app.search_queue.put, FailedQueueItem(show_obj.indexer_id, season, episode)) msg += "<li>" + _("Season ") + str(season) + "</li>" sickrage.app.log.info("Retrying Search for {} season {} because some eps were set to failed".format(show_obj.name, season)) msg += "</ul>" if wanted: sickrage.app.alerts.message(_("Retry Search started"), msg) return True, ""