import pytest from osxphotos.exiftool import get_exiftool_path TEST_FILE_ONE_KEYWORD = "tests/test-images/wedding.jpg" TEST_FILE_MULTI_KEYWORD = "tests/test-images/Tulips.jpg" TEST_MULTI_KEYWORDS = [ "Top Shot", "flowers", "flower", "design", "Stock Photography", "vibrant", "plastic", "Digital Nomad", "close up", "stock photo", "outdoor", "wedding", "Reiseblogger", "fake", "colorful", "Indoor", "display", "photography", ] PHOTOS_DB = "tests/Test-10.15.4.photoslibrary" EXIF_UUID = { "6191423D-8DB8-4D4C-92BE-9BBBA308AAC4": { "EXIF:DateTimeOriginal": "2019:07:04 16:24:01", "EXIF:LensModel": "XF18-55mmF2.8-4 R LM OIS", "IPTC:Keywords": [ "Digital Nomad", "Indoor", "Reiseblogger", "Stock Photography", "Top Shot", "close up", "colorful", "design", "display", "fake", "flower", "outdoor", "photography", "plastic", "stock photo", "vibrant", ], "IPTC:DocumentNotes": "https://flickr.com/e/l7FkSm4f2lQkSV3CG6xlv8Sde5uF3gVu4Hf0Qk11AnU%3D", }, "E9BC5C36-7CD1-40A1-A72B-8B8FAC227D51": { "EXIF:Make": "NIKON CORPORATION", "EXIF:Model": "NIKON D810", "IPTC:DateCreated": "2019:04:15", }, } EXIF_UUID_NONE = ["A1DD1F98-2ECD-431F-9AC9-5AFEFE2D3A5C"] try: exiftool = get_exiftool_path() except: exiftool = None if exiftool is None: pytest.skip("could not find exiftool in path", allow_module_level=True) def test_get_exiftool_path(): import osxphotos.exiftool exiftool = osxphotos.exiftool.get_exiftool_path() assert exiftool is not None def test_version(): import osxphotos.exiftool exif = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert exif.version is not None assert isinstance(exif.version, str) def test_read(): import osxphotos.exiftool exif = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert exif.data["File:MIMEType"] == "image/jpeg" assert exif.data["EXIF:ISO"] == 160 assert exif.data["IPTC:Keywords"] == "wedding" def test_setvalue_1(): # test setting a tag value import os.path import tempfile import osxphotos.exiftool from osxphotos.fileutil import FileUtil tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") tempfile = os.path.join(tempdir.name, os.path.basename(TEST_FILE_ONE_KEYWORD)) FileUtil.copy(TEST_FILE_ONE_KEYWORD, tempfile) exif = osxphotos.exiftool.ExifTool(tempfile) exif.setvalue("IPTC:Keywords", "test") exif._read_exif() assert exif.data["IPTC:Keywords"] == "test" def test_clear_value(): # test clearing a tag value import os.path import tempfile import osxphotos.exiftool from osxphotos.fileutil import FileUtil tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") tempfile = os.path.join(tempdir.name, os.path.basename(TEST_FILE_ONE_KEYWORD)) FileUtil.copy(TEST_FILE_ONE_KEYWORD, tempfile) exif = osxphotos.exiftool.ExifTool(tempfile) assert "IPTC:Keywords" in exif.data exif.setvalue("IPTC:Keywords", None) exif._read_exif() assert "IPTC:Keywords" not in exif.data def test_addvalues_1(): # test setting a tag value import os.path import tempfile import osxphotos.exiftool from osxphotos.fileutil import FileUtil tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") tempfile = os.path.join(tempdir.name, os.path.basename(TEST_FILE_ONE_KEYWORD)) FileUtil.copy(TEST_FILE_ONE_KEYWORD, tempfile) exif = osxphotos.exiftool.ExifTool(tempfile) exif.addvalues("IPTC:Keywords", "test") exif._read_exif() assert sorted(exif.data["IPTC:Keywords"]) == sorted(["wedding", "test"]) def test_addvalues_2(): # test setting a tag value where multiple values already exist import os.path import tempfile import osxphotos.exiftool from osxphotos.fileutil import FileUtil tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") tempfile = os.path.join(tempdir.name, os.path.basename(TEST_FILE_MULTI_KEYWORD)) FileUtil.copy(TEST_FILE_MULTI_KEYWORD, tempfile) exif = osxphotos.exiftool.ExifTool(tempfile) assert sorted(exif.data["IPTC:Keywords"]) == sorted(TEST_MULTI_KEYWORDS) exif.addvalues("IPTC:Keywords", "test") exif._read_exif() assert "IPTC:Keywords" in exif.data test_multi = TEST_MULTI_KEYWORDS.copy() test_multi.append("test") assert sorted(exif.data["IPTC:Keywords"]) == sorted(test_multi) def test_singleton(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) exif2 = osxphotos.exiftool.ExifTool(TEST_FILE_MULTI_KEYWORD) assert exif1._process.pid == exif2._process.pid def test_pid(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert exif1.pid == exif1._process.pid def test_exiftoolproc_process(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert exif1._exiftoolproc.process is not None def test_exiftoolproc_exiftool(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert exif1._exiftoolproc.exiftool == osxphotos.exiftool.get_exiftool_path() def test_as_dict(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) exifdata = exif1.as_dict() assert exifdata["XMP:TagsList"] == "wedding" def test_json(): import osxphotos.exiftool import json exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) exifdata = json.loads(exif1.json()) assert exifdata[0]["XMP:TagsList"] == "wedding" def test_str(): import osxphotos.exiftool exif1 = osxphotos.exiftool.ExifTool(TEST_FILE_ONE_KEYWORD) assert "file: " in str(exif1) assert "exiftool: " in str(exif1) def test_photoinfo_exiftool(): """ test PhotoInfo.exiftool which returns ExifTool object for photo """ import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) for uuid in EXIF_UUID: photo = photosdb.photos(uuid=[uuid])[0] exiftool = photo.exiftool exif_dict = exiftool.as_dict() for key, val in EXIF_UUID[uuid].items(): assert exif_dict[key] == val def test_photoinfo_exiftool_none(): import osxphotos photosdb = osxphotos.PhotosDB(dbfile=PHOTOS_DB) for uuid in EXIF_UUID_NONE: photo = photosdb.photos(uuid=[uuid])[0] exiftool = photo.exiftool assert exiftool is None