Browse Source

add endpoint to search by path, and JS infocard

master
cinnaboot 7 years ago
parent
commit
415cbeb9dc
  1. 2
      video_metadata/schema.sql
  2. 72
      video_metadata/static/file_listing.js
  3. 25
      video_metadata/views/tmdb.py

2
video_metadata/schema.sql

@ -11,7 +11,7 @@ DROP TABLE IF EXISTS movie_paths;
CREATE TABLE movie_paths( CREATE TABLE movie_paths(
movie_id int not null, movie_id int not null,
movie_path text unique 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) foreign key(movie_id) references movie_details(movie_id)
); );

72
video_metadata/static/file_listing.js

@ -1,8 +1,9 @@
// TODO: could get path constants from DOM in jinja template // TODO: could get path constants from DOM in jinja template
const FOLDER_CONTENTS_PATH = '/pvdb/file_listing/folder_contents_json/'; const FOLDER_CONTENTS_PATH = '/pvdb/file_listing/folder_contents_json/';
const QUERY_PATH = '/pvdb/tmdb/query_movie_json' const QUERY_PATH = '/pvdb/tmdb/query_movie_json';
const CREATE_MAPPING_PATH = '/pvdb/tmdb/create_mapping' const CREATE_MAPPING_PATH = '/pvdb/tmdb/create_mapping';
const PATH_PATH = '/pvdb/tmdb/query_path_json';
// NOTE: create links for folder contents // NOTE: create links for folder contents
@ -34,10 +35,31 @@ function addContents(node, json) {
if (element.querySelector('ul')) { if (element.querySelector('ul')) {
element.removeChild(element.querySelector('ul')); element.removeChild(element.querySelector('ul'));
} else { } else {
if (a.dataset.is_dir == 'true') if (a.dataset.is_dir == 'true') {
fetchJSON(FOLDER_CONTENTS_PATH + a.dataset.rel_path, parseResponse, element); fetchJSON(FOLDER_CONTENTS_PATH + a.dataset.rel_path, parseResponse, element);
else } else {
openQueryDialog(a.dataset, e.target); 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) { for (let result of json) {
let qt = document.querySelector('#query_result'); blurb = createBlurb(result);
let qtclone = document.importNode(qt.content, true); blurb.querySelector('.mapping_link').addEventListener('click', function(e) {
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) {
submitFileMapping(e, result.id, dataset.rel_path, element); submitFileMapping(e, result.id, dataset.rel_path, element);
}); });
tclone.querySelector('#query_result_container').appendChild(blurb);
tclone.querySelector('#query_result_container').appendChild(qtclone);
} }
document.querySelector('body').appendChild(tclone); 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) { async function submitFileMapping(click_event, movie_id, rel_path, element) {
click_event.preventDefault();
// NOTE: remove the query box // NOTE: remove the query box
document.querySelector('body').removeChild(document.querySelector('#query_result_container')); document.querySelector('body').removeChild(document.querySelector('#query_result_container'));
click_event.preventDefault();
query_str = CREATE_MAPPING_PATH; query_str = CREATE_MAPPING_PATH;
params = new FormData(); params = new FormData();
params.append('movie_id', movie_id); params.append('movie_id', movie_id);

25
video_metadata/views/tmdb.py

@ -188,6 +188,30 @@ def query_movie_json():
return res 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 # TODO: add option for tv shows
@bp.route('/create_mapping', methods=['POST']) @bp.route('/create_mapping', methods=['POST'])
def create_mapping(): def create_mapping():
@ -336,6 +360,7 @@ def buildViewResult(db_row):
# TODO: add info and debug logging for network requests # 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): def makeTMDBQuery(query_obj, response_obj):
if query_obj.query_type == query_type.MOVIE: if query_obj.query_type == query_type.MOVIE:
search_part = TMDB_SEARCH_MOVIE search_part = TMDB_SEARCH_MOVIE

Loading…
Cancel
Save