Add export_symlinks command.
This commit is contained in:
		
							parent
							
								
									5d11b0cfeb
								
							
						
					
					
						commit
						968d84b3cb
					
				
					 1 changed files with 112 additions and 0 deletions
				
			
		|  | @ -1,8 +1,11 @@ | ||||||
| import argparse | import argparse | ||||||
|  | import os | ||||||
|  | import re | ||||||
| import sys | import sys | ||||||
| 
 | 
 | ||||||
| from voussoirkit import interactive | from voussoirkit import interactive | ||||||
| from voussoirkit import pathclass | from voussoirkit import pathclass | ||||||
|  | from voussoirkit import spinal | ||||||
| from voussoirkit import stringtools | from voussoirkit import stringtools | ||||||
| from voussoirkit import vlogging | from voussoirkit import vlogging | ||||||
| 
 | 
 | ||||||
|  | @ -39,6 +42,62 @@ def find_photodb(): | ||||||
| 
 | 
 | ||||||
| # HELPERS ########################################################################################## | # HELPERS ########################################################################################## | ||||||
| 
 | 
 | ||||||
|  | def export_symlinks_albums(albums, destination, dry_run): | ||||||
|  |     album_directory_names = etiquette.helpers.decollide_names(albums, lambda a: a.display_name) | ||||||
|  |     for album in albums: | ||||||
|  |         associated_directories = album.get_associated_directories() | ||||||
|  |         if len(associated_directories) == 1: | ||||||
|  |             album_dir = associated_directories.pop() | ||||||
|  |             symlink_dir = destination.with_child(etiquette.helpers.remove_path_badchars(album.display_name)) | ||||||
|  |             if dry_run: | ||||||
|  |                 yield symlink_dir | ||||||
|  |                 continue | ||||||
|  |             if symlink_dir.exists: | ||||||
|  |                 yield symlink_dir | ||||||
|  |                 continue | ||||||
|  |             print(album, symlink_dir) | ||||||
|  |             os.symlink(src=album_dir.absolute_path, dst=symlink_dir.absolute_path) | ||||||
|  |             yield symlink_dir | ||||||
|  | 
 | ||||||
|  |         # photo_filenames = etiquette.helpers.album_photos_as_filename_map( | ||||||
|  |         #     album, | ||||||
|  |         #     once_each=False, | ||||||
|  |         #     naming='simplified', | ||||||
|  |         #     root_name=album_directory_names[album], | ||||||
|  |         # ) | ||||||
|  |         # for (photo, filepaths) in photo_filenames.items(): | ||||||
|  |         #     if not include_searchhidden and photo.searchhidden: | ||||||
|  |         #         continue | ||||||
|  |         #     if not photo.real_path.exists: | ||||||
|  |         #         continue | ||||||
|  |         #     for filepath in filepaths: | ||||||
|  |         #         filepath = destination.join(filepath) | ||||||
|  |         #         print(filepath.absolute_path) | ||||||
|  |         #         if dry_run: | ||||||
|  |         #             yield filepath | ||||||
|  |         #             continue | ||||||
|  |         #         if filepath.exists: | ||||||
|  |         #             yield filepath | ||||||
|  |         #             continue | ||||||
|  |         #         print(filepath, filepath.exists) | ||||||
|  |         #         filepath.parent.makedirs(exist_ok=True) | ||||||
|  |         #         os.symlink(src=photo.real_path.absolute_path, dst=filepath.absolute_path) | ||||||
|  |         #         yield filepath | ||||||
|  | 
 | ||||||
|  | def export_symlinks_photos(photos, destination, dry_run): | ||||||
|  |     photo_filenames = etiquette.helpers.decollide_names(photos, lambda p: p.basename) | ||||||
|  |     for (photo, filename) in photo_filenames.items(): | ||||||
|  |         filepath = destination.with_child(filename) | ||||||
|  |         print(filepath.absolute_path) | ||||||
|  |         if dry_run: | ||||||
|  |             yield filepath | ||||||
|  |             continue | ||||||
|  |         if filepath.exists: | ||||||
|  |             yield filepath | ||||||
|  |             continue | ||||||
|  |         os.symlink(src=photo.real_path.absolute_path, dst=filepath.absolute_path) | ||||||
|  |         yield filepath | ||||||
|  | 
 | ||||||
