Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d769dde358 | ||
|
|
d066435e3d | ||
|
|
8f0307fc24 | ||
|
|
908fead8a2 | ||
|
|
072e894e56 | ||
|
|
47e57ee98e |
16
CHANGELOG.md
16
CHANGELOG.md
@@ -4,6 +4,22 @@ All notable changes to this project will be documented in this file. Dates are d
|
|||||||
|
|
||||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||||
|
|
||||||
|
#### [v0.23.3](https://github.com/RhetTbull/osxphotos/compare/v0.23.1...v0.23.3)
|
||||||
|
|
||||||
|
> 22 March 2020
|
||||||
|
|
||||||
|
- Initial version of templating system for CLI [`2feb099`](https://github.com/RhetTbull/osxphotos/commit/2feb0999b3f9ffd9a24e37238f780239a027aa49)
|
||||||
|
- Added __str__ to place [`ad58b03`](https://github.com/RhetTbull/osxphotos/commit/ad58b03f2d31daf33849b141570dd0fb5e0a262e)
|
||||||
|
- Test library updates [`e90d9c6`](https://github.com/RhetTbull/osxphotos/commit/e90d9c6e11fce7a4e4aa348dcc5f57420c0b6c44)
|
||||||
|
|
||||||
|
#### [v0.23.1](https://github.com/RhetTbull/osxphotos/compare/v0.23.0...v0.23.1)
|
||||||
|
|
||||||
|
> 21 March 2020
|
||||||
|
|
||||||
|
- Fixed requirements.txt for bplist2 [`cda5f44`](https://github.com/RhetTbull/osxphotos/commit/cda5f446933ea2272409d1f153e2a7811626ada6)
|
||||||
|
- Updated CHANGELOG.md [`b8da976`](https://github.com/RhetTbull/osxphotos/commit/b8da9765b8949eb90852d249c2877eeb1806d987)
|
||||||
|
- Updated requirements.txt [`9da7ad6`](https://github.com/RhetTbull/osxphotos/commit/9da7ad6dcc021fdafe358d74e1c52f69dc49ade8)
|
||||||
|
|
||||||
#### [v0.23.0](https://github.com/RhetTbull/osxphotos/compare/v0.22.23...v0.23.0)
|
#### [v0.23.0](https://github.com/RhetTbull/osxphotos/compare/v0.22.23...v0.23.0)
|
||||||
|
|
||||||
> 21 March 2020
|
> 21 March 2020
|
||||||
|
|||||||
@@ -1001,6 +1001,7 @@ Apple does provide a framework ([PhotoKit](https://developer.apple.com/documenta
|
|||||||
- [Click](https://pypi.org/project/click/)
|
- [Click](https://pypi.org/project/click/)
|
||||||
- [Mako](https://www.makotemplates.org/)
|
- [Mako](https://www.makotemplates.org/)
|
||||||
- [bpylist2](https://pypi.org/project/bpylist2/)
|
- [bpylist2](https://pypi.org/project/bpylist2/)
|
||||||
|
- [pathvalidate](https://pypi.org/project/pathvalidate/)
|
||||||
|
|
||||||
## Acknowledgements
|
## Acknowledgements
|
||||||
This project was originally inspired by [photo-export](https://github.com/patrikhson/photo-export) by Patrick Fältström, Copyright (c) 2015 Patrik Fältström paf@frobbit.se
|
This project was originally inspired by [photo-export](https://github.com/patrikhson/photo-export) by Patrick Fältström, Copyright (c) 2015 Patrik Fältström paf@frobbit.se
|
||||||
|
|||||||
75
examples/export_by_album.py
Normal file
75
examples/export_by_album.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
""" Export all photos to specified directory using album names as folders
|
||||||
|
If file has been edited, also export the edited version,
|
||||||
|
otherwise, export the original version
|
||||||
|
This will result in duplicate photos if photo is in more than album """
|
||||||
|
|
||||||
|
import os.path
|
||||||
|
import pathlib
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import click
|
||||||
|
from pathvalidate import is_valid_filepath, sanitize_filepath
|
||||||
|
|
||||||
|
import osxphotos
|
||||||
|
|
||||||
|
|
||||||
|
@click.command()
|
||||||
|
@click.argument("export_path", type=click.Path(exists=True))
|
||||||
|
@click.option(
|
||||||
|
"--default-album",
|
||||||
|
help="Default folder for photos with no album. Defaults to 'unfiled'",
|
||||||
|
default="unfiled",
|
||||||
|
)
|
||||||
|
@click.option(
|
||||||
|
"--library-path",
|
||||||
|
help="Path to Photos library, default to last used library",
|
||||||
|
default=None,
|
||||||
|
)
|
||||||
|
def export(export_path, default_album, library_path):
|
||||||
|
export_path = os.path.expanduser(export_path)
|
||||||
|
library_path = os.path.expanduser(library_path) if library_path else None
|
||||||
|
|
||||||
|
if library_path is not None:
|
||||||
|
photosdb = osxphotos.PhotosDB(library_path)
|
||||||
|
else:
|
||||||
|
photosdb = osxphotos.PhotosDB()
|
||||||
|
|
||||||
|
photos = photosdb.photos()
|
||||||
|
|
||||||
|
for p in photos:
|
||||||
|
if not p.ismissing:
|
||||||
|
albums = p.albums
|
||||||
|
if not albums:
|
||||||
|
albums = [default_album]
|
||||||
|
for album in albums:
|
||||||
|
click.echo(f"exporting {p.filename} in album {album}")
|
||||||
|
|
||||||
|
# make sure no invalid characters in destination path (could be in album name)
|
||||||
|
album_name = sanitize_filepath(album, platform="auto")
|
||||||
|
|
||||||
|
# create destination folder, if necessary, based on album name
|
||||||
|
dest_dir = os.path.join(export_path, album_name)
|
||||||
|
|
||||||
|
# verify path is a valid path
|
||||||
|
if not is_valid_filepath(dest_dir, platform="auto"):
|
||||||
|
sys.exit(f"Invalid filepath {dest_dir}")
|
||||||
|
|
||||||
|
# create destination dir if needed
|
||||||
|
if not os.path.isdir(dest_dir):
|
||||||
|
os.makedirs(dest_dir)
|
||||||
|
|
||||||
|
# export the photo
|
||||||
|
if p.hasadjustments:
|
||||||
|
# export edited version
|
||||||
|
exported = p.export(dest_dir, edited=True)
|
||||||
|
edited_name = pathlib.Path(p.path_edited).name
|
||||||
|
click.echo(f"Exported {edited_name} to {exported}")
|
||||||
|
# export unedited version
|
||||||
|
exported = p.export(dest_dir)
|
||||||
|
click.echo(f"Exported {p.filename} to {exported}")
|
||||||
|
else:
|
||||||
|
click.echo(f"Skipping missing photo: {p.filename}")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
export() # pylint: disable=no-value-for-parameter
|
||||||
@@ -1408,8 +1408,8 @@ def export_photo(
|
|||||||
click.echo(
|
click.echo(
|
||||||
f"Possible unmatched substitution in template: {unmatched}", err=True
|
f"Possible unmatched substitution in template: {unmatched}", err=True
|
||||||
)
|
)
|
||||||
dirname = sanitize_filepath(dirname)
|
dirname = sanitize_filepath(dirname, platform="auto")
|
||||||
if not is_valid_filepath(dirname):
|
if not is_valid_filepath(dirname, platform="auto"):
|
||||||
raise ValueError(f"Invalid file path: {dirname}")
|
raise ValueError(f"Invalid file path: {dirname}")
|
||||||
dest = os.path.join(dest, dirname)
|
dest = os.path.join(dest, dirname)
|
||||||
if not os.path.isdir(dest):
|
if not os.path.isdir(dest):
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.23.3"
|
__version__ = "0.23.4"
|
||||||
|
|||||||
Reference in New Issue
Block a user