Пример #1
0
    def from_query(cls, query: str):
        """Find a movie by query (fuzzy search).

        :param query:
        :type query: str
        :raises:
            exceptions.MovieNotFound
        """
        query = query.lower().strip()
        item_list = sql_to_dict(cls.__database__,
                                "select * from movies where hidden=0")

        # We use loops for year and og_title matching
        initial = 0
        final_list = []
        for item in item_list:
            fuzzy = fuzz.ratio(query,
                               f"{item['title']} {item['year']}".lower())

            if fuzzy > initial:
                initial = fuzzy
                final_list.append(item)

                if fuzzy > 98:  # Don't waste more time
                    break

        item = final_list[-1]

        if initial < 59:
            raise exceptions.MovieNotFound(
                f'Movie not found: "{query}". Maybe you meant "{item["title"]}"? '
                f"Explore the collection: {WEBSITE}.")

        return cls(**item, _in_db=True)
Пример #2
0
def search_movie(movie_list, query, raise_resting=True):
    """
    :param movie_list: list of dictionaries
    :param query: query
    :param raise_resting: raise an exception for resting movies
    :raises exceptions.MovieNotFound
    :raises exceptions.RestingMovie
    """
    query = query.lower()

    initial = 0
    final_list = []
    for f in movie_list:
        title = fuzz.ratio(query, f"{f['title']} {f['year']}".lower())
        ogtitle = fuzz.ratio(query,
                             f"{f['original_title']} {f['year']}".lower())
        fuzzy = title if title > ogtitle else ogtitle
        if fuzzy > initial:
            initial = fuzzy
            final_list.append(f)

    item = final_list[-1]
    if initial > 59:
        if raise_resting:
            check_movie_availability(item["last_request"])
        return item

    raise exceptions.MovieNotFound(
        f'Movie not found: "{query}". Maybe you meant "{item["title"]}"? '
        f"Explore the collection: {WEBSITE}.")
Пример #3
0
    def from_id(cls, id_: int):
        """Load the item from its ID.

        :param id_:
        :type id_: int
        """
        movie = sql_to_dict(cls.__database__,
                            "select * from movies where id=?", (id_, ))
        if not movie:
            raise exceptions.MovieNotFound(f"ID not found in database: {id_}")

        return cls(**movie[0], _in_db=True)
Пример #4
0
def search_episode(episode_list, query, raise_resting=True):
    """
    :param episode_list: list of dictionaries
    :param query: query
    :param raise_resting: raise an exception for resting episodes
    :raises exceptions.EpisodeNotFound
    :raises exceptions.RestingMovie
    """
    for ep in episode_list:
        if (query.lower().strip(
        ) == f"{ep['title']} s{ep['season']:02}e{ep['episode']:02}".lower()):
            if raise_resting:
                check_movie_availability(ep["last_request"])
            return ep

    raise exceptions.MovieNotFound(
        f'Episode not found: "{query}". Explore the collection: {WEBSITE}.')
Пример #5
0
    def from_query(cls, query: str):
        """Find a movie by query (fuzzy search).

        :param query:
        :type query: str
        :raises:
            exceptions.MovieNotFound
        """
        query = query.lower().strip()
        title_query = _YEAR_RE.sub("", query).strip()

        item_list = sql_to_dict(cls.__database__,
                                "select * from movies where hidden=0")

        # First try to find movie by title (almost always happens)
        for item in item_list:
            if title_query == item["title"].lower():
                logger.debug("Movie found by title: %s", item["title"])
                return cls(**item, _in_db=True)

        initial = 0
        final_list = []
        for item in item_list:
            fuzzy = fuzz.ratio(query,
                               f"{item['title'].lower()} ({item['year']})")

            if fuzzy > initial:
                initial = fuzzy
                final_list.append(item)

                if fuzzy > 98:  # Don't waste more time
                    break

        if not final_list:
            raise exceptions.NothingFound

        item = final_list[-1]

        if initial < 59:
            raise exceptions.MovieNotFound(
                f'Movie not found: "{query}". Maybe you meant "{item["title"]}"? '
                f"Explore the collection: {WEBSITE}.")

        return cls(**item, _in_db=True)