Add argument once_each, set to False if you want every permutation.
This commit is contained in:
parent
97cc023866
commit
fa512eff28
1 changed files with 27 additions and 12 deletions
|
@ -19,12 +19,13 @@ 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.
|
||||||
|
|
||||||
|
once_each:
|
||||||
If an album is a child of multiple albums, only one instance is used.
|
If an album is a child of multiple albums, only one instance is used.
|
||||||
'''
|
'''
|
||||||
directories = {}
|
directories = {}
|
||||||
|
@ -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}'
|
||||||
|
|
||||||
|
if once_each:
|
||||||
directories[album] = root_folder
|
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():
|
||||||
|
if once_each:
|
||||||
child_directory = os.path.join(root_folder, child_directory)
|
child_directory = os.path.join(root_folder, child_directory)
|
||||||
directories[child_album] = 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.
|
||||||
|
|
||||||
|
once_each:
|
||||||
If a photo appears in multiple albums, only one instance is used.
|
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:
|
||||||
|
|
Loading…
Reference in a new issue