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)
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}.")
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)
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}.')
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)