diff --git a/video_metadata/static/style.css b/video_metadata/static/style.css
index 419cbc1..fab512a 100644
--- a/video_metadata/static/style.css
+++ b/video_metadata/static/style.css
@@ -25,5 +25,5 @@ nav ul li a, nav ul li span, header .action { display: block; padding: 0.5rem; }
input { color: #333; background-color: #eee; }
input.danger { color: #cc2f2e; }
input[type=submit] { align-self: start; min-width: 10em; }
-.debug { background: lightgrey; padding: 1em; overflow: auto; }
+.debug { background: lightgrey; padding: 1em; overflow: auto; border: 1px solid darkgrey }
.search_result { max-width: 400px; padding: 1em; background: aquamarine; }
diff --git a/video_metadata/templates/tmdb/query.html b/video_metadata/templates/tmdb/query.html
index e8573f6..707c879 100644
--- a/video_metadata/templates/tmdb/query.html
+++ b/video_metadata/templates/tmdb/query.html
@@ -21,7 +21,7 @@
- Release Date: {{ r.release_date }}
- Description:
-
{{ r.description }}
+ {{ r.overview }}
diff --git a/video_metadata/views/tmdb.py b/video_metadata/views/tmdb.py
index 522990d..45bb365 100644
--- a/video_metadata/views/tmdb.py
+++ b/video_metadata/views/tmdb.py
@@ -5,6 +5,7 @@ from datetime import date
from enum import Enum
import json
import re
+from sqlite3 import DatabaseError
import ssl
from urllib.error import URLError, HTTPError
import urllib.parse
@@ -13,6 +14,7 @@ import urllib.request
from flask import Blueprint, current_app, flash, request, render_template
from .. import util
+from .. import db
####################
@@ -58,8 +60,8 @@ class view_result(object):
def __init__(self):
self.id = 0
self.title = ''
- self.date = 0
- self.description = ''
+ self.release_date = 0
+ self.overview = ''
self.genre_ids = []
self.original_language = ''
self.poster_path = 'no_image.png'
@@ -70,7 +72,7 @@ class view_result(object):
self.id = result['id']
self.title = result['original_title']
self.release_date = result['release_date']
- self.description = result['overview']
+ self.overview = result['overview']
self.genre_ids = result['genre_ids']
self.original_language = result['original_language']
self.poster_path = result['poster_path']
@@ -101,20 +103,27 @@ def query_movie():
query.raw_query_str = request.args['query']
if query.raw_query_str and parseQueryStr(query):
- if makeQuery(query, response):
+ if isQueryCached(query.parsed_query_str):
+ view_results = makeLocalQuery(query)
+ else:
+ makeTMDBQuery(query, response)
+
try:
response.parsed_response = json.loads(response.response_body)
- response.result_count = response.parsed_response['total_results']
except json.JSONDecodeError as e:
view_data.errors.append(e)
- for result in response.parsed_response['results']:
- copy = view_result()
- view_results.append(copy.copy_result(result, query.query_type))
- else:
- query.errors.append('{}, error making query'.format(util.getFunctionName))
- else:
- errors.append('{}, error in query string'.format(util.getFunctionName()))
+ if 'total_results' in response.parsed_response:
+ response.result_count = response.parsed_response['total_results']
+
+ # TODO: it's possible for the query results to span multiple 'pages'
+ # see) https://developers.themoviedb.org/3/search/search-movies
+ if 'results' in response.parsed_response:
+ for result in response.parsed_response['results']:
+ copy = view_result()
+ view_results.append(copy.copy_result(result, query.query_type))
+
+ storeTMDBQueryResults(query, view_results)
errors.extend(query.errors)
errors.extend(response.errors)
@@ -154,12 +163,54 @@ def parseQueryStr(query_obj):
# TODO: parse tv show titles
if query_obj.query_type == query_type.UNKNOWN:
- query_obj.errors.append('%s: unable to determine query type' % util.getFunctionName())
+ query_obj.errors.append('{}: unable to determine query type'.format(util.getFunctionName()))
return False
return True
-def makeQuery(query_obj, response_obj):
+def isQueryCached(query_str):
+ conn = db.get_db()
+ cur = conn.cursor()
+ cur.execute('SELECT COUNT(*) FROM movie_queries WHERE query=?', (query_str,))
+ count = cur.fetchone()[0]
+
+ print('DEBUG: {}, count: "{}"'.format(util.getFunctionName(), count))
+
+ return (count > 0)
+
+# NOTE: returns list of 'view_result' objects that match the query_obj.parsed_query_str
+# stored in the local db cache
+def makeLocalQuery(query_obj):
+ conn = db.get_db()
+ cur = conn.cursor()
+ results = []
+
+ if query_obj.query_type == query_type.MOVIE:
+ cur.execute('SELECT * FROM movie_queries WHERE query=?', (query_obj.parsed_query_str,))
+ elif query_obj.query_type == query_type.TV_SHOW:
+ pass
+
+ print('DEBUG: {}, number of rows matched: "{}"'.format(
+ util.getFunctionName(), len(cur.fetchall()))
+ )
+
+ if len(cur.fetchall()) > 0:
+ print('DEBUG: {}(), query string "{}", match found in local db'.format(
+ util.getFunctionName(), query_obj.parsed_query_str)
+ )
+
+ for row in cur:
+ vr = view_result()
+ vr.title = row["title"]
+ results.append(vr)
+ else:
+ print('DEBUG: {}(), query string "{}", no matches found in local db'.format(
+ util.getFunctionName(), query_obj.parsed_query_str)
+ )
+
+ return results
+
+def makeTMDBQuery(query_obj, response_obj):
if query_obj.query_type == query_type.MOVIE:
search_part = TMDB_SEARCH_MOVIE
elif query_obj.query_type == query_type.TV_SHOW:
@@ -208,3 +259,29 @@ def makeQuery(query_obj, response_obj):
return True
+def storeTMDBQueryResults(query_obj, result_list):
+ conn = db.get_db()
+ cur = conn.cursor()
+
+ print('DEBUG: {}, adding query string "{}" into local cache'.format(
+ util.getFunctionName(), query_obj.parsed_query_str)
+ )
+
+ try:
+ cur.execute('INSERT INTO movie_queries(query, year) VALUES (?, ?)',
+ (query_obj.parsed_query_str, query_obj.movie_year)
+ )
+ except DatabaseError as e:
+ query_obj.errors.append(e)
+
+ for result in result_list:
+ try:
+ cur.execute("INSERT INTO movie_details("
+ + "movie_id, title, overview, release_date, poster_path)"
+ + " VALUES (?,?,?,?,?)",
+ (result.id, result.title, result.overview, result.release_date, result.poster_path)
+ )
+ except DatabaseError as e:
+ query_obj.errors.append(e)
+
+ conn.commit()