Browse Source

use query_details.detail_id as primary key

master
cinnaboot 6 years ago
parent
commit
d2bcec8215
  1. 17
      video_metadata/schema.sql
  2. 9
      video_metadata/static/file_listing.js
  3. 7
      video_metadata/templates/index.html
  4. 80
      video_metadata/views/tmdb.py

17
video_metadata/schema.sql

@ -8,9 +8,10 @@ CREATE TABLE query_cache(
DROP TABLE IF EXISTS query_details;
CREATE TABLE query_details(
detail_id integer primary key,
movie_id integer, -- NOTE: only one of movie_id, tv_id should be set
tv_id integer,
media_type integer, -- NOTE: 0=UNKNOW, 1=MOVIE, 2=TV_SHOW
media_type integer, -- NOTE: 0=UNKNOWN, 1=MOVIE, 2=TV_SHOW
title text,
overview text,
release_date date,
@ -21,23 +22,17 @@ CREATE TABLE query_details(
DROP TABLE IF EXISTS query_mapping;
CREATE TABLE query_mapping(
query_id integer,
movie_id integer,
tv_id integer,
media_type integer,
detail_id integer,
foreign key(query_id) references query_cache(query_id),
foreign key(movie_id) references query_details(movie_id),
foreign key(tv_id) references query_details(tv_id)
foreign key(detail_id) references query_details(detail_id)
);
DROP TABLE IF EXISTS path_cache;
CREATE TABLE path_cache(
path text unique not null,
movie_id integer,
tv_id integer,
media_type integer,
detail_id integer,
add_date datetime, -- NOTE: date the path was mapped
foreign key(movie_id) references query_details(movie_id),
foreign key(tv_id) references query_details(tv_id)
foreign key(detail_id) references query_details(detail_id)
);
DROP TABLE IF EXISTS movie_genres;

9
video_metadata/static/file_listing.js

@ -99,7 +99,7 @@ function openQueryDialog(dataset, element) {
for (let result of json) {
blurb = createBlurb(result);
blurb.querySelector('.mapping_link').addEventListener('click', function(e) {
submitFileMapping(e, result.id, result.media_type, dataset.rel_path, element);
submitFileMapping(e, result.detail_id, dataset.rel_path, element);
});
tclone.querySelector('#query_result_container').appendChild(blurb);
}
@ -126,14 +126,13 @@ function createBlurb(details) {
return qtclone;
}
async function submitFileMapping(click_event, id, media_type, rel_path, element) {
async function submitFileMapping(click_event, detail_id, rel_path, element) {
click_event.preventDefault();
// NOTE: remove the query box
document.querySelector('body').removeChild(document.querySelector('#query_result_container'));
query_str = CREATE_MAPPING_PATH;
params = new FormData();
params.append('id', id);
params.append('media_type', media_type);
params.append('detail_id', detail_id);
params.append('rel_path', rel_path);
let json = null;
@ -153,7 +152,7 @@ async function submitFileMapping(click_event, id, media_type, rel_path, element)
body.appendChild(clone);
window.setTimeout(function() {
body.removeChild(document.querySelector('.success_container'));
}, 1000);
}, 500);
// NOTE: update the displayed link class
element.className = 'file_stored';
}

7
video_metadata/templates/index.html

@ -5,5 +5,10 @@
{% endblock %}
{% block content %}
<div><a href="{{ url_for('tmdb.list_movie_test') }}">Movie Listing</a></div>
<div>
<ul>
<li><a href="{{ url_for('tmdb.list_movie_test') }}">Movie Listing</a></li>
<li><a href="{{ url_for('tmdb.tv_show_test') }}">TV Show testing</a></li>
</ul>
</div>
{% endblock %}

80
video_metadata/views/tmdb.py

@ -16,6 +16,7 @@ from flask import Blueprint, current_app, flash, Flask, jsonify, request, render
from .. import util
from .. import db
from . import tv_shows
####################
@ -64,8 +65,10 @@ class response_data:
@dataclass
class view_result:
detail_id:int = 0
media_type:str = 'unknown'
id: int = 0
movie_id: int = 0
tv_id: int = 0
title: str = ''
release_date: str = ''
overview: str = ''
@ -101,9 +104,9 @@ class result_encoder(json.JSONEncoder):
@bp.route('/list_movie_test/<string:sorting>')
def list_movie_test(sorting = 'title'):
if sorting == 'add-date':
orderby = 'mp.add_date'
orderby = 'pc.add_date'
elif sorting == 'add-date-desc':
orderby = 'mp.add_date DESC'
orderby = 'pc.add_date DESC'
elif sorting == 'release-date':
orderby = 'md.release_date'
elif sorting == 'release-date-desc':
@ -136,6 +139,25 @@ def list_movie_test(sorting = 'title'):
)
@bp.route('/tv_show_test', methods=['GET', ])
def tv_show_test():
shows = []
errors = []
if 'query' in request.args:
result = tv_shows.doTVQuery(request.args['query'])
shows = result['shows']
errors = result['errors']
if (shows):
pass
return render_template('tmdb/tv_show_test.html',
shows = shows,
debug_str = f'{util.dumpObject(errors)}'
)
@bp.route('/manual_query', methods=['GET', 'POST'])
def manual_query():
query = query_data()
@ -195,16 +217,11 @@ def query_path_json():
path = request.args['rel_path']
cur = db.get_db().cursor()
# NOTE: need to make an extra query to see what our id column is, tv_id or movie_id
mr = cur.execute('SELECT media_type FROM path_cache WHERE path=?', (path, )).fetchone()
if mr != None:
id_column = getIDColumn(mr['media_type'])
q = f'''SELECT
qd.*, pc.*
FROM
path_cache pc
JOIN query_details qd ON qd.{id_column} = pc.{id_column}
JOIN query_details qd ON qd.detail_id = pc.detail_id
WHERE
pc.path = ?
LIMIT 1'''
@ -227,22 +244,19 @@ def create_path_mapping():
errors = []
if not ('rel_path' in request.form
and 'media_type' in request.form
and 'id' in request.form
and 'detail_id' in request.form
):
errors.append(f'required parameters: rel_path, media_type, id')
errors.append(f'required parameters: rel_path, id')
else:
id = request.form['id']
media_type = request.form['media_type']
detail_id = request.form['detail_id']
rel_path = request.form['rel_path']
id_column = getIDColumn(media_type)
conn = db.get_db()
cur = conn.cursor()
current_app.logger.debug(f'mapping path "{rel_path}" for id: {id}')
current_app.logger.debug(f'mapping path "{rel_path}" for detail_id: {detail_id}')
try:
cur.execute(f'INSERT INTO path_cache({id_column}, media_type, path, add_date) '
f'VALUES(?,?,?, datetime())',
(id, media_type, rel_path ))
cur.execute(f'INSERT INTO path_cache(detail_id, path, add_date) '
f'VALUES(?,?, datetime())',
(detail_id, rel_path ))
except DatabaseError as e:
errors.append(str(e))
@ -278,7 +292,13 @@ def doQueryAlgorithm(query:query_data) -> dict:
except json.JSONDecodeError as e:
errors.append(e)
if 'total_results' in response.parsed_response:
# TODO: testing ############
errors.extend(query.errors)
errors.extend(response.errors)
return {'errors': errors, 'results': view_results}
###########################
if response.parsed_response and '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'
@ -357,11 +377,11 @@ def makeLocalQuery(query_obj):
query = f'''SELECT
qd.*
FROM
query_cache mq
JOIN query_mapping map ON mq.query_id = map.query_id
JOIN query_details qd ON qd.{id_column} = map.{id_column}
query_cache qc
JOIN query_mapping map ON qc.query_id = map.query_id
JOIN query_details qd ON qd.detail_id = map.detail_id
WHERE
mq.query = ?'''
qc.query = ?'''
for row in cur.execute(query, (query_obj.parsed_query_str, )):
results.append(buildViewResult(row))
@ -371,17 +391,19 @@ def makeLocalQuery(query_obj):
def buildViewResult(db_row):
vr = view_result()
vr.detail_id = db_row['detail_id']
vr.media_type = db_row['media_type']
vr.id = db_row[getIDColumn(vr.media_type)]
vr.title = db_row['title']
vr.overview = db_row['overview']
vr.release_date = db_row['release_date']
vr.original_language = db_row['original_language']
if vr.media_type == media_type.MOVIE:
vr.tmdb_link = f'{TMDB_MOVIE_LINK_URL}{vr.id}'
vr.movie_id = db_row['movie_id']
vr.tmdb_link = f'{TMDB_MOVIE_LINK_URL}{vr.movie_id}'
elif vr.media_type == media_type.TV_SHOW:
vr.tmdb_link = f'{TMDB_TV_LINK_URL}{vr.id}'
vr.tv_id = db_row['tv_id']
vr.tmdb_link = f'{TMDB_TV_LINK_URL}{vr.tv_id}'
if db_row['poster_path'] != None:
vr.poster_path = db_row['poster_path']
@ -508,8 +530,8 @@ def storeTMDBQueryResults(query_obj, result_list):
(r.id, r.media_type, r.title, r.overview, r.release_date, r.original_language, r.poster_path)
)
cur.execute(f'INSERT INTO query_mapping(query_id, {id_column}, media_type)'
+ ' VALUES (?,?,?)', (query_id, r.id, r.media_type)
cur.execute(f'INSERT INTO query_mapping(query_id, detail_id)'
+ ' VALUES (?,?)', (query_id, cur.lastrowid)
)
except DatabaseError as e:
query_obj.errors.append(f'database error \'{e}\'')

Loading…
Cancel
Save