Skip to content

Commit

Permalink
group thumbnailers in categories so they can be enabled selectively
Browse files Browse the repository at this point in the history
An app using vignette could want to only keep a category of handled
files. See #4
  • Loading branch information
hydrargyrum committed Aug 17, 2019
1 parent 376d230 commit 6a72782
Showing 1 changed file with 51 additions and 2 deletions.
53 changes: 51 additions & 2 deletions vignette/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,10 @@
'KEY_MIME',
'KEY_DOC_PAGES',
'KEY_MOVIE_LENGTH',
'select_thumbnailer_types',
'FILETYPE_IMAGE',
'FILETYPE_VIDEO',
'FILETYPE_DOCUMENT',
)

if sys.version_info.major == 2:
Expand Down Expand Up @@ -469,6 +473,11 @@ def update_metadata(self, dest, moreinfo=None):
raise NotImplementedError()


FILETYPE_IMAGE = 'image'
FILETYPE_VIDEO = 'video'
FILETYPE_DOCUMENT = 'document'


class ThumbnailBackend(object):
def is_available(self):
return False
Expand All @@ -478,6 +487,8 @@ def create_thumbnail(self, src, dest, size):


class PilBackend(MetadataBackend, ThumbnailBackend):
handled_types = frozenset([FILETYPE_IMAGE])

@classmethod
def is_available(cls):
try:
Expand Down Expand Up @@ -554,6 +565,8 @@ def update_metadata(self, dest, moreinfo=None):


class MagickBackend(MetadataBackend, ThumbnailBackend):
handled_types = frozenset([FILETYPE_IMAGE])

@classmethod
def is_available(cls):
try:
Expand Down Expand Up @@ -636,6 +649,7 @@ def is_available(self):


class PopplerCliBackend(CliMixin, ThumbnailBackend):
handled_types = frozenset([FILETYPE_DOCUMENT])
cmd = 'pdftocairo'

def create_thumbnail(self, src, dest, size):
Expand All @@ -649,6 +663,7 @@ def create_thumbnail(self, src, dest, size):


class OooCliBackend(CliMixin, ThumbnailBackend):
handled_types = frozenset([FILETYPE_DOCUMENT])
cmd = 'ooo-thumbnailer'

def create_thumbnail(self, src, dest, size):
Expand All @@ -663,6 +678,8 @@ def create_thumbnail(self, src, dest, size):


class QtBackend(MetadataBackend, ThumbnailBackend):
handled_types = frozenset([FILETYPE_IMAGE])

@classmethod
def is_available(cls):
try:
Expand Down Expand Up @@ -737,12 +754,27 @@ def get_info(self, path):


class GnomeThumbnailer(CliMixin, ThumbnailBackend):
mime_to_handle = {
re.compile('^image/'): FILETYPE_IMAGE,
re.compile('^video/'): FILETYPE_VIDEO,
re.compile('^application/pdf'): FILETYPE_DOCUMENT,
re.compile('^application/vnd.oasis.opendocument.'): FILETYPE_DOCUMENT,
re.compile('^application/vnd.openxmlformats-officedocument.'): FILETYPE_DOCUMENT,
}

def __init__(self, cmd_test, cmd_exec, mimes):
self.cmd = cmd_test
self.accepted_mimes = re.compile('^(?:%s)$' % '|'.join(map(re.escape, mimes)))
cmd_exec = re.sub('%([iosu])', r'%(\1)s', cmd_exec)
self.cmd_exec = shlex.split(cmd_exec)

self.handled_types = set()
for mime in mimes:
for reobj, const in self.mime_to_handle.items():
if reobj.match(mime):
self.handled_types.add(const)
break

def __repr__(self):
return '<%s cmd=%r>' % (type(self).__name__, self.cmd)

Expand Down Expand Up @@ -782,15 +814,17 @@ def build_gnome_thumbnailers():

METADATA_BACKENDS = [QtBackend(), PilBackend(), MagickBackend()]

THUMBNAILER_BACKENDS = [
ALL_THUMBNAILER_BACKENDS = [
OooCliBackend(),
PopplerCliBackend(),
QtBackend(),
PilBackend(),
MagickBackend()
]

THUMBNAILER_BACKENDS.extend(build_gnome_thumbnailers())
ALL_THUMBNAILER_BACKENDS.extend(build_gnome_thumbnailers())

THUMBNAILER_BACKENDS = list(ALL_THUMBNAILER_BACKENDS)


def get_metadata_backend():
Expand Down Expand Up @@ -949,6 +983,21 @@ def thumbnail_info(thumbnail):
return get_metadata_backend().get_info(thumbnail)


def select_thumbnailer_types(types):
"""Select a subset of thumbnailer backends, by type of handled file.
:param types: iterable containing constants `FILETYPE_*`
"""
global THUMBNAILER_BACKENDS

if isinstance(types, (bytes, str)):
types = (types,)
THUMBNAILER_BACKENDS = [
b for b in ALL_THUMBNAILER_BACKENDS
if b.handled_types & set(types)
]


def main():
output = get_thumbnail(sys.argv[1])
if output is None:
Expand Down

0 comments on commit 6a72782

Please sign in to comment.