File size: 4,494 Bytes
24a3bb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68d35c8
24a3bb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
038e989
 
24a3bb4
 
 
038e989
 
24a3bb4
 
038e989
24a3bb4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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)