From a287bfb41f0ee1ab19db39e6f3eb7183093599a9 Mon Sep 17 00:00:00 2001 From: Rhet Turnbull Date: Fri, 22 Jan 2021 20:43:41 -0800 Subject: [PATCH] Fix for issue #353, #354 --- osxphotos/__main__.py | 14 +++- osxphotos/_version.py | 2 +- osxphotos/photoinfo/_photoinfo_export.py | 73 ++++++++++--------- osxphotos/photokit.py | 6 ++ osxphotos/utils.py | 11 ++- tests/search_info_test_data_10_15_7.json | 2 +- tests/sidecars/15uNd7%8RguTEgNPKHfTWw.xmp | 2 +- ...Nd7%8RguTEgNPKHfTWw_albums_as_keywords.xmp | 2 +- tests/sidecars/15uNd7%8RguTEgNPKHfTWw_ext.xmp | 2 +- ...5uNd7%8RguTEgNPKHfTWw_keyword_template.xmp | 2 +- ...d7%8RguTEgNPKHfTWw_persons_as_keywords.xmp | 2 +- tests/sidecars/3Jn73XpSQQCluzRBMWRsMA.xmp | 2 +- ...73XpSQQCluzRBMWRsMA_albums_as_keywords.xmp | 2 +- tests/sidecars/3Jn73XpSQQCluzRBMWRsMA_ext.xmp | 2 +- ...Jn73XpSQQCluzRBMWRsMA_keyword_template.xmp | 2 +- ...3XpSQQCluzRBMWRsMA_persons_as_keywords.xmp | 2 +- .../6191423D-8DB8-4D4C-92BE-9BBBA308AAC4.xmp | 2 +- ...C-92BE-9BBBA308AAC4_albums_as_keywords.xmp | 2 +- ...91423D-8DB8-4D4C-92BE-9BBBA308AAC4_ext.xmp | 2 +- ...D4C-92BE-9BBBA308AAC4_keyword_template.xmp | 2 +- ...-92BE-9BBBA308AAC4_persons_as_keywords.xmp | 2 +- tests/sidecars/6bxcNnzRQKGnK4uPrCJ9UQ.xmp | 2 +- ...cNnzRQKGnK4uPrCJ9UQ_albums_as_keywords.xmp | 2 +- tests/sidecars/6bxcNnzRQKGnK4uPrCJ9UQ_ext.xmp | 2 +- ...bxcNnzRQKGnK4uPrCJ9UQ_keyword_template.xmp | 2 +- ...NnzRQKGnK4uPrCJ9UQ_persons_as_keywords.xmp | 2 +- tests/sidecars/8SOE9s0XQVGsuq4ONohTng.xmp | 2 +- ...E9s0XQVGsuq4ONohTng_albums_as_keywords.xmp | 2 +- tests/sidecars/8SOE9s0XQVGsuq4ONohTng_ext.xmp | 2 +- ...SOE9s0XQVGsuq4ONohTng_keyword_template.xmp | 2 +- ...9s0XQVGsuq4ONohTng_persons_as_keywords.xmp | 2 +- .../A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C.xmp | 2 +- ...F-9AC9-5AFEFE2D3A5C_albums_as_keywords.xmp | 2 +- ...DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C_ext.xmp | 2 +- ...31F-9AC9-5AFEFE2D3A5C_keyword_template.xmp | 2 +- ...-9AC9-5AFEFE2D3A5C_persons_as_keywords.xmp | 2 +- .../D79B8D77-BFFC-460B-9312-034F2877D35B.xmp | 2 +- ...B-9312-034F2877D35B_albums_as_keywords.xmp | 2 +- ...9B8D77-BFFC-460B-9312-034F2877D35B_ext.xmp | 2 +- ...60B-9312-034F2877D35B_keyword_template.xmp | 2 +- ...-9312-034F2877D35B_persons_as_keywords.xmp | 2 +- .../DC99FBDD-7A52-4100-A5BB-344131646C30.xmp | 2 +- ...0-A5BB-344131646C30_albums_as_keywords.xmp | 2 +- ...99FBDD-7A52-4100-A5BB-344131646C30_ext.xmp | 2 +- ...100-A5BB-344131646C30_keyword_template.xmp | 2 +- ...-A5BB-344131646C30_persons_as_keywords.xmp | 2 +- .../E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51.xmp | 2 +- ...1-A72B-8B8FAC227D51_albums_as_keywords.xmp | 2 +- ...BC5C36-7CD1-40A1-A72B-8B8FAC227D51_ext.xmp | 2 +- ...0A1-A72B-8B8FAC227D51_keyword_template.xmp | 2 +- ...-A72B-8B8FAC227D51_persons_as_keywords.xmp | 2 +- .../F12384F6-CD17-4151-ACBA-AE0E3688539E.xmp | 2 +- ...1-ACBA-AE0E3688539E_albums_as_keywords.xmp | 2 +- ...2384F6-CD17-4151-ACBA-AE0E3688539E_ext.xmp | 2 +- ...151-ACBA-AE0E3688539E_keyword_template.xmp | 2 +- ...-ACBA-AE0E3688539E_persons_as_keywords.xmp | 2 +- 56 files changed, 115 insertions(+), 93 deletions(-) diff --git a/osxphotos/__main__.py b/osxphotos/__main__.py index 03c3e6c6..d22c8898 100644 --- a/osxphotos/__main__.py +++ b/osxphotos/__main__.py @@ -2725,7 +2725,7 @@ def export_photo( for error_ in export_results.error: click.echo( click.style( - f"Error exporting photo, file {error_[0]}: {error_[1]}", + f"Error exporting photo ({photo.uuid}: {photo.original_filename}) as {error_[0]}: {error_[1]}", fg=CLI_COLOR_ERROR, ), err=True, @@ -2734,7 +2734,7 @@ def export_photo( except Exception as e: click.echo( click.style( - f"Error exporting photo {photo.original_filename} ({photo.filename}) as {original_filename}: {e}", + f"Error exporting photo ({photo.uuid}: {photo.original_filename}) as {original_filename}: {e}", fg=CLI_COLOR_ERROR, ), err=True, @@ -2854,10 +2854,18 @@ def export_photo( ), err=True, ) + for error_ in export_results_edited.error: + click.echo( + click.style( + f"Error exporting edited photo ({photo.uuid}: {photo.original_filename}) as {error_[0]}: {error_[1]}", + fg=CLI_COLOR_ERROR, + ), + err=True, + ) except Exception as e: click.echo( click.style( - f"Error exporting photo {filename} as {edited_filename}", + f"Error exporting edited photo ({photo.uuid}: {photo.original_filename}) {filename} as {edited_filename}: {e}", fg=CLI_COLOR_ERROR, ), err=True, diff --git a/osxphotos/_version.py b/osxphotos/_version.py index 282a2166..77040130 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,3 +1,3 @@ """ version info """ -__version__ = "0.40.1" +__version__ = "0.40.2" diff --git a/osxphotos/photoinfo/_photoinfo_export.py b/osxphotos/photoinfo/_photoinfo_export.py index 986317ae..4b0ed48f 100644 --- a/osxphotos/photoinfo/_photoinfo_export.py +++ b/osxphotos/photoinfo/_photoinfo_export.py @@ -51,7 +51,7 @@ from ..photokit import ( PhotoKitFetchFailed, PhotoLibrary, ) -from ..utils import findfiles, get_preferred_uti_extension, noop +from ..utils import findfiles, get_preferred_uti_extension, lineno, noop # retry if use_photos_export fails the first time (which sometimes it does) MAX_PHOTOSCRIPT_RETRIES = 3 @@ -251,36 +251,33 @@ def _export_photo_uuid_applescript( except Exception as e: raise ExportError(e) - if exported_files and filename: - # need to find actual filename as sometimes Photos renames JPG to jpeg on export - # may be more than one file exported (e.g. if Live Photo, Photos exports both .jpeg and .mov) - # TemporaryDirectory will cleanup on return - filename_stem = pathlib.Path(filename).stem - exported_paths = [] - for fname in exported_files: - path = pathlib.Path(tmpdir.name) / fname - if ( - len(exported_files) > 1 - and not live_photo - and path.suffix.lower() == ".mov" - ): - # it's the .mov part of live photo but not requested, so don't export - continue - if len(exported_files) > 1 and burst and path.stem != filename_stem: - # skip any burst photo that's not the one we asked for - continue - if filestem: - # rename the file based on filestem, keeping original extension - dest_new = dest / f"{filestem}{path.suffix}" - else: - # use the name Photos provided - dest_new = dest / path.name - if not dry_run: - FileUtil.copy(str(path), str(dest_new)) - exported_paths.append(str(dest_new)) - return exported_paths - else: - return [] + if not exported_files or not filename: + # nothing got exported + raise ExportError(f"Could not export photo {uuid}") + + # need to find actual filename as sometimes Photos renames JPG to jpeg on export + # may be more than one file exported (e.g. if Live Photo, Photos exports both .jpeg and .mov) + # TemporaryDirectory will cleanup on return + filename_stem = pathlib.Path(filename).stem + exported_paths = [] + for fname in exported_files: + path = pathlib.Path(tmpdir.name) / fname + if len(exported_files) > 1 and not live_photo and path.suffix.lower() == ".mov": + # it's the .mov part of live photo but not requested, so don't export + continue + if len(exported_files) > 1 and burst and path.stem != filename_stem: + # skip any burst photo that's not the one we asked for + continue + if filestem: + # rename the file based on filestem, keeping original extension + dest_new = dest / f"{filestem}{path.suffix}" + else: + # use the name Photos provided + dest_new = dest / path.name + if not dry_run: + FileUtil.copy(str(path), str(dest_new)) + exported_paths.append(str(dest_new)) + return exported_paths # _check_export_suffix is not a class method, don't import this into PhotoInfo @@ -827,7 +824,7 @@ def export2( all_results.error.append( ( str(dest), - f"PhotoKitFetchFailed exception exporting photo {self.uuid}: {e}", + f"PhotoKitFetchFailed exception exporting photo {self.uuid}: {e} ({lineno(__file__)})", ) ) if photo: @@ -838,7 +835,9 @@ def export2( ) all_results.exported.extend(exported) except Exception as e: - all_results.error.append((str(dest), e)) + all_results.error.append( + (str(dest), f"{e} ({lineno(__file__)})") + ) else: # dry_run, don't actually export all_results.exported.append(str(dest)) @@ -857,7 +856,7 @@ def export2( ) all_results.exported.extend(exported) except ExportError as e: - all_results.error.append((str(dest), e)) + all_results.error.append((str(dest), f"{e} ({lineno(__file__)})")) else: # export original version and not edited filestem = dest.stem @@ -883,7 +882,9 @@ def export2( ) all_results.exported.extend(exported) except Exception as e: - all_results.error.append((str(dest), e)) + all_results.error.append( + (str(dest), f"{e} ({lineno(__file__)})") + ) else: # dry_run, don't actually export all_results.exported.append(str(dest)) @@ -902,7 +903,7 @@ def export2( ) all_results.exported.extend(exported) except ExportError as e: - all_results.error.append((str(dest), e)) + all_results.error.append((str(dest), f"{e} ({lineno(__file__)})")) if all_results.exported: if jpeg_ext: # use_photos_export (both PhotoKit and AppleScript) don't use the diff --git a/osxphotos/photokit.py b/osxphotos/photokit.py index 6424ca84..6b66b3f2 100644 --- a/osxphotos/photokit.py +++ b/osxphotos/photokit.py @@ -492,6 +492,9 @@ class PhotoAsset: output_file = None if self.isphoto: imagedata = self._request_image_data(version=version) + if not imagedata.image_data: + raise PhotoKitExportError("Could not get image data") + ext = get_preferred_uti_extension(imagedata.uti) output_file = dest / f"{filename.stem}.{ext}" @@ -530,6 +533,9 @@ class PhotoAsset: PHOTOS_VERSION_CURRENT, request current version with all edits PHOTOS_VERSION_UNADJUSTED, request highest quality unadjusted version + Returns: + ImageData instance + Raises: ValueError if passed invalid value for version """ diff --git a/osxphotos/utils.py b/osxphotos/utils.py index c4164663..cc9e4ad4 100644 --- a/osxphotos/utils.py +++ b/osxphotos/utils.py @@ -1,5 +1,6 @@ import fnmatch import glob +import inspect import logging import os import os.path @@ -9,7 +10,6 @@ import re import sqlite3 import subprocess import sys -import tempfile import unicodedata import urllib.parse from plistlib import load as plistload @@ -19,7 +19,6 @@ import CoreServices import objc from ._constants import UNICODE_FORMAT -from .fileutil import FileUtil _DEBUG = False @@ -62,6 +61,14 @@ def noop(*args, **kwargs): pass +def lineno(filename): + """ Returns string with filename and current line number in caller as '(filename): line_num' + Will trim filename to just the name, dropping path, if any. """ + line = inspect.currentframe().f_back.f_lineno + filename = pathlib.Path(filename).name + return f"{filename}: {line}" + + def _get_os_version(): # returns tuple of str containing OS version # e.g. 10.13.6 = ("10", "13", "6") diff --git a/tests/search_info_test_data_10_15_7.json b/tests/search_info_test_data_10_15_7.json index ad98dffd..3e4b208a 100644 --- a/tests/search_info_test_data_10_15_7.json +++ b/tests/search_info_test_data_10_15_7.json @@ -1 +1 @@ -{"UUID_SEARCH_INFO": {"C8EAF50A-D891-4E0C-8086-C417E1284153": {"labels": ["Food", "Butter"], "place_names": ["Durham Bulls Athletic Park"], "streets": ["Blackwell St"], "neighborhoods": ["American Tobacco District", "Downtown Durham"], "city": "Durham", "locality_names": ["Durham"], "state": "North Carolina", "state_abbreviation": "NC", "country": "United States", "bodies_of_water": [], "month": "October", "year": "2018", "holidays": [], "activities": ["Dinner", "Travel", "Entertainment", "Dining", "Trip"], "season": "Fall", "venues": ["Copa", "Luna Rotisserie and Empanadas", "Pie Pusher's", "The Pinhook"], "venue_types": [], "media_types": []}, "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": {"labels": ["Land", "Desert", "Outdoor", "Sky", "Sunset Sunrise"], "place_names": ["Royal Palms State Beach"], "streets": [], "neighborhoods": ["San Pedro"], "city": "Los Angeles", "locality_names": [], "state": "California", "state_abbreviation": "", "country": "United States", "bodies_of_water": ["Catalina Channel"], "month": "November", "year": "2017", "holidays": [], "activities": ["Beach Activity", "Activity"], "season": "Fall", "venues": [], "venue_types": [], "media_types": ["Live Photos"]}, "2C151013-5BBA-4D00-B70F-1C9420418B86": {"labels": ["Water Body", "Land", "Forest", "Water", "Plant", "Outdoor", "Vegetation", "Furniture", "Bench", "People"], "place_names": [], "streets": [], "neighborhoods": [], "city": "", "locality_names": [], "state": "", "state_abbreviation": "", "country": "", "bodies_of_water": [], "month": "December", "year": "2014", "holidays": ["Christmas Day"], "activities": ["Celebration", "Holiday"], "season": "Winter", "venues": [], "venue_types": [], "media_types": []}}, "UUID_SEARCH_INFO_NORMALIZED": {"C8EAF50A-D891-4E0C-8086-C417E1284153": {"labels": ["food", "butter"], "place_names": ["durham bulls athletic park"], "streets": ["blackwell st"], "neighborhoods": ["american tobacco district", "downtown durham"], "city": "durham", "locality_names": ["durham"], "state": "north carolina", "state_abbreviation": "nc", "country": "united states", "bodies_of_water": [], "month": "october", "year": "2018", "holidays": [], "activities": ["dinner", "travel", "entertainment", "dining", "trip"], "season": "fall", "venues": ["copa", "luna rotisserie and empanadas", "pie pusher's", "the pinhook"], "venue_types": [], "media_types": []}, "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": {"labels": ["land", "desert", "outdoor", "sky", "sunset sunrise"], "place_names": ["royal palms state beach"], "streets": [], "neighborhoods": ["san pedro"], "city": "los angeles", "locality_names": [], "state": "california", "state_abbreviation": "", "country": "united states", "bodies_of_water": ["catalina channel"], "month": "november", "year": "2017", "holidays": [], "activities": ["beach activity", "activity"], "season": "fall", "venues": [], "venue_types": [], "media_types": ["live photos"]}, "2C151013-5BBA-4D00-B70F-1C9420418B86": {"labels": ["water body", "land", "forest", "water", "plant", "outdoor", "vegetation", "furniture", "bench", "people"], "place_names": [], "streets": [], "neighborhoods": [], "city": "", "locality_names": [], "state": "", "state_abbreviation": "", "country": "", "bodies_of_water": [], "month": "december", "year": "2014", "holidays": ["christmas day"], "activities": ["celebration", "holiday"], "season": "winter", "venues": [], "venue_types": [], "media_types": []}}, "UUID_SEARCH_INFO_ALL": {"C8EAF50A-D891-4E0C-8086-C417E1284153": ["Food", "Butter", "Durham Bulls Athletic Park", "Blackwell St", "American Tobacco District", "Downtown Durham", "Durham", "Dinner", "Travel", "Entertainment", "Dining", "Trip", "Copa", "Luna Rotisserie and Empanadas", "Pie Pusher's", "The Pinhook", "Durham", "North Carolina", "NC", "United States", "October", "2018", "Fall"], "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": ["Land", "Desert", "Outdoor", "Sky", "Sunset Sunrise", "Royal Palms State Beach", "San Pedro", "Catalina Channel", "Beach Activity", "Activity", "Live Photos", "Los Angeles", "California", "United States", "November", "2017", "Fall"], "2C151013-5BBA-4D00-B70F-1C9420418B86": ["Water Body", "Land", "Forest", "Water", "Plant", "Outdoor", "Vegetation", "Furniture", "Bench", "People", "Christmas Day", "Celebration", "Holiday", "December", "2014", "Winter"]}, "UUID_SEARCH_INFO_ALL_NORMALIZED": {"C8EAF50A-D891-4E0C-8086-C417E1284153": ["food", "butter", "durham bulls athletic park", "blackwell st", "american tobacco district", "downtown durham", "durham", "dinner", "travel", "entertainment", "dining", "trip", "copa", "luna rotisserie and empanadas", "pie pusher's", "the pinhook", "durham", "north carolina", "nc", "united states", "october", "2018", "fall"], "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": ["land", "desert", "outdoor", "sky", "sunset sunrise", "royal palms state beach", "san pedro", "catalina channel", "beach activity", "activity", "live photos", "los angeles", "california", "united states", "november", "2017", "fall"], "2C151013-5BBA-4D00-B70F-1C9420418B86": ["water body", "land", "forest", "water", "plant", "outdoor", "vegetation", "furniture", "bench", "people", "christmas day", "celebration", "holiday", "december", "2014", "winter"]}} +{"UUID_SEARCH_INFO": {"C8EAF50A-D891-4E0C-8086-C417E1284153": {"labels": ["Food", "Butter"], "place_names": ["Durham Bulls Athletic Park"], "streets": ["Blackwell St"], "neighborhoods": ["American Tobacco District", "Downtown Durham"], "city": "Durham", "locality_names": ["Durham"], "state": "North Carolina", "state_abbreviation": "NC", "country": "United States", "bodies_of_water": [], "month": "October", "year": "2018", "holidays": [], "activities": ["Dinner", "Travel", "Entertainment", "Dining", "Trip"], "season": "Fall", "venues": ["Luna Rotisserie and Empanadas", "The Pinhook", "Pie Pusher's", "Copa"], "venue_types": [], "media_types": []}, "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": {"labels": ["Land", "Desert", "Sky", "Sunset Sunrise", "Outdoor"], "place_names": ["Royal Palms State Beach"], "streets": [], "neighborhoods": ["San Pedro"], "city": "Los Angeles", "locality_names": [], "state": "California", "state_abbreviation": "", "country": "United States", "bodies_of_water": ["Catalina Channel"], "month": "November", "year": "2017", "holidays": [], "activities": ["Beach Activity", "Activity"], "season": "Fall", "venues": [], "venue_types": [], "media_types": ["Live Photos"]}, "2C151013-5BBA-4D00-B70F-1C9420418B86": {"labels": ["Water Body", "People", "Land", "Water", "Plant", "Outdoor", "Vegetation", "Forest", "Furniture", "Bench"], "place_names": [], "streets": [], "neighborhoods": [], "city": "", "locality_names": [], "state": "", "state_abbreviation": "", "country": "", "bodies_of_water": [], "month": "December", "year": "2014", "holidays": ["Christmas Day"], "activities": ["Celebration", "Holiday"], "season": "Winter", "venues": [], "venue_types": [], "media_types": []}}, "UUID_SEARCH_INFO_NORMALIZED": {"C8EAF50A-D891-4E0C-8086-C417E1284153": {"labels": ["food", "butter"], "place_names": ["durham bulls athletic park"], "streets": ["blackwell st"], "neighborhoods": ["american tobacco district", "downtown durham"], "city": "durham", "locality_names": ["durham"], "state": "north carolina", "state_abbreviation": "nc", "country": "united states", "bodies_of_water": [], "month": "october", "year": "2018", "holidays": [], "activities": ["dinner", "travel", "entertainment", "dining", "trip"], "season": "fall", "venues": ["luna rotisserie and empanadas", "the pinhook", "pie pusher's", "copa"], "venue_types": [], "media_types": []}, "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": {"labels": ["land", "desert", "sky", "sunset sunrise", "outdoor"], "place_names": ["royal palms state beach"], "streets": [], "neighborhoods": ["san pedro"], "city": "los angeles", "locality_names": [], "state": "california", "state_abbreviation": "", "country": "united states", "bodies_of_water": ["catalina channel"], "month": "november", "year": "2017", "holidays": [], "activities": ["beach activity", "activity"], "season": "fall", "venues": [], "venue_types": [], "media_types": ["live photos"]}, "2C151013-5BBA-4D00-B70F-1C9420418B86": {"labels": ["water body", "people", "land", "water", "plant", "outdoor", "vegetation", "forest", "furniture", "bench"], "place_names": [], "streets": [], "neighborhoods": [], "city": "", "locality_names": [], "state": "", "state_abbreviation": "", "country": "", "bodies_of_water": [], "month": "december", "year": "2014", "holidays": ["christmas day"], "activities": ["celebration", "holiday"], "season": "winter", "venues": [], "venue_types": [], "media_types": []}}, "UUID_SEARCH_INFO_ALL": {"C8EAF50A-D891-4E0C-8086-C417E1284153": ["Food", "Butter", "Durham Bulls Athletic Park", "Blackwell St", "American Tobacco District", "Downtown Durham", "Durham", "Dinner", "Travel", "Entertainment", "Dining", "Trip", "Luna Rotisserie and Empanadas", "The Pinhook", "Pie Pusher's", "Copa", "Durham", "North Carolina", "NC", "United States", "October", "2018", "Fall"], "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": ["Land", "Desert", "Sky", "Sunset Sunrise", "Outdoor", "Royal Palms State Beach", "San Pedro", "Catalina Channel", "Beach Activity", "Activity", "Live Photos", "Los Angeles", "California", "United States", "November", "2017", "Fall"], "2C151013-5BBA-4D00-B70F-1C9420418B86": ["Water Body", "People", "Land", "Water", "Plant", "Outdoor", "Vegetation", "Forest", "Furniture", "Bench", "Christmas Day", "Celebration", "Holiday", "December", "2014", "Winter"]}, "UUID_SEARCH_INFO_ALL_NORMALIZED": {"C8EAF50A-D891-4E0C-8086-C417E1284153": ["food", "butter", "durham bulls athletic park", "blackwell st", "american tobacco district", "downtown durham", "durham", "dinner", "travel", "entertainment", "dining", "trip", "luna rotisserie and empanadas", "the pinhook", "pie pusher's", "copa", "durham", "north carolina", "nc", "united states", "october", "2018", "fall"], "71DFB4C3-E868-4BE4-906E-D96BD8692D7E": ["land", "desert", "sky", "sunset sunrise", "outdoor", "royal palms state beach", "san pedro", "catalina channel", "beach activity", "activity", "live photos", "los angeles", "california", "united states", "november", "2017", "fall"], "2C151013-5BBA-4D00-B70F-1C9420418B86": ["water body", "people", "land", "water", "plant", "outdoor", "vegetation", "forest", "furniture", "bench", "christmas day", "celebration", "holiday", "december", "2014", "winter"]}} diff --git a/tests/sidecars/15uNd7%8RguTEgNPKHfTWw.xmp b/tests/sidecars/15uNd7%8RguTEgNPKHfTWw.xmp index 0757cf90..4ee3b658 100644 --- a/tests/sidecars/15uNd7%8RguTEgNPKHfTWw.xmp +++ b/tests/sidecars/15uNd7%8RguTEgNPKHfTWw.xmp @@ -1,5 +1,5 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +