Source code for src.imagedata.archives

"""This module provides plugins for various image archive formats.

Standard plugins provide support for local filesystem and zip archives.
"""

# Copyright (c) 2018-2026 Erling Andersen, Haukeland University Hospital, Bergen, Norway

import logging
import urllib.parse
from ..transports import Transport

logger = logging.getLogger(__name__)


[docs] class ArchivePluginNotFound(Exception): pass
[docs] class FileAlreadyExistsError(Exception): pass
[docs] def find_plugin(pfind, url, mode="r", opts=None): """Return plugin for given image archive type.""" if opts is None: opts = {} from .. import plugins if 'archive' in plugins: for pname, ptype, pclass in plugins['archive']: if ptype == pfind: return pclass(url=url, mode=mode, opts=opts) raise ArchivePluginNotFound("Plugin for image archive {} not found.".format(ptype))
[docs] def find_mimetype_plugin(mimetype, url, mode="r", read_directory_only=False, opts=None): """Return plugin for given file type.""" _name: str = '{}.{}'.format(__name__, find_mimetype_plugin.__name__) if opts is None: opts = {} from .. import plugins # Windows: Drive letter will be parsed as scheme urldict = urllib.parse.urlsplit(url, scheme="file") transport = None if urldict.scheme: transport = Transport( urldict.scheme, netloc=urldict.netloc, root=urldict.path, mode=mode, read_directory_only=read_directory_only) if mimetype is None: # Get any transport requirement for mimetype try: mimetype = transport.mimetype except AttributeError: pass for pname, ptype, pclass in plugins['archive']: logger.debug("{}: compare '{}' to {}".format( _name, mimetype, pclass.mimetypes)) if mimetype in pclass.mimetypes: logger.debug("{}: {}, mode: {}".format( _name, ptype, mode)) return pclass(url=url, transport=transport, mode=mode, opts=opts) if urldict.scheme == "file": logger.debug("{}: filesystem".format(_name)) try: return find_plugin('filesystem', url, mode, opts=opts) except ArchivePluginNotFound: # Fall-through to fail with ArchivePluginNotFound pass raise ArchivePluginNotFound("Plugin for MIME type {} not found.".format(mimetype))
[docs] def get_archiver_list(): from .. import plugins return plugins['archive'] if 'archive' in plugins else []