Fixed --strip behavior, #511
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.42.75"
|
__version__ = "0.42.76"
|
||||||
|
|||||||
@@ -2784,9 +2784,7 @@ def _render_suffix_template(
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
options = RenderOptions(
|
options = RenderOptions(filename=True, export_dir=dest, exportdb=export_db)
|
||||||
filename=True, strip=strip, export_dir=dest, exportdb=export_db
|
|
||||||
)
|
|
||||||
rendered_suffix, unmatched = photo.render_template(suffix_template, options)
|
rendered_suffix, unmatched = photo.render_template(suffix_template, options)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
raise click.BadOptionUsage(
|
raise click.BadOptionUsage(
|
||||||
@@ -2803,6 +2801,10 @@ def _render_suffix_template(
|
|||||||
var_name,
|
var_name,
|
||||||
f"Invalid template for {option_name}: may not use multi-valued templates: '{suffix_template}': results={rendered_suffix}",
|
f"Invalid template for {option_name}: may not use multi-valued templates: '{suffix_template}': results={rendered_suffix}",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if strip:
|
||||||
|
rendered_suffix[0] = rendered_suffix[0].strip()
|
||||||
|
|
||||||
return rendered_suffix[0]
|
return rendered_suffix[0]
|
||||||
|
|
||||||
|
|
||||||
@@ -3033,7 +3035,6 @@ def get_filenames_from_template(
|
|||||||
options = RenderOptions(
|
options = RenderOptions(
|
||||||
path_sep="_",
|
path_sep="_",
|
||||||
filename=True,
|
filename=True,
|
||||||
strip=strip,
|
|
||||||
edited_version=edited,
|
edited_version=edited,
|
||||||
export_dir=export_dir,
|
export_dir=export_dir,
|
||||||
dest_path=dest_path,
|
dest_path=dest_path,
|
||||||
@@ -3057,7 +3058,10 @@ def get_filenames_from_template(
|
|||||||
else [photo.filename]
|
else [photo.filename]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if strip:
|
||||||
|
filenames = [filename.strip() for filename in filenames]
|
||||||
filenames = [sanitize_filename(filename) for filename in filenames]
|
filenames = [sanitize_filename(filename) for filename in filenames]
|
||||||
|
|
||||||
return filenames
|
return filenames
|
||||||
|
|
||||||
|
|
||||||
@@ -3101,7 +3105,7 @@ def get_dirnames_from_template(
|
|||||||
# got a directory template, render it and check results are valid
|
# got a directory template, render it and check results are valid
|
||||||
try:
|
try:
|
||||||
options = RenderOptions(
|
options = RenderOptions(
|
||||||
dirname=True, strip=strip, edited_version=edited, exportdb=export_db
|
dirname=True, edited_version=edited, exportdb=export_db
|
||||||
)
|
)
|
||||||
dirnames, unmatched = photo.render_template(directory, options)
|
dirnames, unmatched = photo.render_template(directory, options)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
@@ -3116,6 +3120,8 @@ def get_dirnames_from_template(
|
|||||||
|
|
||||||
dest_paths = []
|
dest_paths = []
|
||||||
for dirname in dirnames:
|
for dirname in dirnames:
|
||||||
|
if strip:
|
||||||
|
dirname = dirname.strip()
|
||||||
dirname = sanitize_filepath(dirname)
|
dirname = sanitize_filepath(dirname)
|
||||||
dest_path = os.path.join(dest, dirname)
|
dest_path = os.path.join(dest, dirname)
|
||||||
if not is_valid_filepath(dest_path):
|
if not is_valid_filepath(dest_path):
|
||||||
@@ -3429,7 +3435,6 @@ def write_finder_tags(
|
|||||||
options = RenderOptions(
|
options = RenderOptions(
|
||||||
none_str=_OSXPHOTOS_NONE_SENTINEL,
|
none_str=_OSXPHOTOS_NONE_SENTINEL,
|
||||||
path_sep="/",
|
path_sep="/",
|
||||||
strip=strip,
|
|
||||||
export_dir=export_dir,
|
export_dir=export_dir,
|
||||||
exportdb=export_db,
|
exportdb=export_db,
|
||||||
)
|
)
|
||||||
@@ -3451,6 +3456,9 @@ def write_finder_tags(
|
|||||||
rendered_tags.extend(rendered)
|
rendered_tags.extend(rendered)
|
||||||
|
|
||||||
# filter out any template values that didn't match by looking for sentinel
|
# filter out any template values that didn't match by looking for sentinel
|
||||||
|
if strip:
|
||||||
|
rendered_tags = [value.strip() for value in rendered_tags]
|
||||||
|
|
||||||
rendered_tags = [
|
rendered_tags = [
|
||||||
value.replace(_OSXPHOTOS_NONE_SENTINEL, "") for value in rendered_tags
|
value.replace(_OSXPHOTOS_NONE_SENTINEL, "") for value in rendered_tags
|
||||||
]
|
]
|
||||||
@@ -3496,7 +3504,6 @@ def write_extended_attributes(
|
|||||||
options = RenderOptions(
|
options = RenderOptions(
|
||||||
none_str=_OSXPHOTOS_NONE_SENTINEL,
|
none_str=_OSXPHOTOS_NONE_SENTINEL,
|
||||||
path_sep="/",
|
path_sep="/",
|
||||||
strip=strip,
|
|
||||||
export_dir=export_dir,
|
export_dir=export_dir,
|
||||||
exportdb=export_db,
|
exportdb=export_db,
|
||||||
)
|
)
|
||||||
@@ -3516,6 +3523,9 @@ def write_extended_attributes(
|
|||||||
)
|
)
|
||||||
|
|
||||||
# filter out any template values that didn't match by looking for sentinel
|
# filter out any template values that didn't match by looking for sentinel
|
||||||
|
if strip:
|
||||||
|
rendered = [value.strip() for value in rendered]
|
||||||
|
|
||||||
rendered = [value.replace(_OSXPHOTOS_NONE_SENTINEL, "") for value in rendered]
|
rendered = [value.replace(_OSXPHOTOS_NONE_SENTINEL, "") for value in rendered]
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -530,6 +530,7 @@ def export2(
|
|||||||
preview=False,
|
preview=False,
|
||||||
preview_suffix=DEFAULT_PREVIEW_SUFFIX,
|
preview_suffix=DEFAULT_PREVIEW_SUFFIX,
|
||||||
render_options: Optional[RenderOptions] = None,
|
render_options: Optional[RenderOptions] = None,
|
||||||
|
strip=False,
|
||||||
):
|
):
|
||||||
"""export photo, like export but with update and dry_run options
|
"""export photo, like export but with update and dry_run options
|
||||||
dest: must be valid destination path or exception raised
|
dest: must be valid destination path or exception raised
|
||||||
@@ -588,6 +589,7 @@ def export2(
|
|||||||
preview: if True, also exports preview image
|
preview: if True, also exports preview image
|
||||||
preview_suffix: optional string to append to end of filename for preview images
|
preview_suffix: optional string to append to end of filename for preview images
|
||||||
render_options: optional osxphotos.phototemplate.RenderOptions instance to specify options for rendering templates
|
render_options: optional osxphotos.phototemplate.RenderOptions instance to specify options for rendering templates
|
||||||
|
strip: if True, strip whitespace from rendered templates
|
||||||
|
|
||||||
Returns: ExportResults class
|
Returns: ExportResults class
|
||||||
ExportResults has attributes:
|
ExportResults has attributes:
|
||||||
@@ -969,6 +971,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
sidecars.append(
|
sidecars.append(
|
||||||
(
|
(
|
||||||
@@ -995,6 +998,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
sidecars.append(
|
sidecars.append(
|
||||||
(
|
(
|
||||||
@@ -1017,6 +1021,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
sidecars.append(
|
sidecars.append(
|
||||||
(
|
(
|
||||||
@@ -1087,6 +1092,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
)[0]
|
)[0]
|
||||||
if old_data != current_data:
|
if old_data != current_data:
|
||||||
@@ -1110,6 +1116,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
if warning_:
|
if warning_:
|
||||||
all_results.exiftool_warning.append((exported_file, warning_))
|
all_results.exiftool_warning.append((exported_file, warning_))
|
||||||
@@ -1130,6 +1137,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
export_db.set_stat_exif_for_file(
|
export_db.set_stat_exif_for_file(
|
||||||
@@ -1155,6 +1163,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
if warning_:
|
if warning_:
|
||||||
all_results.exiftool_warning.append((exported_file, warning_))
|
all_results.exiftool_warning.append((exported_file, warning_))
|
||||||
@@ -1175,6 +1184,7 @@ def export2(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
export_db.set_stat_exif_for_file(
|
export_db.set_stat_exif_for_file(
|
||||||
@@ -1580,6 +1590,7 @@ def _write_exif_data(
|
|||||||
persons=True,
|
persons=True,
|
||||||
location=True,
|
location=True,
|
||||||
replace_keywords=False,
|
replace_keywords=False,
|
||||||
|
strip=False,
|
||||||
):
|
):
|
||||||
"""write exif data to image file at filepath
|
"""write exif data to image file at filepath
|
||||||
|
|
||||||
@@ -1593,6 +1604,7 @@ def _write_exif_data(
|
|||||||
persons: if True, write person data to metadata
|
persons: if True, write person data to metadata
|
||||||
location: if True, write location data to metadata
|
location: if True, write location data to metadata
|
||||||
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
||||||
|
strip: if True, strip any leading or trailing whitespace from rendered templates
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
(warning, error) of warning and error strings if exiftool produces warnings or errors
|
(warning, error) of warning and error strings if exiftool produces warnings or errors
|
||||||
@@ -1610,6 +1622,7 @@ def _write_exif_data(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
|
|
||||||
with ExifTool(filepath, flags=flags, exiftool=self._db._exiftool_path) as exiftool:
|
with ExifTool(filepath, flags=flags, exiftool=self._db._exiftool_path) as exiftool:
|
||||||
@@ -1635,6 +1648,7 @@ def _exiftool_dict(
|
|||||||
persons=True,
|
persons=True,
|
||||||
location=True,
|
location=True,
|
||||||
replace_keywords=False,
|
replace_keywords=False,
|
||||||
|
strip=False,
|
||||||
):
|
):
|
||||||
"""Return dict of EXIF details for building exiftool JSON sidecar or sending commands to ExifTool.
|
"""Return dict of EXIF details for building exiftool JSON sidecar or sending commands to ExifTool.
|
||||||
Does not include all the EXIF fields as those are likely already in the image.
|
Does not include all the EXIF fields as those are likely already in the image.
|
||||||
@@ -1651,6 +1665,7 @@ def _exiftool_dict(
|
|||||||
persons: if True, include person data
|
persons: if True, include person data
|
||||||
location: if True, include location data
|
location: if True, include location data
|
||||||
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
||||||
|
strip: if True, strip any rendered templates
|
||||||
|
|
||||||
Returns: dict with exiftool tags / values
|
Returns: dict with exiftool tags / values
|
||||||
|
|
||||||
@@ -1698,6 +1713,8 @@ def _exiftool_dict(
|
|||||||
)
|
)
|
||||||
rendered = self.render_template(description_template, options)[0]
|
rendered = self.render_template(description_template, options)[0]
|
||||||
description = " ".join(rendered) if rendered else ""
|
description = " ".join(rendered) if rendered else ""
|
||||||
|
if strip:
|
||||||
|
description = description.strip()
|
||||||
exif["EXIF:ImageDescription"] = description
|
exif["EXIF:ImageDescription"] = description
|
||||||
exif["XMP:Description"] = description
|
exif["XMP:Description"] = description
|
||||||
exif["IPTC:Caption-Abstract"] = description
|
exif["IPTC:Caption-Abstract"] = description
|
||||||
@@ -1745,6 +1762,9 @@ def _exiftool_dict(
|
|||||||
)
|
)
|
||||||
rendered_keywords.extend(rendered)
|
rendered_keywords.extend(rendered)
|
||||||
|
|
||||||
|
if strip:
|
||||||
|
rendered_keywords = [keyword.strip() for keyword in rendered_keywords]
|
||||||
|
|
||||||
# filter out any template values that didn't match by looking for sentinel
|
# filter out any template values that didn't match by looking for sentinel
|
||||||
rendered_keywords = [
|
rendered_keywords = [
|
||||||
keyword
|
keyword
|
||||||
@@ -1909,6 +1929,7 @@ def _exiftool_json_sidecar(
|
|||||||
persons=True,
|
persons=True,
|
||||||
location=True,
|
location=True,
|
||||||
replace_keywords=False,
|
replace_keywords=False,
|
||||||
|
strip=False,
|
||||||
):
|
):
|
||||||
"""Return dict of EXIF details for building exiftool JSON sidecar or sending commands to ExifTool.
|
"""Return dict of EXIF details for building exiftool JSON sidecar or sending commands to ExifTool.
|
||||||
Does not include all the EXIF fields as those are likely already in the image.
|
Does not include all the EXIF fields as those are likely already in the image.
|
||||||
@@ -1926,6 +1947,7 @@ def _exiftool_json_sidecar(
|
|||||||
persons: if True, include person data
|
persons: if True, include person data
|
||||||
location: if True, include location data
|
location: if True, include location data
|
||||||
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
||||||
|
strip: if True, strip whitespace from rendered templates
|
||||||
|
|
||||||
Returns: dict with exiftool tags / values
|
Returns: dict with exiftool tags / values
|
||||||
|
|
||||||
@@ -1965,6 +1987,7 @@ def _exiftool_json_sidecar(
|
|||||||
persons=persons,
|
persons=persons,
|
||||||
location=location,
|
location=location,
|
||||||
replace_keywords=replace_keywords,
|
replace_keywords=replace_keywords,
|
||||||
|
strip=strip,
|
||||||
)
|
)
|
||||||
|
|
||||||
if not tag_groups:
|
if not tag_groups:
|
||||||
@@ -1990,6 +2013,7 @@ def _xmp_sidecar(
|
|||||||
persons=True,
|
persons=True,
|
||||||
location=True,
|
location=True,
|
||||||
replace_keywords=False,
|
replace_keywords=False,
|
||||||
|
strip=False,
|
||||||
):
|
):
|
||||||
"""returns string for XMP sidecar
|
"""returns string for XMP sidecar
|
||||||
use_albums_as_keywords: treat album names as keywords
|
use_albums_as_keywords: treat album names as keywords
|
||||||
@@ -2002,6 +2026,7 @@ def _xmp_sidecar(
|
|||||||
persons: if True, include person data
|
persons: if True, include person data
|
||||||
location: if True, include location data
|
location: if True, include location data
|
||||||
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
replace_keywords: if True, keyword_template replaces any keywords, otherwise it's additive
|
||||||
|
strip: if True, strip whitespace from rendered templates
|
||||||
"""
|
"""
|
||||||
|
|
||||||
xmp_template_file = (
|
xmp_template_file = (
|
||||||
@@ -2019,6 +2044,8 @@ def _xmp_sidecar(
|
|||||||
)
|
)
|
||||||
rendered = self.render_template(description_template, options)[0]
|
rendered = self.render_template(description_template, options)[0]
|
||||||
description = " ".join(rendered) if rendered else ""
|
description = " ".join(rendered) if rendered else ""
|
||||||
|
if strip:
|
||||||
|
description = description.strip()
|
||||||
else:
|
else:
|
||||||
description = self.description if self.description is not None else ""
|
description = self.description if self.description is not None else ""
|
||||||
|
|
||||||
@@ -2060,6 +2087,9 @@ def _xmp_sidecar(
|
|||||||
)
|
)
|
||||||
rendered_keywords.extend(rendered)
|
rendered_keywords.extend(rendered)
|
||||||
|
|
||||||
|
if strip:
|
||||||
|
rendered_keywords = [keyword.strip() for keyword in rendered_keywords]
|
||||||
|
|
||||||
# filter out any template values that didn't match by looking for sentinel
|
# filter out any template values that didn't match by looking for sentinel
|
||||||
rendered_keywords = [
|
rendered_keywords = [
|
||||||
keyword
|
keyword
|
||||||
|
|||||||
Reference in New Issue
Block a user