Bug fix timezone none 976 (#978)

* Allow --uuid-from-file to read from stdin, #965

* Load query options before opening the database

* Fix for timezone in database has value None, #976
This commit is contained in:
Rhet Turnbull 2023-02-11 09:26:57 -08:00 committed by GitHub
parent 97a0a65d8a
commit d990670f72
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 10 deletions

View File

@ -11,7 +11,9 @@ from photoscript import PhotosLibrary
from rich.console import Console from rich.console import Console
from osxphotos._constants import APP_NAME from osxphotos._constants import APP_NAME
from osxphotos._version import __version__
from osxphotos.compare_exif import PhotoCompare from osxphotos.compare_exif import PhotoCompare
from osxphotos.crash_reporter import crash_reporter, set_crash_data
from osxphotos.datetime_utils import datetime_naive_to_local, datetime_to_new_tz from osxphotos.datetime_utils import datetime_naive_to_local, datetime_to_new_tz
from osxphotos.exif_datetime_updater import ExifDateTimeUpdater from osxphotos.exif_datetime_updater import ExifDateTimeUpdater
from osxphotos.exiftool import get_exiftool_path from osxphotos.exiftool import get_exiftool_path
@ -29,6 +31,7 @@ from .cli_params import THEME_OPTION, TIMESTAMP_OPTION, VERBOSE_OPTION
from .click_rich_echo import rich_click_echo as echo from .click_rich_echo import rich_click_echo as echo
from .click_rich_echo import rich_echo_error as echo_error from .click_rich_echo import rich_echo_error as echo_error
from .color_themes import get_theme from .color_themes import get_theme
from .common import OSXPHOTOS_CRASH_LOG
from .darkmode import is_dark_mode from .darkmode import is_dark_mode
from .help import HELP_WIDTH, rich_text from .help import HELP_WIDTH, rich_text
from .param_types import ( from .param_types import (
@ -333,6 +336,13 @@ command which can be used to change the time zone of photos after import.
is_flag=True, is_flag=True,
help="Bypass confirmation prompt. Use with caution.", help="Bypass confirmation prompt. Use with caution.",
) )
@crash_reporter(
OSXPHOTOS_CRASH_LOG,
"[red]Something went wrong and osxphotos encountered an error:[/red]",
"osxphotos crash log",
"Please file a bug report at https://github.com/RhetTbull/osxphotos/issues with the crash log attached.",
f"osxphotos version: {__version__}",
)
def timewarp( def timewarp(
date, date,
date_delta, date_delta,
@ -364,6 +374,8 @@ def timewarp(
See Timewarp Overview below for additional information. See Timewarp Overview below for additional information.
""" """
set_crash_data("locals", locals())
# check constraints # check constraints
if not any( if not any(
[ [
@ -496,6 +508,7 @@ def timewarp(
"[tz]timezone offset[/tz], [tz]timezone name[/tz]" "[tz]timezone offset[/tz], [tz]timezone name[/tz]"
) )
for photo in photos: for photo in photos:
set_crash_data("photo", f"{photo.uuid} {photo.filename}")
tz_seconds, tz_str, tz_name = tzinfo.get_timezone(photo) tz_seconds, tz_str, tz_name = tzinfo.get_timezone(photo)
photo_date_local = datetime_naive_to_local(photo.date) photo_date_local = datetime_naive_to_local(photo.date)
photo_date_tz = datetime_to_new_tz(photo_date_local, tz_seconds) photo_date_tz = datetime_to_new_tz(photo_date_local, tz_seconds)
@ -521,6 +534,7 @@ def timewarp(
"filename, uuid, photo time (Photos), photo time (EXIF), timezone offset (Photos), timezone offset (EXIF)" "filename, uuid, photo time (Photos), photo time (EXIF), timezone offset (Photos), timezone offset (EXIF)"
) )
for photo in photos: for photo in photos:
set_crash_data("photo", f"{photo.uuid} {photo.filename}")
diff_results = ( diff_results = (
photocomp.compare_exif_no_markup(photo) photocomp.compare_exif_no_markup(photo)
if plain if plain
@ -579,29 +593,30 @@ def timewarp(
f"Processing [num]{num_photos}[/] {pluralize(len(photos), 'photo', 'photos')}", f"Processing [num]{num_photos}[/] {pluralize(len(photos), 'photo', 'photos')}",
total=num_photos, total=num_photos,
) )
for p in photos: for photo in photos:
set_crash_data("photo", f"{photo.uuid} {photo.filename}")
if parse_date: if parse_date:
set_photo_date_from_filename_(p, p.filename, parse_date) set_photo_date_from_filename_(photo, photo.filename, parse_date)
if pull_exif: if pull_exif:
exif_updater.update_photos_from_exif( exif_updater.update_photos_from_exif(
p, use_file_modify_date=use_file_time photo, use_file_modify_date=use_file_time
) )
if any([date, time, date_delta, time_delta]): if any([date, time, date_delta, time_delta]):
update_photo_date_time_(p) update_photo_date_time_(photo)
if match_time: if match_time:
# need to adjust time before the timezone is updated # need to adjust time before the timezone is updated
# or the old timezone will be overwritten in the database # or the old timezone will be overwritten in the database
update_photo_time_for_new_timezone_(photo=p, new_timezone=timezone) update_photo_time_for_new_timezone_(photo=photo, new_timezone=timezone)
if timezone: if timezone:
tz_updater.update_photo(p) tz_updater.update_photo(photo)
if function: if function:
verbose(f"Calling function [bold]{function[1]}") verbose(f"Calling function [bold]{function[1]}")
photo_path = exif_updater.get_photo_path(p) photo_path = exif_updater.get_photo_path(photo)
update_photo_from_function_(photo=p, path=photo_path) update_photo_from_function_(photo=photo, path=photo_path)
if push_exif: if push_exif:
# this should be the last step in the if chain to ensure all Photos data is updated # this should be the last step in the if chain to ensure all Photos data is updated
# before exiftool is run # before exiftool is run
exif_warn, exif_error = exif_updater.update_exif_from_photos(p) exif_warn, exif_error = exif_updater.update_exif_from_photos(photo)
if exif_warn: if exif_warn:
echo_error(f"[warning]Warning running exiftool: {exif_warn}[/]") echo_error(f"[warning]Warning running exiftool: {exif_warn}[/]")
if exif_error: if exif_error:

View File

@ -44,7 +44,7 @@ def crash_reporter(filename, message, title, postamble, *extra_args):
f.write(f"Platform: {platform.platform()}\n") f.write(f"Platform: {platform.platform()}\n")
f.write(f"Python version: {sys.version}\n") f.write(f"Python version: {sys.version}\n")
f.write(f"sys.argv: {sys.argv}\n") f.write(f"sys.argv: {sys.argv}\n")
f.write("CRASH_DATA: \\n") f.write("CRASH_DATA:\n")
for k, v in CRASH_DATA.items(): for k, v in CRASH_DATA.items():
f.write(f"{k}: {v}\n") f.write(f"{k}: {v}\n")
for arg in extra_args: for arg in extra_args:

View File

@ -67,6 +67,7 @@ class PhotoTimeZone:
c.execute(sql) c.execute(sql)
results = c.fetchone() results = c.fetchone()
tz, tzname = (results[0], results[1]) tz, tzname = (results[0], results[1])
tz = tz or 0 # it's possible for tz to be None, #976
tz_str = tz_to_str(tz) tz_str = tz_to_str(tz)
return tz, tz_str, tzname return tz, tz_str, tzname