Fix for issue #263
This commit is contained in:
@@ -1402,16 +1402,18 @@ def query(
|
||||
@click.option(
|
||||
"--edited-suffix",
|
||||
metavar="SUFFIX",
|
||||
help="Optional suffix for naming edited photos. Default name for edited photos is in form "
|
||||
help="Optional suffix template for naming edited photos. Default name for edited photos is in form "
|
||||
"'photoname_edited.ext'. For example, with '--edited-suffix _bearbeiten', the edited photo "
|
||||
f"would be named 'photoname_bearbeiten.ext'. The default suffix is '{DEFAULT_EDITED_SUFFIX}'.",
|
||||
f"would be named 'photoname_bearbeiten.ext'. The default suffix is '{DEFAULT_EDITED_SUFFIX}'. "
|
||||
"Multi-value templates (see Templating System) are not permitted with --edited-suffix.",
|
||||
)
|
||||
@click.option(
|
||||
"--original-suffix",
|
||||
metavar="SUFFIX",
|
||||
help="Optional suffix for naming original photos. Default name for original photos is in form "
|
||||
help="Optional suffix template for naming original photos. Default name for original photos is in form "
|
||||
"'filename.ext'. For example, with '--original-suffix _original', the original photo "
|
||||
"would be named 'filename_original.ext'. The default suffix is '' (no suffix).",
|
||||
"would be named 'filename_original.ext'. The default suffix is '' (no suffix). "
|
||||
"Multi-value templates (see Templating System) are not permitted with --original-suffix.",
|
||||
)
|
||||
@click.option(
|
||||
"--use-photos-export",
|
||||
@@ -1578,8 +1580,6 @@ def export(
|
||||
ignore=["ctx", "cli_obj", "dest", "load_config", "save_config"],
|
||||
)
|
||||
|
||||
# print(jpeg_quality, edited_suffix, original_suffix)
|
||||
|
||||
global VERBOSE
|
||||
VERBOSE = bool(verbose)
|
||||
|
||||
@@ -1716,11 +1716,7 @@ def export(
|
||||
("jpeg_quality", ("convert_to_jpeg")),
|
||||
]
|
||||
try:
|
||||
cfg.validate(
|
||||
exclusive=exclusive_options,
|
||||
dependent=dependent_options,
|
||||
cli=True,
|
||||
)
|
||||
cfg.validate(exclusive=exclusive_options, dependent=dependent_options, cli=True)
|
||||
except ConfigOptionsInvalidError as e:
|
||||
click.echo(f"Incompatible export options: {e.message}", err=True)
|
||||
raise click.Abort()
|
||||
@@ -1736,8 +1732,6 @@ def export(
|
||||
DEFAULT_ORIGINAL_SUFFIX if original_suffix is None else original_suffix
|
||||
)
|
||||
|
||||
# print(jpeg_quality, edited_suffix, original_suffix)
|
||||
|
||||
if not os.path.isdir(dest):
|
||||
click.echo(f"DEST {dest} must be valid path", err=True)
|
||||
raise click.Abort()
|
||||
@@ -2693,10 +2687,25 @@ def export_photo(
|
||||
filenames = get_filenames_from_template(photo, filename_template, original_name)
|
||||
for filename in filenames:
|
||||
if original_suffix:
|
||||
rendered_suffix, unmatched = photo.render_template(
|
||||
original_suffix, filename=True
|
||||
)
|
||||
if not rendered_suffix or unmatched:
|
||||
raise click.BadOptionUsage(
|
||||
"original_suffix",
|
||||
f"Invalid template for --original-suffix '{original_suffix}': results={rendered_suffix} unmatched={unmatched}",
|
||||
)
|
||||
if len(rendered_suffix) > 1:
|
||||
raise click.BadOptionUsage(
|
||||
"original_suffix",
|
||||
f"Invalid template for --original-suffix: may not use multi-valued templates: '{original_suffix}': results={rendered_suffix}",
|
||||
)
|
||||
rendered_suffix = rendered_suffix[0]
|
||||
|
||||
original_filename = pathlib.Path(filename)
|
||||
original_filename = (
|
||||
original_filename.parent
|
||||
/ f"{original_filename.stem}{original_suffix}{original_filename.suffix}"
|
||||
/ f"{original_filename.stem}{rendered_suffix}{original_filename.suffix}"
|
||||
)
|
||||
original_filename = str(original_filename)
|
||||
else:
|
||||
@@ -2813,7 +2822,30 @@ def export_photo(
|
||||
# use filename suffix which might be wrong,
|
||||
# will be corrected by use_photos_export
|
||||
edited_ext = pathlib.Path(photo.filename).suffix
|
||||
edited_filename = f"{edited_filename.stem}{edited_suffix}{edited_ext}"
|
||||
|
||||
if edited_suffix:
|
||||
rendered_suffix, unmatched = photo.render_template(
|
||||
edited_suffix, filename=True
|
||||
)
|
||||
|
||||
if not rendered_suffix or unmatched:
|
||||
raise click.BadOptionUsage(
|
||||
"edited_suffix",
|
||||
f"Invalid template for --edited-suffix '{edited_suffix}': results={rendered_suffix} unmatched={unmatched}",
|
||||
)
|
||||
if len(rendered_suffix) > 1:
|
||||
raise click.BadOptionUsage(
|
||||
"edited_suffix",
|
||||
f"Invalid template for --edited-suffix: may not use multi-valued templates: '{edited_suffix}': results={rendered_suffix}",
|
||||
)
|
||||
rendered_suffix = rendered_suffix[0]
|
||||
|
||||
edited_filename = (
|
||||
f"{edited_filename.stem}{rendered_suffix}{edited_ext}"
|
||||
)
|
||||
else:
|
||||
edited_filename = f"{edited_filename.stem}{edited_ext}"
|
||||
|
||||
verbose_(
|
||||
f"Exporting edited version of {photo.original_filename} ({photo.filename}) as {edited_filename}"
|
||||
)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
""" version info """
|
||||
|
||||
__version__ = "0.38.3"
|
||||
__version__ = "0.38.4"
|
||||
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ TEMPLATE_SUBSTITUTIONS = {
|
||||
),
|
||||
"{photo_or_video}": "'photo' or 'video' depending on what type the image is. To customize, use default value as in '{photo_or_video,photo=fotos;video=videos}'",
|
||||
"{hdr}": "Photo is HDR?; True/False value, use in format '{hdr?VALUE_IF_TRUE,VALUE_IF_FALSE}'",
|
||||
"{edited}": "Photo has been edited (has adjustments)?; True/False value, use in format '{edited?VALUE_IF_TRUE,VALUE_IF_FALSE}'",
|
||||
"{created.date}": "Photo's creation date in ISO format, e.g. '2020-03-22'",
|
||||
"{created.year}": "4-digit year of photo creation time",
|
||||
"{created.yy}": "2-digit year of photo creation time",
|
||||
@@ -632,7 +633,9 @@ class PhotoTemplate:
|
||||
elif field == "photo_or_video":
|
||||
value = self.get_photo_video_type(default)
|
||||
elif field == "hdr":
|
||||
value = self.get_photo_hdr(default, bool_val)
|
||||
value = self.get_photo_bool_attribute("hdr", default, bool_val)
|
||||
elif field == "edited":
|
||||
value = self.get_photo_bool_attribute("hasadjustments", default, bool_val)
|
||||
elif field == "created.date":
|
||||
value = DateTimeFormatter(self.photo.date).date
|
||||
elif field == "created.year":
|
||||
@@ -962,8 +965,10 @@ class PhotoTemplate:
|
||||
else:
|
||||
return default_dict["photo"]
|
||||
|
||||
def get_photo_hdr(self, default, bool_val):
|
||||
if self.photo.hdr:
|
||||
def get_photo_bool_attribute(self, attr, default, bool_val):
|
||||
# get value for a PhotoInfo bool attribute
|
||||
val = getattr(self.photo, attr)
|
||||
if val:
|
||||
return bool_val
|
||||
else:
|
||||
return default
|
||||
|
||||
Reference in New Issue
Block a user