Add argument once_each, set to False if you want every permutation.

master
voussoir 2020-09-27 13:28:03 -07:00
parent 97cc023866
commit fa512eff28
1 changed files with 27 additions and 12 deletions

View File

@ -19,13 +19,14 @@ from voussoirkit import pathclass
from . import constants from . import constants
from . import exceptions from . import exceptions
def album_as_directory_map(album, recursive=True): def album_as_directory_map(album, once_each=True, recursive=True):
''' '''
Given an album, produce a dictionary mapping Album objects to directory Given an album, produce a dictionary mapping Album objects to directory
names as they will appear inside the zip archive. names as they will appear inside the zip archive.
Sub-albums become subfolders. Sub-albums become subfolders.
If an album is a child of multiple albums, only one instance is used. once_each:
If an album is a child of multiple albums, only one instance is used.
''' '''
directories = {} directories = {}
if album.title: if album.title:
@ -34,31 +35,45 @@ def album_as_directory_map(album, recursive=True):
else: else:
root_folder = f'album {album.id}' root_folder = f'album {album.id}'
directories[album] = root_folder if once_each:
directories[album] = root_folder
else:
directories[album] = [root_folder]
if recursive: if recursive:
for child_album in album.get_children(): for child_album in album.get_children():
child_directories = album_as_directory_map(child_album, recursive=True) child_directories = album_as_directory_map(child_album, once_each=once_each, recursive=True)
for (child_album, child_directory) in child_directories.items(): for (child_album, child_directory) in child_directories.items():
child_directory = os.path.join(root_folder, child_directory) if once_each:
directories[child_album] = child_directory child_directory = os.path.join(root_folder, child_directory)
directories[child_album] = child_directory
else:
child_directory = [os.path.join(root_folder, d) for d in child_directory]
directories.setdefault(child_album, []).extend(child_directory)
return directories return directories
def album_photos_as_filename_map(album, recursive=True): def album_photos_as_filename_map(album, once_each=True, recursive=True):
''' '''
Given an album, produce a dictionary mapping Photo objects to the Given an album, produce a dictionary mapping Photo objects to the
filenames that will appear inside the zip archive. filenames that will appear inside the zip archive.
This includes creating subfolders for sub albums. This includes creating subfolders for sub albums.
If a photo appears in multiple albums, only one instance is used. once_each:
If a photo appears in multiple albums, only one instance is used.
''' '''
arcnames = {} arcnames = {}
directories = album_as_directory_map(album, recursive=recursive) directories = album_as_directory_map(album, once_each=once_each, recursive=recursive)
for (album, directory) in directories.items(): for (album, directory) in directories.items():
photos = album.get_photos() photos = album.get_photos()
for photo in photos: for photo in photos:
photo_name = f'{photo.id} - {photo.basename}' photo_name = f'{photo.id} - {photo.basename}'
arcnames[photo] = os.path.join(directory, photo_name) if once_each:
arcname = os.path.join(directory, photo_name)
arcnames[photo] = arcname
else:
arcname = [os.path.join(d, photo_name) for d in directory]
arcnames.setdefault(photo, []).extend(arcname)
return arcnames return arcnames
@ -484,12 +499,12 @@ def zip_album(album, recursive=True):
zipfile = zipstream.ZipFile() zipfile = zipstream.ZipFile()
# Add the photos. # Add the photos.
arcnames = album_photos_as_filename_map(album, recursive=recursive) arcnames = album_photos_as_filename_map(album, once_each=True, recursive=recursive)
for (photo, arcname) in arcnames.items(): for (photo, arcname) in arcnames.items():
zipfile.write(filename=photo.real_path.absolute_path, arcname=arcname) zipfile.write(filename=photo.real_path.absolute_path, arcname=arcname)
# Add the album metadata as an {id}.txt file within each directory. # Add the album metadata as an {id}.txt file within each directory.
directories = album_as_directory_map(album, recursive=recursive) directories = album_as_directory_map(album, once_each=True, recursive=recursive)
for (inner_album, directory) in directories.items(): for (inner_album, directory) in directories.items():
metafile_text = [] metafile_text = []
if inner_album.title: if inner_album.title: