RhetTbull / photos_time_warp

Batch adjust the date, time, or timezone of photos in Apple Photos from the Mac command line.
MIT License
12 stars 1 forks source link

`--push-exif` errors with `OperationalError: no such column: ZDETECTEDFACE.ZBALDTYPE` #21

Closed tkrunning closed 2 years ago

tkrunning commented 2 years ago

First off, thanks for a very useful tool!

I'm correcting the time of some images in Photos.app, which works fine, however if I try to sync those changes to the original file I get the following error/traceback:

Ξ ~ → photos_time_warp --push-exif
2021-12-26 14:11:15,649 - WARNING - photosdb.py - 100 - WARNING: This module has only been tested with macOS versions [10.12, 10.13, 10.14, 10.15, 10.16, 11.0, 11.1, 11.2, 11.3, 11.4, 11.5]: you have Darwin, OS version: 12.0
╭───────────────────── Traceback (most recent call last) ──────────────────────╮
│ /Users/tkrunning/.local/bin/photos_time_warp:8 in <module>                   │
│                                                                              │
│   5 from photos_time_warp.cli import cli                                     │
│   6 if __name__ == '__main__':                                               │
│   7 │   sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])     │
│ ❱ 8 │   sys.exit(cli())                                                      │
│   9                                                                          │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │ __annotations__ = {}                                                     │ │
│ │    __builtins__ = <module 'builtins' (built-in)>                         │ │
│ │      __cached__ = None                                                   │ │
│ │         __doc__ = None                                                   │ │
│ │        __file__ = '/Users/tkrunning/.local/bin/photos_time_warp'         │ │
│ │      __loader__ = <_frozen_importlib_external.SourceFileLoader object at │ │
│ │                   0x102a110f0>                                           │ │
│ │        __name__ = '__main__'                                             │ │
│ │     __package__ = None                                                   │ │
│ │        __spec__ = None                                                   │ │
│ │             cli = <PhotosTimeWarpCommand cli>                            │ │
│ │              re = <module 're' from                                      │ │
│ │                   '/opt/homebrew/Cellar/python@3.10/3.10.1/Frameworks/P… │ │
│ │             sys = <module 'sys' (built-in)>                              │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/click/core.py:1137 in __call__                                          │
│                                                                              │
│   1134 │                                                                     │
│   1135 │   def __call__(self, *args: t.Any, **kwargs: t.Any) -> t.Any:       │
│   1136 │   │   """Alias for :meth:`main`."""                                 │
│ ❱ 1137 │   │   return self.main(*args, **kwargs)                             │
│   1138                                                                       │
│   1139                                                                       │
│   1140 class Command(BaseCommand):                                           │
│                                                                              │
│ ╭─────────────── locals ───────────────╮                                     │
│ │   args = ()                          │                                     │
│ │ kwargs = {}                          │                                     │
│ │   self = <PhotosTimeWarpCommand cli> │                                     │
│ ╰──────────────────────────────────────╯                                     │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/click/core.py:1062 in main                                              │
│                                                                              │
│   1059 │   │   try:                                                          │
│   1060 │   │   │   try:                                                      │
│   1061 │   │   │   │   with self.make_context(prog_name, args, **extra) as c │
│ ❱ 1062 │   │   │   │   │   rv = self.invoke(ctx)                             │
│   1063 │   │   │   │   │   if not standalone_mode:                           │
│   1064 │   │   │   │   │   │   return rv                                     │
│   1065 │   │   │   │   │   # it's not safe to `ctx.exit(rv)` here!           │
│                                                                              │
│ ╭─────────────────────────────── locals ───────────────────────────────╮     │
│ │                args = []                                             │     │
│ │        complete_var = None                                           │     │
│ │                 ctx = <cloup._context.Context object at 0x102b260b0> │     │
│ │               extra = {}                                             │     │
│ │           prog_name = 'photos_time_warp'                             │     │
│ │                self = <PhotosTimeWarpCommand cli>                    │     │
│ │     standalone_mode = True                                           │     │
│ │ windows_expand_args = True                                           │     │
│ ╰──────────────────────────────────────────────────────────────────────╯     │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/click/core.py:1404 in invoke                                            │
│                                                                              │
│   1401 │   │   │   echo(style(message, fg="red"), err=True)                  │
│   1402 │   │                                                                 │
│   1403 │   │   if self.callback is not None:                                 │
│ ❱ 1404 │   │   │   return ctx.invoke(self.callback, **ctx.params)            │
│   1405 │                                                                     │
│   1406 │   def shell_complete(self, ctx: Context, incomplete: str) -> t.List │
│   1407 │   │   """Return a list of completions for the incomplete value. Loo │
│                                                                              │
│ ╭─────────────────────── locals ────────────────────────╮                    │
│ │  ctx = <cloup._context.Context object at 0x102b260b0> │                    │
│ │ self = <PhotosTimeWarpCommand cli>                    │                    │
│ ╰───────────────────────────────────────────────────────╯                    │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/click/core.py:763 in invoke                                             │
│                                                                              │
│    760 │   │                                                                 │
│    761 │   │   with augment_usage_errors(__self):                            │
│    762 │   │   │   with ctx:                                                 │
│ ❱  763 │   │   │   │   return __callback(*args, **kwargs)                    │
│    764 │                                                                     │
│    765 │   def forward(                                                      │
│    766 │   │   __self, __cmd: "Command", *args: t.Any, **kwargs: t.Any  # no │
│                                                                              │
│ ╭────────────────────────────── locals ───────────────────────────────╮      │
│ │ _Context__callback = <function cli at 0x1097e4550>                  │      │
│ │     _Context__self = <cloup._context.Context object at 0x102b260b0> │      │
│ │               args = ()                                             │      │
│ │                ctx = <cloup._context.Context object at 0x102b260b0> │      │
│ │             kwargs = {                                              │      │
│ │                      │   'push_exif': True,                         │      │
│ │                      │   'date': None,                              │      │
│ │                      │   'date_delta': None,                        │      │
│ │                      │   'time': None,                              │      │
│ │                      │   'time_delta': None,                        │      │
│ │                      │   'timezone': None,                          │      │
│ │                      │   'inspect': False,                          │      │
│ │                      │   'compare_exif': False,                     │      │
│ │                      │   'pull_exif': False,                        │      │
│ │                      │   'match_time': False,                       │      │
│ │                      │   ... +5                                     │      │
│ │                      }                                              │      │
│ ╰─────────────────────────────────────────────────────────────────────╯      │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/photos_time_warp/cli.py:482 in cli                                      │
│                                                                              │
│   479 │   │   )                                                              │
│   480 │                                                                      │
│   481 │   if any([push_exif, pull_exif]):                                    │
│ ❱ 482 │   │   exif_updater = ExifUpdater(                                    │
│   483 │   │   │   library_path=library, verbose=verbose, exiftool_path=exift │
│   484 │   │   )                                                              │
│   485                                                                        │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │                      add_to_album = None                                 │ │
│ │                      compare_exif = False                                │ │
│ │                              date = None                                 │ │
│ │                        date_delta = None                                 │ │
│ │                     exiftool_path = '/opt/homebrew/bin/exiftool'         │ │
│ │                           inspect = False                                │ │
│ │                           library = None                                 │ │
│ │                        match_time = False                                │ │
│ │                            photos = [                                    │ │
│ │                                     │   <photoscript.Photo object at     │ │
│ │                                     0x1097e01f0>                         │ │
│ │                                     ]                                    │ │
│ │                             plain = False                                │ │
│ │                         pull_exif = False                                │ │
│ │                         push_exif = True                                 │ │
│ │                              time = None                                 │ │
│ │                        time_delta = None                                 │ │
│ │                          timezone = None                                 │ │
│ │           update_photo_date_time_ = functools.partial(<function          │ │
│ │                                     update_photo_date_time at            │ │
│ │                                     0x1097d7400>, date=None, time=None,  │ │
│ │                                     date_delta=None, time_delta=None)    │ │
│ │ update_photo_time_for_new_timezone_ functools.partial(<function          │ │
│ │                                   = update_photo_time_for_new_timezone   │ │
│ │                                     at 0x1097d7d00>, library_path=None)  │ │
│ │                          verbose_ = False                                │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/photos_time_warp/exif_updater.py:50 in __init__                         │
│                                                                              │
│    47 │   │   exiftool_path: Optional[str] = None,                           │
│    48 │   ):                                                                 │
│    49 │   │   self.library_path = library_path                               │
│ ❱  50 │   │   self.db = PhotosDB(self.library_path)                          │
│    51 │   │   self.verbose = verbose or noop                                 │
│    52 │   │   self.exiftool_path = exiftool_path                             │
│    53 │   │   self.tzinfo = PhotoTimeZone(library_path=self.library_path)    │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │ exiftool_path = '/opt/homebrew/bin/exiftool'                             │ │
│ │  library_path = None                                                     │ │
│ │          self = <photos_time_warp.exif_updater.ExifUpdater object at     │ │
│ │                 0x10979ffa0>                                             │ │
│ │       verbose = <function verbose at 0x102b31bd0>                        │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/osxphotos/photosdb/photosdb.py:331 in __init__                          │
│                                                                              │
│    328 │   │   if int(self._db_version) <= int(_PHOTOS_4_VERSION):           │
│    329 │   │   │   self._process_database4()                                 │
│    330 │   │   else:                                                         │
│ ❱  331 │   │   │   self._process_database5()                                 │
│    332 │   │                                                                 │
│    333 │   │   self._db_connection, _ = self.get_db_connection()             │
│    334                                                                       │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │            _ = 'database'                                                │ │
│ │       dbfile = PosixPath('/Volumes/Photos/Photos                         │ │
│ │                Library.photoslibrary/database/Photos.sqlite')            │ │
│ │       dbpath = PosixPath('/Volumes/Photos/Photos                         │ │
│ │                Library.photoslibrary/database')                          │ │
│ │     exiftool = None                                                      │ │
│ │ library_path = '/Volumes/Photos/Photos Library.photoslibrary'            │ │
│ │        major = '0'                                                       │ │
│ │ masters_path = '/Volumes/Photos/Photos Library.photoslibrary/originals'  │ │
│ │         self = osxphotos.PhotosDB(dbfile='/Volumes/Photos/Photos         │ │
│ │                Library.photoslibrary/database/photos.db')                │ │
│ │       system = 'Darwin'                                                  │ │
│ │          ver = '12'                                                      │ │
│ │      verbose = <function noop at 0x107308280>                            │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/osxphotos/photosdb/photosdb.py:2476 in _process_database5               │
│                                                                              │
│   2473 │   │                                                                 │
│   2474 │   │   # process face info                                           │
│   2475 │   │   verbose("Processing face details.")                           │
│ ❱ 2476 │   │   self._process_faceinfo()                                      │
│   2477 │   │                                                                 │
│   2478 │   │   # process search info                                         │
│   2479 │   │   verbose("Processing photo labels.")                           │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │               album = '4ABB0E8B-915A-4734-9F6A-5D7E7C7222B5'             │ │
│ │            album_id = '4ABB0E8B-915A-4734-9F6A-5D7E7C7222B5'             │ │
│ │          album_join = 'Z_27ASSETS.Z_3ASSETS'                             │ │
│ │          album_sort = 'Z_27ASSETS.Z_FOK_3ASSETS'                         │ │
│ │          album_uuid = 'EB51DAC7-3EB5-43DC-9CEB-D0C48A698693'             │ │
│ │    asset_album_join = 'Z_27ASSETS.Z_27ALBUMS'                            │ │
│ │   asset_album_table = 'Z_27ASSETS'                                       │ │
│ │         asset_table = 'ZASSET'                                           │ │
│ │          burst_uuid = '679B8980-724F-4A0E-9817-50EAD34221D5'             │ │
│ │                   c = <sqlite3.Cursor object at 0x1097569c0>             │ │
│ │                conn = <sqlite3.Connection object at 0x109788340>         │ │
│ │               delta = datetime.timedelta(seconds=7200)                   │ │
│ │         depth_state = 'ZASSET.ZDEPTHTYPE'                                │ │
│ │             details = {                                                  │ │
│ │                       │   '_uuid':                                       │ │
│ │                       '4ABB0E8B-915A-4734-9F6A-5D7E7C7222B5',            │ │
│ │                       │   'title': None,                                 │ │
│ │                       │   'cloudlocalstate': 0,                          │ │
│ │                       │   'cloudownerfirstname': None,                   │ │
│ │                       │   'cloudownderlastname': None,                   │ │
│ │                       │   'cloudownerhashedpersonid': None,              │ │
│ │                       │   'cloudlibrarystate': None,                     │ │
│ │                       │   'cloudidentifier': None,                       │ │
│ │                       │   'kind': 1506,                                  │ │
│ │                       │   'parentfolder': None,                          │ │
│ │                       │   ... +7                                         │ │
│ │                       }                                                  │ │
│ │                face = (23, 'B9D9FE59-9F78-4011-AA63-99754501D681')       │ │
│ │    folder_hierarchy = {                                                  │ │
│ │                       │   '256F09FC-1A80-4E0B-9552-4B7276B3BB92': {      │ │
│ │                       │   │   'D17BA6FC-70E2-44D5-9D2A-74BFAE2B57AC': {  │ │
│ │                       │   │   │                                          │ │
│ │                       '1091F303-6DEB-4892-9DCE-373CBC824ADD': {          │ │
│ │                       │   │   │   │                                      │ │
│ │                       '4E8361E9-5501-4F95-A85C-47263E8A4504': {          │ │
│ │                       │   │   │   │   │                                  │ │
│ │                       '6DB06A7A-52B6-44C7-89A0-8425DAF92B36': None       │ │
│ │                       │   │   │   │   }                                  │ │
│ │                       │   │   │   }                                      │ │
│ │                       │   │   }                                          │ │
│ │                       │   }                                              │ │
│ │                       }                                                  │ │
│ │            fullname = '_UNKNOWN_'                                        │ │
│ │     hdr_type_column = 'ZHDRTYPE'                                         │ │
│ │           imagedate = datetime.datetime(2016, 9, 1, 18, 25, 33)          │ │
│ │          import_fok = 'null'                                             │ │
│ │                info = {                                                  │ │
│ │                       │   '_uuid':                                       │ │
│ │                       'FFFF3748-ECE6-4E7D-B1E1-A04A9331E15A',            │ │
│ │                       │   'modelID': None,                               │ │
│ │                       │   'masterUuid': None,                            │ │
│ │                       │   'masterFingerprint':                           │ │
│ │                       'AbkCqk/ezuiyhagwcqZhwyvqAIJI',                    │ │
│ │                       │   'name': None,                                  │ │
│ │                       │   'lastmodifieddate_timestamp': None,            │ │
│ │                       │   'lastmodifieddate': None,                      │ │
│ │                       │   'imageTimeZoneOffsetSeconds': 7200,            │ │
│ │                       │   'imageDate_timestamp': 494439933,              │ │
│ │                       │   'imageDate': datetime.datetime(2016, 9, 1, 18, │ │
│ │                       25, 33,                                            │ │
│ │                       tzinfo=datetime.timezone(datetime.timedelta(secon… │ │
│ │                       │   ... +81                                        │ │
│ │                       }                                                  │ │
│ │             keyword = (                                                  │ │
│ │                       │   'Last days',                                   │ │
│ │                       │   'BA79808B-79DD-479A-BDD6-002E836C093D'         │ │
│ │                       )                                                  │ │
│ │        keyword_join = 'Z_1KEYWORDS.Z_38KEYWORDS'                         │ │
│ │       keyword_title = 'Last days'                                        │ │
│ │              parent = '6DB06A7A-52B6-44C7-89A0-8425DAF92B36'             │ │
│ │              person = (                                                  │ │
│ │                       │   25554,                                         │ │
│ │                       │   57512,                                         │ │
│ │                       │   'B7706124-392C-475D-A157-3C7BA1B1F0D7',        │ │
│ │                       │   'E2A8D747-2361-44D8-B221-9F9F08D15077'         │ │
│ │                       )                                                  │ │
│ │          photo_uuid = '6AB93675-DB48-4F5C-B7A7-15B205E16EFD'             │ │
│ │          photos_ver = 7                                                  │ │
│ │                  pk = 23                                                 │ │
│ │           pk_parent = None                                               │ │
│ │           root_uuid = ['B09B120A-F973-4C04-A96B-FE3EFDA83AFF']           │ │
│ │                 row = (                                                  │ │
│ │                       │   '368D2C0F-607B-4618-A304-B42318BFF50F',        │ │
│ │                       │   12146964,                                      │ │
│ │                       │   None,                                          │ │
│ │                       │   17,                                            │ │
│ │                       │   4,                                             │ │
│ │                       │   None                                           │ │
│ │                       )                                                  │ │
│ │             seconds = 7200                                               │ │
│ │                self = osxphotos.PhotosDB(dbfile='/Volumes/Photos/Photos  │ │
│ │                       Library.photoslibrary/database/photos.db')         │ │
│ │           signature = (                                                  │ │
│ │                       │   6527006,                                       │ │
│ │                       │   datetime.datetime(2016, 9, 1, 18, 25, 33,      │ │
│ │                       tzinfo=datetime.timezone(datetime.timedelta(secon… │ │
│ │                       │   3648,                                          │ │
│ │                       │   5472,                                          │ │
│ │                       │   'public.jpeg',                                 │ │
│ │                       │   0                                              │ │
│ │                       )                                                  │ │
│ │          sort_order = 3072                                               │ │
│ │         sql_missing = ' SELECT \n                ZASSET.ZUUID, \n        │ │
│ │                       ZINTERNALRESOURCE.ZLOCAL'+494                      │ │
│ │             sql_raw = ' SELECT\n                ZASSET.ZUUID,\n          │ │
│ │                       ZINTERNALRESOURCE.ZDATALEN'+490                    │ │
│ │               title = None                                               │ │
│ │                  tz = datetime.timezone(datetime.timedelta(seconds=7200… │ │
│ │ uti_original_column = 'ZINTERNALRESOURCE.ZCOMPACTUTI'                    │ │
│ │                uuid = 'FFFF3748-ECE6-4E7D-B1E1-A04A9331E15A'             │ │
│ │             verbose = <function noop at 0x107308280>                     │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/osxphotos/photosdb/_photosdb_process_faceinfo.py:35 in                  │
│ _process_faceinfo                                                            │
│                                                                              │
│    32 │   if self._db_version <= _PHOTOS_4_VERSION:                          │
│    33 │   │   _process_faceinfo_4(self)                                      │
│    34 │   else:                                                              │
│ ❱  35 │   │   _process_faceinfo_5(self)                                      │
│    36                                                                        │
│    37                                                                        │
│    38 def _process_faceinfo_4(photosdb):                                     │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │ self = osxphotos.PhotosDB(dbfile='/Volumes/Photos/Photos                 │ │
│ │        Library.photoslibrary/database/photos.db')                        │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
│                                                                              │
│ /Users/tkrunning/.local/pipx/venvs/photos-time-warp/lib/python3.10/site-pack │
│ ages/osxphotos/photosdb/_photosdb_process_faceinfo.py:188 in                 │
│ _process_faceinfo_5                                                          │
│                                                                              │
│   185 │                                                                      │
│   186 │   (conn, cursor) = _open_sql_file(db)                                │
│   187 │                                                                      │
│ ❱ 188 │   result = cursor.execute(                                           │
│   189 │   │   f"""                                                           │
│   190 │   │   SELECT                                                         │
│   191 │   │   ZDETECTEDFACE.Z_PK,                                            │
│                                                                              │
│ ╭───────────────────────────────── locals ─────────────────────────────────╮ │
│ │ asset_table = 'ZASSET'                                                   │ │
│ │        conn = <sqlite3.Connection object at 0x112b3d740>                 │ │
│ │      cursor = <sqlite3.Cursor object at 0x110cbef40>                     │ │
│ │          db = '/var/folders/gq/1rqy_8g977g90cxn8mfylp5c0000gn/T/osxphot… │ │
│ │    photosdb = osxphotos.PhotosDB(dbfile='/Volumes/Photos/Photos          │ │
│ │               Library.photoslibrary/database/photos.db')                 │ │
│ ╰──────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────╯
OperationalError: no such column: ZDETECTEDFACE.ZBALDTYPE

Any idea what's going on?

I have exiftool version 12.30 in case that matters (although, looking at the error I doubt that's the case). I'm running MacOS 12.0.1.

RhetTbull commented 2 years ago

This is due to a Photos database schema change on Monterey. I've updated the dependencies in setup.py to pull the fixed version of osxphotos which is where the problem was. Update or re-install from git and the problem should be fixed. Let me know if you still have any issues!

tkrunning commented 2 years ago

That sounds great! I assume I'm supposed to run pipx upgrade photos_time_warp to get the latest version?

However when I run that I get the following error:

ERROR: Could not find a version that satisfies the requirement osxphotos>=0.43.8 (from photos-time-warp) (from versions: 0.10.4, 0.10.5, 0.11.0, 0.12.1, 0.12.2, 0.12.3, 0.13.0, 0.14.0, 0.14.2, 0.14.4, 0.14.6, 0.14.8, 0.14.14, 0.14.21, 0.15.0, 0.17.2, 0.17.6, 0.18.0, 0.19.0, 0.20.0, 0.21.0, 0.21.1, 0.21.2, 0.21.5, 0.21.6, 0.22.0, 0.22.4, 0.22.5, 0.22.7, 0.22.9, 0.22.10, 0.22.12, 0.22.13, 0.22.16, 0.22.17, 0.22.21, 0.22.23, 0.23.1, 0.23.3, 0.23.4, 0.24.1, 0.24.2, 0.25.0, 0.25.1, 0.26.0, 0.26.1, 0.27.0, 0.27.1, 0.27.3, 0.27.4, 0.28.1, 0.28.2, 0.28.3, 0.28.4, 0.28.5, 0.28.6, 0.28.7, 0.28.8, 0.28.9, 0.28.10, 0.28.13, 0.28.14, 0.28.16, 0.28.17, 0.28.18, 0.28.19, 0.29.0, 0.29.1, 0.29.2, 0.29.5, 0.29.8, 0.29.9, 0.29.12, 0.29.13, 0.29.14, 0.29.16, 0.29.17, 0.29.18, 0.29.19, 0.29.22, 0.29.23, 0.29.24, 0.29.25, 0.29.26, 0.29.28, 0.29.29, 0.29.30, 0.30.0, 0.30.1, 0.30.2, 0.30.3, 0.30.4, 0.30.5, 0.30.6, 0.30.7, 0.30.9, 0.30.10, 0.30.12, 0.30.13, 0.31.0, 0.32.0, 0.33.0, 0.33.2, 0.33.3, 0.33.5, 0.33.7, 0.33.8, 0.34.0, 0.34.1, 0.34.2, 0.34.3, 0.34.4, 0.34.5, 0.35.0, 0.35.1, 0.35.2, 0.35.3, 0.35.4, 0.35.5, 0.35.6, 0.35.7, 0.36.0, 0.36.1, 0.36.2, 0.36.4, 0.36.5, 0.36.6, 0.36.7, 0.36.8, 0.36.9, 0.36.10, 0.36.11, 0.36.13, 0.36.14, 0.36.15, 0.36.16, 0.36.17, 0.36.18, 0.36.19, 0.36.20, 0.36.21, 0.36.22, 0.36.23, 0.36.24, 0.36.25, 0.37.0, 0.37.1, 0.37.2, 0.37.3, 0.37.4, 0.37.5, 0.37.6, 0.37.7, 0.38.0, 0.38.2, 0.38.3, 0.38.4, 0.38.5, 0.38.6, 0.38.7, 0.38.8, 0.38.9, 0.38.11, 0.38.12, 0.38.13, 0.38.14, 0.38.15, 0.38.16, 0.38.17, 0.38.18, 0.38.19, 0.38.20, 0.38.21, 0.38.22, 0.39.0, 0.39.1, 0.39.2, 0.39.3, 0.39.4, 0.39.5, 0.39.6, 0.39.7, 0.39.8, 0.39.9, 0.39.10, 0.39.11, 0.39.12, 0.39.13, 0.39.15, 0.39.16, 0.39.17, 0.39.18, 0.39.19, 0.39.20, 0.39.21, 0.39.22, 0.39.23, 0.39.24, 0.39.25, 0.40.0, 0.40.1, 0.40.2, 0.40.3, 0.40.5, 0.40.6, 0.40.7, 0.40.8, 0.40.9, 0.40.10, 0.40.11, 0.40.12, 0.40.13, 0.40.14, 0.40.16, 0.40.17, 0.40.18, 0.40.19, 0.41.0, 0.41.1, 0.41.2, 0.41.3, 0.41.4, 0.41.5, 0.41.6, 0.41.7, 0.41.8, 0.41.9, 0.41.10, 0.41.11, 0.42.0, 0.42.1, 0.42.2, 0.42.3, 0.42.4, 0.42.6, 0.42.8, 0.42.9, 0.42.11, 0.42.12, 0.42.13, 0.42.14, 0.42.15, 0.42.17, 0.42.19, 0.42.20, 0.42.22, 0.42.23, 0.42.24, 0.42.26, 0.42.27, 0.42.28, 0.42.30, 0.42.31, 0.42.34, 0.42.35, 0.42.36, 0.42.37, 0.42.38, 0.42.39, 0.42.40, 0.42.41, 0.42.42, 0.42.43, 0.42.44, 0.42.45, 0.42.46, 0.42.51, 0.42.52, 0.42.54, 0.42.57, 0.42.58, 0.42.59, 0.42.60, 0.42.61, 0.42.62, 0.42.63, 0.42.64, 0.42.65, 0.42.66, 0.42.67, 0.42.69, 0.42.70, 0.42.71, 0.42.72, 0.42.73, 0.42.74, 0.42.77, 0.42.78, 0.42.79, 0.42.80, 0.42.82, 0.42.83, 0.42.84, 0.42.85, 0.42.86, 0.42.87, 0.42.88, 0.42.89, 0.42.90, 0.42.91, 0.42.92, 0.42.93, 0.42.94, 0.43.0, 0.43.1, 0.43.3, 0.43.4, 0.43.5, 0.43.6, 0.43.7)
ERROR: No matching distribution found for osxphotos>=0.43.8
'/Users/tkrunning/.local/pipx/venvs/photos-time-warp/bin/python -m pip install
--upgrade git+https://github.com/RhetTbull/photos_time_warp.git -q' failed

Edit: some more detailed output when running pip3 install --upgrade git+https://github.com/RhetTbull/photos_time_warp.git without the -q flag:

DEPRECATION: Configuring installation scheme with distutils config files is deprecated and will no longer work in the near future. If you are using a Homebrew or Linuxbrew Python, please see discussion at https://github.com/Homebrew/homebrew-core/issues/76621
Collecting git+https://github.com/RhetTbull/photos_time_warp.git
  Cloning https://github.com/RhetTbull/photos_time_warp.git to /private/var/folders/gq/1rqy_8g977g90cxn8mfylp5c0000gn/T/pip-req-build-c7_9ehuy
  Running command git clone --filter=blob:none -q https://github.com/RhetTbull/photos_time_warp.git /private/var/folders/gq/1rqy_8g977g90cxn8mfylp5c0000gn/T/pip-req-build-c7_9ehuy
  Resolved https://github.com/RhetTbull/photos_time_warp.git to commit 0805a1a4f778387847f8a06040fe187cce744beb
  Preparing metadata (setup.py) ... done
ERROR: Could not find a version that satisfies the requirement osxphotos>=0.43.8 (from photos-time-warp) (from versions: 0.10.4, 0.10.5, 0.11.0, 0.12.1, 0.12.2, 0.12.3, 0.13.0, 0.14.0, 0.14.2, 0.14.4, 0.14.6, 0.14.8, 0.14.14, 0.14.21, 0.15.0, 0.17.2, 0.17.6, 0.18.0, 0.19.0, 0.20.0, 0.21.0, 0.21.1, 0.21.2, 0.21.5, 0.21.6, 0.22.0, 0.22.4, 0.22.5, 0.22.7, 0.22.9, 0.22.10, 0.22.12, 0.22.13, 0.22.16, 0.22.17, 0.22.21, 0.22.23, 0.23.1, 0.23.3, 0.23.4, 0.24.1, 0.24.2, 0.25.0, 0.25.1, 0.26.0, 0.26.1, 0.27.0, 0.27.1, 0.27.3, 0.27.4, 0.28.1, 0.28.2, 0.28.3, 0.28.4, 0.28.5, 0.28.6, 0.28.7, 0.28.8, 0.28.9, 0.28.10, 0.28.13, 0.28.14, 0.28.16, 0.28.17, 0.28.18, 0.28.19, 0.29.0, 0.29.1, 0.29.2, 0.29.5, 0.29.8, 0.29.9, 0.29.12, 0.29.13, 0.29.14, 0.29.16, 0.29.17, 0.29.18, 0.29.19, 0.29.22, 0.29.23, 0.29.24, 0.29.25, 0.29.26, 0.29.28, 0.29.29, 0.29.30, 0.30.0, 0.30.1, 0.30.2, 0.30.3, 0.30.4, 0.30.5, 0.30.6, 0.30.7, 0.30.9, 0.30.10, 0.30.12, 0.30.13, 0.31.0, 0.32.0, 0.33.0, 0.33.2, 0.33.3, 0.33.5, 0.33.7, 0.33.8, 0.34.0, 0.34.1, 0.34.2, 0.34.3, 0.34.4, 0.34.5, 0.35.0, 0.35.1, 0.35.2, 0.35.3, 0.35.4, 0.35.5, 0.35.6, 0.35.7, 0.36.0, 0.36.1, 0.36.2, 0.36.4, 0.36.5, 0.36.6, 0.36.7, 0.36.8, 0.36.9, 0.36.10, 0.36.11, 0.36.13, 0.36.14, 0.36.15, 0.36.16, 0.36.17, 0.36.18, 0.36.19, 0.36.20, 0.36.21, 0.36.22, 0.36.23, 0.36.24, 0.36.25, 0.37.0, 0.37.1, 0.37.2, 0.37.3, 0.37.4, 0.37.5, 0.37.6, 0.37.7, 0.38.0, 0.38.2, 0.38.3, 0.38.4, 0.38.5, 0.38.6, 0.38.7, 0.38.8, 0.38.9, 0.38.11, 0.38.12, 0.38.13, 0.38.14, 0.38.15, 0.38.16, 0.38.17, 0.38.18, 0.38.19, 0.38.20, 0.38.21, 0.38.22, 0.39.0, 0.39.1, 0.39.2, 0.39.3, 0.39.4, 0.39.5, 0.39.6, 0.39.7, 0.39.8, 0.39.9, 0.39.10, 0.39.11, 0.39.12, 0.39.13, 0.39.15, 0.39.16, 0.39.17, 0.39.18, 0.39.19, 0.39.20, 0.39.21, 0.39.22, 0.39.23, 0.39.24, 0.39.25, 0.40.0, 0.40.1, 0.40.2, 0.40.3, 0.40.5, 0.40.6, 0.40.7, 0.40.8, 0.40.9, 0.40.10, 0.40.11, 0.40.12, 0.40.13, 0.40.14, 0.40.16, 0.40.17, 0.40.18, 0.40.19, 0.41.0, 0.41.1, 0.41.2, 0.41.3, 0.41.4, 0.41.5, 0.41.6, 0.41.7, 0.41.8, 0.41.9, 0.41.10, 0.41.11, 0.42.0, 0.42.1, 0.42.2, 0.42.3, 0.42.4, 0.42.6, 0.42.8, 0.42.9, 0.42.11, 0.42.12, 0.42.13, 0.42.14, 0.42.15, 0.42.17, 0.42.19, 0.42.20, 0.42.22, 0.42.23, 0.42.24, 0.42.26, 0.42.27, 0.42.28, 0.42.30, 0.42.31, 0.42.34, 0.42.35, 0.42.36, 0.42.37, 0.42.38, 0.42.39, 0.42.40, 0.42.41, 0.42.42, 0.42.43, 0.42.44, 0.42.45, 0.42.46, 0.42.51, 0.42.52, 0.42.54, 0.42.57, 0.42.58, 0.42.59, 0.42.60, 0.42.61, 0.42.62, 0.42.63, 0.42.64, 0.42.65, 0.42.66, 0.42.67, 0.42.69, 0.42.70, 0.42.71, 0.42.72, 0.42.73, 0.42.74, 0.42.77, 0.42.78, 0.42.79, 0.42.80, 0.42.82, 0.42.83, 0.42.84, 0.42.85, 0.42.86, 0.42.87, 0.42.88, 0.42.89, 0.42.90, 0.42.91, 0.42.92, 0.42.93, 0.42.94, 0.43.0, 0.43.1, 0.43.3, 0.43.4, 0.43.5, 0.43.6, 0.43.7)
ERROR: No matching distribution found for osxphotos>=0.43.8

Edit 2: It looks like the requirement should be osxphotos>=0.43.7 not osxphotos>=0.43.8 as the former is the latest release for osxphotos.

Edit 3: I created a tiny PR (which I've tested works on my system): #22

RhetTbull commented 2 years ago

Doh! Thanks for the PR. I forgot I'd bumped the version number on osxphotos after some recent updates but haven't yet pushed a release.