diff --git a/video_metadata/schema.sql b/video_metadata/schema.sql index 1334674..da86498 100644 --- a/video_metadata/schema.sql +++ b/video_metadata/schema.sql @@ -11,7 +11,7 @@ DROP TABLE IF EXISTS movie_paths; CREATE TABLE movie_paths( movie_id int not null, movie_path text unique not null, - add_date date, -- NOTE: date the path was mapped + add_date datetime, -- NOTE: date the path was mapped foreign key(movie_id) references movie_details(movie_id) ); diff --git a/video_metadata/static/file_listing.js b/video_metadata/static/file_listing.js index fb2312b..e6d046b 100644 --- a/video_metadata/static/file_listing.js +++ b/video_metadata/static/file_listing.js @@ -1,8 +1,9 @@ // TODO: could get path constants from DOM in jinja template const FOLDER_CONTENTS_PATH = '/pvdb/file_listing/folder_contents_json/'; -const QUERY_PATH = '/pvdb/tmdb/query_movie_json' -const CREATE_MAPPING_PATH = '/pvdb/tmdb/create_mapping' +const QUERY_PATH = '/pvdb/tmdb/query_movie_json'; +const CREATE_MAPPING_PATH = '/pvdb/tmdb/create_mapping'; +const PATH_PATH = '/pvdb/tmdb/query_path_json'; // NOTE: create links for folder contents @@ -34,10 +35,31 @@ function addContents(node, json) { if (element.querySelector('ul')) { element.removeChild(element.querySelector('ul')); } else { - if (a.dataset.is_dir == 'true') + if (a.dataset.is_dir == 'true') { fetchJSON(FOLDER_CONTENTS_PATH + a.dataset.rel_path, parseResponse, element); - else - openQueryDialog(a.dataset, e.target); + } else { + if (a.className == 'file_stored') + openInfoCard(a.dataset, e.target); + else // 'file' + openQueryDialog(a.dataset, e.target); + } + } + }); +} + +// NOTE: display an 'info card' for a path that has already been stored +function openInfoCard(dataset, element) { + query_str = PATH_PATH + '?rel_path=' + dataset.rel_path; + fetchJSON(query_str, function(json) { + if (json.errors) { + for (let e of json.errors) + logError(e) + } else { + blurb = createBlurb(json); + // NOTE: don't need the mapping link here + let p = blurb.querySelector('.mapping_link').parentNode; + p.parentNode.removeChild(p); + element.parentNode.appendChild(blurb); } }); } @@ -61,25 +83,11 @@ function openQueryDialog(dataset, element) { }); for (let result of json) { - let qt = document.querySelector('#query_result'); - let qtclone = document.importNode(qt.content, true); - - let title_link = qtclone.querySelector('h3 > a'); - title_link.href = result.tmdb_link; - title_link.appendChild(document.createTextNode(result.title)); - - let date = qtclone.querySelector('.query_release_date'); - date.appendChild(document.createTextNode(result.release_date)); - - let description = qtclone.querySelector('.query_description'); - description.appendChild(document.createTextNode(result.overview)); - - let map_link = qtclone.querySelector('.mapping_link'); - map_link.addEventListener('click', function(e) { + blurb = createBlurb(result); + blurb.querySelector('.mapping_link').addEventListener('click', function(e) { submitFileMapping(e, result.id, dataset.rel_path, element); }); - - tclone.querySelector('#query_result_container').appendChild(qtclone); + tclone.querySelector('#query_result_container').appendChild(blurb); } document.querySelector('body').appendChild(tclone); @@ -87,10 +95,28 @@ function openQueryDialog(dataset, element) { }); } +function createBlurb(details) { + console.log(details); + let qt = document.querySelector('#query_result'); + let qtclone = document.importNode(qt.content, true); + + let title_link = qtclone.querySelector('h3 > a'); + title_link.href = details.tmdb_link; + title_link.appendChild(document.createTextNode(details.title)); + + let date = qtclone.querySelector('.query_release_date'); + date.appendChild(document.createTextNode(details.release_date)); + + let description = qtclone.querySelector('.query_description'); + description.appendChild(document.createTextNode(details.overview)); + + return qtclone; +} + async function submitFileMapping(click_event, movie_id, rel_path, element) { + click_event.preventDefault(); // NOTE: remove the query box document.querySelector('body').removeChild(document.querySelector('#query_result_container')); - click_event.preventDefault(); query_str = CREATE_MAPPING_PATH; params = new FormData(); params.append('movie_id', movie_id); diff --git a/video_metadata/views/tmdb.py b/video_metadata/views/tmdb.py index 473ddb7..9970a70 100644 --- a/video_metadata/views/tmdb.py +++ b/video_metadata/views/tmdb.py @@ -188,6 +188,30 @@ def query_movie_json(): return res +@bp.route('/query_path_json') +def query_path_json(): + errors = [] + + if 'rel_path' in request.args: + path = request.args['rel_path'] + cur = db.get_db().cursor() + q = '''SELECT + md.*, mp.* + FROM + movie_paths mp + JOIN movie_details md ON md.movie_id = mp.movie_id + WHERE + mp.movie_path = ? + LIMIT 1''' + + cur.execute(q, (path, )) + row = cur.fetchone() + + res = Response(json.dumps(buildViewResult(row), cls=result_encoder)) + res.headers.set('Content-Type', 'application/json') + return res + + # TODO: add option for tv shows @bp.route('/create_mapping', methods=['POST']) def create_mapping(): @@ -336,6 +360,7 @@ def buildViewResult(db_row): # TODO: add info and debug logging for network requests +# TODO: need to check response headers for rate limiting requests def makeTMDBQuery(query_obj, response_obj): if query_obj.query_type == query_type.MOVIE: search_part = TMDB_SEARCH_MOVIE