def test_missing(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["missing"]]) assert len(photos) == 1 p = photos[0] assert p.path == None assert p.ismissing == True
def test_missing(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["od0fmC7NQx+ayVr+%i06XA"]) assert len(photos) == 1 p = photos[0] assert p.path == None assert p.ismissing == True
def test_missing(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["6iAZJP7ZQ5iXxapoJb3ytA"]) assert len(photos) == 1 p = photos[0] assert p.path == None assert p.ismissing == True
def test_hasadjustments2(): # test hasadjustments == False import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["15uNd7%8RguTEgNPKHfTWw"]) assert len(photos) == 1 p = photos[0] assert p.hasadjustments == False
def test_hasadjustments1(): # test hasadjustments == True import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["6bxcNnzRQKGnK4uPrCJ9UQ"]) assert len(photos) == 1 p = photos[0] assert p.hasadjustments == True
def iCloudPhotoList(year): db = os.path.expanduser("/Volumes/3/iCloud.photoslibrary") photosdb = osxphotos.PhotosDB(db) return photosdb.photos( images = True, movies = True, from_date = datetime.datetime(int(year), 1, 1), to_date = datetime.datetime(int(year), 12, 31), )
def test_hasadjustments2(): # test hasadjustments == False import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]]) assert len(photos) == 1 p = photos[0] assert p.hasadjustments == False
def test_album_names(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) albums = photosdb.albums assert len(albums) == len(ALBUMS) for album in albums: assert album in ALBUMS
def test_modified(): import datetime import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["modified"]]) assert photos[0].date_modified is not None assert photos[0].date_modified.isoformat( ) == "2019-12-26T21:08:48.306538-07:00"
def test_albums_as_dict(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) albums_as_dict = photosdb.albums_as_dict for album in albums_as_dict: assert album in ALBUM_DICT assert albums_as_dict[album] == ALBUM_DICT[album]
def test_place_place_info_as_dict(): # test PlaceInfo.as_dict() import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photo = photosdb.photos(uuid=[UUID_DICT["place_maui"]])[0] assert isinstance(photo.place, osxphotos.placeinfo.PlaceInfo) assert photo.place.as_dict() == MAUI_DICT
def test_missing(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["Pj99JmYjQkeezdY2OFuSaw"]) assert len(photos) == 1 p = photos[0] assert p.path == None assert p.ismissing == True
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}")
def info(ctx, cli_obj, db, json_, photos_library): """Print out descriptive info of the Photos library database.""" db = get_photos_db(*photos_library, db, cli_obj.db) if db is None: click.echo(ctx.obj.group.commands["info"].get_help(ctx), err=True) click.echo("\n\nLocated the following Photos library databases: ", err=True) _list_libraries() return photosdb = osxphotos.PhotosDB(dbfile=db) info = { "database_path": photosdb.db_path, "database_version": photosdb.db_version } photos = photosdb.photos(movies=False) not_shared_photos = [p for p in photos if not p.shared] info["photo_count"] = len(not_shared_photos) hidden = [p for p in photos if p.hidden] info["hidden_photo_count"] = len(hidden) movies = photosdb.photos(images=False, movies=True) not_shared_movies = [p for p in movies if not p.shared] info["movie_count"] = len(not_shared_movies) if photosdb.db_version > _PHOTOS_4_VERSION: shared_photos = [p for p in photos if p.shared] info["shared_photo_count"] = len(shared_photos) shared_movies = [p for p in movies if p.shared] info["shared_movie_count"] = len(shared_movies) keywords = photosdb.keywords_as_dict info["keywords_count"] = len(keywords) info["keywords"] = keywords albums = photosdb.albums_as_dict info["albums_count"] = len(albums) info["albums"] = albums if photosdb.db_version > _PHOTOS_4_VERSION: albums_shared = photosdb.albums_shared_as_dict info["shared_albums_count"] = len(albums_shared) info["shared_albums"] = albums_shared persons = photosdb.persons_as_dict info["persons_count"] = len(persons) info["persons"] = persons if cli_obj.json or json_: click.echo(json.dumps(info, ensure_ascii=False)) else: click.echo(yaml.dump(info, sort_keys=False, allow_unicode=True))
def test_path_edited1(): # test a valid edited path import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["movie"]], movies=True) assert len(photos) == 1 p = photos[0] path = p.path_edited assert path.endswith("resources/media/version/00/00/fullsizeoutput_7.mov")
def test_init4(): # test invalid db import os import tempfile import osxphotos (bad_db, bad_db_name) = tempfile.mkstemp(suffix=".db", prefix="osxphotos-") os.close(bad_db) with pytest.raises(Exception): assert osxphotos.PhotosDB(bad_db_name) with pytest.raises(Exception): assert osxphotos.PhotosDB(dbfile=bad_db_name) try: os.remove(bad_db_name) except: pass
def test_path_edited2(): # test an invalid edited path import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["6191423D-8DB8-4D4C-92BE-9BBBA308AAC4"]) assert len(photos) == 1 p = photos[0] path = p.path_edited assert path is None
def test_external_edit2(): # test image has not been edited in external editor import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["no_external_edit"]]) assert len(photos) == 1 p = photos[0] assert p.external_edit == False
def test_expand_in_place_with_delim_single_value(): """ Test that single-value substitutions are correct when {DELIM+FIELD} format used """ import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB_15_7) photo = photosdb.get_photo(UUID_TITLE) for template in TEMPLATE_VALUES_TITLE: rendered, _ = photo.render_template(template) assert sorted(rendered) == sorted(TEMPLATE_VALUES_TITLE[template])
def test_path_edited2(): # test an invalid edited path import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["no_adjustments"]]) assert len(photos) == 1 p = photos[0] path = p.path_edited assert path is None
def test_albums_parent(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) albums = photosdb.album_info for album in albums: parent = album.parent.title if album.parent else None assert parent == ALBUM_PARENT_DICT[album.title]
def test_path_edited2(): # test an invalid edited path import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["15uNd7%8RguTEgNPKHfTWw"]) assert len(photos) == 1 p = photos[0] path = p.path_edited assert path is None
def test_external_edit1(): # test image has been edited in external editor import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["3Jn73XpSQQCluzRBMWRsMA"]) assert len(photos) == 1 p = photos[0] assert p.external_edit == True
def test_photosdb_repr(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photosdb2 = eval(repr(photosdb)) ignore_keys = ["_tmp_db", "_tmp_files"] assert {k: v for k, v in photosdb.__dict__.items() if k not in ignore_keys} == { k: v for k, v in photosdb2.__dict__.items() if k not in ignore_keys }
def test_external_edit2(): # test image has not been edited in external editor import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=["6bxcNnzRQKGnK4uPrCJ9UQ"]) assert len(photos) == 1 p = photos[0] assert p.external_edit == False
def test_compound_query(): import osxphotos photosdb = osxphotos.PhotosDB(PHOTOS_DB) photos = photosdb.photos(persons=["Katie", "Maria"], albums=["Multi Keyword"]) assert len(photos) == 2 assert UUID_DICT["multi_query_1"] in [p.uuid for p in photos] assert UUID_DICT["multi_query_2"] in [p.uuid for p in photos]
def test_date_modified_invalid(): """ Test date modified is invalid """ from datetime import datetime, timedelta, timezone import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) photos = photosdb.photos(uuid=[UUID_DICT["date_invalid"]]) assert len(photos) == 1 p = photos[0] assert p.date_modified is None
def test_uti(): """ test uti """ import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) for uuid, uti in UTI_DICT.items(): photo = photosdb.get_photo(uuid) assert photo.uti == uti assert photo.uti_original == UTI_ORIGINAL_DICT[uuid]
def test_albums_folders(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) albums = photosdb.album_info for album in albums: folders = album.folder_list folder_names = [f.title for f in folders] assert folder_names == ALBUM_FOLDER_NAMES_DICT[album.title]
def test_photoinfo_intrash_3(): """ Test PhotoInfo.intrash and photo has keyword and person """ import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) p = photosdb.photos(uuid=[UUID_DICT["intrash_person_keywords"]], intrash=True)[0] assert p.intrash assert "Maria" in p.persons assert "wedding" in p.keywords