Add a --date argument to new-photo-post script
If this argument is passed, skip pulling dates from the EXIF data and use it as
the post date.
I recently tried to post a photo that had no EXIF data. This argument provides
an override so the script doesn't 💥 on missing metadata.
This commit is contained in:
parent
d4f286d723
commit
0e999284b9
1 changed files with 33 additions and 15 deletions
|
|
@ -14,12 +14,23 @@ from erynwells_me.metadata import slugify
|
||||||
from erynwells_me.paths import photos_path
|
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):
|
def parse_args(argv, *a, **kw):
|
||||||
parser = argparse.ArgumentParser(*a, **kw)
|
parser = argparse.ArgumentParser(*a, **kw)
|
||||||
parser.add_argument('-e', '--edit', action='store_true')
|
parser.add_argument('-e', '--edit', action='store_true')
|
||||||
parser.add_argument('-n', '--dry-run', action='store_true')
|
parser.add_argument('-n', '--dry-run', action='store_true')
|
||||||
parser.add_argument('-t', '--title')
|
parser.add_argument('-t', '--title')
|
||||||
parser.add_argument('-s', '--slug')
|
parser.add_argument('-s', '--slug')
|
||||||
|
parser.add_argument('-d', '--date', type=date_argument)
|
||||||
parser.add_argument('--dump-exif', action='store_true')
|
parser.add_argument('--dump-exif', action='store_true')
|
||||||
parser.add_argument('photos', nargs='+')
|
parser.add_argument('photos', nargs='+')
|
||||||
args = parser.parse_args(argv)
|
args = parser.parse_args(argv)
|
||||||
|
|
@ -29,7 +40,7 @@ def parse_args(argv, *a, **kw):
|
||||||
def main(argv):
|
def main(argv):
|
||||||
args = parse_args(argv[1:], prog=argv[0])
|
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):
|
for index, photo in enumerate(args.photos):
|
||||||
print(f'image\t\t{photo}')
|
print(f'image\t\t{photo}')
|
||||||
|
|
@ -40,14 +51,20 @@ def main(argv):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
raw_exif = image._getexif()
|
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:
|
photo_date = None
|
||||||
date_string = f'{friendly_exif["DateTime"]} {friendly_exif["OffsetTime"]}'
|
if not args.date:
|
||||||
exif_date = datetime.datetime.strptime(date_string, '%Y:%m:%d %H:%M:%S %z')
|
try:
|
||||||
except KeyError:
|
date_string = f'{friendly_exif["DateTime"]} {friendly_exif["OffsetTime"]}'
|
||||||
exif_date = datetime.datetime.strptime(friendly_exif["DateTime"], '%Y:%m:%d %H:%M:%S')
|
photo_date = datetime.datetime.strptime(date_string, '%Y:%m:%d %H:%M:%S %z')
|
||||||
print(f'capture-time\t{exif_date.isoformat()}')
|
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')
|
iso_rating = friendly_exif.get('ISOSpeedRatings')
|
||||||
if iso_rating:
|
if iso_rating:
|
||||||
|
|
@ -66,23 +83,24 @@ def main(argv):
|
||||||
if exposure_time:
|
if exposure_time:
|
||||||
print(f'exposure-time\t{exposure_time}')
|
print(f'exposure-time\t{exposure_time}')
|
||||||
|
|
||||||
if not earliest_exif_date or exif_date < earliest_exif_date:
|
if not post_date or photo_date < post_date:
|
||||||
earliest_exif_date = exif_date
|
post_date = photo_date
|
||||||
|
|
||||||
if index < len(args.photos) - 1:
|
if index < len(args.photos) - 1:
|
||||||
print()
|
print()
|
||||||
|
|
||||||
if not earliest_exif_date:
|
if not post_date:
|
||||||
earliest_exif_date = datetime.datetime.now()
|
post_date = datetime.datetime.now()
|
||||||
|
|
||||||
year = earliest_exif_date.year
|
year = post_date.year
|
||||||
month = earliest_exif_date.month
|
month = post_date.month
|
||||||
|
|
||||||
if args.slug:
|
if args.slug:
|
||||||
name = args.slug
|
name = args.slug
|
||||||
elif args.title:
|
elif args.title:
|
||||||
name = slugify(args.title)
|
name = slugify(args.title)
|
||||||
else:
|
else:
|
||||||
|
photo = args.photos[0]
|
||||||
name = osp.splitext(osp.basename(photo))[0]
|
name = osp.splitext(osp.basename(photo))[0]
|
||||||
|
|
||||||
post_path_year = os.path.join(photos_path(), f'{year:04}', name)
|
post_path_year = os.path.join(photos_path(), f'{year:04}', name)
|
||||||
|
|
@ -100,7 +118,7 @@ def main(argv):
|
||||||
post_path = post_path_year
|
post_path = post_path_year
|
||||||
|
|
||||||
try:
|
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:
|
if not args.dry_run:
|
||||||
result = subprocess.run(hugo_command)
|
result = subprocess.run(hugo_command)
|
||||||
result.check_returncode()
|
result.check_returncode()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue