From 657523b9c93af3c779e4a789df8031580e4b40f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Desfr=C3=AAnes?= <mickael.desfrenes@unicaen.fr> Date: Thu, 10 Apr 2025 15:10:20 +0200 Subject: [PATCH] add command to tile all images --- pount/apps/iiif/management/commands/__init__.py | 0 .../apps/iiif/management/commands/ensureiiif.py | 17 +++++++++++++++++ pount/apps/iiif/storage_backends.py | 1 + pount/apps/iiif/tasks.py | 16 ++++++++++------ 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 pount/apps/iiif/management/commands/__init__.py create mode 100644 pount/apps/iiif/management/commands/ensureiiif.py diff --git a/pount/apps/iiif/management/commands/__init__.py b/pount/apps/iiif/management/commands/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/pount/apps/iiif/management/commands/ensureiiif.py b/pount/apps/iiif/management/commands/ensureiiif.py new file mode 100644 index 00000000..51010075 --- /dev/null +++ b/pount/apps/iiif/management/commands/ensureiiif.py @@ -0,0 +1,17 @@ +import logging + +from django.core.management import BaseCommand + +logger = logging.getLogger(__file__) + + +class Command(BaseCommand): + def handle(self, *args, **options): + """ + Lancer les tuilages manquants sur les fichiers images pour IIIF + """ + from pount.apps.api.models.item import MediaFile + from pount.apps.iiif.tasks import ensure_media_has_iiif + + for f in MediaFile.objects.filter(component="Image"): + ensure_media_has_iiif.delay(f.id) diff --git a/pount/apps/iiif/storage_backends.py b/pount/apps/iiif/storage_backends.py index 3f45cafc..a0ebdbec 100644 --- a/pount/apps/iiif/storage_backends.py +++ b/pount/apps/iiif/storage_backends.py @@ -5,6 +5,7 @@ from pount.apps.api.storage_backends import MediaStorage class IIIFFileStorage(MediaStorage): location = str(settings.CANTALOUPE_S3SOURCE_BASICLOOKUPSTRATEGY_PATH_PREFIX).rstrip("/") + file_overwrite = False def get_default_settings(self): default_settings = super().get_default_settings() diff --git a/pount/apps/iiif/tasks.py b/pount/apps/iiif/tasks.py index 9bc95f5c..fafeffb5 100644 --- a/pount/apps/iiif/tasks.py +++ b/pount/apps/iiif/tasks.py @@ -48,18 +48,23 @@ def ensure_media_has_iiif(media_id: Union[str, UUID]) -> None: media_file: MediaFile = MediaFile.objects.filter(id=media_id).first() if not media_file: - logger.debug(f"no such media file: {media_id}") + logger.info(f"no such media file: {media_id}") return item_media_storage = ItemMediaFileStorage() full_name = item_mediafile_fullname(media_file.filename, media_file.item) if not item_media_storage.exists(full_name): - logger.debug(f"media file not on storage: {media_id} / {full_name}") + logger.info(f"media file not on storage: {media_id} / {full_name}") return + iiif_storage = IIIFFileStorage() + tiled_pic_name = f"{media_file.id}.tiled.tif" + if iiif_storage.exists(tiled_pic_name): + logger.info(f"Tiled file already exists: {tiled_pic_name}") + return with tempfile.TemporaryDirectory() as tmp_dirname: - logger.debug(f"Start tiling in {tmp_dirname}") + logger.info(f"Start tiling in {tmp_dirname}") response = requests.get(media_file.url, stream=True) if response.ok: tmp_file_name = Path(tmp_dirname, media_file.filename) @@ -70,7 +75,6 @@ def ensure_media_has_iiif(media_id: Union[str, UUID]) -> None: f.write(chunk) tiled_tif = f"{basename}.tiled.tif" pic_to_tiled_tiff(tmp_file_name, tiled_tif) - iiif_storage = IIIFFileStorage() with open(tiled_tif, "rb") as f: - iiif_storage.save(f"{media_file.id}.tiled.tif", f) - logger.debug(f"saved {tiled_tif}") + iiif_storage.save(tiled_pic_name, f) + logger.info(f"saved {tiled_tif}") -- GitLab