Browse Source

updating tmdb query display

master
cinnaboot 7 years ago
parent
commit
aac83d989c
  1. 1
      video_metadata/static/style.css
  2. 8
      video_metadata/templates/tmdb/query.html
  3. 115
      video_metadata/views/tmdb.py

1
video_metadata/static/style.css

@ -26,3 +26,4 @@ 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; }
.search_result { max-width: 400px; padding: 1em; background: aquamarine; }

8
video_metadata/templates/tmdb/query.html

@ -15,13 +15,13 @@
<div id="search_results">
<h2>Query Results</h2>
{% for r in view_data.response_object.results %}
<div>
<h3>{{ r.original_title }}</h3>
{% for r in view_data %}
<div class="search_result">
<h3><a href="{{ r.tmdb_link }}">{{ r.title }}</a></h3>
<ul>
<li>Release Date: {{ r.release_date }}</li>
<li>Description:
<p>{{ r.overview }}</p>
<p>{{ r.description }}</p>
</li>
</ul>
</div>

115
video_metadata/views/tmdb.py

@ -4,7 +4,6 @@ from contextlib import closing
from datetime import date
from enum import Enum
import json
from pprint import pprint
import re
import ssl
from urllib.error import URLError, HTTPError
@ -20,9 +19,11 @@ from .. import util
# constants
bp = Blueprint('tmdb', __name__, url_prefix='/tmdb')
TMDB_URL = 'https://api.themoviedb.org'
TMDB_API_URL = 'https://api.themoviedb.org'
TMDB_SEARCH_MOVIE = '/3/search/movie'
TMDB_SEARCH_TV = '/3/search/tv'
TMDB_MOVIE_LINK_URL = 'https://www.themoviedb.org/movie/'
TMDB_TV_LINK_URL = 'https://www.themoviedb.org/tv/'
####################
@ -42,11 +43,44 @@ class query_data(object):
self.query_params = {}
self.query_type = query_type.UNKNOWN
self.raw_query_str = ''
self.tmdb_api_key = ''
class response_data(object):
def __init__(self):
self.errors = []
self.parsed_response = {}
self.response_body = ''
self.response_headers = []
self.response_object = {}
self.response_status = 0
self.tmdb_api_key = ''
self.result_count = 0
class view_result(object):
def __init__(self):
self.id = 0
self.title = ''
self.date = 0
self.description = ''
self.genre_ids = []
self.original_language = ''
self.poster_path = 'no_image.png'
self.tmdb_link = ''
# NOTE: result is parsed JSON object from tmdb API
def copy_result(self, result, query_type):
self.id = result['id']
self.title = result['original_title']
self.release_date = result['release_date']
self.description = result['overview']
self.genre_ids = result['genre_ids']
self.original_language = result['original_language']
self.poster_path = result['poster_path']
if query_type == query_type.MOVIE:
self.tmdb_link = TMDB_MOVIE_LINK_URL + str(result['id'])
elif query_type == query_type.TV_SHOW:
self.tmdb_link = TMDB_TV_LINK_URL + str(result['id'])
return self
####################
@ -54,32 +88,46 @@ class query_data(object):
@bp.route('/query_movie')
def query_movie():
view_data = query_data()
view_data.tmdb_api_key = current_app.config['TMDB_API_KEY']
errors = []
query = query_data()
response = response_data()
view_results = []
query.tmdb_api_key = current_app.config['TMDB_API_KEY']
# NOTE: query string can be submitted from a link or form input
if 'query' in request.form:
view_data.raw_query_str = request.form['query']
query.raw_query_str = request.form['query']
elif 'query' in request.args:
view_data.raw_query_str = request.args['query']
if parseQueryStr(view_data) and makeQuery(view_data):
try:
p = view_data.response_object = json.loads(view_data.response_body)
pprint(p)
except json.JSONDecodeError as e:
view_data.errors.append(e)
query.raw_query_str = request.args['query']
if query.raw_query_str and parseQueryStr(query):
if makeQuery(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:
# display errors
pass
errors.append('{}, error in query string'.format(util.getFunctionName()))
if view_data.errors:
flash(view_data.errors)
errors.extend(query.errors)
errors.extend(response.errors)
if errors:
flash(errors)
return render_template(
'tmdb/query.html',
view_data=view_data,
debug_str=util.dumpObjAttr(view_data)
view_data = view_results,
debug_str = str(util.dumpObjAttr(query) + '\n'
+ util.dumpObjAttr(response)) + '\n'
+ util.dumpList(view_results, 0) + '\n'
)
@ -89,12 +137,7 @@ def query_movie():
# TODO: need a way to correctly parse titles like: "2001: A Space Odyssey (1968)"
# with legitimate dates in the title
def parseQueryStr(query_obj):
if not query_obj.raw_query_str:
query_obj.errors.append('%s: raw query string is empty' % util.getFunctionName())
return False
s = query_obj.raw_query_str.replace('.', ' ').strip()
year = None
current_year = date.today().year
# NOTE: find all 4 digit numbers to match the year of queries with 4 digit numbers in the title
@ -110,13 +153,13 @@ def parseQueryStr(query_obj):
break
# TODO: parse tv show titles
if query_obj.query_type == query_type.MOVIE:
return True
else:
if query_obj.query_type == query_type.UNKNOWN:
query_obj.errors.append('%s: unable to determine query type' % util.getFunctionName())
return False
def makeQuery(query_obj):
return True
def makeQuery(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:
@ -134,7 +177,7 @@ def makeQuery(query_obj):
}
)
query_obj.full_url = TMDB_URL + search_part + '?' + query_obj.query_params
query_obj.full_url = TMDB_API_URL + search_part + '?' + query_obj.query_params
context = ssl.create_default_context()
req = urllib.request.Request(query_obj.full_url, None, request_headers)
ct_header = ''
@ -149,18 +192,18 @@ def makeQuery(query_obj):
return False
for k, v in response.info().items():
query_obj.response_headers.append((k, v))
response_obj.response_headers.append((k, v))
if k == 'Content-Type':
ct_header = str(k + ':' + v)
query_obj.response_status = response.status
response_obj.response_status = response.status
if 'charset' in ct_header:
charset = cgi.parse_header(ct_header)[1]['charset']
query_obj.response_body = response.read().decode(charset)
response_obj.response_body = response.read().decode(charset)
else:
query_obj.errors.append('%s(), no charset key in ct_header' % util.getFunctionName())
query_obj.response_body = response.read()
response_obj.errors.append('%s(), no charset key in ct_header' % util.getFunctionName())
response_obj.response_body = response.read()
return False
return True

Loading…
Cancel
Save