From 9823509909043ab72b8482c23cb4b90ea3200e18 Mon Sep 17 00:00:00 2001 From: dave Date: Sun, 9 Sep 2018 23:43:17 -0700 Subject: [PATCH] add pager --- photoapp/daemon.py | 5 ++++- photoapp/image.py | 8 +++----- photoapp/ingest.py | 34 ++++++++++++++++++++++++++++------ styles/less/main.less | 10 ++++++++++ templates/feed.html | 24 +++++++++++++++++++++++- templates/map.html | 6 +++--- 6 files changed, 71 insertions(+), 16 deletions(-) diff --git a/photoapp/daemon.py b/photoapp/daemon.py index 8deb294..32715ee 100644 --- a/photoapp/daemon.py +++ b/photoapp/daemon.py @@ -6,6 +6,7 @@ from photoapp.types import Photo, PhotoSet, Tag, TagItem from jinja2 import Environment, FileSystemLoader, select_autoescape from sqlalchemy.exc import IntegrityError from sqlalchemy import func +import math APPROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../")) @@ -18,6 +19,7 @@ class PhotosWeb(object): autoescape=select_autoescape(['html', 'xml'])) self.tpl.globals.update(mime2ext=self.mime2ext) self.tpl.filters['basename'] = os.path.basename + self.tpl.filters['ceil'] = math.ceil self.thumb = ThumbnailView(self) self.photo = PhotoView(self) self.download = DownloadView(self) @@ -52,8 +54,9 @@ class PhotosWeb(object): def feed(self, page=0, pgsize=25): s = self.session() page, pgsize = int(page), int(pgsize) + total_sets = s.query(func.count(PhotoSet.id)).first()[0] images = s.query(PhotoSet).order_by(PhotoSet.date.desc()).offset(pgsize * page).limit(pgsize).all() - yield self.render("feed.html", images=[i for i in images], page=page) + yield self.render("feed.html", images=[i for i in images], page=page, pgsize=int(pgsize), total_sets=total_sets) @cherrypy.expose def monthly(self): diff --git a/photoapp/image.py b/photoapp/image.py index 4732fc8..7827e9a 100644 --- a/photoapp/image.py +++ b/photoapp/image.py @@ -71,17 +71,15 @@ def get_exif_data(path): datestr = exif[key] continue - if datestr is None: - print(exif.keys()) - raise Exception("{} has no DateTime".format(path)) # TODO how often do we hit this - dateinfo = datetime.strptime(datestr, "%Y:%m:%d %H:%M:%S") + if datestr is not None: + dateinfo = datetime.strptime(datestr, "%Y:%m:%d %H:%M:%S") orien = exif.get("Orientation") if orien: orientationinfo = {0: 0, 8: 1, 3: 2, 6: 3}.get(int(orien), 0) gps = exif.get("GPSInfo") - if gps: + if gps and 1 in gps and 2 in gps and 3 in gps and 4 in gps: # see https://gis.stackexchange.com/a/273402 gps_y = round(hms_to_decimal(rational64u_to_hms(gps[2])), 8) gps_x = round(hms_to_decimal(rational64u_to_hms(gps[4])), 8) diff --git a/photoapp/ingest.py b/photoapp/ingest.py index 8731a38..8b2fac7 100644 --- a/photoapp/ingest.py +++ b/photoapp/ingest.py @@ -1,5 +1,6 @@ import magic import argparse +import traceback from photoapp.library import PhotoLibrary from photoapp.image import get_jpg_info, get_hash, get_mtime from itertools import chain @@ -25,11 +26,16 @@ files_raw = ["cr2", "xmp"] files_video = ["mp4", "mov"] +def pprogress(done, total=None): + print(" complete: {}{}\r".format(done, " / {} ".format(total) if total else ''), end='') + + def batch_ingest(library, files): # group by extension byext = {k: [] for k in known_extensions} - print("processing {} items".format(len(files))) + total = len(files) + print("processing {} items".format(total)) print("Pre-sorting files") for item in files: if not os.path.isfile(item): @@ -52,9 +58,11 @@ def batch_ingest(library, files): # process regular images first. for item in chain(*[byext[ext] for ext in regular_images]): photos.append(get_jpg_info(item)) + pprogress(len(photos), total) - print("Scanning RAWs") + print("\nScanning RAWs") # process raws + done = len(photos) for item in chain(*[byext[ext] for ext in files_raw]): itemmeta = Photo(hash=get_hash(item), path=item, size=os.path.getsize(item), format=special_magic(item)) @@ -66,24 +74,38 @@ def batch_ingest(library, files): if os.path.basename(fmt.path).lower() == fmatch: foundmatch = True photo.files.append(itemmeta) + done += 1 + pprogress(done, total) break if foundmatch: break if not foundmatch: photos.append(PhotoSet(date=get_mtime(item), lat=0, lon=0, files=[itemmeta])) + done += 1 + pprogress(done, total) # TODO prune any xmp without an associated regular image or cr2 - print("Scanning other files") + print("\nScanning other files") # process all other formats for item in chain(*[byext[ext] for ext in files_video]): itemmeta = Photo(hash=get_hash(item), path=item, size=os.path.getsize(item), format=special_magic(item)) photos.append(PhotoSet(date=get_mtime(item), lat=0, lon=0, files=[itemmeta])) + done += 1 + pprogress(done, total) - print("Updating database") + print("\nUpdating database") + done = 0 + total = len(photos) for photoset in photos: - library.add_photoset(photoset) - print("Update complete") + try: + library.add_photoset(photoset) + pprogress(done, total) + done += 1 + except: + traceback.print_exc() + pass + print("\nUpdate complete") def special_magic(fpath): diff --git a/styles/less/main.less b/styles/less/main.less index 9f07e69..84d864c 100644 --- a/styles/less/main.less +++ b/styles/less/main.less @@ -236,3 +236,13 @@ a { } } } + +ul.pager { + padding: 0; + li { + display: inline-block; + &.current { + font-weight: bold; + } + } +} diff --git a/templates/feed.html b/templates/feed.html index 97a47fd..695c604 100644 --- a/templates/feed.html +++ b/templates/feed.html @@ -5,6 +5,7 @@ {% set locals = namespace() %} +{% set total_pages = (total_sets/pgsize)|ceil %}
{% set locals.im_date = "" %} @@ -21,7 +22,28 @@
{% endfor %}
- {% if page > 0 %}Previous {% endif %}Next +
+
Page
+ {% if page > 0 %} + + {% endif %} +
+
    + {% for pgnum in range(0, total_pages) %} + + {{ pgnum }} + + {% endfor %} +
+
+ {% if page + 1 < total_pages %} + + {% endif %} +
{% include "page-bottom.html" %} diff --git a/templates/map.html b/templates/map.html index aeb2a9b..d162e4b 100644 --- a/templates/map.html +++ b/templates/map.html @@ -9,9 +9,9 @@