File size: 4,526 Bytes
834fe53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0c43bc8
834fe53
 
 
 
 
 
 
 
 
 
 
 
 
 
 
824fcc0
834fe53
 
 
 
 
824fcc0
 
834fe53
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
               }

def get_recommendations(input_list):
    movie_names = ["The Matrix", "The Shawshank Redemption", "The Godfather", "The Dark Knight", "Inception"]
    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 for recommendation section 
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 = 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 += "<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_cod

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, ""

# Gradio Interface 
iface = gr.Interface(
    
    fn= display_movie, 
    inputs= [gr.Textbox(label="Enter a movie name"), 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"]]
    )

iface.launch()