Skip to content

Commit

Permalink
processors: move tiles processor to records
Browse files Browse the repository at this point in the history
  • Loading branch information
yashlamba committed Apr 25, 2024
1 parent 68a3fd5 commit b310b58
Show file tree
Hide file tree
Showing 4 changed files with 72 additions and 28 deletions.
6 changes: 3 additions & 3 deletions invenio_records_resources/services/files/processors/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ def __init__(self, processors):
"""Initialize the runner."""
self._processors = processors

def run(self, file_record, uow=None):
def run(self, file_record):
"""Run file processors or a given file record."""
for p in self._processors:
if p.can_process(file_record):
p.process(file_record, uow=uow)
p.process(file_record)


class FileProcessor:
Expand All @@ -38,6 +38,6 @@ def can_process(self, file_record):
"""Determine if this processor can process a given file record."""
return False

def process(self, file_record, uow=None):
def process(self, file_record):
"""Process a file."""
pass
29 changes: 4 additions & 25 deletions invenio_records_resources/services/files/processors/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@

"""Image metadata extractor."""

import datetime
import os
from io import BytesIO

import pkg_resources
from flask import current_app
from invenio_access.permissions import system_identity

from invenio_records_resources.services.uow import TaskOp

Expand Down Expand Up @@ -40,7 +43,7 @@ def can_process(self, file_record):
return ext in current_app.config["RECORDS_RESOURCES_IMAGE_FORMATS"]
return False

def process(self, file_record, uow=None):
def process(self, file_record):
"""Process the file record.
Security: Do not execute ImageMagick inside an HTTP request. Always
Expand All @@ -62,27 +65,3 @@ def process(self, file_record, uow=None):
height = img_or_seq.height
if width > 0 and height > 0:
file_record.metadata.update({"width": width, "height": height})


class TilesProcessor(FileProcessor):

def __init__(self, valid_exts=["tif", "jpeg", "png", "jpg"]):
self.valid_exts = valid_exts

def can_process(self, file_record):
if file_record.file.ext in self.valid_exts:
return True

def process(self, file_record, uow):
record = file_record.record
from invenio_rdm_records.services.iiif.tasks import ( # TODO Temp fix for circular import
generate_zoomable_image,
)

uow.register(
TaskOp(
generate_zoomable_image,
record_id=record["id"],
file_key=file_record.key,
)
)
14 changes: 14 additions & 0 deletions invenio_records_resources/services/records/processors/base.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
class RecordFilesProcessor:
"""Base class for record files processors."""

def _can_process(self, file_record, draft, record):
"""Determine if this processor can process a given record file."""
return False

def _process(self, file_record, draft, record, uow=None):
"""Process a record file."""
pass

def __call__(self, file_record, draft, record, uow=None):
if self._can_process(file_record, draft, record):
self._process(file_record, draft, record, uow=uow)
51 changes: 51 additions & 0 deletions invenio_records_resources/services/records/processors/tiles.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
import datetime
from io import BytesIO

from invenio_rdm_records.services.iiif.tasks import generate_zoomable_image

from invenio_records_resources.services.records.processors.base import (
RecordFilesProcessor,
)
from invenio_records_resources.services.uow import TaskOp


class TilesProcessor(RecordFilesProcessor):

def __init__(self, valid_exts=["tif", "jpeg", "png", "jpg"]):
self.valid_exts = valid_exts

def _can_process(self, file_record, record, draft):
if file_record.file.ext in self.valid_exts:
return True

def _process(self, file_record, draft, record, uow):
ref = record if record.is_published else draft
ref.media_files.enabled = True
ref["media_files"]["enabled"] = True

mf = ref.media_files.create(
f"{file_record.key}.ptif",
data={
"metadata": {
"processor": {
"type": "image-tiles",
"status": "init",
# TODO: could also be just `mf.updated`
"updated_at": datetime.datetime.now().isoformat(),
"props": {},
},
},
"access": {"hidden": False},
},
)

ref.media_files.create_obj(f"{file_record.key}.ptif", BytesIO())
ref.media_files.commit(f"{file_record.key}.ptif")

uow.register(
TaskOp(
generate_zoomable_image,
record_id=ref["id"],
file_key=file_record.key,
)
)

0 comments on commit b310b58

Please sign in to comment.