diff --git a/cps/helper.py b/cps/helper.py index 004e1b0e..37ee7bb2 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -30,10 +30,12 @@ import requests import unidecode from uuid import uuid4 -from flask import send_from_directory, make_response, abort, url_for, Response +from flask import send_from_directory, make_response, abort, url_for, Response, redirect from flask_babel import gettext as _ from flask_babel import lazy_gettext as N_ from flask_babel import get_locale +from flask_image_resizer import resized_img_src + from .cw_login import current_user from sqlalchemy.sql.expression import true, false, and_, or_, text, func from sqlalchemy.exc import InvalidRequestError, OperationalError @@ -749,6 +751,8 @@ def get_book_cover_with_uuid(book_uuid, resolution=None): def get_book_cover_internal(book, resolution=None): + """returns an optimized version of the cover, unless using google drive""" + if book and book.has_cover: # Send the book cover thumbnail if it exists in cache @@ -757,8 +761,13 @@ def get_book_cover_internal(book, resolution=None): if thumbnail: cache = fs.FileSystem() if cache.get_cache_file_exists(thumbnail.filename, CACHE_TYPE_THUMBNAILS): - return send_from_directory(cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), - thumbnail.filename) + return redirect(resized_img_src( + os.path.join( + cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), + thumbnail.filename + ), + format="webp" + )) # Send the book cover from Google Drive if configured if config.config_use_google_drive: @@ -777,9 +786,9 @@ def get_book_cover_internal(book, resolution=None): # Send the book cover from the Calibre directory else: - cover_file_path = os.path.join(config.get_book_path(), book.path) - if os.path.isfile(os.path.join(cover_file_path, "cover.jpg")): - return send_from_directory(cover_file_path, "cover.jpg") + cover_file_path = os.path.join(config.get_book_path(), book.path, "cover.jpg") + if os.path.isfile(cover_file_path): + return redirect(resized_img_src(cover_file_path, format="webp")) else: return get_cover_on_failure() else: @@ -820,8 +829,13 @@ def get_series_cover_internal(series_id, resolution=None): if thumbnail: cache = fs.FileSystem() if cache.get_cache_file_exists(thumbnail.filename, CACHE_TYPE_THUMBNAILS): - return send_from_directory(cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), - thumbnail.filename) + return redirect(resized_img_src( + os.path.join( + cache.get_cache_file_dir(thumbnail.filename, CACHE_TYPE_THUMBNAILS), + thumbnail.filename + ), + format="webp" + )) return get_series_thumbnail_on_failure(series_id, resolution) diff --git a/cps/templates/image.html b/cps/templates/image.html index 088e6b99..f84fa12b 100644 --- a/cps/templates/image.html +++ b/cps/templates/image.html @@ -4,7 +4,7 @@ {% set srcset = book|get_cover_srcset %} {{ image_alt }} @@ -15,7 +15,7 @@ {% set srcset = series|get_series_srcset %} {{ book_title }} diff --git a/cps/web.py b/cps/web.py index 2519ebd5..fa15b3fc 100644 --- a/cps/web.py +++ b/cps/web.py @@ -29,6 +29,8 @@ from flask import request, redirect, send_from_directory, make_response, flash, from flask import session as flask_session from flask_babel import gettext as _ from flask_babel import get_locale +from flask_image_resizer import resized_img_src + from .cw_login import login_user, logout_user, current_user from flask_limiter import RateLimitExceeded from flask_limiter.util import get_remote_address @@ -1147,6 +1149,17 @@ def category_list(): @web.route("/cover//") @login_required_if_no_ano def get_cover(book_id, resolution=None): + return redirect( + resized_img_src( + url_for("web.get_raw_cover", book_id=book_id, resolution=resolution) + ) + ) + + +@web.route("/raw_cover/") +@web.route("/raw_cover//") +@login_required_if_no_ano +def get_raw_cover(book_id, resolution=None): resolutions = { 'og': constants.COVER_THUMBNAIL_ORIGINAL, 'sm': constants.COVER_THUMBNAIL_SMALL, @@ -1161,6 +1174,17 @@ def get_cover(book_id, resolution=None): @web.route("/series_cover//") @login_required_if_no_ano def get_series_cover(series_id, resolution=None): + return redirect( + resized_img_src( + url_for("web.get_raw_series_cover", series_id=series_id, resolution=resolution) + ) + ) + + +@web.route("/raw_series_cover/") +@web.route("/raw_series_cover//") +@login_required_if_no_ano +def get_raw_series_cover(series_id, resolution=None): resolutions = { 'og': constants.COVER_THUMBNAIL_ORIGINAL, 'sm': constants.COVER_THUMBNAIL_SMALL,