update import script, add metadata sorting script
This commit is contained in:
		
							parent
							
								
									e32fbdf181
								
							
						
					
					
						commit
						c597c0ec9c
					
				| @ -5,6 +5,11 @@ | ||||
| srcdir=$CAM_SRC | ||||
| bkpdir=$CAM_BKP | ||||
| 
 | ||||
| if [ "$#" -eq 2 ]; then | ||||
|     srcdir=$1 | ||||
|     bkpdir=$2 | ||||
| fi | ||||
| 
 | ||||
| [ ! -d $srcdir ] && echo "$srcdir not found" && exit 1 | ||||
| [ ! -d $bkpdir ] && echo "$bkpdir not found" && exit 1 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										120
									
								
								.scripts/cam/metasort
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										120
									
								
								.scripts/cam/metasort
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,120 @@ | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
| # usage: metasort SRCDIR DESTDIR | ||||
| 
 | ||||
| # this script iterates through every file in SRCDIR, copying them into a YYYY/MM/DD folder structure rooted in DESTDIR.  | ||||
| # EXIF data is read from jpg images. files with matching basenames to jpg images (.JPG.xmp, .ARW) are copied with their matching JPG images. | ||||
| 
 | ||||
| # TODO: | ||||
| # | ||||
| #   copy images and associated files into folders | ||||
| 
 | ||||
| import os | ||||
| import sys | ||||
| import re | ||||
| import pathlib | ||||
| import shutil | ||||
| import exifread | ||||
| import datetime | ||||
| 
 | ||||
| # parse and validate arguments | ||||
| 
 | ||||
| if len(sys.argv) != 3: | ||||
|     print("usage: metasort SRCDIR DESTDIR") | ||||
|     sys.exit(1) | ||||
| 
 | ||||
| src_dir = sys.argv[1] | ||||
| dest_dir = sys.argv[2] | ||||
| 
 | ||||
| def check_is_dir(path): | ||||
|     if not os.path.isdir(path): | ||||
|         print("{} is not a directory".format(path)) | ||||
|         sys.exit(1) | ||||
| 
 | ||||
| check_is_dir(src_dir) | ||||
| check_is_dir(dest_dir) | ||||
| 
 | ||||
| # arguments ok! | ||||
| 
 | ||||
| src_filenames = next(os.walk(src_dir), (None, None, []))[2] | ||||
| src_filenames.sort() | ||||
| 
 | ||||
| jpg_pattern = re.compile("^(.+)(\.JPG)$") | ||||
| 
 | ||||
| bad_jpgs = [] | ||||
| 
 | ||||
| def get_all_files_for_name(filename): | ||||
|     stem = pathlib.Path(filename).stem | ||||
|     stem_pattern = re.compile("^({})(\..+)$".format(stem)) | ||||
| 
 | ||||
|     files = [] | ||||
|     files.append(filename) | ||||
| 
 | ||||
|     for other_filename in src_filenames: | ||||
| 
 | ||||
|         if jpg_pattern.match(other_filename): | ||||
|             continue | ||||
| 
 | ||||
|         if stem_pattern.match(other_filename): | ||||
|             files.append(other_filename) | ||||
| 
 | ||||
|     return files | ||||
| 
 | ||||
| 
 | ||||
| copied = 0 | ||||
| for src_filename in src_filenames: | ||||
| 
 | ||||
|     if not jpg_pattern.match(src_filename): | ||||
|         continue | ||||
| 
 | ||||
|     # read exif properties | ||||
|     path = os.path.join(src_dir, src_filename) | ||||
|     tags = exifread.process_file(open(path, 'rb')) | ||||
|     date_tag = "Image DateTime" | ||||
|     if not date_tag in tags: | ||||
|         bad_jpgs.append(src_filename) | ||||
|         continue | ||||
| 
 | ||||
|     date = datetime.datetime.strptime(str(tags[date_tag]), "%Y:%m:%d %H:%M:%S") | ||||
| 
 | ||||
|     # make a directory for this date  | ||||
|     date_dir = os.path.join(dest_dir, str(date.year), f'{date.month:02}', f'{date.day:02}') | ||||
|     pathlib.Path(date_dir).mkdir(parents=True, exist_ok=True) | ||||
| 
 | ||||
|     files = get_all_files_for_name(src_filename) | ||||
| 
 | ||||
|     print("\n{}\t{}\t{}\t{}\n".format(src_filename, len(files), date, date_dir)) | ||||
| 
 | ||||
|     # copy all files into date_dir | ||||
|     for f in files: | ||||
|         f_src = os.path.join(src_dir, f) | ||||
|         f_dest = os.path.join(date_dir, f) | ||||
| 
 | ||||
|         print(f"{f_src}\t->\t{f_dest}") | ||||
|         shutil.copy2(f_src, f_dest) | ||||
|         copied += 1 | ||||
| 
 | ||||
| # deal with bad files | ||||
| bad_dir = os.path.join(dest_dir, "corrupted") | ||||
| bad_files = [] | ||||
| for bad_jpg in bad_jpgs: | ||||
|     for bad_file in get_all_files_for_name(bad_jpg): | ||||
|         bad_files.append(bad_file) | ||||
| 
 | ||||
| if len(bad_files) > 0: | ||||
|     print("could not read metadata from {} jpgs:\n".format(len(bad_jpgs))) | ||||
|     print(", ".join(bad_jpgs)) | ||||
|     print("\nin total, {} corrupt files were found:\n".format(len(bad_files))) | ||||
|     print(", ".join(bad_files)) | ||||
|     print("\nthese will be copied to {}. maybe they can be fixed eventually 😔".format(bad_dir)) | ||||
| 
 | ||||
|     pathlib.Path(bad_dir).mkdir(parents=True, exist_ok=True) | ||||
| 
 | ||||
|     # copy bad files to corrupted dir | ||||
|     for bad_file in bad_files: | ||||
|         bad_file_src = os.path.join(src_dir, bad_file) | ||||
|         bad_file_dest = os.path.join(bad_dir, bad_file) | ||||
|         shutil.copy2(bad_file_src, bad_file_dest) | ||||
|         copied += 1 | ||||
| 
 | ||||
| print(f"\nall done! {copied} files were copied in total. feel free to delete files in {src_dir}. have a nice day!") | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user