## GENERAL * optimising for job scans... - run_ai_on_path not finding previous job as jex path is path_prefix... pa=# select * from jobextra where job_id = 45; id | job_id | name | value ----+--------+-------------+--------------------------- 79 | 45 | person | all 80 | 45 | ptype | Import 83 | 45 | path_prefix | static/Import/new_img_dir 84 | 45 | eid-0 | 2 85 | 45 | eid-1 | 31 BUT WHY 2 eids -- because we have photos and new_img_dir, interesting that pp is the last one... need to do better with this on creation I think? * browser back/forward buttons dont work -- use POST -> redirect to GET * viewlist - [DONE] can work out new view_eids server side, and pass them back as json data (fixes loss of fullscreen & back/fwd issues) - [DONE] should really define the first/last of a GetEntries search and use definitive logic to show at start or end of entries (for next/prev buttons in viewer.html) - [DONE] store "current", "first_eid", "last_eid" in pa_user_state - use them on reload, e.g. if current set use it not view eid (should be okay with client-side skipping, and just make sure if it is viewlist we use next/prev logic not current - can consider an optim-- new_view page makes calls to viewlist to ADD json data only, so only trigger a new "viewlist" if we dont have data for that part of the eids job.py:@app.route("/jobs", methods=["GET", "POST"]) job.py:@app.route("/job/", methods=["GET","POST"]) -- these need to store 'job prefs' somewhere... (extras?) files.py:@app.route("/fix_dups", methods=["POST"]) ??? * [DONE] order/ find face with largest size and at least show that as unmatched - could also try to check it vs. other faces, if it matches more than say 10? we offer it up as a required ref img, then cut that face (with margin) out and use it is a new ref image / person * on viewer: allow face to be used to create person, add to existing person, and allow 'ignore', mark as 'not a face', etc. -> all into DB - so need face 'treatment' -> could be matched via face_refimg_link, but also could be 'ignore' or 'not a face', in each case we could exclude those faces from matching for the future, and reporting on matches, etc. - context-menu with rects on a canvas https://stackoverflow.com/questions/31601393/create-context-menu-using-jquery-with-html-5-canvas - also allow joblog search from the viewer for that file... * refimg locns can lose an array idx of 0 always. * search allow noo * delete folder * allow joblog search * consider less hacky way to find start/end of GetEntries* -> so we KNOW which eid is first and last and don't use jscript to work out when to set next/prev disabled GUI overhaul? * on a phone, the files.html page header is a mess "Oldest.." line is too large to fit on 1 line (make it a hamburger?) - searched for text overlaps buttons above and below - < 10 files > is subsequently not centered - the fodler/bin icons might be best below search then? (and on same line as XS/S, etc.) * when search, have a way to hide deleted files -> not sure where to put this on GUI, its so busy... * metadata at folder level with file level to add more richness - store in DB? or store in hidden file (or both)... IF it is outside the DB, then I can 'rebuild' the DB at anytime from scratch * dont allow me to stupidly move a folder to itself * get build process to create a random string for secret for PROD, otherwise use builtin for dev * deal with changing/adding/removing a path in settings * dup issues: * when we have lots of dups, sort the directories by alpha so its consistent when choosing * auto-detect has 0 choices to keep 0 files -- not sure what that was about really * comment your code -> only html files remaining * read that guys face matching / clustering / nearest neighbour examples, for a whole new AI capability https://www.pyimagesearch.com/2018/07/09/face-clustering-with-python/ * fix up logging in general * support animated gifs in html5 canvas * think about security - in job_mgr anywhere I can os.replace/remove NEED to protect, etc ## DB * Dir can have date in the DB, so we can do Oldest/Newest dirs in Folder view ### BACKEND * revisit SymlinkName() and make it simpler (see comment in shared.py) *** Need to use thread-safe sessions per Thread, half-assed version did not work Admin -> do I want to have admin roles/users? -> purge deleted files (and associated DB data) needs a dbox or privs ### AI * faces per file (need a threshold for too many? OR * consider size of bbox of face / 'high-quality' faces -- if face is too small in image, dont match it ### UI * viewer needs to allow toggle to scan_model (and prob. right-click on file... AI (with CNN) AI (with hog) - make the form-select AI_Model actually do the change (but need more mem on mara really) For AI / rescan: way to override per file: the model used [partial - UI done, need mem on mara] the threshold used? maybe on the per file you could select an unknown face and add it as a ref img to a existing person, or make a new person and attach? file details is sort of crap - only works on import path - probably better to have a different 'view', e.g. folders/flat/detailed timelineview? (I think maybe sunburst for large amounts of files, then maybe something more timeline-series for drilling in?) (vertical timeline, date has thumbnails (small) horizontally along a page, etc.? https://www.highcharts.com/docs/chart-and-series-types/timeline-series https://www.highcharts.com/demo/sunburst https://www.highcharts.com/demo/heatmap https://www.highcharts.com/demo/packed-bubble-split ### SORTER * exif processing? * location stuff - test a new photo from my camera out -- image is in dir, need to look at exifread output ### FUTURE: * can emby use nfo for images (for AI/tags?) -NO sadly