Update main.py
Browse files
main.py
CHANGED
|
@@ -10,6 +10,8 @@ import pickle
|
|
| 10 |
import requests
|
| 11 |
from datetime import date, datetime
|
| 12 |
|
|
|
|
|
|
|
| 13 |
# load the nlp model and tfidf vectorizer from disk
|
| 14 |
filename = 'nlp_model.pkl'
|
| 15 |
clf = pickle.load(open(filename, 'rb'))
|
|
@@ -42,6 +44,58 @@ def home():
|
|
| 42 |
return render_template('home.html',suggestions=suggestions)
|
| 43 |
|
| 44 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
@app.route("/recommend",methods=["POST"])
|
| 46 |
@app.route("/recommend", methods=["POST"])
|
| 47 |
def recommend():
|
|
@@ -108,7 +162,7 @@ def recommend():
|
|
| 108 |
for i in range(len(cast_places))
|
| 109 |
}
|
| 110 |
|
| 111 |
-
|
| 112 |
movie_reviews = {} # default: no reviews
|
| 113 |
try:
|
| 114 |
url = f"https://www.imdb.com/title/{imdb_id}/reviews?ref_=tt_ov_rt"
|
|
@@ -135,13 +189,16 @@ def recommend():
|
|
| 135 |
pred = clf.predict(movie_vector)
|
| 136 |
reviews_status.append('Positive' if pred else 'Negative')
|
| 137 |
|
| 138 |
-
|
| 139 |
-
|
| 140 |
-
|
|
|
|
| 141 |
except Exception as e:
|
| 142 |
print(f"IMDb reviews fetch failed: {e}")
|
| 143 |
movie_reviews = {}
|
| 144 |
-
|
|
|
|
|
|
|
| 145 |
|
| 146 |
# dates
|
| 147 |
movie_rel_date = ""
|
|
|
|
| 10 |
import requests
|
| 11 |
from datetime import date, datetime
|
| 12 |
|
| 13 |
+
|
| 14 |
+
TMDB_API_KEY = os.environ.get("TMDB_API_KEY")
|
| 15 |
# load the nlp model and tfidf vectorizer from disk
|
| 16 |
filename = 'nlp_model.pkl'
|
| 17 |
clf = pickle.load(open(filename, 'rb'))
|
|
|
|
| 44 |
return render_template('home.html',suggestions=suggestions)
|
| 45 |
|
| 46 |
|
| 47 |
+
def get_tmdb_reviews_from_imdb(imdb_id, max_reviews=10):
|
| 48 |
+
"""
|
| 49 |
+
Given an imdb_id like 'tt1234567', return a dict {review_text: sentiment}
|
| 50 |
+
using TMDb's API. Returns {} on failure or if no reviews found.
|
| 51 |
+
"""
|
| 52 |
+
if not TMDB_API_KEY:
|
| 53 |
+
# Key not available — caller will handle fallback
|
| 54 |
+
print("TMDb API key not set; skipping TMDb fetch.")
|
| 55 |
+
return {}
|
| 56 |
+
|
| 57 |
+
try:
|
| 58 |
+
find_url = f"https://api.themoviedb.org/3/find/{imdb_id}"
|
| 59 |
+
params = {"api_key": TMDB_API_KEY, "external_source": "imdb_id"}
|
| 60 |
+
r = requests.get(find_url, params=params, timeout=8)
|
| 61 |
+
r.raise_for_status()
|
| 62 |
+
found = r.json()
|
| 63 |
+
|
| 64 |
+
results = found.get("movie_results") or []
|
| 65 |
+
if not results:
|
| 66 |
+
return {}
|
| 67 |
+
|
| 68 |
+
tmdb_id = results[0]["id"]
|
| 69 |
+
|
| 70 |
+
reviews_url = f"https://api.themoviedb.org/3/movie/{tmdb_id}/reviews"
|
| 71 |
+
params = {"api_key": TMDB_API_KEY, "language": "en-US", "page": 1}
|
| 72 |
+
r2 = requests.get(reviews_url, params=params, timeout=8)
|
| 73 |
+
r2.raise_for_status()
|
| 74 |
+
reviews_data = r2.json()
|
| 75 |
+
|
| 76 |
+
out = {}
|
| 77 |
+
count = 0
|
| 78 |
+
for item in reviews_data.get("results", []):
|
| 79 |
+
if count >= max_reviews:
|
| 80 |
+
break
|
| 81 |
+
content = item.get("content")
|
| 82 |
+
if not content:
|
| 83 |
+
continue
|
| 84 |
+
# run your classifier to keep UX consistent
|
| 85 |
+
movie_review_list = np.array([content])
|
| 86 |
+
movie_vector = vectorizer.transform(movie_review_list)
|
| 87 |
+
pred = clf.predict(movie_vector)
|
| 88 |
+
sentiment = "Positive" if pred else "Negative"
|
| 89 |
+
out[content] = sentiment
|
| 90 |
+
count += 1
|
| 91 |
+
|
| 92 |
+
return out
|
| 93 |
+
|
| 94 |
+
except Exception as e:
|
| 95 |
+
print(f"TMDb fetch failed: {e}")
|
| 96 |
+
return {}
|
| 97 |
+
|
| 98 |
+
|
| 99 |
@app.route("/recommend",methods=["POST"])
|
| 100 |
@app.route("/recommend", methods=["POST"])
|
| 101 |
def recommend():
|
|
|
|
| 162 |
for i in range(len(cast_places))
|
| 163 |
}
|
| 164 |
|
| 165 |
+
|
| 166 |
movie_reviews = {} # default: no reviews
|
| 167 |
try:
|
| 168 |
url = f"https://www.imdb.com/title/{imdb_id}/reviews?ref_=tt_ov_rt"
|
|
|
|
| 189 |
pred = clf.predict(movie_vector)
|
| 190 |
reviews_status.append('Positive' if pred else 'Negative')
|
| 191 |
|
| 192 |
+
if reviews_list:
|
| 193 |
+
movie_reviews = {
|
| 194 |
+
reviews_list[i]: reviews_status[i] for i in range(len(reviews_list))
|
| 195 |
+
}
|
| 196 |
except Exception as e:
|
| 197 |
print(f"IMDb reviews fetch failed: {e}")
|
| 198 |
movie_reviews = {}
|
| 199 |
+
|
| 200 |
+
if not movie_reviews:
|
| 201 |
+
movie_reviews = get_tmdb_reviews_from_imdb(imdb_id)
|
| 202 |
|
| 203 |
# dates
|
| 204 |
movie_rel_date = ""
|