diff --git a/video_metadata/schema.sql b/video_metadata/schema.sql index 7ea2d5c..7813cfc 100644 --- a/video_metadata/schema.sql +++ b/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; diff --git a/video_metadata/static/file_listing.js b/video_metadata/static/file_listing.js index 4479632..51cd903 100644 --- a/video_metadata/static/file_listing.js +++ b/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'; } diff --git a/video_metadata/templates/index.html b/video_metadata/templates/index.html index 9f16948..f16bd6b 100644 --- a/video_metadata/templates/index.html +++ b/video_metadata/templates/index.html @@ -5,5 +5,10 @@ {% endblock %} {% block content %} -
Movie Listing
+
+ +
{% endblock %} diff --git a/video_metadata/views/tmdb.py b/video_metadata/views/tmdb.py index 79bbf79..cdf3a1f 100644 --- a/video_metadata/views/tmdb.py +++ b/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/') 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,22 +217,17 @@ 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.detail_id = pc.detail_id + WHERE + pc.path = ? + LIMIT 1''' - q = f'''SELECT - qd.*, pc.* - FROM - path_cache pc - JOIN query_details qd ON qd.{id_column} = pc.{id_column} - WHERE - pc.path = ? - LIMIT 1''' - - cur.execute(q, (path, )) - row = cur.fetchone() + cur.execute(q, (path, )) + row = cur.fetchone() if errors: for e in errors: @@ -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}\'')