├── .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 |
4 |
5 |
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}}
--------------------------------------------------------------------------------