Spaces:
Sleeping
Sleeping
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) | |