| def get_photos_by_glob(pattern): | def get_photos_by_glob(pattern): | ||||||
|     photodb = find_photodb() |     photodb = find_photodb() | ||||||
|     pattern = pathclass.normalize_sep(pattern) |     pattern = pathclass.normalize_sep(pattern) | ||||||
|  | @ -171,6 +230,54 @@ def easybake_argparse(args): | ||||||
|     if args.autoyes or interactive.getpermission('Commit?'): |     if args.autoyes or interactive.getpermission('Commit?'): | ||||||
|         photodb.commit() |         photodb.commit() | ||||||
| 
 | 
 | ||||||
|  | def export_symlinks_argparse(args): | ||||||
|  |     photodb = find_photodb() | ||||||
|  |     destination = pathclass.Path(args.destination) | ||||||
|  |     destination.makedirs(exist_ok=True) | ||||||
|  | 
 | ||||||
|  |     total_paths = set() | ||||||
|  | 
 | ||||||
|  |     albums = [] | ||||||
|  |     if args.album_id_args: | ||||||
|  |         albums.extend(photodb.get_albums_by_id(args.album_id_args)) | ||||||
|  |     if args.album_search_args: | ||||||
|  |         albums.extend(search_by_argparse(args.album_search_args, yield_albums=True)) | ||||||
|  |     export = export_symlinks_albums( | ||||||
|  |         albums, | ||||||
|  |         destination, | ||||||
|  |         dry_run=args.dry_run, | ||||||
|  |     ) | ||||||
|  |     total_paths.update(export) | ||||||
|  | 
 | ||||||
|  |     photos = [] | ||||||
|  |     if args.photo_id_args: | ||||||
|  |         photos.extend(photodb.get_photos_by_id(args.photo_id_args)) | ||||||
|  |     if args.photo_search_args: | ||||||
|  |         photos.extend(search_by_argparse(args.photo_search_args, yield_photos=True)) | ||||||
|  |     export = export_symlinks_photos( | ||||||
|  |         photos, | ||||||
|  |         destination, | ||||||
|  |         dry_run=args.dry_run, | ||||||
|  |     ) | ||||||
|  |     total_paths.update(export) | ||||||
|  | 
 | ||||||
|  |     if args.prune and not args.dry_run: | ||||||
|  |         symlinks = set(file for file in spinal.walk_generator(destination) if file.is_link) | ||||||
|  |         symlinks = symlinks.difference(total_paths) | ||||||
|  |         for old_symlink in symlinks: | ||||||
|  |             print(f'Pruning {old_symlink}.') | ||||||
|  |             os.remove(old_symlink.absolute_path) | ||||||
|  |             if not old_symlink.parent.listdir(): | ||||||
|  |                 os.rmdir(old_symlink.parent.absolute_path) | ||||||
|  |         checkdirs = set(spinal.walk_generator(destination, yield_directories=True, yield_files=False)) | ||||||
|  |         while checkdirs: | ||||||
|  |             check = checkdirs.pop() | ||||||
|  |             if check not in destination: | ||||||
|  |                 continue | ||||||
|  |             if len(check.listdir()) == 0: | ||||||
|  |                 os.rmdir(check.absolute_path) | ||||||
|  |                 checkdirs.add(check.parent) | ||||||
|  | 
 | ||||||
| def init_argparse(args): | def init_argparse(args): | ||||||
|     photodb = etiquette.photodb.PhotoDB(create=True) |     photodb = etiquette.photodb.PhotoDB(create=True) | ||||||
|     photodb.commit() |     photodb.commit() | ||||||
|  | @ -322,6 +429,11 @@ def main(argv): | ||||||
|     p_digest.add_argument('--yes', dest='autoyes', action='store_true') |     p_digest.add_argument('--yes', dest='autoyes', action='store_true') | ||||||
|     p_digest.set_defaults(func=digest_directory_argparse) |     p_digest.set_defaults(func=digest_directory_argparse) | ||||||
| 
 | 
 | ||||||
|  |     p_export_symlinks = subparsers.add_parser('export_symlinks', aliases=['export-symlinks']) | ||||||
|  |     p_export_symlinks.add_argument('--destination', dest='destination', required=True) | ||||||
|  |     p_export_symlinks.add_argument('--dry', dest='dry_run', action='store_true') | ||||||
|  |     p_export_symlinks.add_argument('--prune', dest='prune', action='store_true') | ||||||
|  |     p_export_symlinks.set_defaults(func=export_symlinks_argparse) | ||||||
| 
 | 
 | ||||||
|     p_init = subparsers.add_parser('init', aliases=['create']) |     p_init = subparsers.add_parser('init', aliases=['create']) | ||||||
|     p_init.set_defaults(func=init_argparse) |     p_init.set_defaults(func=init_argparse) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue