Esempio n. 1
0
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))
Esempio n. 2
0
    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
Esempio n. 3
0
    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()
Esempio n. 4
0
    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
Esempio n. 5
0
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))
Esempio n. 6
0
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
Esempio n. 7
0
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, ""