"""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,
opts=opts)
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 []