AmirShabani's picture
Update app.py
a684e88
raw
history blame
No virus
5.2 kB
import gradio as gr
import requests
import numpy as np
import pandas as pd
from PIL import Image
# api_key = "a4ed408" _ added to get_poster and get_data Function!
# A function that takes a movie name and returns its poster image as a numpy array
def get_poster(movie):
api_key = "a4ed408"
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
status = data['Response']
poster = data["Poster"]
if not isinstance(poster, str):
poster = "https://t2.gstatic.com/licensed-image?q=tbn:ANd9GcRav8An8wQSdccA_9fjnx0W_SH3xunzQXaitfpWmZpUKiLfKpMNRY_kZf5-6EQk2ZSi"
title = data["Title"]
year = data["Year"]
director = data["Director"]
cast = data["Actors"]
genres = data["Genre"]
rating = data["imdbRating"]
# Return a dictionary with the information
return {
"status": status,
"poster": poster,
"title": title,
"director": director,
"cast": cast,
"genres": genres,
"rating": rating,
"year" : year
}
# 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 += "<table style='width:100%; border: 1px solid black; text-align: center;'>"
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 = f"{movie_data['title']} ({movie_data['year']})"
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 += "<tr>"
# Add a table cell tag with the poster image as an img tag
html_code += f"<td><img src='{poster_url}' height='400' width='300'></td>"
# Add a table cell tag with the movie information as a paragraph tag
html_code += f"<td><p><b>Title:</b> {title}</p><p><b>Director:</b> {director}</p><p><b>Cast:</b> {cast}</p><p><b>Genres:</b> {genres}</p><p><b>Rating:</b> {rating}</p></td>"
# Close the table row tag
html_code += "</tr>"
# Close the table tag
html_code += "</table>"
return html_code
# Display Function
user_input = {}
def display_movie(movie, rating):
global user_input
data = get_data(movie)
if data['status'] == 'True':
user_input[f"{data['title']} ({data['year']})"] = rating
poster = get_poster(data['title'])
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
elif data['status'] == 'True':
# Return the input movie name and poster
return f"You entered {movie} with rating {rating}", poster, ""
else:
return f"we can't find {movie} please try again", np.zeros((500, 500, 3)), ""
# 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")],
live= False,
#examples=[["The Matrix"], ["The Lion King"], ["Titanic"], ['Fight Club'], ["Inception"], ["Pulp Fiction"], ["Forrest Gump"], ["Schindler’s List"]],
title = "Movie Recommender"
)
iface.launch()