divyesh01's picture
All files are uploaded
a0b8a4c verified
import streamlit as st
import pickle
import pandas as pd
import requests
def fetch_poster(movie_name):
"""
Fetch movie posters using the IMDb API via RapidAPI.
Args:
movie_name (str): The name of the movie for which to fetch the poster.
Returns:
str: The URL of the movie poster or a placeholder URL if not available.
"""
url = "https://imdb8.p.rapidapi.com/title/find"
querystring = {"q": movie_name} # Search by movie name
headers = {
"x-rapidapi-key": "1fbfa1d6b2msh32cfe69cdbe3847p1a958ajsn576375deeb9c", # Replace with your RapidAPI key
"x-rapidapi-host": "imdb8.p.rapidapi.com"
}
try:
response = requests.get(url, headers=headers, params=querystring, timeout=30)
response.raise_for_status() # Check for HTTP request errors
data = response.json()
results = data.get("results", [])
if results:
poster_url = results[0].get("image", {}).get("url") # Access the poster URL
if poster_url:
return poster_url
st.warning("Poster not found for movie: {}".format(movie_name))
return "https://via.placeholder.com/500x750?text=No+Poster+Available" # Placeholder image
except requests.exceptions.Timeout:
st.error("The request timed out while fetching poster for movie: {}".format(movie_name))
return "https://via.placeholder.com/500x750?text=Timeout+Error" # Timeout placeholder
except requests.exceptions.RequestException as e:
st.error(f"An error occurred while fetching poster for {movie_name}: {e}")
return "https://via.placeholder.com/500x750?text=Connection+Error" # Connection error placeholder
def recommend(movie):
"""
Recommend movies based on similarity matrix and fetch posters using the IMDb API.
Args:
movie (str): The name of the movie for recommendations.
Returns:
list, list: Lists of recommended movie names and their poster URLs.
"""
try:
movies_index = movies[movies["title"] == movie].index[0]
distances = similarity[movies_index]
movie_list = sorted(list(enumerate(distances)), reverse=True, key=lambda x: x[1])[1:6]
recommended_movies = []
recommended_movies_posters = []
for i in movie_list:
recommended_movies.append(movies.iloc[i[0]].title)
# Fetch poster and handle any connection or data issues
poster = fetch_poster(movies.iloc[i[0]].title)
recommended_movies_posters.append(poster)
return recommended_movies, recommended_movies_posters
except IndexError:
st.error("The movie is not found in the dataset.")
return [], []
# Load movie data and similarity matrix from pickled files
movies_dict = pickle.load(open('movie_dict.pkl', 'rb'))
movies = pd.DataFrame(movies_dict)
similarity = pickle.load(open('similarity.pkl', 'rb'))
st.title("Movie Recommender System")
# Movie selection dropdown
selected_movie_name = st.selectbox(
"Select a movie to get recommendations:", movies['title'].values
)
# Display recommendations upon button click
if st.button("Recommend"):
names, posters = recommend(selected_movie_name)
if names and posters and len(names) >= 5:
col1, col2, col3, col4, col5 = st.columns(5)
with col1:
st.text(names[0])
st.image(posters[0])
with col2:
st.text(names[1])
st.image(posters[1])
with col3:
st.text(names[2])
st.image(posters[2])
with col4:
st.text(names[3])
st.image(posters[3])
with col5:
st.text(names[4])
st.image(posters[4])
else:
st.write("No recommendations found for the selected movie or unable to fetch posters.")