예제 #1
0
    def test_tvrage(self):
        friends = lookup_series("Friends")
        assert friends.genres == ["Comedy", "Romance/Dating"]
        s1e22 = friends.find_episode(1, 22)
        log.info("s1e22 %s " % s1e22)

        # Testing next
        s1e23 = s1e22.next()
        log.info("s1e23 %s " % s1e23)
        assert s1e23.episode == 23 and s1e23.season == 1

        s1e24 = s1e23.next()
        assert s1e24.episode == 24 and s1e24.season == 1
        log.info("s1e24 %s " % s1e24)

        s2e1 = s1e24.next()
        assert s2e1.episode == 1 and s2e1.season == 2
        log.info("s2e1 %s " % s2e1)

        s31e1 = friends.find_episode(31, 1)
        assert not s31e1
        log.info("s31e1 %s " % s31e1)
        s1e1 = friends.find_episode(1, 1)
        assert s1e1
        log.info("s1e1 %s " % s1e1)
        s1e32 = friends.find_episode(1, 32)
        log.info("s1e32 %s " % s1e32)
        assert not s1e32
        assert friends.finished()
    def estimate(self, entry):
        season = entry['series_season']
        if entry.get('series_id_type') == 'sequence':
            # Tvrage has absolute numbered shows under season 1
            season = 1
        log.debug("Querying release estimation for %s S%02dE%02d ..." %
                  (entry['series_name'], season, entry['series_episode']))
        with Session(expire_on_commit=False) as session:
            try:
                series_info = lookup_series(name=entry['series_name'], session=session)
            except LookupError as e:
                log.debug('tvrage lookup error: %s' % e)
            except OverflowError:
                # There is a bug in tvrage library on certain platforms if an episode is marked as airing
                # before 1970. We can safely assume the episode has been released. See #2739
                log.debug('tvrage library crash due to date before 1970, assuming released')
                return datetime(1970, 1, 1)
            else:
                if series_info:
                    try:
                        episode_info = series_info.find_episode(season, entry['series_episode'])
                        if episode_info:
                            return episode_info.airdate
                        else:
                            # If episode does not exist in tvrage database, we always return a future date
                            log.verbose('%s S%02dE%02d does not exist in tvrage database, assuming unreleased',
                                        series_info.name, season, entry['series_episode'])
                            return datetime.now() + timedelta(weeks=4)
                    except Exception as e:
                        log.exception(e)
                else:
                    log.debug('No series info obtained from TVRage to %s' % entry['series_name'])

        log.debug('No episode info obtained from TVRage for %s season %s episode %s' %
                  (entry['series_name'], entry['series_season'], entry['series_episode']))
예제 #3
0
    def test_tvrage(self):
        friends = lookup_series("Friends")
        assert friends.genres == ['Comedy', 'Romance/Dating']
        s1e22 = friends.find_episode(1, 22)
        log.info("s1e22 %s " % s1e22)

        # Testing next
        s1e23 = s1e22.next()
        log.info("s1e23 %s " % s1e23)
        assert s1e23.episode == 23 and s1e23.season == 1

        s1e24 = s1e23.next()
        assert s1e24.episode == 24 and s1e24.season == 1
        log.info("s1e24 %s " % s1e24)

        s2e1 = s1e24.next()
        assert s2e1.episode == 1 and s2e1.season == 2
        log.info("s2e1 %s " % s2e1)

        s31e1 = friends.find_episode(31, 1)
        assert not s31e1
        log.info("s31e1 %s " % s31e1)
        s1e1 = friends.find_episode(1, 1)
        assert s1e1
        log.info("s1e1 %s " % s1e1)
        s1e32 = friends.find_episode(1, 32)
        log.info("s1e32 %s " % s1e32)
        assert not s1e32
        assert friends.finished()
