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 %}
@@ -15,7 +15,7 @@
{% set srcset = series|get_series_srcset %}
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,