File size: 3,982 Bytes
a0b8a4c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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.")