Skip to content

Commit 4f829cb

Browse files
committed
Improve metadata handler by operations.
Consecutive calls using the same arguments are cached and served from cache. This applies for the backend setup, get_metadata and get_keys, as these are rather expensive calls. This may be problematic if metadata is written to the image in-between calls.
1 parent 2999695 commit 4f829cb

File tree

2 files changed

+8
-0
lines changed

2 files changed

+8
-0
lines changed

vimiv/plugins/metadata_piexif.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"""
1515

1616
import contextlib
17+
import functools
1718
from pathlib import Path
1819
from typing import Any, Sequence, Iterable, Optional, Dict
1920

@@ -25,6 +26,7 @@
2526
_logger = log.module_logger(__name__)
2627

2728

29+
@functools.lru_cache(1)
2830
def prepare_backend(path: Path) -> Optional[Dict[str, Any]]:
2931
"""Extract all metadata from the image."""
3032
try:
@@ -78,6 +80,7 @@ def get_date_time(path: Path) -> str:
7880

7981

8082
@exif.register(exif.Operations.get_metadata)
83+
@functools.lru_cache(1)
8184
def get_metadata(path: Path, desired_keys: Sequence[str]) -> exif.MetadataDictT:
8285
"""Get value of all desired keys."""
8386
metadata = prepare_backend(path)
@@ -126,6 +129,7 @@ def get_metadata(path: Path, desired_keys: Sequence[str]) -> exif.MetadataDictT:
126129

127130

128131
@exif.register(exif.Operations.get_keys)
132+
@functools.lru_cache(1)
129133
def get_keys(path: Path) -> Iterable[str]:
130134
"""Retrieve the key of all metadata values available in the current image."""
131135
metadata = prepare_backend(path)

vimiv/plugins/metadata_py3exiv2.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"""
1414

1515
import contextlib
16+
import functools
1617
import itertools
1718
from pathlib import Path
1819
from typing import Any, Sequence, Iterable, Optional
@@ -25,6 +26,7 @@
2526
_logger = log.module_logger(__name__)
2627

2728

29+
@functools.lru_cache(1)
2830
def prepare_backend(path: Path) -> Optional[pyexiv2.ImageMetadata]:
2931
"""Load metadata from image."""
3032
try:
@@ -81,6 +83,7 @@ def get_date_time(path: Path) -> str:
8183

8284

8385
@exif.register(exif.Operations.get_metadata)
86+
@functools.lru_cache(1)
8487
def get_metadata(path: Path, desired_keys: Sequence[str]) -> exif.MetadataDictT:
8588
"""Get value of all desired keys."""
8689
metadata = prepare_backend(path)
@@ -120,6 +123,7 @@ def get_metadata(path: Path, desired_keys: Sequence[str]) -> exif.MetadataDictT:
120123

121124

122125
@exif.register(exif.Operations.get_keys)
126+
@functools.lru_cache(1)
123127
def get_keys(path: Path) -> Iterable[str]:
124128
"""Retrieve the key of all metadata values available in the current image."""
125129
metadata = prepare_backend(path)

0 commit comments

Comments
 (0)