MovieRecommendation / programmeRecommendation.py
SoumyaJ's picture
Update programmeRecommendation.py
038e989 verified
import pandas as pd
import pickle
from pathlib import Path
import joblib
import os
import requests
from dotenv import load_dotenv
load_dotenv()
os.environ['CALENDARIFIC_API_KEY'] = os.getenv("CALENDARIFIC_API_KEY")
currentPath = Path(__file__).resolve().parent
modelfilePath = currentPath / "similarity.pkl"
moviesfilePath = currentPath / "movielist_images.pkl"
with open(modelfilePath, 'rb') as file:
model = pickle.load(file)
with open(moviesfilePath,'rb') as file:
movieslist = joblib.load(file)
def recommendMoviesByTitle(programmeTitle):
recommended_movies = []
if programmeTitle in movieslist['programmetitle'].values:
movie_index = movieslist[movieslist['programmetitle'] == programmeTitle].index[0]
sim_score = model[movie_index]
#Take the top 10 results ONLY
movie_list = sorted(list(enumerate(sim_score)), reverse = True, key = lambda x: x[1])[1:11]
for i in movie_list:
recommended_movies.append({'programmetitle':movieslist.iloc[i[0]].programmetitle, 'imageurl': movieslist.iloc[i[0]].imagepath})
else:
return("No movies to recommend by title...")
return recommended_movies
COUNTRY_CODE = "US"
def get_holidaysByScheduleDate(scheduleDate):
key = os.environ["CALENDARIFIC_API_KEY"]
current_date = pd.to_datetime(scheduleDate,errors="coerce")
year = current_date.year
month = current_date.month
holidaylist = []
endpoint_url = f"https://calendarific.com/api/v2/holidays?api_key={key}&country={COUNTRY_CODE}&year={year}&month={month}"
response = requests.get(endpoint_url)
if response.status_code == 200:
holidays = response.json()['response']['holidays']
holidaylist = list(map(lambda x: x['description'],holidays))
return list(set(holidaylist))
else:
return []
def recommendMoviesByKeywordsAndGenres(keywordToSearchBy, genres, referenceProgrammeTitle):
recommended_movies = []
filtered_movies = []
# Convert the list of genres to lowercase for consistent comparison
genres = [genre.lower().strip() for genre in genres]
if keywordToSearchBy:
#search for event name in the programme title first
filtered_movies = movieslist[movieslist['programmetitle'].str.contains(keywordToSearchBy, case=False)]
filtered_movies = filtered_movies[filtered_movies['genredescription'].apply(
lambda genre_list: all(genre.lower() in [g.lower().strip() for g in genre_list.split(',')] for genre in genres))]
if len(filtered_movies) == 0:
# Step 1: Filter the DataFrame to find movies that match the given keyword
filtered_movies = movieslist[movieslist['Name'].str.contains(keywordToSearchBy, case=False)]
filtered_movies = filtered_movies[filtered_movies['genredescription'].apply(
lambda genre_list: all(genre.lower() in [g.lower().strip() for g in genre_list.split(',')] for genre in genres))]
if len(filtered_movies) == 0:
return recommendMoviesByTitle(referenceProgrammeTitle)
if filtered_movies.empty:
return("No movies found with the given keyword and genres.")
movies = filtered_movies.sample(len(filtered_movies))
recommended_movies.append({'programmetitle':movies.iloc[0]['programmetitle'],'imageurl': movies.iloc[0]['imagepath']})
movie_index = movies.index[0]
sim_score = model[movie_index]
movie_list = sorted(list(enumerate(sim_score)), reverse=True, key=lambda x: x[1])[1:10]
for i in movie_list:
recommended_movies.append({'programmetitle':movieslist.iloc[i[0]].programmetitle,'imageurl': movieslist.iloc[i[0]].imagepath})
return recommended_movies
def recommendProgrammes(scheduleDate : str, genres: list, referenceProgrammeTitle : str):
holidaylist = get_holidaysByScheduleDate(scheduleDate)
eventName = ""
if any("Christmas" in sentence for sentence in holidaylist):
eventName = "Christmas"
elif any("New year" in sentence for sentence in holidaylist):
eventName = "New year"
elif any("Halloween" in sentence for sentence in holidaylist):
eventName = "Halloween"
elif any("Valentine" in sentence for sentence in holidaylist):
eventName = "Valentine"
elif any("Black Friday" in sentence for sentence in holidaylist):
eventName = "Thanksgiving"
return recommendMoviesByKeywordsAndGenres(eventName,genres=genres, referenceProgrammeTitle = referenceProgrammeTitle)