├── .idea ├── .name ├── misc.xml ├── vcs.xml ├── .gitignore ├── inspectionProfiles │ └── profiles_settings.xml ├── modules.xml └── proj.iml ├── config.py ├── treeStruct.py ├── pieStruct.py ├── cacheFunction.py ├── constant.py ├── dataReddit.py ├── graphStruct.py ├── checkInput.py ├── dataTMDb.py ├── main.py ├── README.md ├── test1.json ├── movie_data.json └── add_layer_data.json /.idea/.name: -------------------------------------------------------------------------------- 1 | proj -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | REDDIT_CLIENT_ID = '...' 2 | REDDIT_SECRET = '...' 3 | REDDIT_USER_AGENT = '...' 4 | TMDb_API_KEY = '...' 5 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | # Datasource local storage ignored files 7 | /dataSources/ 8 | /dataSources.local.xml 9 | -------------------------------------------------------------------------------- /.idea/inspectionProfiles/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/proj.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /treeStruct.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/10 13:34 5 | # @File : treeStruct.py 6 | from anytree import Node, RenderTree 7 | 8 | root = Node("root") 9 | 10 | 11 | def tree_from_given_title(title_list, add_layer_data): 12 | dic = {} 13 | count = 0 14 | for i in title_list: 15 | count += 1 16 | dic['[MOVIE{}] '.format(count) + i] = add_layer_data[i] 17 | return dic 18 | 19 | 20 | def parse_data(parent, data): 21 | if isinstance(data, dict): 22 | for key, value in data.items(): 23 | node = Node(f"{key}: ", parent=parent) 24 | parse_data(node, value) 25 | elif isinstance(data, list): 26 | for i, value in enumerate(data): 27 | node = Node(f"[{i}]: ", parent=parent) 28 | parse_data(node, value) 29 | else: 30 | parent.name += str(data) 31 | 32 | 33 | def print_tree(title_list, add_layer_data): 34 | get_data = tree_from_given_title(title_list, add_layer_data) 35 | parse_data(root, get_data) 36 | for pre, fill, node in RenderTree(root): 37 | print("%s%s" % (pre, node.name)) 38 | -------------------------------------------------------------------------------- /pieStruct.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/10 17:05 5 | # @File : pieStruct.py 6 | 7 | import plotly.graph_objs as go 8 | import plotly.subplots as sp 9 | 10 | from cacheFunction import load_cached_movies 11 | from treeStruct import tree_from_given_title 12 | 13 | 14 | def pie_rating(data): 15 | # Collect vote averages 16 | vote_averages = [movie["vote average"] for movie in data.values()] 17 | 18 | # Define categories for vote averages 19 | categories = { 20 | "0-1": 0, 21 | "1-2": 0, 22 | "2-3": 0, 23 | "3-4": 0, 24 | "4-5": 0, 25 | "5-6": 0, 26 | "6-7": 0, 27 | "7-8": 0, 28 | "8-9": 0, 29 | "9-10": 0, 30 | } 31 | 32 | # Count the vote averages for each category 33 | for vote_average in vote_averages: 34 | for category, upper_bound in zip(categories.keys(), range(1, 11)): 35 | if vote_average <= upper_bound: 36 | categories[category] += 1 37 | break 38 | 39 | # Generate the pie chart 40 | labels = list(categories.keys()) 41 | sizes = list(categories.values()) 42 | 43 | fig = go.Figure(data=[go.Pie(labels=labels, values=sizes, hole=.3)]) 44 | fig.update_layout(title_text="Distribution of Vote Averages", legend_title="Vote Average Ranges") 45 | fig.show() 46 | 47 | 48 | if __name__ == '__main__': 49 | data = load_cached_movies("movie_data.json") 50 | # new_data = tree_from_given_title(data.keys(), data) 51 | pie_rating(data) 52 | -------------------------------------------------------------------------------- /cacheFunction.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/9 13:37 5 | # @File : cacheFunction.py 6 | 7 | import os 8 | import json 9 | 10 | 11 | def load_cached_movies(path): 12 | if os.path.exists(path): 13 | with open(path, 'r') as infile: 14 | movie_cache = json.load(infile) 15 | return movie_cache 16 | else: 17 | print("This database dose not exit!") 18 | return None 19 | 20 | 21 | def cache_data_to_json(path, movie_data): 22 | with open(path, 'w') as outfile: 23 | json.dump(movie_data, outfile) 24 | print("The relevant data has been automatically fetched and saved to a JSON file.") 25 | 26 | 27 | # add the 'title' to each json dict module, which will make the json module easily read by movie title 28 | def add_one_layer_to_json(data): 29 | new_dic = {} 30 | for i in range(len(data)): 31 | new_dic[data[i]['title']] = data[i] 32 | with open('add_layer_data.json', 'w') as outfile: 33 | json.dump(new_dic, outfile) 34 | return new_dic 35 | 36 | 37 | if __name__ == '__main__': 38 | # Load cached movies from the JSON file 39 | movie_cache = load_cached_movies('movie_data.json') 40 | # print(movie_cache) 41 | 42 | # Example: Retrieve cached movies 43 | if movie_cache: 44 | # Encoding the string as UTF-8 and decoding it with 'unicode_escape' 45 | # to replace escape sequences with the actual characters 46 | print(json.dumps(movie_cache, indent=4)) 47 | else: 48 | print("No cached movies found.") 49 | -------------------------------------------------------------------------------- /constant.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/9 13:35 5 | # @File : constant.py 6 | 7 | genre_id_to_name = { 8 | 28: 'Action', 9 | 12: 'Adventure', 10 | 16: 'Animation', 11 | 35: 'Comedy', 12 | 80: 'Crime', 13 | 99: 'Documentary', 14 | 18: 'Drama', 15 | 10751: 'Family', 16 | 14: 'Fantasy', 17 | 36: 'History', 18 | 27: 'Horror', 19 | 10402: 'Music', 20 | 9648: 'Mystery', 21 | 10749: 'Romance', 22 | 878: 'Science Fiction', 23 | 10770: 'TV Movie', 24 | 53: 'Thriller', 25 | 10752: 'War', 26 | 37: 'Western' 27 | } 28 | 29 | year_can_be_get = [str(i) for i in range(2000, 2023)] 30 | 31 | # Define JSON schema 32 | schema = { 33 | "type": "object", 34 | "properties": { 35 | "id": {"type": "integer"}, 36 | "title": {"type": "string"}, 37 | "year": {"type": "string", "pattern": "^\\d{4}$"}, 38 | "genres": { 39 | "type": "array", 40 | "items": {"type": "string"} 41 | }, 42 | "actors": { 43 | "type": "array", 44 | "items": {"type": "string"} 45 | }, 46 | "directors": {"type": "string"}, 47 | "overview": {"type": "string"}, 48 | "popularity": {"type": "number"}, 49 | "vote average": {"type": "number"}, 50 | "vote count": {"type": "integer"} 51 | }, 52 | "required": [ 53 | "id", 54 | "title", 55 | "year", 56 | "genres", 57 | "actors", 58 | "directors", 59 | "overview", 60 | "popularity", 61 | "vote average", 62 | "vote count" 63 | ], 64 | "additionalProperties": False 65 | } 66 | -------------------------------------------------------------------------------- /dataReddit.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/10 17:51 5 | # @File : dataReddit.py 6 | 7 | import praw 8 | import config 9 | 10 | REDDIT_CLIENT_ID = config.REDDIT_CLIENT_ID 11 | REDDIT_SECRET = config.REDDIT_SECRET 12 | REDDIT_USER_AGENT = config.REDDIT_USER_AGENT 13 | 14 | reddit = praw.Reddit( 15 | client_id=REDDIT_CLIENT_ID, 16 | client_secret=REDDIT_SECRET, 17 | user_agent=REDDIT_USER_AGENT 18 | ) 19 | 20 | 21 | def fetch_movie_reviews(subreddit_name, movie_title, limit=3): 22 | subreddit = reddit.subreddit(subreddit_name) 23 | search_query = f'title:{movie_title}' 24 | submissions = subreddit.search(search_query, limit=limit) 25 | 26 | reviews = [] 27 | for submission in submissions: 28 | # Fetch all comments, including those hidden behind "load more comments" links 29 | # submission.comments.replace_more(limit=2) 30 | comments = submission.comments.list() 31 | review = { 32 | 'title': submission.title, 33 | 'score': submission.score, 34 | 'url': submission.url, 35 | 'author': submission.author.name if submission.author else None, 36 | # 'created_utc': submission.created_utc, 37 | 'comments': comments[:10] 38 | } 39 | # print(review) 40 | reviews.append(review) 41 | 42 | return reviews 43 | 44 | 45 | def print_topics(movie_title): 46 | # Use the fetch_movie_reviews function to get movie reviews 47 | subreddit_name = 'movies' 48 | reviews = fetch_movie_reviews(subreddit_name, movie_title) 49 | for review in reviews: 50 | print(f"Title: {review['title']}") 51 | print(f"Score: {review['score']}") 52 | print(f"URL: {review['url']}") 53 | print(f"Author: {review['author']}") 54 | if review['comments']: 55 | first_comment = review['comments'][0] 56 | second_comment = review['comments'][1] 57 | print(f"First comment: {first_comment.body}") 58 | print(f"Second comment: {second_comment.body}") 59 | else: 60 | print("No comments found.") 61 | 62 | print('-' * 80) 63 | -------------------------------------------------------------------------------- /graphStruct.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/10 18:07 5 | # @File : graphStruct.py 6 | from cacheFunction import load_cached_movies 7 | import networkx as nx 8 | import plotly.graph_objects as go 9 | 10 | 11 | def similarity(movie1, movie2): 12 | genres_similarity = len(set(movie1['genres']) & set(movie2['genres'])) 13 | actors_similarity = len(set(movie1['actors']) & set(movie2['actors'])) 14 | directors_similarity = int(movie1['directors'] == movie2['directors']) 15 | 16 | return genres_similarity + actors_similarity + directors_similarity 17 | 18 | 19 | def find_similar_movies(movie_data, target_title, top_n=5): 20 | # print(movie_data) 21 | target_movie = movie_data[target_title] 22 | similarities = [(title, similarity(target_movie, movie)) for title, movie in movie_data.items() if 23 | title != target_title] 24 | similarities.sort(key=lambda x: x[1], reverse=True) 25 | return similarities[:top_n] 26 | 27 | 28 | def create_similarity_graph(movie_data, similar_movies): 29 | G = nx.Graph() 30 | for movie_title, similarity_score in similar_movies: 31 | G.add_node(movie_title, title=movie_title) 32 | G.add_edge(movie_data["target_movie"]["title"], movie_title, weight=similarity_score) 33 | 34 | return G 35 | 36 | 37 | def draw_similarity_graph_plotly(graph, target_title): 38 | edge_x = [] 39 | edge_y = [] 40 | edge_weights = [] 41 | pos = nx.spring_layout(graph, seed=42) 42 | 43 | for edge in graph.edges(): 44 | x0, y0 = pos[edge[0]] 45 | x1, y1 = pos[edge[1]] 46 | edge_x.extend([x0, x1, None]) 47 | edge_y.extend([y0, y1, None]) 48 | edge_weights.append(graph[edge[0]][edge[1]]['weight']) 49 | 50 | edge_trace = go.Scatter( 51 | x=edge_x, y=edge_y, 52 | line=dict(width=1, color='#888'), 53 | hoverinfo='text', 54 | text=edge_weights, 55 | mode='lines') 56 | 57 | node_x = [pos[node][0] for node in graph.nodes()] 58 | node_y = [pos[node][1] for node in graph.nodes()] 59 | 60 | node_trace = go.Scatter( 61 | x=node_x, y=node_y, 62 | mode='markers+text', 63 | hoverinfo='text', 64 | text=[node for node in graph.nodes()], 65 | textposition="top center", 66 | textfont=dict(size=12, color='#888'), 67 | marker=dict( 68 | showscale=False, 69 | colorscale='YlGnBu', 70 | reversescale=True, 71 | color=[], 72 | size=10, 73 | line_width=2)) 74 | 75 | fig = go.Figure(data=[edge_trace, node_trace], 76 | layout=go.Layout( 77 | title=f'Similarity Graph for {target_title}', 78 | titlefont=dict(size=16), 79 | showlegend=False, 80 | hovermode='closest', 81 | margin=dict(b=20, l=5, r=5, t=40), 82 | xaxis=dict(showgrid=False, zeroline=False, showticklabels=False), 83 | yaxis=dict(showgrid=False, zeroline=False, showticklabels=False)) 84 | ) 85 | 86 | fig.show() 87 | 88 | 89 | if __name__ == '__main__': 90 | pass 91 | # movie_data = load_cached_movies('movie_data.json') # Find the top 5 similar movies 92 | # target_title = "Gladiator" 93 | # top_similar_movies = find_similar_movies(movie_data, target_title, top_n=5) 94 | # print(f"Top 5 similar movies to {target_title}:") 95 | # for title, similarity_score in top_similar_movies: 96 | # print(f"{title} (similarity: {similarity_score})") 97 | # 98 | # # Create and draw the similarity graph 99 | # movie_data["target_movie"] = movie_data[target_title] 100 | # G = create_similarity_graph(movie_data, top_similar_movies) 101 | # draw_similarity_graph_plotly(G, target_title) 102 | -------------------------------------------------------------------------------- /checkInput.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/9 14:49 5 | # @File : checkInput.py 6 | 7 | import functools 8 | import re 9 | import constant 10 | 11 | 12 | def validate_cache_input(func): 13 | @functools.wraps(func) 14 | def wrapper(*args, **kwargs): 15 | user_input = func(*args, **kwargs) 16 | while True: 17 | if user_input == 'None': 18 | return 'movie_data.json' 19 | elif re.match(r'^[\w_-]+\.json$', str(user_input)): 20 | return user_input 21 | else: 22 | user_input = input("The input is not valid. Please enter a valid input [JSON file name or 'None']. " 23 | "'None' means the Json file name is 'movie_data.json'.") 24 | 25 | return wrapper 26 | 27 | 28 | def validate_start_input(func): 29 | @functools.wraps(func) 30 | def wrapper(*args, **kwargs): 31 | user_input = func(*args, **kwargs) 32 | while True: 33 | set_a = user_input 34 | if isinstance(args[0], list): 35 | set_b = set(args[0]) 36 | else: 37 | set_b = set(str(i) for i in args[0].keys()) 38 | # print(set_b) 39 | if set_a.issubset(set_b): 40 | # print(user_input) 41 | return list(user_input) 42 | else: 43 | user_input = set(input( 44 | "{} is invalid input! Please check again and input all you need: ".format(set_a - set_b)).split( 45 | ' ')) 46 | 47 | return wrapper 48 | 49 | 50 | def validate_choice_input(func): 51 | @functools.wraps(func) 52 | def wrapper(*args, **kwargs): 53 | user_input = func(*args, **kwargs) 54 | while True: 55 | if user_input.isdigit(): 56 | if int(user_input) in [1, 2, 3, 4, 5]: 57 | return user_input 58 | else: 59 | user_input = input("Invalid input! Please give your choice from 1 to 5: ") 60 | else: 61 | user_input = input("Invalid input! Please give your choice from 1 to 5: ") 62 | 63 | return wrapper 64 | 65 | 66 | def validate_detail_input(func): 67 | @functools.wraps(func) 68 | def wrapper(*args, **kwargs): 69 | user_input = func(*args, **kwargs) 70 | set_a = set(user_input.split(",")) 71 | # print(args[1]) 72 | set_b = set(args[1].keys()) 73 | # print(args[1].keys()) 74 | while True: 75 | set_a = set(user_input.split(",")) 76 | if set_a.issubset(set_b): 77 | return user_input.split(",") 78 | else: 79 | user_input = input("Some movies you gave are not in our recommendation list! Please check it " 80 | "and provide movie names again [use comma to separate movies] (e.g. " 81 | "Britannic,The Crossing,Vola sciusciù): ") 82 | 83 | return wrapper 84 | 85 | 86 | @validate_cache_input 87 | def self_input(path): 88 | return input(path) 89 | 90 | 91 | @validate_start_input 92 | def start_input(database=None): 93 | if isinstance(database, dict): 94 | return set(input( 95 | "Please enter the corresponding code(s) for your preferred movie genre(s) that our database must covered, " 96 | "separated by spaces. (e.g. 28 12 16): ").split(' ')) 97 | else: 98 | return set(input( 99 | "Please enter the year(s)[2000-2022] of the movie(s) you would like to be recommended, separated by " 100 | "spaces. (e.g. 2000 2001 2002) :").split(' ')) 101 | 102 | 103 | @validate_choice_input 104 | def choice_input(choice): 105 | return input(choice) 106 | 107 | 108 | @validate_detail_input 109 | def detail_input(name, data_recommend): 110 | return input(name) 111 | -------------------------------------------------------------------------------- /dataTMDb.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # @Author : Yang Yang 3 | # @UniqueName : yyanga 4 | # @Time : 2023/4/9 13:26 5 | # @File : dataTMDb.py 6 | import requests 7 | import constant 8 | from cacheFunction import cache_data_to_json 9 | from checkInput import self_input 10 | import config 11 | 12 | TMDb_API_KEY = config.TMDb_API_KEY 13 | 14 | 15 | # get information about actors and directors 16 | def fetch_movie_details(movie_id): 17 | base_url = f'https://api.themoviedb.org/3/movie/{movie_id}' 18 | params = { 19 | 'api_key': TMDb_API_KEY, 20 | 'append_to_response': 'credits', 21 | } 22 | response = requests.get(base_url, params=params) 23 | return response.json() 24 | 25 | 26 | # fetch movie from one year and one genre 27 | def fetch_movies(page=1, year=None, genre_ids=None, sort_by='popularity.desc'): 28 | base_url = 'https://api.themoviedb.org/3/discover/movie' 29 | params = { 30 | 'api_key': TMDb_API_KEY, 31 | 'page': page, 32 | 'sort_by': sort_by, 33 | } 34 | 35 | if year: 36 | params['primary_release_year'] = year 37 | 38 | if genre_ids: 39 | params['with_genres'] = ','.join(str(id) for id in genre_ids) 40 | 41 | response = requests.get(base_url, params=params) 42 | # print(response.json()) 43 | movie_results = response.json()['results'] 44 | movie_data = [] 45 | for movie in movie_results: 46 | details = fetch_movie_details(movie['id']) 47 | movie['actors'] = [cast['name'] for cast in details['credits']['cast']] 48 | movie['directors'] = [crew['name'] for crew in details['credits']['crew'] if crew['job'] == 'Director'] 49 | movie['genres'] = [constant.genre_id_to_name[genre_id] for genre_id in movie['genre_ids']] 50 | # print(movie) 51 | try: 52 | movie_info = { 53 | 'id': movie['id'], 54 | 'title': movie['title'], 55 | 'year': year, 56 | 'genres': movie['genres'], 57 | 'actors': movie['actors'][:5], 58 | 'directors': movie['directors'][0], 59 | 'overview': movie['overview'], 60 | 'popularity': movie['popularity'], 61 | 'vote average': movie['vote_average'], 62 | 'vote count': movie['vote_count'] 63 | } 64 | movie_data.append(movie_info) 65 | # print(movie_data) 66 | except: 67 | pass 68 | return movie_data 69 | 70 | 71 | def fetch_movies_more(years, genre_ids=None, flag=1): 72 | movie_data = [] 73 | 74 | if flag == 1: 75 | for year in years: 76 | print(f"Fetching movies from {year}...") 77 | movies = fetch_movies(year=year, genre_ids=genre_ids) 78 | # try: 79 | # movies = fetch_movies(year=year, genre_ids=genre_ids) 80 | # except: 81 | # print('The condition you gave is too strict. Please use less genre and more years to pick movies.') 82 | # return 0, None 83 | if flag == 2: 84 | for year in years: 85 | print(f"Fetching movies from {year}...") 86 | for genre in genre_ids: 87 | print(f"Fetching movies in {genre}...") 88 | movies = fetch_movies(year=year, genre_ids=genre_ids) 89 | # try: 90 | # movies = fetch_movies(year=year, genre_ids=genre_ids) 91 | # except: 92 | # print('The condition you gave is too strict. Please use less genre and more years to pick movies.') 93 | # return 0, None 94 | # the recommended movies need more than 6, which is good to make Graph 95 | # (we will need to give top 5 similar movies later) 96 | if len(movies) <= 6: 97 | print('The condition you gave is too strict. Please use less genre and more years to pick movies.') 98 | return 0, None 99 | path = self_input( 100 | "The relevant data will be automatically fetched and saved to a JSON file for further processing. The " 101 | "default file name is 'movie_data.json'. Do you want to change the file name? If you wish to change it, " 102 | "please enter the new file name; otherwise, enter 'None': ") 103 | cache_data_to_json(path, movies) 104 | 105 | return movies, path 106 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import shutil 2 | import time 3 | from pprint import pprint 4 | 5 | import constant 6 | from dataReddit import print_topics 7 | from dataTMDb import fetch_movies_more 8 | from cacheFunction import load_cached_movies, add_one_layer_to_json, cache_data_to_json 9 | from checkInput import start_input, self_input, choice_input, detail_input 10 | from jsonschema import validate, ValidationError 11 | 12 | from graphStruct import find_similar_movies, create_similarity_graph, draw_similarity_graph_plotly 13 | from pieStruct import pie_rating 14 | from treeStruct import print_tree 15 | 16 | 17 | def main(): 18 | terminal_size = shutil.get_terminal_size() 19 | width = terminal_size.columns 20 | print("Welcome to 'Movie Recommendation System'!") 21 | flag = input("Do you already have your own valid json database(Y/N)? [If this is the first time you use this " 22 | "system, please answer 'N']: ") 23 | yes_list = ['y', 'yes', 'yup', 'yea'] 24 | no_list = ['n', 'no', 'nope', 'nah'] 25 | while True: 26 | if flag in yes_list: 27 | path = self_input("Make sure your json file is in your program dictionary and please enter your filename:" 28 | "(e.g. data.json) ") 29 | # load data you already have 30 | movie_data = load_cached_movies(path) 31 | try: 32 | # justify the json data is valid 33 | [validate(movie_data[i], constant.schema) for i in range(len(movie_data))] 34 | break 35 | except ValidationError as e: 36 | print("JSON database is not valid. The invalid messages are:", e.message) 37 | flag = input( 38 | "Do you already have another your own valid json database(Y/N)? :") 39 | except TypeError as e: 40 | flag = input( 41 | "Do you already have another your own valid json database(Y/N)? :") 42 | elif flag in no_list: 43 | print() 44 | print("*" * width) 45 | print("OK! That's fine! Let us provide database for you! Give us your preference!!") 46 | print("*" * width) 47 | print() 48 | print("Here is the movie genre codes. ") 49 | pprint(constant.genre_id_to_name) 50 | genre_ids = start_input(constant.genre_id_to_name) 51 | years = start_input(constant.year_can_be_get) 52 | # cache data to json 53 | chose = input( 54 | "Do you want each selected movie to belong to every genre you preferred above, or is it sufficient " 55 | "for a movie to belong to just one of those genres? (1/2): ") 56 | while True: 57 | if int(chose) == 1: 58 | break 59 | elif int(chose) == 2: 60 | break 61 | else: 62 | chose = input("Your input is invalid! Please Enter again: ") 63 | while True: 64 | movie_data, path = fetch_movies_more(years, genre_ids=genre_ids, flag=int(chose)) 65 | if movie_data == 0: 66 | genre_ids = start_input(constant.genre_id_to_name) 67 | years = start_input(constant.year_can_be_get) 68 | else: 69 | break 70 | break 71 | else: 72 | flag = input("Your input is invalid! Please Enter again: ") 73 | # add the 'title' to each json dict module, which will make the json module easily read by movie title 74 | movie_data_final = add_one_layer_to_json(movie_data) 75 | add_layer_path = self_input( 76 | "The final recommend data will be saved to a JSON file for further processing. " 77 | "please enter the new file name: ") 78 | cache_data_to_json(add_layer_path, movie_data_final) 79 | # print(movie_data_final) 80 | while True: 81 | print() 82 | print("*" * width) 83 | print("Here is the overall recommended movie names based on your preference! Or the database you provided!", '\n') 84 | print(movie_data_final.keys(), '\n') 85 | print("*" * width) 86 | print("You can use the menu to do your choice!") 87 | print("1. See more details about the movie you chosen from the overall recommendation.") 88 | print("2. View the rating distribution of recommended movies.[0-10]") 89 | print("3. Find similar movies more accurately. (Deeply recommendation)") 90 | print("4. View related topics or discussion of a certain movie.") 91 | print("5. Exit!") 92 | 93 | your_choice = choice_input("Input your choice: ") 94 | if your_choice == '1': 95 | detail_need_movie = detail_input("Print the name of movie(s) you want to see its details[use comma to " 96 | "separate movies] (e.g. Britannic,The Crossing,Vola sciusciù): ", 97 | movie_data_final) 98 | print() 99 | print("Here is the detailed information represented by tree-structure.") 100 | print("-" * width) 101 | print_tree(detail_need_movie, movie_data_final) 102 | time.sleep(3) 103 | 104 | elif your_choice == '2': 105 | data_rating = load_cached_movies(add_layer_path) 106 | pie_rating(data_rating) 107 | 108 | elif your_choice == '3': 109 | # print(movie_data) 110 | target_title = detail_input("Please provide the title of your favorite movie from the recommended list. " 111 | "We will find the top 5 most similar movies based on genre and actor " 112 | "similarities for the given title:", movie_data_final)[0] 113 | top_similar_movies = find_similar_movies(movie_data_final, target_title, top_n=5) 114 | print(f"Top 5 similar movies to {target_title}:") 115 | for title, similarity_score in top_similar_movies: 116 | print(f"{title} (similarity: {similarity_score})") 117 | # Create and draw the similarity graph 118 | movie_data_final["target_movie"] = movie_data_final[target_title] 119 | G = create_similarity_graph(movie_data_final, top_similar_movies) 120 | draw_similarity_graph_plotly(G, target_title) 121 | 122 | elif your_choice == '4': 123 | movie_topics = detail_input("Print the name of movie you want to view related topics or discussion: ", 124 | movie_data_final) 125 | print_topics(movie_topics) 126 | else: 127 | break 128 | 129 | 130 | # Press the green button in the gutter to run the script. 131 | if __name__ == '__main__': 132 | main() 133 | 134 | # Load cached movies from the JSON file 135 | # movie_cache = load_cached_movies('movie_data.json') 136 | # if movie_cache: 137 | # print(json.dumps(movie_cache, indent=4)) 138 | # else: 139 | # print("No cached movies found.") 140 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Personalized Movie Recommendation System using TMDb and Reddit APIs 2 | This project is a movie recommendation system based on the TMDb and Reddit APIs in Pythjon. It can retrieve specific data based on a valid database provided by the user or according to user preferences using the APIs, and present the information in various forms (including: movie details tree display, recommended movie ratings distribution pie charts, similar movie recommendations graphes, and movie discussion board display) 3 | ## Prerequisites 4 | **Libaries:** 5 | * shutil 6 | * time 7 | * pprint 8 | * jsonschema 9 | * json 10 | * praw 11 | * requests 12 | * networkx 13 | * plotly 14 | * anytree 15 | 16 | **APIS:** 17 | Modify **config.py** —— Provide APIs, the template is as follows: 18 | 19 | ```python 20 | # Reddit APIs 21 | REDDIT_CLIENT_ID = 'client id' 22 | REDDIT_SECRET = 'secret' 23 | REDDIT_USER_AGENT = 'user agent' 24 | # TMDb API 25 | TMDb_API_KEY = 'key' 26 | ``` 27 | *tip:I will upload a documentation file named **final_submit_yyanga.pdf** on Canvas, which will include the API I used. Teaching assistants or grading teachers can directly use my API for convenient code execution.* 28 | 29 | 30 | **To obtain an API key from TMDb by yourself (The Movie Database), follow these steps:** 31 | * Create an account or sign in: Visit the TMDb website (https://www.themoviedb.org/) and either sign up for a new account or sign in to your existing account. 32 | * Request an API key: Once you are signed in, go to your account settings by clicking on your avatar in the top right corner and selecting "Settings" from the dropdown menu. Navigate to the "API" tab on the left sidebar. 33 | * Fill out the application form: Click on "Generate a new API key" and fill out the application form. Choose the type of API key you need (Developer or Professional). For most cases, the Developer option should be sufficient. Provide the required details, such as the application's name, purpose, and a brief description. 34 | * Accept the terms of use: Review and accept the TMDb API terms of use. 35 | * Receive your API key: Once your application is submitted, you will receive your API key. It will also be available in your account's API settings. 36 | 37 | **To obtain an API key from Reddit (a Client ID, Client Secret and User-Agent string), follow these steps:** 38 | * Create an account or sign in: Visit the Reddit website (https://www.reddit.com/) and either sign up for a new account or sign in to your existing account. 39 | * Go to the App Preferences page: Once you are signed in, go to the "App Preferences" page by clicking on your username in the top right corner and selecting "User Settings" from the dropdown menu. Then, navigate to the "Privacy & Security" tab and scroll down to the "App Authorization" section. Click on the "Developed Applications" tab and then click on the "Create App" or "Create Another App" button. 40 | * Fill out the application form: Provide the necessary information, such as the application's name, description, and redirect URI. Choose the "script" option for the "App type" field. The redirect URI can be set to "http://localhost:8080" if you are using the API for local development. 41 | * Create the application: Click on the "Create app" button at the bottom of the form to submit your application. 42 | * Get your Client ID and Client Secret: After successfully creating the application, you will be provided with a "Client ID" and "Client Secret". The Client ID can be found under the application's name in the "Developed Applications" section, and the Client Secret is listed as "secret" in the application's details. 43 | * Finally create a User-Agent string for 'REDDIT_USER_AGENT': The User-Agent string is a custom text that helps identify your application to the Reddit API. It should follow the format :: (by /u/). For example: python:my-reddit-app:v1.0 (by /u/exampleUser). 44 | 45 | ## Data Structure 46 | ### Tree 47 | In this project, we utilize a tree data structure to display the detailed information of a movie. The tree is constructed based on a revised JSON file. By calling the `anytree` library, we can directly display the tree structure of the JSON file. 48 | 49 | The tree implementation in this project includes the following features: 50 | 51 | - Displaying movie details hierarchically 52 | - Visualizing the JSON file as a tree structure 53 | 54 | ### Graph 55 | In this project, association graphs are used to show the top five most similar movies by calling the `networkx`. This similarity is calculated based on shared genres, directors, and the number of actors. 56 | 57 | The graphs implementation in this project includes the following features: 58 | 59 | - Use graph to show the top five most similar movies. 60 | - The similarity is calculated based on shared genres, directors, and the number of actors. By visualizing the similarities, users can easily identify movies with similar characteristics. 61 | 62 | ## Running the Program 63 | * Step 1: Execute the main script or command. 64 | * Step 2: Follow the prompts or input commands as needed. 65 | * Put your own valid json data in same dictionary if you have 66 | 67 | *tip: your own valid json data should satisfy this json style (You can also use movie_data.json I provided on github to do test):* 68 | 69 | ```python 70 | schema = { 71 | "type": "object", 72 | "properties": { 73 | "id": {"type": "integer"}, 74 | "title": {"type": "string"}, 75 | "year": {"type": "string", "pattern": "^\\d{4}$"}, 76 | "genres": { 77 | "type": "array", 78 | "items": {"type": "string"} 79 | }, 80 | "actors": { 81 | "type": "array", 82 | "items": {"type": "string"} 83 | }, 84 | "directors": {"type": "string"}, 85 | "overview": {"type": "string"}, 86 | "popularity": {"type": "number"}, 87 | "vote average": {"type": "number"}, 88 | "vote count": {"type": "integer"} 89 | }, 90 | "required": [ 91 | "id", 92 | "title", 93 | "year", 94 | "genres", 95 | "actors", 96 | "directors", 97 | "overview", 98 | "popularity", 99 | "vote average", 100 | "vote count" 101 | ], 102 | "additionalProperties": False} 103 | ``` 104 | * Give your preference about movies [geners and years] 105 | * Cache this original json data and name this json file by yourself 106 | * Cache revised json data and name this file by yourself 107 | * Use menu to choose the result you want to see 108 | 109 | * Step 3: Get the graph output or text results. 110 | 111 | ## Additional Information 112 | The modified JSON file differs from the originally saved file in that an additional layer of key is added before each movie module, named as the movie title. This makes it easier to retrieve related information for each movie by its title in subsequent data processing. 113 | 114 | The original JSON data will be saved by default in the 'movie_data.json' file, which is provided in the GitHub repository. This file can serve as a template for JSON format obtained from APIs or as a test file for users who want to provide their own data at the beginning. The updated revised JSON data will replace the 'movie_data.json' file by default (input 'None' when the system ask for a new name). If you don't want to replace the original file, you can rename it to a different name. I have uploaded 'add_data_layer.json' on GitHub, which stores the revised JSON data. You can refer to this file to understand the format of the revised JSON data. 115 | -------------------------------------------------------------------------------- /test1.json: -------------------------------------------------------------------------------- 1 | [{"id": 98, "title": "Gladiator", "year": "2000", "genres": ["Action", "Drama", "Adventure"], "actors": ["Russell Crowe", "Joaquin Phoenix", "Connie Nielsen", "Oliver Reed", "Richard Harris"], "directors": "Ridley Scott", "overview": "In the year 180, the death of emperor Marcus Aurelius throws the Roman Empire into chaos. Maximus is one of the Roman army's most capable and trusted generals and a key advisor to the emperor. As Marcus' devious son Commodus ascends to the throne, Maximus is set to be executed. He escapes, but is captured by slave traders. Renamed Spaniard and forced to become a gladiator, Maximus must battle to the death with other men for the amusement of paying audiences.", "popularity": 75.503, "vote average": 8.2, "vote count": 16305}, {"id": 955, "title": "Mission: Impossible II", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Tom Cruise", "Dougray Scott", "Thandiwe Newton", "Ving Rhames", "Richard Roxburgh"], "directors": "John Woo", "overview": "With computer genius Luther Stickell at his side and a beautiful thief on his mind, agent Ethan Hunt races across Australia and Spain to stop a former IMF agent from unleashing a genetically engineered biological weapon called Chimera. This mission, should Hunt choose to accept it, plunges him into the center of an international crisis of terrifying magnitude.", "popularity": 38.732, "vote average": 6.1, "vote count": 5719}, {"id": 4327, "title": "Charlie's Angels", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Crime", "Thriller"], "actors": ["Cameron Diaz", "Drew Barrymore", "Lucy Liu", "Bill Murray", "Sam Rockwell"], "directors": "McG", "overview": "The captivating crime-fighting trio who are masters of disguise, espionage and martial arts are back! When a devious mastermind embroils them in a plot to destroy individual privacy, the Angels, aided by their loyal sidekick Bosley, set out to bring down the bad guys. But when a terrible secret is revealed, it makes the Angels targets for assassination.", "popularity": 35.24, "vote average": 5.8, "vote count": 3737}, {"id": 10991, "title": "Pok\u00e9mon 3: The Movie", "year": "2000", "genres": ["Adventure", "Fantasy", "Animation", "Action", "Family"], "actors": ["Rica Matsumoto", "Ikue Otani", "Yuji Ueda", "Mayumi Iizuka", "Megumi Hayashibara"], "directors": "Kunihiko Yuyama", "overview": "When Molly Hale's sadness of her father's disappearance gets to her, she unknowingly uses the Unown to create her own dream world along with Entei, who she believes to be her father. When Entei kidnaps Ash's mother, Ash along with Misty & Brock invade the mansion looking for his mom and trying to stop the mysteries of Molly's Dream World and Entei!", "popularity": 34.176, "vote average": 6.5, "vote count": 550}, {"id": 2133, "title": "The Perfect Storm", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["George Clooney", "Mark Wahlberg", "Diane Lane", "John C. Reilly", "William Fichtner"], "directors": "Wolfgang Petersen", "overview": "In October 1991, a confluence of weather conditions combined to form a killer storm in the North Atlantic. Caught in the storm was the sword-fishing boat Andrea Gail.", "popularity": 30.903, "vote average": 6.4, "vote count": 1932}, {"id": 19576, "title": "One Piece: The Movie", "year": "2000", "genres": ["Action", "Animation", "Adventure", "Comedy", "Fantasy"], "actors": ["Mayumi Tanaka", "Kazuya Nakai", "Akemi Okamura", "Kappei Yamaguchi", "Yuka Imai"], "directors": "Atsuji Shimizu", "overview": "There once was a pirate known as the Great Gold Pirate Woonan, who obtained almost one-third of the world's gold. Over the course of a few years, the pirate's existence faded, and a legend grew that he disappeared with his gold to a remote island, an island pirates continue to search for. Aboard the Going Merry, Luffy and his crew, starved and reckless, are robbed of their treasure. In an attempt to get it back, they wreck the getaway ship, guided by a young boy named Tobio, who's a captured part of El Drago's pirate crew. El Drago's love for gold has driven him to look for Woonan's island, and thanks to Woonan's treasure map, he finds it. During this time, Luffy's crew have been split up, and despite their own circumstances, they must find a way to stop El Drago from obtaining Woonan's gold.", "popularity": 29.46, "vote average": 7, "vote count": 267}, {"id": 146, "title": "Crouching Tiger, Hidden Dragon", "year": "2000", "genres": ["Adventure", "Drama", "Action", "Romance"], "actors": ["Chow Yun-fat", "Michelle Yeoh", "Zhang Ziyi", "Chang Chen", "Sihung Lung"], "directors": "Ang Lee", "overview": "Two warriors in pursuit of a stolen sword and a notorious fugitive are led to an impetuous, physically-skilled, teenage nobleman's daughter, who is at a crossroads in her life.", "popularity": 27.95, "vote average": 7.4, "vote count": 2782}, {"id": 8584, "title": "Shanghai Noon", "year": "2000", "genres": ["Adventure", "Action", "Comedy", "Western"], "actors": ["Jackie Chan", "Owen Wilson", "Lucy Liu", "Xander Berkeley", "Roger Yuan"], "directors": "Tom Dey", "overview": "Chon Wang, a clumsy imperial guard trails Princess Pei Pei when she is kidnapped from the Forbidden City and transported to America. Wang follows her captors to Nevada, where he teams up with an unlikely partner, outcast outlaw Roy O'Bannon, and tries to spring the princess from her imprisonment.", "popularity": 26.378, "vote average": 6.4, "vote count": 2216}, {"id": 31347, "title": "Cardcaptor Sakura: The Sealed Card", "year": "2000", "genres": ["Comedy", "Animation", "Adventure", "Fantasy", "Romance", "Action"], "actors": ["Sakura Tange", "Motoko Kumai", "Aya Hisakawa", "Masaya Onosaka", "Megumi Ogata"], "directors": "Morio Asaka", "overview": "All of the Clow Cards have been captured, and Sakura Kinomoto, the new Master of the Cards, is preparing to play the lead in the play for the town festival. However, a new evil force is causing mysterious events all over Tomoeda, including the disappearance of Sakura's cards. With Syaoran's help, Sakura must figure out the cause of these events, and save her town.", "popularity": 22.839, "vote average": 8.2, "vote count": 156}, {"id": 7450, "title": "Titan A.E.", "year": "2000", "genres": ["Animation", "Action", "Science Fiction", "Family", "Adventure"], "actors": ["Matt Damon", "Bill Pullman", "Drew Barrymore", "John Leguizamo", "Nathan Lane"], "directors": "Gary Goldman", "overview": "A young man finds out that he holds the key to restoring hope and ensuring survival for the human race, while an alien species called the Drej are bent on mankind's destruction.", "popularity": 20.665, "vote average": 6.6, "vote count": 936}, {"id": 11678, "title": "Vertical Limit", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Chris O'Donnell", "Robin Tunney", "Bill Paxton", "Scott Glenn", "Izabella Scorupco"], "directors": "Martin Campbell", "overview": "Trapped near the summit of K2, the world's second-highest mountain, Annie Garrett radios to base camp for help. Brother Peter hears Annie's message and assembles a team to save her and her group before they succumb to K2's unforgiving elements. But, as Annie lays injured in an icy cavern, the rescuers face several terrifying events that could end the rescue attempt -- and their lives.", "popularity": 19.964, "vote average": 6, "vote count": 898}, {"id": 479, "title": "Shaft", "year": "2000", "genres": ["Action", "Adventure", "Crime", "Thriller"], "actors": ["Samuel L. Jackson", "Vanessa Williams", "Jeffrey Wright", "Christian Bale", "Busta Rhymes"], "directors": "John Singleton", "overview": "New York police detective John Shaft arrests Walter Wade Jr. for a racially motivated slaying. But the only eyewitness disappears, and Wade jumps bail for Switzerland. Two years later Wade returns to face trial, confident his money and influence will get him acquitted -- especially since he's paid a drug kingpin to kill the witness.", "popularity": 18.196, "vote average": 6, "vote count": 1109}, {"id": 5551, "title": "Space Cowboys", "year": "2000", "genres": ["Action", "Adventure", "Thriller"], "actors": ["Clint Eastwood", "Tommy Lee Jones", "Donald Sutherland", "James Garner", "James Cromwell"], "directors": "Clint Eastwood", "overview": "Frank Corvin, \u2018Hawk\u2019 Hawkins, Jerry O'Neill and \u2018Tank\u2019 Sullivan were hotdog members of Project Daedalus, the Air Force's test program for space travel, but their hopes were dashed in 1958 with the formation of NASA and the use of trained chimps. They blackmail their way into orbit when Russia's mysterious \u2018Ikon\u2019 communications satellite's orbit begins to degrade and threatens to crash to Earth.", "popularity": 17.491, "vote average": 6.4, "vote count": 1188}, {"id": 16225, "title": "Heavy Metal 2000", "year": "2000", "genres": ["Action", "Adventure", "Animation", "Fantasy", "Science Fiction"], "actors": ["Michael Ironside", "Julie Strain", "Billy Idol", "Pier Paquette", "Sonja Ball"], "directors": "Michael Coldewey", "overview": "Upon discovery of a shard of what could be the Loc-Nar, a miner named Tyler becomes possessed with an insatiable hunger for power and a thirst for immortality. On his way to the planet of youth, Tyler wipes out most of a space colony and kidnaps a beautiful young woman. His only mistake is that he doesn't kill her sister, Julie, who then sets out on a mission of rescue and revenge.", "popularity": 16.538, "vote average": 6.1, "vote count": 178}, {"id": 5491, "title": "Battlefield Earth", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Science Fiction"], "actors": ["John Travolta", "Barry Pepper", "Forest Whitaker", "Kim Coates", "Sabine Karsenti"], "directors": "Roger Christian", "overview": "In the year 3000, man is no match for the Psychlos, a greedy, manipulative race of aliens on a quest for ultimate profit. Led by the powerful Terl, the Psychlos are stripping Earth clean of its natural resources, using the broken remnants of humanity as slaves. What is left of the human race has descended into a near primitive state. After being captured, it is up to Tyler to save mankind.", "popularity": 14.298, "vote average": 3.2, "vote count": 705}, {"id": 10479, "title": "Rules of Engagement", "year": "2000", "genres": ["War", "Action", "Adventure", "Drama", "History"], "actors": ["Tommy Lee Jones", "Samuel L. Jackson", "Guy Pearce", "Ben Kingsley", "Bruce Greenwood"], "directors": "William Friedkin", "overview": "A Marine Colonel is brought to court-martial after ordering his men to fire on demonstrators surrounding the American embassy in Yemen.", "popularity": 12.39, "vote average": 6.2, "vote count": 597}, {"id": 39468, "title": "Godzilla vs. Megaguirus", "year": "2000", "genres": ["Action", "Adventure", "Science Fiction", "Horror"], "actors": ["Misato Tanaka", "Masat\u014d Ibu", "Shosuke Tanihara", "Yuriko Hoshi", "Toshiyuki Nagashima"], "directors": "Masaaki Tezuka", "overview": "In an alternate timeline the original Godzilla is never defeated and repeatedly reemerges to feed on Japan's energy sources. A new inter-dimensional weapon called the Dimension Tide is created with the intent of eliminating Godzilla. However, the new weapon might also serve as a gateway to something far more sinister.", "popularity": 10.903, "vote average": 6.7, "vote count": 141}, {"id": 11398, "title": "The Art of War", "year": "2000", "genres": ["Crime", "Action", "Adventure"], "actors": ["Wesley Snipes", "Donald Sutherland", "Maury Chaykin", "Anne Archer", "Michael Biehn"], "directors": "Christian Duguay", "overview": "When ruthless terrorists threaten to bring down the United Nations, they frame the one man they believe can stop them: an international security expert named Shaw. Now he must run from his own allies and become a solitary force for good, as he tries to stop what could become World War III.", "popularity": 9.94, "vote average": 5.7, "vote count": 423}, {"id": 31443, "title": "The President's Man", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["Chuck Norris", "Dylan Neal", "Jennifer Tung", "Ralph Waite", "Stuart Whitman"], "directors": "Michael Preece", "overview": "To many, Joshua McCord is a charismatic Asian studies professor. To the President of the United States, he's America's greatest secret weapon; a covert operative charged with only the most sensitive and dangerous missions.", "popularity": 6.953, "vote average": 4.6, "vote count": 38}, {"id": 111244, "title": "The Dukes of Hazzard: Hazzard in Hollywood", "year": "2000", "genres": ["Comedy", "Action", "Adventure", "TV Movie"], "actors": ["John Schneider", "Catherine Bach", "James Best", "Ben Jones", "Sonny Shroyer"], "directors": "Bradford May", "overview": "The Duke Boys and company travel to Hollywood to sell some musical recordings in order to raise money to build a new hospital in Hazzard County. However, when their recordings and money are stolen, they wind up on the run from mysterious hitmen, sleazy record producers, Russian gangsters, and vicious loan sharks.", "popularity": 5.78, "vote average": 5.8, "vote count": 24}] -------------------------------------------------------------------------------- /movie_data.json: -------------------------------------------------------------------------------- 1 | [{"id": 98, "title": "Gladiator", "year": "2000", "genres": ["Action", "Drama", "Adventure"], "actors": ["Russell Crowe", "Joaquin Phoenix", "Connie Nielsen", "Oliver Reed", "Richard Harris"], "directors": "Ridley Scott", "overview": "In the year 180, the death of emperor Marcus Aurelius throws the Roman Empire into chaos. Maximus is one of the Roman army's most capable and trusted generals and a key advisor to the emperor. As Marcus' devious son Commodus ascends to the throne, Maximus is set to be executed. He escapes, but is captured by slave traders. Renamed Spaniard and forced to become a gladiator, Maximus must battle to the death with other men for the amusement of paying audiences.", "popularity": 75.503, "vote average": 8.2, "vote count": 16305}, {"id": 955, "title": "Mission: Impossible II", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Tom Cruise", "Dougray Scott", "Thandiwe Newton", "Ving Rhames", "Richard Roxburgh"], "directors": "John Woo", "overview": "With computer genius Luther Stickell at his side and a beautiful thief on his mind, agent Ethan Hunt races across Australia and Spain to stop a former IMF agent from unleashing a genetically engineered biological weapon called Chimera. This mission, should Hunt choose to accept it, plunges him into the center of an international crisis of terrifying magnitude.", "popularity": 38.732, "vote average": 6.1, "vote count": 5719}, {"id": 4327, "title": "Charlie's Angels", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Crime", "Thriller"], "actors": ["Cameron Diaz", "Drew Barrymore", "Lucy Liu", "Bill Murray", "Sam Rockwell"], "directors": "McG", "overview": "The captivating crime-fighting trio who are masters of disguise, espionage and martial arts are back! When a devious mastermind embroils them in a plot to destroy individual privacy, the Angels, aided by their loyal sidekick Bosley, set out to bring down the bad guys. But when a terrible secret is revealed, it makes the Angels targets for assassination.", "popularity": 35.24, "vote average": 5.8, "vote count": 3737}, {"id": 10991, "title": "Pok\u00e9mon 3: The Movie", "year": "2000", "genres": ["Adventure", "Fantasy", "Animation", "Action", "Family"], "actors": ["Rica Matsumoto", "Ikue Otani", "Yuji Ueda", "Mayumi Iizuka", "Megumi Hayashibara"], "directors": "Kunihiko Yuyama", "overview": "When Molly Hale's sadness of her father's disappearance gets to her, she unknowingly uses the Unown to create her own dream world along with Entei, who she believes to be her father. When Entei kidnaps Ash's mother, Ash along with Misty & Brock invade the mansion looking for his mom and trying to stop the mysteries of Molly's Dream World and Entei!", "popularity": 34.176, "vote average": 6.5, "vote count": 550}, {"id": 2133, "title": "The Perfect Storm", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["George Clooney", "Mark Wahlberg", "Diane Lane", "John C. Reilly", "William Fichtner"], "directors": "Wolfgang Petersen", "overview": "In October 1991, a confluence of weather conditions combined to form a killer storm in the North Atlantic. Caught in the storm was the sword-fishing boat Andrea Gail.", "popularity": 30.903, "vote average": 6.4, "vote count": 1932}, {"id": 19576, "title": "One Piece: The Movie", "year": "2000", "genres": ["Action", "Animation", "Adventure", "Comedy", "Fantasy"], "actors": ["Mayumi Tanaka", "Kazuya Nakai", "Akemi Okamura", "Kappei Yamaguchi", "Yuka Imai"], "directors": "Atsuji Shimizu", "overview": "There once was a pirate known as the Great Gold Pirate Woonan, who obtained almost one-third of the world's gold. Over the course of a few years, the pirate's existence faded, and a legend grew that he disappeared with his gold to a remote island, an island pirates continue to search for. Aboard the Going Merry, Luffy and his crew, starved and reckless, are robbed of their treasure. In an attempt to get it back, they wreck the getaway ship, guided by a young boy named Tobio, who's a captured part of El Drago's pirate crew. El Drago's love for gold has driven him to look for Woonan's island, and thanks to Woonan's treasure map, he finds it. During this time, Luffy's crew have been split up, and despite their own circumstances, they must find a way to stop El Drago from obtaining Woonan's gold.", "popularity": 29.46, "vote average": 7, "vote count": 267}, {"id": 146, "title": "Crouching Tiger, Hidden Dragon", "year": "2000", "genres": ["Adventure", "Drama", "Action", "Romance"], "actors": ["Chow Yun-fat", "Michelle Yeoh", "Zhang Ziyi", "Chang Chen", "Sihung Lung"], "directors": "Ang Lee", "overview": "Two warriors in pursuit of a stolen sword and a notorious fugitive are led to an impetuous, physically-skilled, teenage nobleman's daughter, who is at a crossroads in her life.", "popularity": 27.95, "vote average": 7.4, "vote count": 2782}, {"id": 8584, "title": "Shanghai Noon", "year": "2000", "genres": ["Adventure", "Action", "Comedy", "Western"], "actors": ["Jackie Chan", "Owen Wilson", "Lucy Liu", "Xander Berkeley", "Roger Yuan"], "directors": "Tom Dey", "overview": "Chon Wang, a clumsy imperial guard trails Princess Pei Pei when she is kidnapped from the Forbidden City and transported to America. Wang follows her captors to Nevada, where he teams up with an unlikely partner, outcast outlaw Roy O'Bannon, and tries to spring the princess from her imprisonment.", "popularity": 26.378, "vote average": 6.4, "vote count": 2216}, {"id": 31347, "title": "Cardcaptor Sakura: The Sealed Card", "year": "2000", "genres": ["Comedy", "Animation", "Adventure", "Fantasy", "Romance", "Action"], "actors": ["Sakura Tange", "Motoko Kumai", "Aya Hisakawa", "Masaya Onosaka", "Megumi Ogata"], "directors": "Morio Asaka", "overview": "All of the Clow Cards have been captured, and Sakura Kinomoto, the new Master of the Cards, is preparing to play the lead in the play for the town festival. However, a new evil force is causing mysterious events all over Tomoeda, including the disappearance of Sakura's cards. With Syaoran's help, Sakura must figure out the cause of these events, and save her town.", "popularity": 22.839, "vote average": 8.2, "vote count": 156}, {"id": 7450, "title": "Titan A.E.", "year": "2000", "genres": ["Animation", "Action", "Science Fiction", "Family", "Adventure"], "actors": ["Matt Damon", "Bill Pullman", "Drew Barrymore", "John Leguizamo", "Nathan Lane"], "directors": "Gary Goldman", "overview": "A young man finds out that he holds the key to restoring hope and ensuring survival for the human race, while an alien species called the Drej are bent on mankind's destruction.", "popularity": 20.665, "vote average": 6.6, "vote count": 936}, {"id": 11678, "title": "Vertical Limit", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Chris O'Donnell", "Robin Tunney", "Bill Paxton", "Scott Glenn", "Izabella Scorupco"], "directors": "Martin Campbell", "overview": "Trapped near the summit of K2, the world's second-highest mountain, Annie Garrett radios to base camp for help. Brother Peter hears Annie's message and assembles a team to save her and her group before they succumb to K2's unforgiving elements. But, as Annie lays injured in an icy cavern, the rescuers face several terrifying events that could end the rescue attempt -- and their lives.", "popularity": 19.964, "vote average": 6, "vote count": 898}, {"id": 479, "title": "Shaft", "year": "2000", "genres": ["Action", "Adventure", "Crime", "Thriller"], "actors": ["Samuel L. Jackson", "Vanessa Williams", "Jeffrey Wright", "Christian Bale", "Busta Rhymes"], "directors": "John Singleton", "overview": "New York police detective John Shaft arrests Walter Wade Jr. for a racially motivated slaying. But the only eyewitness disappears, and Wade jumps bail for Switzerland. Two years later Wade returns to face trial, confident his money and influence will get him acquitted -- especially since he's paid a drug kingpin to kill the witness.", "popularity": 18.196, "vote average": 6, "vote count": 1109}, {"id": 5551, "title": "Space Cowboys", "year": "2000", "genres": ["Action", "Adventure", "Thriller"], "actors": ["Clint Eastwood", "Tommy Lee Jones", "Donald Sutherland", "James Garner", "James Cromwell"], "directors": "Clint Eastwood", "overview": "Frank Corvin, \u2018Hawk\u2019 Hawkins, Jerry O'Neill and \u2018Tank\u2019 Sullivan were hotdog members of Project Daedalus, the Air Force's test program for space travel, but their hopes were dashed in 1958 with the formation of NASA and the use of trained chimps. They blackmail their way into orbit when Russia's mysterious \u2018Ikon\u2019 communications satellite's orbit begins to degrade and threatens to crash to Earth.", "popularity": 17.491, "vote average": 6.4, "vote count": 1188}, {"id": 16225, "title": "Heavy Metal 2000", "year": "2000", "genres": ["Action", "Adventure", "Animation", "Fantasy", "Science Fiction"], "actors": ["Michael Ironside", "Julie Strain", "Billy Idol", "Pier Paquette", "Sonja Ball"], "directors": "Michael Coldewey", "overview": "Upon discovery of a shard of what could be the Loc-Nar, a miner named Tyler becomes possessed with an insatiable hunger for power and a thirst for immortality. On his way to the planet of youth, Tyler wipes out most of a space colony and kidnaps a beautiful young woman. His only mistake is that he doesn't kill her sister, Julie, who then sets out on a mission of rescue and revenge.", "popularity": 16.538, "vote average": 6.1, "vote count": 178}, {"id": 5491, "title": "Battlefield Earth", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Science Fiction"], "actors": ["John Travolta", "Barry Pepper", "Forest Whitaker", "Kim Coates", "Sabine Karsenti"], "directors": "Roger Christian", "overview": "In the year 3000, man is no match for the Psychlos, a greedy, manipulative race of aliens on a quest for ultimate profit. Led by the powerful Terl, the Psychlos are stripping Earth clean of its natural resources, using the broken remnants of humanity as slaves. What is left of the human race has descended into a near primitive state. After being captured, it is up to Tyler to save mankind.", "popularity": 14.298, "vote average": 3.2, "vote count": 705}, {"id": 10479, "title": "Rules of Engagement", "year": "2000", "genres": ["War", "Action", "Adventure", "Drama", "History"], "actors": ["Tommy Lee Jones", "Samuel L. Jackson", "Guy Pearce", "Ben Kingsley", "Bruce Greenwood"], "directors": "William Friedkin", "overview": "A Marine Colonel is brought to court-martial after ordering his men to fire on demonstrators surrounding the American embassy in Yemen.", "popularity": 12.39, "vote average": 6.2, "vote count": 597}, {"id": 39468, "title": "Godzilla vs. Megaguirus", "year": "2000", "genres": ["Action", "Adventure", "Science Fiction", "Horror"], "actors": ["Misato Tanaka", "Masat\u014d Ibu", "Shosuke Tanihara", "Yuriko Hoshi", "Toshiyuki Nagashima"], "directors": "Masaaki Tezuka", "overview": "In an alternate timeline the original Godzilla is never defeated and repeatedly reemerges to feed on Japan's energy sources. A new inter-dimensional weapon called the Dimension Tide is created with the intent of eliminating Godzilla. However, the new weapon might also serve as a gateway to something far more sinister.", "popularity": 10.903, "vote average": 6.7, "vote count": 141}, {"id": 11398, "title": "The Art of War", "year": "2000", "genres": ["Crime", "Action", "Adventure"], "actors": ["Wesley Snipes", "Donald Sutherland", "Maury Chaykin", "Anne Archer", "Michael Biehn"], "directors": "Christian Duguay", "overview": "When ruthless terrorists threaten to bring down the United Nations, they frame the one man they believe can stop them: an international security expert named Shaw. Now he must run from his own allies and become a solitary force for good, as he tries to stop what could become World War III.", "popularity": 9.94, "vote average": 5.7, "vote count": 423}, {"id": 31443, "title": "The President's Man", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["Chuck Norris", "Dylan Neal", "Jennifer Tung", "Ralph Waite", "Stuart Whitman"], "directors": "Michael Preece", "overview": "To many, Joshua McCord is a charismatic Asian studies professor. To the President of the United States, he's America's greatest secret weapon; a covert operative charged with only the most sensitive and dangerous missions.", "popularity": 6.953, "vote average": 4.6, "vote count": 38}, {"id": 111244, "title": "The Dukes of Hazzard: Hazzard in Hollywood", "year": "2000", "genres": ["Comedy", "Action", "Adventure", "TV Movie"], "actors": ["John Schneider", "Catherine Bach", "James Best", "Ben Jones", "Sonny Shroyer"], "directors": "Bradford May", "overview": "The Duke Boys and company travel to Hollywood to sell some musical recordings in order to raise money to build a new hospital in Hazzard County. However, when their recordings and money are stolen, they wind up on the run from mysterious hitmen, sleazy record producers, Russian gangsters, and vicious loan sharks.", "popularity": 5.78, "vote average": 5.8, "vote count": 24}] 2 | -------------------------------------------------------------------------------- /add_layer_data.json: -------------------------------------------------------------------------------- 1 | {"Gladiator": {"id": 98, "title": "Gladiator", "year": "2000", "genres": ["Action", "Drama", "Adventure"], "actors": ["Russell Crowe", "Joaquin Phoenix", "Connie Nielsen", "Oliver Reed", "Richard Harris"], "directors": "Ridley Scott", "overview": "In the year 180, the death of emperor Marcus Aurelius throws the Roman Empire into chaos. Maximus is one of the Roman army's most capable and trusted generals and a key advisor to the emperor. As Marcus' devious son Commodus ascends to the throne, Maximus is set to be executed. He escapes, but is captured by slave traders. Renamed Spaniard and forced to become a gladiator, Maximus must battle to the death with other men for the amusement of paying audiences.", "popularity": 75.503, "vote average": 8.2, "vote count": 16305}, "Mission: Impossible II": {"id": 955, "title": "Mission: Impossible II", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Tom Cruise", "Dougray Scott", "Thandiwe Newton", "Ving Rhames", "Richard Roxburgh"], "directors": "John Woo", "overview": "With computer genius Luther Stickell at his side and a beautiful thief on his mind, agent Ethan Hunt races across Australia and Spain to stop a former IMF agent from unleashing a genetically engineered biological weapon called Chimera. This mission, should Hunt choose to accept it, plunges him into the center of an international crisis of terrifying magnitude.", "popularity": 38.732, "vote average": 6.1, "vote count": 5719}, "Charlie's Angels": {"id": 4327, "title": "Charlie's Angels", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Crime", "Thriller"], "actors": ["Cameron Diaz", "Drew Barrymore", "Lucy Liu", "Bill Murray", "Sam Rockwell"], "directors": "McG", "overview": "The captivating crime-fighting trio who are masters of disguise, espionage and martial arts are back! When a devious mastermind embroils them in a plot to destroy individual privacy, the Angels, aided by their loyal sidekick Bosley, set out to bring down the bad guys. But when a terrible secret is revealed, it makes the Angels targets for assassination.", "popularity": 35.24, "vote average": 5.8, "vote count": 3737}, "Pok\u00e9mon 3: The Movie": {"id": 10991, "title": "Pok\u00e9mon 3: The Movie", "year": "2000", "genres": ["Adventure", "Fantasy", "Animation", "Action", "Family"], "actors": ["Rica Matsumoto", "Ikue Otani", "Yuji Ueda", "Mayumi Iizuka", "Megumi Hayashibara"], "directors": "Kunihiko Yuyama", "overview": "When Molly Hale's sadness of her father's disappearance gets to her, she unknowingly uses the Unown to create her own dream world along with Entei, who she believes to be her father. When Entei kidnaps Ash's mother, Ash along with Misty & Brock invade the mansion looking for his mom and trying to stop the mysteries of Molly's Dream World and Entei!", "popularity": 34.176, "vote average": 6.5, "vote count": 550}, "The Perfect Storm": {"id": 2133, "title": "The Perfect Storm", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["George Clooney", "Mark Wahlberg", "Diane Lane", "John C. Reilly", "William Fichtner"], "directors": "Wolfgang Petersen", "overview": "In October 1991, a confluence of weather conditions combined to form a killer storm in the North Atlantic. Caught in the storm was the sword-fishing boat Andrea Gail.", "popularity": 30.903, "vote average": 6.4, "vote count": 1932}, "One Piece: The Movie": {"id": 19576, "title": "One Piece: The Movie", "year": "2000", "genres": ["Action", "Animation", "Adventure", "Comedy", "Fantasy"], "actors": ["Mayumi Tanaka", "Kazuya Nakai", "Akemi Okamura", "Kappei Yamaguchi", "Yuka Imai"], "directors": "Atsuji Shimizu", "overview": "There once was a pirate known as the Great Gold Pirate Woonan, who obtained almost one-third of the world's gold. Over the course of a few years, the pirate's existence faded, and a legend grew that he disappeared with his gold to a remote island, an island pirates continue to search for. Aboard the Going Merry, Luffy and his crew, starved and reckless, are robbed of their treasure. In an attempt to get it back, they wreck the getaway ship, guided by a young boy named Tobio, who's a captured part of El Drago's pirate crew. El Drago's love for gold has driven him to look for Woonan's island, and thanks to Woonan's treasure map, he finds it. During this time, Luffy's crew have been split up, and despite their own circumstances, they must find a way to stop El Drago from obtaining Woonan's gold.", "popularity": 29.46, "vote average": 7, "vote count": 267}, "Crouching Tiger, Hidden Dragon": {"id": 146, "title": "Crouching Tiger, Hidden Dragon", "year": "2000", "genres": ["Adventure", "Drama", "Action", "Romance"], "actors": ["Chow Yun-fat", "Michelle Yeoh", "Zhang Ziyi", "Chang Chen", "Sihung Lung"], "directors": "Ang Lee", "overview": "Two warriors in pursuit of a stolen sword and a notorious fugitive are led to an impetuous, physically-skilled, teenage nobleman's daughter, who is at a crossroads in her life.", "popularity": 27.95, "vote average": 7.4, "vote count": 2782}, "Shanghai Noon": {"id": 8584, "title": "Shanghai Noon", "year": "2000", "genres": ["Adventure", "Action", "Comedy", "Western"], "actors": ["Jackie Chan", "Owen Wilson", "Lucy Liu", "Xander Berkeley", "Roger Yuan"], "directors": "Tom Dey", "overview": "Chon Wang, a clumsy imperial guard trails Princess Pei Pei when she is kidnapped from the Forbidden City and transported to America. Wang follows her captors to Nevada, where he teams up with an unlikely partner, outcast outlaw Roy O'Bannon, and tries to spring the princess from her imprisonment.", "popularity": 26.378, "vote average": 6.4, "vote count": 2216}, "Cardcaptor Sakura: The Sealed Card": {"id": 31347, "title": "Cardcaptor Sakura: The Sealed Card", "year": "2000", "genres": ["Comedy", "Animation", "Adventure", "Fantasy", "Romance", "Action"], "actors": ["Sakura Tange", "Motoko Kumai", "Aya Hisakawa", "Masaya Onosaka", "Megumi Ogata"], "directors": "Morio Asaka", "overview": "All of the Clow Cards have been captured, and Sakura Kinomoto, the new Master of the Cards, is preparing to play the lead in the play for the town festival. However, a new evil force is causing mysterious events all over Tomoeda, including the disappearance of Sakura's cards. With Syaoran's help, Sakura must figure out the cause of these events, and save her town.", "popularity": 22.839, "vote average": 8.2, "vote count": 156}, "Titan A.E.": {"id": 7450, "title": "Titan A.E.", "year": "2000", "genres": ["Animation", "Action", "Science Fiction", "Family", "Adventure"], "actors": ["Matt Damon", "Bill Pullman", "Drew Barrymore", "John Leguizamo", "Nathan Lane"], "directors": "Gary Goldman", "overview": "A young man finds out that he holds the key to restoring hope and ensuring survival for the human race, while an alien species called the Drej are bent on mankind's destruction.", "popularity": 20.665, "vote average": 6.6, "vote count": 936}, "Vertical Limit": {"id": 11678, "title": "Vertical Limit", "year": "2000", "genres": ["Adventure", "Action", "Thriller"], "actors": ["Chris O'Donnell", "Robin Tunney", "Bill Paxton", "Scott Glenn", "Izabella Scorupco"], "directors": "Martin Campbell", "overview": "Trapped near the summit of K2, the world's second-highest mountain, Annie Garrett radios to base camp for help. Brother Peter hears Annie's message and assembles a team to save her and her group before they succumb to K2's unforgiving elements. But, as Annie lays injured in an icy cavern, the rescuers face several terrifying events that could end the rescue attempt -- and their lives.", "popularity": 19.964, "vote average": 6, "vote count": 898}, "Shaft": {"id": 479, "title": "Shaft", "year": "2000", "genres": ["Action", "Adventure", "Crime", "Thriller"], "actors": ["Samuel L. Jackson", "Vanessa Williams", "Jeffrey Wright", "Christian Bale", "Busta Rhymes"], "directors": "John Singleton", "overview": "New York police detective John Shaft arrests Walter Wade Jr. for a racially motivated slaying. But the only eyewitness disappears, and Wade jumps bail for Switzerland. Two years later Wade returns to face trial, confident his money and influence will get him acquitted -- especially since he's paid a drug kingpin to kill the witness.", "popularity": 18.196, "vote average": 6, "vote count": 1109}, "Space Cowboys": {"id": 5551, "title": "Space Cowboys", "year": "2000", "genres": ["Action", "Adventure", "Thriller"], "actors": ["Clint Eastwood", "Tommy Lee Jones", "Donald Sutherland", "James Garner", "James Cromwell"], "directors": "Clint Eastwood", "overview": "Frank Corvin, \u2018Hawk\u2019 Hawkins, Jerry O'Neill and \u2018Tank\u2019 Sullivan were hotdog members of Project Daedalus, the Air Force's test program for space travel, but their hopes were dashed in 1958 with the formation of NASA and the use of trained chimps. They blackmail their way into orbit when Russia's mysterious \u2018Ikon\u2019 communications satellite's orbit begins to degrade and threatens to crash to Earth.", "popularity": 17.491, "vote average": 6.4, "vote count": 1188}, "Heavy Metal 2000": {"id": 16225, "title": "Heavy Metal 2000", "year": "2000", "genres": ["Action", "Adventure", "Animation", "Fantasy", "Science Fiction"], "actors": ["Michael Ironside", "Julie Strain", "Billy Idol", "Pier Paquette", "Sonja Ball"], "directors": "Michael Coldewey", "overview": "Upon discovery of a shard of what could be the Loc-Nar, a miner named Tyler becomes possessed with an insatiable hunger for power and a thirst for immortality. On his way to the planet of youth, Tyler wipes out most of a space colony and kidnaps a beautiful young woman. His only mistake is that he doesn't kill her sister, Julie, who then sets out on a mission of rescue and revenge.", "popularity": 16.538, "vote average": 6.1, "vote count": 178}, "Battlefield Earth": {"id": 5491, "title": "Battlefield Earth", "year": "2000", "genres": ["Action", "Adventure", "Comedy", "Science Fiction"], "actors": ["John Travolta", "Barry Pepper", "Forest Whitaker", "Kim Coates", "Sabine Karsenti"], "directors": "Roger Christian", "overview": "In the year 3000, man is no match for the Psychlos, a greedy, manipulative race of aliens on a quest for ultimate profit. Led by the powerful Terl, the Psychlos are stripping Earth clean of its natural resources, using the broken remnants of humanity as slaves. What is left of the human race has descended into a near primitive state. After being captured, it is up to Tyler to save mankind.", "popularity": 14.298, "vote average": 3.2, "vote count": 705}, "Rules of Engagement": {"id": 10479, "title": "Rules of Engagement", "year": "2000", "genres": ["War", "Action", "Adventure", "Drama", "History"], "actors": ["Tommy Lee Jones", "Samuel L. Jackson", "Guy Pearce", "Ben Kingsley", "Bruce Greenwood"], "directors": "William Friedkin", "overview": "A Marine Colonel is brought to court-martial after ordering his men to fire on demonstrators surrounding the American embassy in Yemen.", "popularity": 12.39, "vote average": 6.2, "vote count": 597}, "Godzilla vs. Megaguirus": {"id": 39468, "title": "Godzilla vs. Megaguirus", "year": "2000", "genres": ["Action", "Adventure", "Science Fiction", "Horror"], "actors": ["Misato Tanaka", "Masat\u014d Ibu", "Shosuke Tanihara", "Yuriko Hoshi", "Toshiyuki Nagashima"], "directors": "Masaaki Tezuka", "overview": "In an alternate timeline the original Godzilla is never defeated and repeatedly reemerges to feed on Japan's energy sources. A new inter-dimensional weapon called the Dimension Tide is created with the intent of eliminating Godzilla. However, the new weapon might also serve as a gateway to something far more sinister.", "popularity": 10.903, "vote average": 6.7, "vote count": 141}, "The Art of War": {"id": 11398, "title": "The Art of War", "year": "2000", "genres": ["Crime", "Action", "Adventure"], "actors": ["Wesley Snipes", "Donald Sutherland", "Maury Chaykin", "Anne Archer", "Michael Biehn"], "directors": "Christian Duguay", "overview": "When ruthless terrorists threaten to bring down the United Nations, they frame the one man they believe can stop them: an international security expert named Shaw. Now he must run from his own allies and become a solitary force for good, as he tries to stop what could become World War III.", "popularity": 9.94, "vote average": 5.7, "vote count": 423}, "The President's Man": {"id": 31443, "title": "The President's Man", "year": "2000", "genres": ["Action", "Adventure", "Drama", "Thriller"], "actors": ["Chuck Norris", "Dylan Neal", "Jennifer Tung", "Ralph Waite", "Stuart Whitman"], "directors": "Michael Preece", "overview": "To many, Joshua McCord is a charismatic Asian studies professor. To the President of the United States, he's America's greatest secret weapon; a covert operative charged with only the most sensitive and dangerous missions.", "popularity": 6.953, "vote average": 4.6, "vote count": 38}, "The Dukes of Hazzard: Hazzard in Hollywood": {"id": 111244, "title": "The Dukes of Hazzard: Hazzard in Hollywood", "year": "2000", "genres": ["Comedy", "Action", "Adventure", "TV Movie"], "actors": ["John Schneider", "Catherine Bach", "James Best", "Ben Jones", "Sonny Shroyer"], "directors": "Bradford May", "overview": "The Duke Boys and company travel to Hollywood to sell some musical recordings in order to raise money to build a new hospital in Hazzard County. However, when their recordings and money are stolen, they wind up on the run from mysterious hitmen, sleazy record producers, Russian gangsters, and vicious loan sharks.", "popularity": 5.78, "vote average": 5.8, "vote count": 24}} --------------------------------------------------------------------------------