More refactoring of export code, #462

This commit is contained in:
Rhet Turnbull
2022-01-14 18:31:50 -08:00
parent 458da0e9b2
commit 476c94407f

View File

@@ -13,7 +13,7 @@ import pathlib
import re import re
import tempfile import tempfile
from collections import namedtuple # pylint: disable=syntax-error from collections import namedtuple # pylint: disable=syntax-error
from typing import TYPE_CHECKING, Optional, Callable from typing import TYPE_CHECKING, Callable, List, Optional
import photoscript import photoscript
from mako.template import Template from mako.template import Template
@@ -34,7 +34,7 @@ from ._constants import (
from ._version import __version__ from ._version import __version__
from .datetime_utils import datetime_tz_to_utc from .datetime_utils import datetime_tz_to_utc
from .exiftool import ExifTool from .exiftool import ExifTool
from .export_db import ExportDBNoOp, ExportDB_ABC from .export_db import ExportDB_ABC, ExportDBNoOp
from .fileutil import FileUtil from .fileutil import FileUtil
from .photokit import ( from .photokit import (
PHOTOS_VERSION_CURRENT, PHOTOS_VERSION_CURRENT,
@@ -715,125 +715,29 @@ class PhotoExporter:
exif_files = all_results.exported exif_files = all_results.exported
# TODO: remove duplicative code from below # TODO: remove duplicative code from below
if exiftool and update and exif_files: for exported_file in exif_files:
for exported_file in exif_files: results = self._write_exif_metadata_to_files(
files_are_different = False exported_file=exported_file,
old_data = export_db.get_exifdata_for_file(exported_file) exiftool=exiftool,
if old_data is not None: update=update,
old_data = json.loads(old_data)[0] exiftool_flags=exiftool_flags,
current_data = json.loads( use_albums_as_keywords=use_albums_as_keywords,
self._exiftool_json_sidecar( use_persons_as_keywords=use_persons_as_keywords,
use_albums_as_keywords=use_albums_as_keywords, keyword_template=keyword_template,
use_persons_as_keywords=use_persons_as_keywords, description_template=description_template,
keyword_template=keyword_template, ignore_date_modified=ignore_date_modified,
description_template=description_template, merge_exif_keywords=merge_exif_keywords,
ignore_date_modified=ignore_date_modified, merge_exif_persons=merge_exif_persons,
merge_exif_keywords=merge_exif_keywords, persons=persons,
merge_exif_persons=merge_exif_persons, location=location,
persons=persons, replace_keywords=replace_keywords,
location=location, strip=strip,
replace_keywords=replace_keywords, fileutil=fileutil,
strip=strip, export_db=export_db,
) dry_run=dry_run,
)[0] verbose=verbose,
if old_data != current_data: )
files_are_different = True all_results += results
if old_data is None or files_are_different:
# didn't have old data, assume we need to write it
# or files were different
verbose(f"Writing metadata with exiftool for {exported_file}")
if not dry_run:
warning_, error_ = self._write_exif_data(
exported_file,
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
flags=exiftool_flags,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
)
if warning_:
all_results.exiftool_warning.append(
(exported_file, warning_)
)
if error_:
all_results.exiftool_error.append((exported_file, error_))
all_results.error.append((exported_file, error_))
export_db.set_exifdata_for_file(
exported_file,
self._exiftool_json_sidecar(
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
),
)
export_db.set_stat_exif_for_file(
exported_file, fileutil.file_sig(exported_file)
)
all_results.exif_updated.append(exported_file)
else:
verbose(f"Skipped up to date exiftool metadata for {exported_file}")
elif exiftool and exif_files:
for exported_file in exif_files:
verbose(f"Writing metadata with exiftool for {exported_file}")
if not dry_run:
warning_, error_ = self._write_exif_data(
exported_file,
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
flags=exiftool_flags,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
)
if warning_:
all_results.exiftool_warning.append((exported_file, warning_))
if error_:
all_results.exiftool_error.append((exported_file, error_))
all_results.error.append((exported_file, error_))
export_db.set_exifdata_for_file(
exported_file,
self._exiftool_json_sidecar(
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
),
)
export_db.set_stat_exif_for_file(
exported_file, fileutil.file_sig(exported_file)
)
all_results.exif_updated.append(exported_file)
if touch_file: if touch_file:
for exif_file in all_results.exif_updated: for exif_file in all_results.exif_updated:
@@ -1448,6 +1352,148 @@ class PhotoExporter:
sidecar_xmp_skipped=sidecar_xmp_files_skipped, sidecar_xmp_skipped=sidecar_xmp_files_skipped,
) )
def _write_exif_metadata_to_files(
self,
exported_file: str,
exiftool: bool,
update: bool,
exiftool_flags: Optional[List[str]],
use_albums_as_keywords: bool,
use_persons_as_keywords: bool,
keyword_template: Optional[str],
description_template: Optional[str],
ignore_date_modified: bool,
merge_exif_keywords: bool,
merge_exif_persons: bool,
persons: bool,
location: bool,
replace_keywords: bool,
strip: bool,
fileutil: FileUtil,
export_db: ExportDB_ABC,
dry_run: bool,
verbose: Optional[Callable],
) -> ExportResults:
results = ExportResults()
if exiftool and update and exported_file:
for exported_file in [exported_file]:
files_are_different = False
old_data = export_db.get_exifdata_for_file(exported_file)
if old_data is not None:
old_data = json.loads(old_data)[0]
current_data = json.loads(
self._exiftool_json_sidecar(
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
)
)[0]
if old_data != current_data:
files_are_different = True
if old_data is None or files_are_different:
# didn't have old data, assume we need to write it
# or files were different
verbose(f"Writing metadata with exiftool for {exported_file}")
if not dry_run:
warning_, error_ = self._write_exif_data(
exported_file,
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
flags=exiftool_flags,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
)
if warning_:
results.exiftool_warning.append((exported_file, warning_))
if error_:
results.exiftool_error.append((exported_file, error_))
results.error.append((exported_file, error_))
export_db.set_exifdata_for_file(
exported_file,
self._exiftool_json_sidecar(
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
),
)
export_db.set_stat_exif_for_file(
exported_file, fileutil.file_sig(exported_file)
)
results.exif_updated.append(exported_file)
else:
verbose(f"Skipped up to date exiftool metadata for {exported_file}")
elif exiftool and exported_file:
for exported_file in [exported_file]:
verbose(f"Writing metadata with exiftool for {exported_file}")
if not dry_run:
warning_, error_ = self._write_exif_data(
exported_file,
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
flags=exiftool_flags,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
)
if warning_:
results.exiftool_warning.append((exported_file, warning_))
if error_:
results.exiftool_error.append((exported_file, error_))
results.error.append((exported_file, error_))
export_db.set_exifdata_for_file(
exported_file,
self._exiftool_json_sidecar(
use_albums_as_keywords=use_albums_as_keywords,
use_persons_as_keywords=use_persons_as_keywords,
keyword_template=keyword_template,
description_template=description_template,
ignore_date_modified=ignore_date_modified,
merge_exif_keywords=merge_exif_keywords,
merge_exif_persons=merge_exif_persons,
persons=persons,
location=location,
replace_keywords=replace_keywords,
strip=strip,
),
)
export_db.set_stat_exif_for_file(
exported_file, fileutil.file_sig(exported_file)
)
results.exif_updated.append(exported_file)
return results
def _write_exif_data( def _write_exif_data(
self, self,
filepath, filepath,