File size: 4,261 Bytes
4d39f31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
082b552
4d39f31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from flask import Flask, render_template, request, redirect, url_for, session, flash
import pandas as pd
import joblib
from fuzzywuzzy import process
from flask_bcrypt import Bcrypt
from functools import wraps
import os
from supabase import create_client, Client
from dotenv import load_dotenv


load_dotenv()

app = Flask(__name__)
app.secret_key = os.getenv("SECRET_KEY")
bcrypt = Bcrypt(app)



movies = pd.read_csv('core/data/processed_movies_with_posters.csv')
cosine_sim = joblib.load('core/model/cosine_sim.pkl')



def get_recommendations(title, cosine_sim=cosine_sim):
    title = title.lower()
    if title not in movies['title'].str.lower().values:
        close_matches = process.extract(title, movies['title'].str.lower().values, limit=5)
        return None, [movies[movies['title'].str.lower() == match[0]].iloc[0] for match in close_matches]
    idx = movies[movies['title'].str.lower() == title].index[0]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:11]
    movie_indices = [i[0] for i in sim_scores]
    return movies.iloc[movie_indices], None

def get_recommendations_by_id(movie_id, cosine_sim=cosine_sim):
    idx = movies[movies['id'] == movie_id].index[0]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:6]
    movie_indices = [i[0] for i in sim_scores]
    return movies.iloc[movie_indices]

@app.route('/')

def home():
    return render_template('recommendation.html', movies=movies.sample(20).to_dict(orient='records'))

@app.route('/movie/<int:id>')
def movie_details(id):
    movie = movies[movies['id'] == id].iloc[0]
    recommendations = get_recommendations_by_id(id).to_dict(orient='records')
    return render_template('movie_details.html', movie=movie, recommendations=recommendations)

@app.route('/recommend', methods=['POST'])
def recommend():
    title = request.form['title']
    recommendations, close_matches = get_recommendations(title)
    if recommendations is None:
        flash("Movie title not found. Did you mean one of these?", 'warning')
        return render_template('recommendation.html', movies=[match.to_dict() for match in close_matches])
    return render_template('recommendation.html', movies=recommendations.to_dict(orient='records'))

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        query = request.form['query']
        results = movies[movies['title'].str.contains(query, case=False, na=False)]
        return render_template('search.html', movies=results.to_dict(orient='records'))
    return render_template('search.html', movies=None)

@app.route('/filter', methods=['GET', 'POST'])
def filter():
    genres = sorted(movies['genre'].str.split(',', expand=True).stack().dropna().unique())
    languages = sorted(movies['original_language'].dropna().unique())

    if request.method == 'POST':
        selected_genre = request.form.get('genre')
        selected_language = request.form.get('language')

        if not selected_genre and not selected_language:
            return render_template('filter.html', movies=None, genres=genres, languages=languages,
                                   error_message="No movies found. Please adjust your filters.")

        filtered_movies = movies.copy()

        if selected_genre:
            filtered_movies = filtered_movies[filtered_movies['genre'].str.contains(selected_genre, na=False)]

        if selected_language:
            filtered_movies = filtered_movies[filtered_movies['original_language'] == selected_language]

        filtered_movies['genre'] = filtered_movies['genre'].fillna('').astype(str)

        sample_size = min(50, len(filtered_movies))

        filtered_movies = filtered_movies.sample(sample_size).to_dict(orient='records')

        return render_template('filter.html', movies=filtered_movies, genres=genres, languages=languages,
                               error_message=None)

    return render_template('filter.html', movies=None, genres=genres, languages=languages, error_message=None)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860)