예제 #4
0
    def estimate(self, entry):
        if all(field in entry for field in ['series_name', 'series_season', 'series_episode']):
            # Try to get airdate from tvrage first
            if api_tvrage:
                season = entry['series_season']
                if entry.get('series_id_type') == 'sequence':
                    # Tvrage has absolute numbered shows under season 1
                    season = 1
                log.debug("Querying release estimation for %s S%02dE%02d ..." %
                          (entry['series_name'], season, entry['series_episode']))
                try:
                    series_info = lookup_series(name=entry['series_name'])
                except LookupError as e:
                    log.debug('tvrage lookup error: %s' % e)
                else:
                    if series_info:
                        try:
                            episode_info = series_info.find_episode(season, entry['series_episode'])
                            if episode_info:
                                return episode_info.airdate
                            else:
                                # If episode does not exist in tvrage database, we always return a future date
                                log.verbose('%s S%02dE%02d does not exist in tvrage database, assuming unreleased',
                                          series_info.name, season, entry['series_episode'])
                                return datetime.now() + timedelta(weeks=4)
                        except Exception as e:
                            log.exception(e)
                    else:
                        log.debug('No series info obtained from TVRage to %s' % entry['series_name'])

                log.debug('No episode info obtained from TVRage for %s season %s episode %s' %
                          (entry['series_name'], entry['series_season'], entry['series_episode']))

            # If no results from tvrage, estimate a date based on series history
            session = Session()
            series = session.query(Series).filter(Series.name == entry['series_name']).first()
            if not series:
                return
            episodes = (session.query(Episode).join(Episode.series).
                        filter(Episode.season != None).
                        filter(Series.id == series.id).
                        filter(Episode.season == func.max(Episode.season).select()).
                        order_by(desc(Episode.number)).limit(2).all())
            if len(episodes) < 2:
                return
            # If last two eps were not contiguous, don't guess
            if episodes[0].number != episodes[1].number + 1:
                return
            last_diff = episodes[0].first_seen - episodes[1].first_seen
            # If last eps were grabbed close together, we might be catching up, don't guess
            # Or, if last eps were too far apart, don't guess
            # TODO: What range?
            if last_diff < timedelta(days=2) or last_diff > timedelta(days=10):
                return
            # Estimate next season somewhat more than a normal episode break
            if entry['series_season'] > episodes[0].season:
                # TODO: How big should this be?
                return episodes[0].first_seen + multiply_timedelta(last_diff, 2)
            # Estimate next episode comes out about same length as last ep span, with a little leeway
            return episodes[0].first_seen + multiply_timedelta(last_diff, 0.9)
예제 #5
0
    def test_tvrage(self):
        with Session(expire_on_commit=False) as session:
            friends = lookup_series("Friends", session=session)
            assert friends.genres == ['Comedy', 'Romance/Dating']
            s1e22 = friends.find_episode(1, 22)
            log.info("s1e22 %s " % s1e22)

            # Testing next
            s1e23 = s1e22.next()
            log.info("s1e23 %s " % s1e23)
            assert s1e23.episode == 23 and s1e23.season == 1

            s1e24 = s1e23.next()
            assert s1e24.episode == 24 and s1e24.season == 1
            log.info("s1e24 %s " % s1e24)

            s2e1 = s1e24.next()
            assert s2e1.episode == 1 and s2e1.season == 2
            log.info("s2e1 %s " % s2e1)

            s31e1 = friends.find_episode(31, 1)
            assert not s31e1
            log.info("s31e1 %s " % s31e1)
            s1e1 = friends.find_episode(1, 1)
            assert s1e1
            log.info("s1e1 %s " % s1e1)
            s1e32 = friends.find_episode(1 ,32)
            log.info("s1e32 %s " % s1e32)
            assert not s1e32
            assert friends.finished()
