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 | ||||
| 
 | ||||
| 
 | ||||
| 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() | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue