SURESHBEEKHANI's picture
Upload 4 files
7adf8b5 verified
# Importing necessary libraries from Flask
from flask import Flask, render_template, request # Flask creates web applications; render_template serves HTML, and request handles form data.
import pickle # pickle is used for loading pre-trained models or data stored in serialized files.
import requests # requests is used to make HTTP requests to external APIs.
# Initializing a Flask application
app = Flask(__name__)
# Load the movie list and similarity matrix
movies = pickle.load(open('artifacts/model.pkl', 'rb')) # Loads the list of movies from a serialized file.
similarity = pickle.load(open('artifacts/similarity.pkl', 'rb')) # Loads the similarity matrix for movies, used for recommendations.
# Function to fetch the poster image of a movie from The Movie Database (TMDB) API
def fetch_poster(movie_id):
# TMDB API URL, dynamically formatted with a movie ID and API key to get movie details
url = f"https://api.themoviedb.org/3/movie/{movie_id}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US"
data = requests.get(url).json() # Sends a GET request to the URL and retrieves the response in JSON format.
poster_path = data.get('poster_path') # Extracts the poster path if available.
if poster_path: # Checks if a poster path exists for the movie.
return "https://image.tmdb.org/t/p/w500/" + poster_path # Returns the full URL for the poster image.
return None # If no poster is available, returns None.
# Function to recommend similar movies
def recommend(movie):
# Gets the index of the selected movie in the movies DataFrame based on the movie title
index = movies[movies['title'] == movie].index[0]
# Enumerates similarity scores with the selected movie and sorts them in descending order
distances = sorted(list(enumerate(similarity[index])), reverse=True, key=lambda x: x[1])
recommended_movie_names = [] # List to store recommended movie titles.
recommended_movie_posters = [] # List to store corresponding poster images.
# Loop to get the top 5 similar movies (ignoring the first entry, which is the movie itself)
for i in distances[1:5]:
movie_id = movies.iloc[i[0]].movie_id # Gets the movie ID for each recommended movie.
recommended_movie_posters.append(fetch_poster(movie_id)) # Fetches and appends the movie's poster.
recommended_movie_names.append(movies.iloc[i[0]].title) # Adds the movie title to recommendations.
return recommended_movie_names, recommended_movie_posters # Returns lists of recommended movie titles and posters.
# Route for the homepage, handling both GET and POST requests
@app.route('/', methods=['GET', 'POST'])
def index():
# When a movie is selected and form is submitted (POST request)
if request.method == 'POST':
selected_movie = request.form.get('movie') # Retrieves the selected movie from the form.
# Calls the recommend function and gets recommended movie names and posters
recommended_movie_names, recommended_movie_posters = recommend(selected_movie)
# Renders the HTML page with the selected movie, recommendations, and movie list for dropdown
return render_template('index.html', selected_movie=selected_movie,
recommended_movie_names=recommended_movie_names,
recommended_movie_posters=recommended_movie_posters,
movies=movies['title'].values,
zip=zip) # Adds zip function to enable pairing movie names with posters.
# For GET requests, render the page with the movie list only.
return render_template('index.html', movies=movies['title'].values)
# Running the application in debug mode for development (provides error details on crashes)
if __name__ == '__main__':
app.run(debug=True)