Added --original-suffix for issue #263
This commit is contained in:
@@ -351,6 +351,13 @@ Options:
|
|||||||
photo would be named
|
photo would be named
|
||||||
'photoname_bearbeiten.ext'. The default
|
'photoname_bearbeiten.ext'. The default
|
||||||
suffix is '_edited'.
|
suffix is '_edited'.
|
||||||
|
--original-suffix SUFFIX Optional suffix 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).
|
||||||
--no-extended-attributes Don't copy extended attributes when
|
--no-extended-attributes Don't copy extended attributes when
|
||||||
exporting. You only need this if exporting
|
exporting. You only need this if exporting
|
||||||
to a filesystem that doesn't support Mac OS
|
to a filesystem that doesn't support Mac OS
|
||||||
|
|||||||
@@ -1383,6 +1383,14 @@ def query(
|
|||||||
"'photoname_edited.ext'. For example, with '--edited-suffix _bearbeiten', the edited photo "
|
"'photoname_edited.ext'. For example, with '--edited-suffix _bearbeiten', the edited photo "
|
||||||
"would be named 'photoname_bearbeiten.ext'. The default suffix is '_edited'.",
|
"would be named 'photoname_bearbeiten.ext'. The default suffix is '_edited'.",
|
||||||
)
|
)
|
||||||
|
@click.option(
|
||||||
|
"--original-suffix",
|
||||||
|
metavar="SUFFIX",
|
||||||
|
default="",
|
||||||
|
help="Optional suffix 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).",
|
||||||
|
)
|
||||||
@click.option(
|
@click.option(
|
||||||
"--no-extended-attributes",
|
"--no-extended-attributes",
|
||||||
is_flag=True,
|
is_flag=True,
|
||||||
@@ -1484,6 +1492,7 @@ def export(
|
|||||||
directory,
|
directory,
|
||||||
filename_template,
|
filename_template,
|
||||||
edited_suffix,
|
edited_suffix,
|
||||||
|
original_suffix,
|
||||||
place,
|
place,
|
||||||
no_place,
|
no_place,
|
||||||
has_comment,
|
has_comment,
|
||||||
@@ -1752,6 +1761,7 @@ def export(
|
|||||||
dry_run=dry_run,
|
dry_run=dry_run,
|
||||||
touch_file=touch_file,
|
touch_file=touch_file,
|
||||||
edited_suffix=edited_suffix,
|
edited_suffix=edited_suffix,
|
||||||
|
original_suffix=original_suffix,
|
||||||
use_photos_export=use_photos_export,
|
use_photos_export=use_photos_export,
|
||||||
convert_to_jpeg=convert_to_jpeg,
|
convert_to_jpeg=convert_to_jpeg,
|
||||||
jpeg_quality=jpeg_quality,
|
jpeg_quality=jpeg_quality,
|
||||||
@@ -1805,6 +1815,7 @@ def export(
|
|||||||
dry_run=dry_run,
|
dry_run=dry_run,
|
||||||
touch_file=touch_file,
|
touch_file=touch_file,
|
||||||
edited_suffix=edited_suffix,
|
edited_suffix=edited_suffix,
|
||||||
|
original_suffix=original_suffix,
|
||||||
use_photos_export=use_photos_export,
|
use_photos_export=use_photos_export,
|
||||||
convert_to_jpeg=convert_to_jpeg,
|
convert_to_jpeg=convert_to_jpeg,
|
||||||
jpeg_quality=jpeg_quality,
|
jpeg_quality=jpeg_quality,
|
||||||
@@ -2324,6 +2335,7 @@ def export_photo(
|
|||||||
dry_run=None,
|
dry_run=None,
|
||||||
touch_file=None,
|
touch_file=None,
|
||||||
edited_suffix="_edited",
|
edited_suffix="_edited",
|
||||||
|
original_suffix="",
|
||||||
use_photos_export=False,
|
use_photos_export=False,
|
||||||
convert_to_jpeg=False,
|
convert_to_jpeg=False,
|
||||||
jpeg_quality=1.0,
|
jpeg_quality=1.0,
|
||||||
@@ -2422,7 +2434,19 @@ def export_photo(
|
|||||||
|
|
||||||
filenames = get_filenames_from_template(photo, filename_template, original_name)
|
filenames = get_filenames_from_template(photo, filename_template, original_name)
|
||||||
for filename in filenames:
|
for filename in filenames:
|
||||||
verbose(f"Exporting {photo.original_filename} ({photo.filename}) as {filename}")
|
if original_suffix:
|
||||||
|
original_filename = pathlib.Path(filename)
|
||||||
|
original_filename = (
|
||||||
|
original_filename.parent
|
||||||
|
/ f"{original_filename.stem}{original_suffix}{original_filename.suffix}"
|
||||||
|
)
|
||||||
|
original_filename = str(original_filename)
|
||||||
|
else:
|
||||||
|
original_filename = filename
|
||||||
|
|
||||||
|
verbose(
|
||||||
|
f"Exporting {photo.original_filename} ({photo.filename}) as {original_filename}"
|
||||||
|
)
|
||||||
|
|
||||||
dest_paths = get_dirnames_from_template(
|
dest_paths = get_dirnames_from_template(
|
||||||
photo, directory, export_by_date, dest, dry_run
|
photo, directory, export_by_date, dest, dry_run
|
||||||
@@ -2448,12 +2472,10 @@ def export_photo(
|
|||||||
|
|
||||||
# export the photo to each path in dest_paths
|
# export the photo to each path in dest_paths
|
||||||
for dest_path in dest_paths:
|
for dest_path in dest_paths:
|
||||||
if not export_original:
|
if export_original:
|
||||||
verbose(f"Skipping original version of {photo.original_filename}")
|
|
||||||
else:
|
|
||||||
export_results = photo.export2(
|
export_results = photo.export2(
|
||||||
dest_path,
|
dest_path,
|
||||||
filename,
|
original_filename,
|
||||||
sidecar_json=sidecar_json,
|
sidecar_json=sidecar_json,
|
||||||
sidecar_xmp=sidecar_xmp,
|
sidecar_xmp=sidecar_xmp,
|
||||||
live_photo=export_live,
|
live_photo=export_live,
|
||||||
@@ -2500,6 +2522,9 @@ def export_photo(
|
|||||||
for touched in export_results.touched:
|
for touched in export_results.touched:
|
||||||
verbose(f"Touched date on file {touched}")
|
verbose(f"Touched date on file {touched}")
|
||||||
|
|
||||||
|
else:
|
||||||
|
verbose(f"Skipping original version of {photo.original_filename}")
|
||||||
|
|
||||||
# if export-edited, also export the edited version
|
# if export-edited, also export the edited version
|
||||||
# verify the photo has adjustments and valid path to avoid raising an exception
|
# verify the photo has adjustments and valid path to avoid raising an exception
|
||||||
if export_edited and photo.hasadjustments:
|
if export_edited and photo.hasadjustments:
|
||||||
@@ -2508,7 +2533,7 @@ def export_photo(
|
|||||||
if not download_missing and photo.path_edited is None:
|
if not download_missing and photo.path_edited is None:
|
||||||
verbose(f"Skipping missing edited photo for {filename}")
|
verbose(f"Skipping missing edited photo for {filename}")
|
||||||
else:
|
else:
|
||||||
edited_name = pathlib.Path(filename)
|
edited_filename = pathlib.Path(filename)
|
||||||
# check for correct edited suffix
|
# check for correct edited suffix
|
||||||
if photo.path_edited is not None:
|
if photo.path_edited is not None:
|
||||||
edited_ext = pathlib.Path(photo.path_edited).suffix
|
edited_ext = pathlib.Path(photo.path_edited).suffix
|
||||||
@@ -2516,11 +2541,15 @@ def export_photo(
|
|||||||
# use filename suffix which might be wrong,
|
# use filename suffix which might be wrong,
|
||||||
# will be corrected by use_photos_export
|
# will be corrected by use_photos_export
|
||||||
edited_ext = pathlib.Path(photo.filename).suffix
|
edited_ext = pathlib.Path(photo.filename).suffix
|
||||||
edited_name = f"{edited_name.stem}{edited_suffix}{edited_ext}"
|
edited_filename = (
|
||||||
verbose(f"Exporting edited version of {filename} as {edited_name}")
|
f"{edited_filename.stem}{edited_suffix}{edited_ext}"
|
||||||
|
)
|
||||||
|
verbose(
|
||||||
|
f"Exporting edited version of {filename} as {edited_filename}"
|
||||||
|
)
|
||||||
export_results_edited = photo.export2(
|
export_results_edited = photo.export2(
|
||||||
dest_path,
|
dest_path,
|
||||||
edited_name,
|
edited_filename,
|
||||||
sidecar_json=sidecar_json,
|
sidecar_json=sidecar_json,
|
||||||
sidecar_xmp=sidecar_xmp,
|
sidecar_xmp=sidecar_xmp,
|
||||||
export_as_hardlink=export_as_hardlink,
|
export_as_hardlink=export_as_hardlink,
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.36.24"
|
__version__ = "0.36.25"
|
||||||
|
|
||||||
|
|||||||
@@ -65,6 +65,7 @@ CLI_EXPORT_FILENAMES_ALBUM_UNICODE = ["IMG_4547.jpg"]
|
|||||||
CLI_EXPORT_FILENAMES_DELETED_TWIN = ["wedding.jpg", "wedding_edited.jpeg"]
|
CLI_EXPORT_FILENAMES_DELETED_TWIN = ["wedding.jpg", "wedding_edited.jpeg"]
|
||||||
|
|
||||||
CLI_EXPORT_EDITED_SUFFIX = "_bearbeiten"
|
CLI_EXPORT_EDITED_SUFFIX = "_bearbeiten"
|
||||||
|
CLI_EXPORT_ORIGINAL_SUFFIX = "_original"
|
||||||
|
|
||||||
CLI_EXPORT_FILENAMES_EDITED_SUFFIX = [
|
CLI_EXPORT_FILENAMES_EDITED_SUFFIX = [
|
||||||
"Pumkins1.jpg",
|
"Pumkins1.jpg",
|
||||||
@@ -77,6 +78,16 @@ CLI_EXPORT_FILENAMES_EDITED_SUFFIX = [
|
|||||||
"wedding_bearbeiten.jpeg",
|
"wedding_bearbeiten.jpeg",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
CLI_EXPORT_FILENAMES_ORIGINAL_SUFFIX = [
|
||||||
|
"Pumkins1_original.jpg",
|
||||||
|
"Pumkins2_original.jpg",
|
||||||
|
"Pumpkins3_original.jpg",
|
||||||
|
"St James Park_original.jpg",
|
||||||
|
"St James Park_edited.jpeg",
|
||||||
|
"Tulips_original.jpg",
|
||||||
|
"wedding_original.jpg",
|
||||||
|
"wedding_edited.jpeg",
|
||||||
|
]
|
||||||
|
|
||||||
CLI_EXPORT_FILENAMES_CURRENT = [
|
CLI_EXPORT_FILENAMES_CURRENT = [
|
||||||
"1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg",
|
"1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg",
|
||||||
@@ -1010,6 +1021,33 @@ def test_export_edited_suffix():
|
|||||||
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_EDITED_SUFFIX)
|
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_EDITED_SUFFIX)
|
||||||
|
|
||||||
|
|
||||||
|
def test_export_original_suffix():
|
||||||
|
""" test export with --original-suffix """
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import osxphotos
|
||||||
|
from osxphotos.__main__ import export
|
||||||
|
|
||||||
|
runner = CliRunner()
|
||||||
|
cwd = os.getcwd()
|
||||||
|
# pylint: disable=not-context-manager
|
||||||
|
with runner.isolated_filesystem():
|
||||||
|
result = runner.invoke(
|
||||||
|
export,
|
||||||
|
[
|
||||||
|
os.path.join(cwd, CLI_PHOTOS_DB),
|
||||||
|
".",
|
||||||
|
"--original-suffix",
|
||||||
|
CLI_EXPORT_ORIGINAL_SUFFIX,
|
||||||
|
"-V",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
assert result.exit_code == 0
|
||||||
|
files = glob.glob("*")
|
||||||
|
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_ORIGINAL_SUFFIX)
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.skipif(
|
@pytest.mark.skipif(
|
||||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||||
reason="Skip if running in Github actions, no GPU.",
|
reason="Skip if running in Github actions, no GPU.",
|
||||||
|
|||||||
Reference in New Issue
Block a user