diff --git a/Dockerfile b/Dockerfile index fda47998c..630cd367c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -83,8 +83,6 @@ ARG RUNTIME_PACKAGES="\ postgresql-client \ # For Numpy libatlas3-base \ - # thumbnail size reduction - pngquant \ # OCRmyPDF dependencies tesseract-ocr \ tesseract-ocr-eng \ diff --git a/docs/administration.rst b/docs/administration.rst index f1930256c..dfb88ff80 100644 --- a/docs/administration.rst +++ b/docs/administration.rst @@ -518,15 +518,3 @@ Basic usage to disable encryption of your document store: .. code:: decrypt_documents [--passphrase SECR3TP4SSPHRA$E] - -Managing thumbnail format -=================== - -Document thumbnails were originally created as PNG format. Newly -uploaded documents are now using WebP to reduce both storage space and -page loading times. To convert older PNG format thumbnails to WebP -run: - -.. code:: - - convert_thumbnails diff --git a/src/documents/__init__.py b/src/documents/__init__.py index 005c6e2fb..dc94f2bdd 100644 --- a/src/documents/__init__.py +++ b/src/documents/__init__.py @@ -1,6 +1,5 @@ # this is here so that django finds the checks. from .checks import changed_password_check from .checks import parser_check -from .checks import png_thumbnail_check -__all__ = ["changed_password_check", "parser_check", "png_thumbnail_check"] +__all__ = ["changed_password_check", "parser_check"] diff --git a/src/documents/checks.py b/src/documents/checks.py index 0a9511bd6..a014a0ac2 100644 --- a/src/documents/checks.py +++ b/src/documents/checks.py @@ -1,9 +1,7 @@ import textwrap -from pathlib import Path from django.conf import settings from django.core.checks import Error -from django.core.checks import Info from django.core.checks import register from django.core.exceptions import FieldError from django.db.utils import OperationalError @@ -68,23 +66,3 @@ def parser_check(app_configs, **kwargs): ] else: return [] - - -@register() -def png_thumbnail_check(app_configs, **kwargs): - from documents.models import Document - - try: - documents = Document.objects.all() - for document in documents: - existing_thumbnail = Path(document.thumbnail_path).resolve() - if existing_thumbnail.suffix == ".png": - return [ - Info( - "PNG thumbnails found, consider running convert_thumbnails " - "to convert to WebP", - ), - ] - return [] - except (OperationalError, ProgrammingError, FieldError): - return [] # No documents table yet diff --git a/src/documents/management/commands/document_exporter.py b/src/documents/management/commands/document_exporter.py index 4bddd51b8..526d59368 100644 --- a/src/documents/management/commands/document_exporter.py +++ b/src/documents/management/commands/document_exporter.py @@ -189,7 +189,7 @@ class Command(BaseCommand): original_target = os.path.join(self.target, original_name) document_dict[EXPORTER_FILE_NAME] = original_name - thumbnail_name = base_name + "-thumbnail.png" + thumbnail_name = base_name + "-thumbnail.webp" thumbnail_target = os.path.join(self.target, thumbnail_name) document_dict[EXPORTER_THUMBNAIL_NAME] = thumbnail_name diff --git a/src/documents/management/commands/document_thumbnails.py b/src/documents/management/commands/document_thumbnails.py index 535a0f670..b56bc0042 100644 --- a/src/documents/management/commands/document_thumbnails.py +++ b/src/documents/management/commands/document_thumbnails.py @@ -1,7 +1,6 @@ import logging import multiprocessing import shutil -from pathlib import Path import tqdm from django import db @@ -23,12 +22,6 @@ def _process_document(doc_in): try: - existing_thumbnail = Path(document.thumbnail_path).resolve() - - # Remove an existing PNG format thumbnail, if it existed - if existing_thumbnail.exists() and existing_thumbnail.suffix == ".png": - existing_thumbnail.unlink() - thumb = parser.get_thumbnail( document.source_path, document.mime_type, diff --git a/src/documents/tests/samples/documents/thumbnails/0000001.png b/src/documents/tests/samples/documents/thumbnails/0000001.png deleted file mode 100644 index a3a768401..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000001.png and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000001.webp b/src/documents/tests/samples/documents/thumbnails/0000001.webp new file mode 100644 index 000000000..a7ff623b2 Binary files /dev/null and b/src/documents/tests/samples/documents/thumbnails/0000001.webp differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000002.png b/src/documents/tests/samples/documents/thumbnails/0000002.png deleted file mode 100644 index a3a768401..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000002.png and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000002.webp b/src/documents/tests/samples/documents/thumbnails/0000002.webp new file mode 100644 index 000000000..a7ff623b2 Binary files /dev/null and b/src/documents/tests/samples/documents/thumbnails/0000002.webp differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000003.png b/src/documents/tests/samples/documents/thumbnails/0000003.png deleted file mode 100644 index a3a768401..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000003.png and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000003.webp b/src/documents/tests/samples/documents/thumbnails/0000003.webp new file mode 100644 index 000000000..a7ff623b2 Binary files /dev/null and b/src/documents/tests/samples/documents/thumbnails/0000003.webp differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000004.png.gpg b/src/documents/tests/samples/documents/thumbnails/0000004.png.gpg deleted file mode 100644 index 8a61a9126..000000000 Binary files a/src/documents/tests/samples/documents/thumbnails/0000004.png.gpg and /dev/null differ diff --git a/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg b/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg new file mode 100644 index 000000000..3abc69d36 Binary files /dev/null and b/src/documents/tests/samples/documents/thumbnails/0000004.webp.gpg differ diff --git a/src/documents/tests/test_api.py b/src/documents/tests/test_api.py index 24bdc3a50..6d659e66d 100644 --- a/src/documents/tests/test_api.py +++ b/src/documents/tests/test_api.py @@ -176,7 +176,7 @@ class TestDocumentApi(DirectoriesMixin, APITestCase): ) with open( - os.path.join(self.dirs.thumbnail_dir, f"{doc.pk:07d}.png"), + os.path.join(self.dirs.thumbnail_dir, f"{doc.pk:07d}.webp"), "wb", ) as f: f.write(content_thumbnail) @@ -1022,7 +1022,7 @@ class TestDocumentApi(DirectoriesMixin, APITestCase): "samples", "documents", "thumbnails", - "0000001.png", + "0000001.webp", ) archive_file = os.path.join(os.path.dirname(__file__), "samples", "simple.pdf") diff --git a/src/documents/tests/test_consumer.py b/src/documents/tests/test_consumer.py index a770d3ff6..48f195903 100644 --- a/src/documents/tests/test_consumer.py +++ b/src/documents/tests/test_consumer.py @@ -180,7 +180,7 @@ class DummyParser(DocumentParser): def __init__(self, logging_group, scratch_dir, archive_path): super().__init__(logging_group, None) - _, self.fake_thumb = tempfile.mkstemp(suffix=".png", dir=scratch_dir) + _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=scratch_dir) self.archive_path = archive_path def get_thumbnail(self, document_path, mime_type, file_name=None): @@ -199,7 +199,7 @@ class CopyParser(DocumentParser): def __init__(self, logging_group, progress_callback=None): super().__init__(logging_group, progress_callback) - _, self.fake_thumb = tempfile.mkstemp(suffix=".png", dir=self.tempdir) + _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=self.tempdir) def parse(self, document_path, mime_type, file_name=None): self.text = "The text" @@ -214,7 +214,7 @@ class FaultyParser(DocumentParser): def __init__(self, logging_group, scratch_dir): super().__init__(logging_group) - _, self.fake_thumb = tempfile.mkstemp(suffix=".png", dir=scratch_dir) + _, self.fake_thumb = tempfile.mkstemp(suffix=".webp", dir=scratch_dir) def get_thumbnail(self, document_path, mime_type, file_name=None): return self.fake_thumb @@ -230,6 +230,8 @@ def fake_magic_from_file(file, mime=False): return "application/pdf" elif os.path.splitext(file)[1] == ".png": return "image/png" + elif os.path.splitext(file)[1] == ".webp": + return "image/webp" else: return "unknown" else: diff --git a/src/documents/tests/test_management.py b/src/documents/tests/test_management.py index 65ed36ff9..76a5459b5 100644 --- a/src/documents/tests/test_management.py +++ b/src/documents/tests/test_management.py @@ -150,9 +150,9 @@ class TestDecryptDocuments(TestCase): "samples", "documents", "thumbnails", - f"0000004.png.gpg", + f"0000004.webp.gpg", ), - os.path.join(thumb_dir, f"{doc.id:07}.png.gpg"), + os.path.join(thumb_dir, f"{doc.id:07}.webp.gpg"), ) call_command("decrypt_documents") diff --git a/src/documents/tests/test_sanity_check.py b/src/documents/tests/test_sanity_check.py index 5ebedd908..9bb424cbc 100644 --- a/src/documents/tests/test_sanity_check.py +++ b/src/documents/tests/test_sanity_check.py @@ -42,9 +42,9 @@ class TestSanityCheck(DirectoriesMixin, TestCase): "samples", "documents", "thumbnails", - "0000001.png", + "0000001.webp", ), - os.path.join(self.dirs.thumbnail_dir, "0000001.png"), + os.path.join(self.dirs.thumbnail_dir, "0000001.webp"), ) return Document.objects.create( diff --git a/src/documents/views.py b/src/documents/views.py index bcd2958f8..8fa86b4ca 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -362,11 +362,7 @@ class DocumentViewSet( handle = doc.thumbnail_file # TODO: Send ETag information and use that to send new thumbnails # if available - thumbnail_path = doc.thumbnail_path - if os.path.splitext(thumbnail_path)[1] == ".webp": - content_type = "image/webp" - else: - content_type = "image/png" + content_type = "image/webp" return HttpResponse(handle, content_type=content_type) except (FileNotFoundError, Document.DoesNotExist):