diff --git a/scripts/new-photo-post b/scripts/new-photo-post index b36ba18..bb04719 100755 --- a/scripts/new-photo-post +++ b/scripts/new-photo-post @@ -14,12 +14,23 @@ from erynwells_me.metadata import slugify from erynwells_me.paths import photos_path +def date_argument(value: str) -> datetime.datetime: + parsed_date = datetime.datetime.fromisoformat(value) + + if not parsed_date.tzinfo: + local_timezone = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo + parsed_date = datetime.datetime.combine(parsed_date.date(), parsed_date.time(), local_timezone) + + return parsed_date + + def parse_args(argv, *a, **kw): parser = argparse.ArgumentParser(*a, **kw) parser.add_argument('-e', '--edit', action='store_true') parser.add_argument('-n', '--dry-run', action='store_true') parser.add_argument('-t', '--title') parser.add_argument('-s', '--slug') + parser.add_argument('-d', '--date', type=date_argument) parser.add_argument('--dump-exif', action='store_true') parser.add_argument('photos', nargs='+') args = parser.parse_args(argv) @@ -29,7 +40,7 @@ def parse_args(argv, *a, **kw): def main(argv): args = parse_args(argv[1:], prog=argv[0]) - earliest_exif_date: Optional[datetime.datetime] = None + post_date: Optional[datetime.datetime] = args.date for index, photo in enumerate(args.photos): print(f'image\t\t{photo}') @@ -40,14 +51,20 @@ def main(argv): continue raw_exif = image._getexif() - friendly_exif = {TAGS[k]: v for k, v in raw_exif.items() if k in TAGS} + friendly_exif = {} + if raw_exif: + friendly_exif = {TAGS[k]: v for k, v in raw_exif.items() if k in TAGS} - try: - date_string = f'{friendly_exif["DateTime"]} {friendly_exif["OffsetTime"]}' - exif_date = datetime.datetime.strptime(date_string, '%Y:%m:%d %H:%M:%S %z') - except KeyError: - exif_date = datetime.datetime.strptime(friendly_exif["DateTime"], '%Y:%m:%d %H:%M:%S') - print(f'capture-time\t{exif_date.isoformat()}') + photo_date = None + if not args.date: + try: + date_string = f'{friendly_exif["DateTime"]} {friendly_exif["OffsetTime"]}' + photo_date = datetime.datetime.strptime(date_string, '%Y:%m:%d %H:%M:%S %z') + except KeyError: + photo_date = datetime.datetime.strptime(friendly_exif["DateTime"], '%Y:%m:%d %H:%M:%S') + else: + photo_date = args.date + print(f'capture-time\t{photo_date.isoformat()}') iso_rating = friendly_exif.get('ISOSpeedRatings') if iso_rating: @@ -66,23 +83,24 @@ def main(argv): if exposure_time: print(f'exposure-time\t{exposure_time}') - if not earliest_exif_date or exif_date < earliest_exif_date: - earliest_exif_date = exif_date + if not post_date or photo_date < post_date: + post_date = photo_date if index < len(args.photos) - 1: print() - if not earliest_exif_date: - earliest_exif_date = datetime.datetime.now() + if not post_date: + post_date = datetime.datetime.now() - year = earliest_exif_date.year - month = earliest_exif_date.month + year = post_date.year + month = post_date.month if args.slug: name = args.slug elif args.title: name = slugify(args.title) else: + photo = args.photos[0] name = osp.splitext(osp.basename(photo))[0] post_path_year = os.path.join(photos_path(), f'{year:04}', name) @@ -100,7 +118,7 @@ def main(argv): post_path = post_path_year try: - hugo_command = ['hugo', 'new', '--clock', earliest_exif_date.isoformat(), post_path] + hugo_command = ['hugo', 'new', '--clock', post_date.isoformat(), post_path] if not args.dry_run: result = subprocess.run(hugo_command) result.check_returncode()