From 399d432a66354b9c235f30d10c6985fbde1b7e4f Mon Sep 17 00:00:00 2001 From: Rhet Turnbull Date: Thu, 26 Nov 2020 18:35:03 -0800 Subject: [PATCH] Added --original-suffix for issue #263 --- README.md | 7 +++++++ osxphotos/__main__.py | 47 ++++++++++++++++++++++++++++++++++--------- osxphotos/_version.py | 2 +- tests/test_cli.py | 38 ++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 0d55d079..d596abb1 100644 --- a/README.md +++ b/README.md @@ -351,6 +351,13 @@ Options: photo would be named 'photoname_bearbeiten.ext'. The default 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 exporting. You only need this if exporting to a filesystem that doesn't support Mac OS diff --git a/osxphotos/__main__.py b/osxphotos/__main__.py index a8fb180a..2b6d4ef2 100644 --- a/osxphotos/__main__.py +++ b/osxphotos/__main__.py @@ -1383,6 +1383,14 @@ def query( "'photoname_edited.ext'. For example, with '--edited-suffix _bearbeiten', the edited photo " "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( "--no-extended-attributes", is_flag=True, @@ -1484,6 +1492,7 @@ def export( directory, filename_template, edited_suffix, + original_suffix, place, no_place, has_comment, @@ -1752,6 +1761,7 @@ def export( dry_run=dry_run, touch_file=touch_file, edited_suffix=edited_suffix, + original_suffix=original_suffix, use_photos_export=use_photos_export, convert_to_jpeg=convert_to_jpeg, jpeg_quality=jpeg_quality, @@ -1805,6 +1815,7 @@ def export( dry_run=dry_run, touch_file=touch_file, edited_suffix=edited_suffix, + original_suffix=original_suffix, use_photos_export=use_photos_export, convert_to_jpeg=convert_to_jpeg, jpeg_quality=jpeg_quality, @@ -2324,6 +2335,7 @@ def export_photo( dry_run=None, touch_file=None, edited_suffix="_edited", + original_suffix="", use_photos_export=False, convert_to_jpeg=False, jpeg_quality=1.0, @@ -2422,7 +2434,19 @@ def export_photo( filenames = get_filenames_from_template(photo, filename_template, original_name) 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( photo, directory, export_by_date, dest, dry_run @@ -2448,12 +2472,10 @@ def export_photo( # export the photo to each path in dest_paths for dest_path in dest_paths: - if not export_original: - verbose(f"Skipping original version of {photo.original_filename}") - else: + if export_original: export_results = photo.export2( dest_path, - filename, + original_filename, sidecar_json=sidecar_json, sidecar_xmp=sidecar_xmp, live_photo=export_live, @@ -2500,6 +2522,9 @@ def export_photo( for touched in export_results.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 # verify the photo has adjustments and valid path to avoid raising an exception if export_edited and photo.hasadjustments: @@ -2508,7 +2533,7 @@ def export_photo( if not download_missing and photo.path_edited is None: verbose(f"Skipping missing edited photo for {filename}") else: - edited_name = pathlib.Path(filename) + edited_filename = pathlib.Path(filename) # check for correct edited suffix if photo.path_edited is not None: edited_ext = pathlib.Path(photo.path_edited).suffix @@ -2516,11 +2541,15 @@ 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_name = f"{edited_name.stem}{edited_suffix}{edited_ext}" - verbose(f"Exporting edited version of {filename} as {edited_name}") + edited_filename = ( + f"{edited_filename.stem}{edited_suffix}{edited_ext}" + ) + verbose( + f"Exporting edited version of {filename} as {edited_filename}" + ) export_results_edited = photo.export2( dest_path, - edited_name, + edited_filename, sidecar_json=sidecar_json, sidecar_xmp=sidecar_xmp, export_as_hardlink=export_as_hardlink, diff --git a/osxphotos/_version.py b/osxphotos/_version.py index 7ddcd901..02953066 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,4 +1,4 @@ """ version info """ -__version__ = "0.36.24" +__version__ = "0.36.25" diff --git a/tests/test_cli.py b/tests/test_cli.py index fb18f484..d5ed28ec 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -65,6 +65,7 @@ CLI_EXPORT_FILENAMES_ALBUM_UNICODE = ["IMG_4547.jpg"] CLI_EXPORT_FILENAMES_DELETED_TWIN = ["wedding.jpg", "wedding_edited.jpeg"] CLI_EXPORT_EDITED_SUFFIX = "_bearbeiten" +CLI_EXPORT_ORIGINAL_SUFFIX = "_original" CLI_EXPORT_FILENAMES_EDITED_SUFFIX = [ "Pumkins1.jpg", @@ -77,6 +78,16 @@ CLI_EXPORT_FILENAMES_EDITED_SUFFIX = [ "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 = [ "1EB2B765-0765-43BA-A90C-0D0580E6172C.jpeg", @@ -1010,6 +1021,33 @@ def test_export_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( "OSXPHOTOS_TEST_CONVERT" not in os.environ, reason="Skip if running in Github actions, no GPU.",