예제 #6
0
    def do_search_tvsearch(self, arg_entry, config=None):
        log.info('Searching for %s' % (arg_entry['title']))
        # normally this should be used with emit_series who has provided season and episodenumber
        if 'series_name' not in arg_entry or 'series_season' not in arg_entry or 'series_episode' not in arg_entry:
            return []
        serie_info = lookup_series(arg_entry['series_name'])
        if not serie_info:
            return []

        url = (config['url'] + '&rid=%s&season=%s&ep=%s' %
               (serie_info.showid, arg_entry['series_season'], arg_entry['series_episode']))
        return self.fill_entries_for_url(url, config)
예제 #7
0
    def do_search_tvsearch(self, arg_entry, config=None):
        log.info('Searching for %s' % (arg_entry['title']))
        # normally this should be used with emit_series who has provided season and episodenumber
        if 'series_name' not in arg_entry or 'series_season' not in arg_entry or 'series_episode' not in arg_entry:
            return []
        serie_info = lookup_series(arg_entry['series_name'])
        if not serie_info:
            return []

        url = (config['url'] + '&rid=%s&season=%s&ep=%s' %
               (serie_info.showid, arg_entry['series_season'], arg_entry['series_episode']))
        return self.fill_entries_for_url(url, config)
예제 #8
0
 def get_series_info(self, series_name):
     return lookup_series(name=series_name)
예제 #9
0
    def estimate(self, entry):
        if all(field in entry for field in ['series_name', 'series_season', 'series_episode']):
            # Try to get airdate from tvrage first
            if api_tvrage:
                season = entry['series_season']
                if entry.get('series_id_type') == 'sequence':
                    # Tvrage has absolute numbered shows under season 1
                    season = 1
                log.debug("Querying release estimation for %s S%02dE%02d ..." %
                          (entry['series_name'], season, entry['series_episode']))
                try:
                    series_info = lookup_series(name=entry['series_name'])
                except LookupError as e:
                    log.debug('tvrage lookup error: %s' % e)
                else:
                    if series_info:
                        try:
                            episode_info = series_info.find_episode(season, entry['series_episode'])
                            if episode_info:
                                return episode_info.airdate
                            else:
                                # If episode does not exist in tvrage database, we always return a future date
                                log.verbose('%s S%02dE%02d does not exist in tvrage database, assuming unreleased',
                                          series_info.name, season, entry['series_episode'])
                                return datetime.now() + timedelta(weeks=4)
                        except Exception as e:
                            log.exception(e)
                    else:
                        log.debug('No series info obtained from TVRage to %s' % entry['series_name'])

                log.debug('No episode info obtained from TVRage for %s season %s episode %s' %
                          (entry['series_name'], entry['series_season'], entry['series_episode']))

            # If no results from tvrage, estimate a date based on series history
            with contextlib.closing(Session()) as session:
                series = session.query(Series).filter(Series.name == entry['series_name']).first()
                if not series:
                    return
                episodes = (session.query(Episode).join(Episode.series).
                            filter(Episode.season != None).
                            filter(Series.id == series.id).
                            filter(Episode.season == func.max(Episode.season).select()).
                            order_by(desc(Episode.number)).limit(2).all())

                if len(episodes) < 2:
                    return
                # If last two eps were not contiguous, don't guess
                if episodes[0].number != episodes[1].number + 1:
                    return
                last_diff = episodes[0].first_seen - episodes[1].first_seen
                # If last eps were grabbed close together, we might be catching up, don't guess
                # Or, if last eps were too far apart, don't guess
                # TODO: What range?
                if last_diff < timedelta(days=2) or last_diff > timedelta(days=10):
                    return
                # Estimate next season somewhat more than a normal episode break
                if entry['series_season'] > episodes[0].season:
                    # TODO: How big should this be?
                    return episodes[0].first_seen + multiply_timedelta(last_diff, 2)
                # Estimate next episode comes out about same length as last ep span, with a little leeway
                return episodes[0].first_seen + multiply_timedelta(last_diff, 0.9)
예제 #10
0
 def get_series_info(self, series_name):
     return lookup_series(name=series_name)