File size: 5,957 Bytes
131f396
 
 
 
 
 
 
 
 
 
 
0ba454c
8bba3ae
 
 
131f396
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
131
132
133
134
from flask import Flask, render_template,request,flash
import pickle,requests
import joblib

# Provide template folder name
# The default folder name should be "templates" else need to mention custom folder name
app = Flask(__name__, template_folder='templates',
            static_folder='static')
app.secret_key = "abc"  

# movies = pickle.load(open('movie_l.pkl','rb'))
#similarity = joblib.load('movie_list.joblib')
movies = pickle.load(open('./movie_list.pkl','rb'))
similarity = pickle.load(open('./similarity.pkl','rb'))
mv = pickle.load(open('./castcrew.pkl','rb'))

def getcast(movie_id):
    movie_row = mv[mv['movie_id'] == movie_id]

    # extract the cast and crew information from the row
    cast = (movie_row['cast'].values[0])
    listToStr = ' '.join([str(elem) + ',' for i,elem in enumerate(cast)])
    
    print(cast)
    crew = str(movie_row['crew'].values[0])
    crew.replace("'", "")
    return (listToStr[:-1],crew[2:-2])

def getm(movie):
    index = movies[movies['title'] == movie].index[0]
    movie_i = movies.iloc[index].movie_id
    url = "https://api.themoviedb.org/3/movie/{}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US".format(movie_i)
    data = requests.get(url)
    data = data.json()
    company_names = [company['name'] for company in data['production_companies']]
    return (data['release_date'].split("-")[0],company_names)

def rating(movie):
    index = movies[movies['title'] == movie].index[0]
    movie_i = movies.iloc[index].movie_id
    url = "https://api.themoviedb.org/3/movie/{}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US".format(movie_i)
    data = requests.get(url)
    data = data.json()
    genres = [genre['name'] for genre in data['genres']]
    return (round(float(data['vote_average']), 2),data['release_date'],genres,data['homepage'])

def detail(movie_id):
    url = "https://api.themoviedb.org/3/movie/{}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US".format(movie_id)
    data = requests.get(url)
    data = data.json()
    genres = [genre['name'] for genre in data['genres']]
    vote = round(float(data['vote_average']), 2)
    return (data['overview'],data['homepage'],', '.join(genres),data['runtime'],vote)


def fetch_poster(movie_id):
    url = "https://api.themoviedb.org/3/movie/{}?api_key=8265bd1679663a7ea12ac168da84d2e8&language=en-US".format(movie_id)
    data = requests.get(url)
    data = data.json()
    poster_path = data['poster_path']
    full_path = "https://image.tmdb.org/t/p/w500/" + poster_path
    return full_path

# function to return movie names and poster of top five similar movies got through model we built
def recommend(movie):
    index = movies[movies['title'] == movie].index[0]
    movie_i = movies.iloc[index].movie_id
    mp=fetch_poster(movie_i)
    overview,homepage,genres,rev,vote=detail(movie_i)
    cast,crew = getcast(movie_i)
    distances = sorted(list(enumerate(similarity[index])), reverse=True, key=lambda x: x[1])
    recommended_movie_names = []
    recommended_movie_posters = []
    for i in distances[1:8]:
        # fetch the movie poster
        movie_id = movies.iloc[i[0]].movie_id
        recommended_movie_posters.append(fetch_poster(movie_id))
        recommended_movie_names.append(movies.iloc[i[0]].title)
    return recommended_movie_names,recommended_movie_posters,overview,homepage,genres,rev,vote,mp,cast,crew


@app.route('/', methods=["GET","POST"])
def index():
    if request.method == "POST":
      try:
            movie = request.form.get("search")
            if(len(movie) < 1):
                return render_template('movie.html')
            recommended_movie_names,recommended_movie_posters,overview,homepage,genres,rev,vote,mp,cast,crew = recommend(movie)
            raj= getm(movie)
            ratings= [rating(movie) for movie in recommended_movie_names]
            return render_template('movie.html',names=recommended_movie_names,posters=recommended_movie_posters,over=overview,homep=homepage,gen=genres,cur_m=movie,rev=rev,vote=vote,rating=ratings,mp=mp,raj=raj,cast=cast,crew=crew)

      except:
          flash("Movie not available")  
          return render_template('home.html')

    flash("Movie not available") 
    return render_template('home.html')

@app.route('/nest/<string:movie>', methods=["GET","POST"])
def nest(movie):
    if request.method == "POST":
        try:
            movie1 = request.form.get("search")
            if movie1:
                if(len(movie) < 1):
                   return render_template('home.html')
                recommended_movie_names,recommended_movie_posters,overview,homepage,genres,rev,vote,mp,cast,crew = recommend(movie)
                raj= getm(movie)
                ratings= [rating(movie) for movie in recommended_movie_names]
                return render_template('movie.html',names=recommended_movie_names,posters=recommended_movie_posters,over=overview,homep=homepage,gen=genres,cur_m=movie,rev=rev,vote=vote,rating=ratings,mp=mp,raj=raj,cast=cast,crew=crew)

            else:
                if not movie:
                   return render_template('home.html')
                recommended_movie_names, recommended_movie_posters, overview, homepage, genres, rev, vote, mp,cast,crew = recommend(movie)
                raj= getm(movie)
                ratings = [rating(movie) for movie in recommended_movie_names]
                return render_template('movie.html', names=recommended_movie_names, posters=recommended_movie_posters,
                                    over=overview, homep=homepage, gen=genres, cur_m=movie, rev=rev, vote=vote,
                                    rating=ratings, mp=mp,raj=raj, cast=cast, crew=crew)

        except:
            flash("Movie not available")  
            return render_template('home.html')
        
@app.route('/nest', methods=["GET","POST"])
def test():
    return render_template('home.html')


if __name__ == '__main__':
    app.run(debug=True)