import gradio as gr import requests import numpy as np import pandas as pd from PIL import Image # api_key = "4e45e5b0" # A function that takes a movie name and returns its poster image as a numpy array def get_poster(movie): api_key = "4e45e5b0" base_url = "http://www.omdbapi.com/" params = {"apikey": api_key , "t": movie} response = requests.get(base_url, params=params) data = response.json() if data['Response'] == 'True': # Check if the response is successful # Open the image from the url poster_image = Image.open(requests.get(data['Poster'], stream=True).raw) # Convert the image to a numpy array poster_array = np.array(poster_image) return poster_array else: return np.zeros((500, 500, 3)) # A function that takes a movie name and returns its meta data def get_data(movie): api_key = "4e45e5b0" base_url = "http://www.omdbapi.com/" params = {"apikey": api_key , "t": movie} response = requests.get(base_url, params=params) data = response.json() if data['Response'] == 'True': # Check if the response is successful poster = data["Poster"] title = data["Title"] director = data["Director"] cast = data["Actors"] genres = data["Genre"] rating = data["imdbRating"] # Return a dictionary with the information return { "poster": poster, "title": title, "director": director, "cast": cast, "genres": genres, "rating": rating } # Recommendation Function from core import output_list def get_recommendations(input_list): movie_names = output_list(input_list) movies_data = [get_data(movie) for movie in movie_names] movie_posters = [get_poster(movie) for movie in movie_names] return movie_names, movie_posters # HTML table def generate_table(movies, posters): html_code = "" # Add the table tag and style attributes html_code += "" for i in range(len(movies)): movie_name = movies[i] poster_array = posters[i] movie_data = get_data(movie_name) # Extract the information from the dictionary poster_url = movie_data["poster"] title = movie_data["title"] director = movie_data["director"] cast = movie_data["cast"] genres = movie_data["genres"] rating = movie_data["rating"] # Add a table row tag for each movie html_code += "" # Add a table cell tag with the poster image as an img tag html_code += f"" # Add a table cell tag with the movie information as a paragraph tag html_code += f"" # Close the table row tag html_code += "" # Close the table tag html_code += "

Title: {title}

Director: {director}

Cast: {cast}

Genres: {genres}

Rating: {rating}

" return html_code # Display Function user_input = {} def display_movie(movie, rating): global user_input user_input[movie] = rating poster = get_poster(movie) if len(user_input) == 5: # Get the recommended movies from the input r_movies, r_posters = get_recommendations(user_input) # Create a list with a list of HTML strings with information html_code = generate_table(r_movies, r_posters) user_input = {} # Return the output return f"Your movies are ready!\nPlease check the recommendations below.", np.zeros((500, 500, 3)), html_code else: # Return the input movie name and poster return f"You entered {movie} with rating {rating}", poster, "" # Interface iface = gr.Interface( fn= display_movie, inputs= [gr.Textbox(label="Enter a movie name (five movie in total!)"), gr.Slider(minimum=0, maximum=5, step=1, label="Rate the movie")], outputs= [gr.Textbox(label="Output", min_width=200), gr.components.Image(label="Poster", height=400, width=300), gr.components.HTML(label="Recommendations", height=400)], live= False, examples=[["The Matrix"], ["The Lion King"], ["Titanic"], ['Fight Club'], ["Inception"]], title = "Movie Recommender", ) iface.launch()