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)