Improve usage of trusted_file throughout new_photo, metadata.

master
voussoir 2022-09-27 17:45:24 -07:00
parent 219b1ca5bb
commit 762f86c397
No known key found for this signature in database
GPG Key ID: 5F7554F8C26DACCB
3 changed files with 21 additions and 8 deletions

View File

@ -213,7 +213,7 @@ def dotdot_range(s) -> tuple:
return (low, high) return (low, high)
def generate_image_thumbnail(filepath, width, height) -> PIL.Image: def _generate_image_thumbnail(filepath, max_width, max_height) -> PIL.Image:
if not os.path.isfile(filepath): if not os.path.isfile(filepath):
raise FileNotFoundError(filepath) raise FileNotFoundError(filepath)
image = PIL.Image.open(filepath) image = PIL.Image.open(filepath)
@ -222,8 +222,8 @@ def generate_image_thumbnail(filepath, width, height) -> PIL.Image:
(new_width, new_height) = imagetools.fit_into_bounds( (new_width, new_height) = imagetools.fit_into_bounds(
image_width=image_width, image_width=image_width,
image_height=image_height, image_height=image_height,
frame_width=width, frame_width=max_width,
frame_height=height, frame_height=max_height,
only_shrink=True, only_shrink=True,
) )
if (new_width, new_height) != (image_width, image_height): if (new_width, new_height) != (image_width, image_height):
@ -244,6 +244,15 @@ def generate_image_thumbnail(filepath, width, height) -> PIL.Image:
image = image.convert('RGB') image = image.convert('RGB')
return image return image
def generate_image_thumbnail(*args, trusted_file=False, **kwargs) -> PIL.Image:
_max_pixels = PIL.Image.MAX_IMAGE_PIXELS
if trusted_file:
PIL.Image.MAX_IMAGE_PIXELS = None
try:
return _generate_image_thumbnail(*args, **kwargs)
finally:
PIL.Image.MAX_IMAGE_PIXELS = _max_pixels
def generate_video_thumbnail(filepath, outfile, width, height, **special) -> PIL.Image: def generate_video_thumbnail(filepath, outfile, width, height, **special) -> PIL.Image:
if not os.path.isfile(filepath): if not os.path.isfile(filepath):
raise FileNotFoundError(filepath) raise FileNotFoundError(filepath)

View File

@ -1060,9 +1060,11 @@ class Photo(ObjectBase):
@decorators.required_feature('photo.generate_thumbnail') @decorators.required_feature('photo.generate_thumbnail')
@worms.atomic @worms.atomic
def generate_thumbnail(self, **special) -> pathclass.Path: def generate_thumbnail(self, trusted_file=False, **special) -> pathclass.Path:
''' '''
special: special:
For images, you can provide `max_width` and/or `max_height` to
override the config file.
For videos, you can provide a `timestamp` to take the thumbnail at. For videos, you can provide a `timestamp` to take the thumbnail at.
''' '''
hopeful_filepath = self.make_thumbnail_filepath() hopeful_filepath = self.make_thumbnail_filepath()
@ -1073,8 +1075,9 @@ class Photo(ObjectBase):
try: try:
image = helpers.generate_image_thumbnail( image = helpers.generate_image_thumbnail(
self.real_path.absolute_path, self.real_path.absolute_path,
width=self.photodb.config['thumbnail_width'], max_width=special.get('max_width', self.photodb.config['thumbnail_width']),
height=self.photodb.config['thumbnail_height'], max_height=special.get('max_height', self.photodb.config['thumbnail_height']),
trusted_file=trusted_file,
) )
except (OSError, ValueError): except (OSError, ValueError):
traceback.print_exc() traceback.print_exc()

View File

@ -319,6 +319,7 @@ class PDBPhotoMixin:
known_hash=None, known_hash=None,
searchhidden=False, searchhidden=False,
tags=None, tags=None,
trusted_file=False,
) -> objects.Photo: ) -> objects.Photo:
''' '''
Given a filepath, determine its attributes and create a new Photo object Given a filepath, determine its attributes and create a new Photo object
@ -377,9 +378,9 @@ class PDBPhotoMixin:
if do_metadata: if do_metadata:
hash_kwargs = hash_kwargs or {} hash_kwargs = hash_kwargs or {}
photo.reload_metadata(hash_kwargs=hash_kwargs) photo.reload_metadata(hash_kwargs=hash_kwargs, trusted_file=trusted_file)
if do_thumbnail: if do_thumbnail:
photo.generate_thumbnail() photo.generate_thumbnail(trusted_file=trusted_file)
tags = tags or [] tags = tags or []
tags = [self.get_tag(name=tag) for tag in tags] tags = [self.get_tag(name=tag) for tag in tags]