fix error on ungeneratable thumbs and refactor placeholder serve code

This commit is contained in:
dave 2021-09-14 21:24:24 -07:00
parent 6a587f8714
commit f131fc44df
3 changed files with 25 additions and 10 deletions

View File

@ -7,21 +7,19 @@ from collections import defaultdict
from urllib.parse import urlparse from urllib.parse import urlparse
from datetime import datetime, timedelta from datetime import datetime, timedelta
from photoapp.thumbtool import ThumbGenerator from photoapp.thumbtool import ThumbGenerator
from photoapp.types import Photo, PhotoSet, Tag, TagItem, PhotoStatus, User, mime2ext, regular_mimes, video_mimes from photoapp.types import APPROOT, Photo, PhotoSet, Tag, TagItem, PhotoStatus, User, mime2ext, \
regular_mimes, video_mimes
from photoapp.dbsession import DatabaseSession from photoapp.dbsession import DatabaseSession
from photoapp.common import pwhash from photoapp.common import pwhash
from photoapp.api import PhotosApi, LibraryManager from photoapp.api import PhotosApi, LibraryManager
from photoapp.dbutils import SAEnginePlugin, SATool, db, get_db_engine, date_format from photoapp.dbutils import SAEnginePlugin, SATool, db, get_db_engine, date_format
from photoapp.utils import auth, require_auth, photoset_auth_filter, slugify, cherryparam, number_format from photoapp.utils import auth, require_auth, photoset_auth_filter, slugify, cherryparam, number_format
from photoapp.storage import uri_to_storage from photoapp.storage import uri_to_storage
from photoapp.webutils import validate_password from photoapp.webutils import validate_password, serve_thumbnail_placeholder
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from sqlalchemy import desc, func, and_, or_ from sqlalchemy import desc, func, and_, or_
APPROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))
class PhotosWeb(object): class PhotosWeb(object):
""" """
Http root of the UI webserver Http root of the UI webserver
@ -272,14 +270,15 @@ class ThumbnailView(object):
t = vtypes.pop() # TODO arbitrary t = vtypes.pop() # TODO arbitrary
thumb_from = formats[t][0] # TODO arbitrary thumb_from = formats[t][0] # TODO arbitrary
if not thumb_from: # no format we know how to make a thumbnail from was found
return serve_thumbnail_placeholder()
thumb_fobj = self.master.thumbtool.make_thumb(thumb_from, thumb_size) thumb_fobj = self.master.thumbtool.make_thumb(thumb_from, thumb_size)
if thumb_fobj: if thumb_fobj:
return cherrypy.lib.static.serve_fileobj(thumb_fobj, "image/jpeg") return cherrypy.lib.static.serve_fileobj(thumb_fobj, "image/jpeg")
else: else: # thumb creation failed or in progress
cherrypy.response.headers["Cache-Control"] = "no-store, must-revalidate, max-age=0" return serve_thumbnail_placeholder(True)
cherrypy.response.headers["Age"] = "0"
return cherrypy.lib.static.serve_file(os.path.join(APPROOT, "assets/img/unknown.svg"), "image/svg+xml")
@cherrypy.popargs('item_type', 'uuid') @cherrypy.popargs('item_type', 'uuid')

View File

@ -3,11 +3,15 @@ from sqlalchemy.orm import relationship
from sqlalchemy.schema import UniqueConstraint from sqlalchemy.schema import UniqueConstraint
from photoapp.dbutils import Base from photoapp.dbutils import Base
from datetime import datetime from datetime import datetime
import os
import enum as py_enum import enum as py_enum
import uuid import uuid
import enum import enum
APPROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))
class fcategory(py_enum.Enum): class fcategory(py_enum.Enum):
image = 0 image = 0
raw = 1 raw = 1

View File

@ -1,4 +1,6 @@
from photoapp.types import User import os
import cherrypy
from photoapp.types import APPROOT, User
from photoapp.dbutils import db from photoapp.dbutils import db
from photoapp.common import pwhash from photoapp.common import pwhash
@ -7,3 +9,13 @@ def validate_password(realm, username, password):
if db.query(User).filter(User.name == username, User.password == pwhash(password)).first(): if db.query(User).filter(User.name == username, User.password == pwhash(password)).first():
return True return True
return False return False
def serve_thumbnail_placeholder(temporary=False):
"""
Serve the placeholder for broken/unavailable thumbnails, the <?> image. Setting temporary will add a no-cache header
"""
if temporary:
cherrypy.response.headers["Cache-Control"] = "no-store, must-revalidate, max-age=0"
cherrypy.response.headers["Age"] = "0"
return cherrypy.lib.static.serve_file(os.path.join(APPROOT, "assets/img/unknown.svg"), "image/svg+xml")