diff --git a/osxphotos/_version.py b/osxphotos/_version.py index 11187915..0f562e40 100644 --- a/osxphotos/_version.py +++ b/osxphotos/_version.py @@ -1,3 +1,3 @@ """ version info """ -__version__ = "0.42.69" +__version__ = "0.42.70" diff --git a/osxphotos/export_db.py b/osxphotos/export_db.py index d591fd89..ec3e5d98 100644 --- a/osxphotos/export_db.py +++ b/osxphotos/export_db.py @@ -89,11 +89,11 @@ class ExportDB_ABC(ABC): pass @abstractmethod - def get_detected_text_for_uuid(self, uuid, confidence): + def get_detected_text_for_uuid(self, uuid): pass @abstractmethod - def set_detected_text_for_uuid(self, uuid, text, confidence): + def set_detected_text_for_uuid(self, uuid, json_text): pass @abstractmethod @@ -170,10 +170,10 @@ class ExportDBNoOp(ExportDB_ABC): def get_previous_uuids(self): return [] - def get_detected_text_for_uuid(self, uuid, confidence): - return [] + def get_detected_text_for_uuid(self, uuid): + return None - def set_detected_text_for_uuid(self, uuid, text, confidence): + def set_detected_text_for_uuid(self, uuid, json_text): pass def set_data( @@ -493,7 +493,7 @@ class ExportDB(ExportDB_ABC): c = conn.cursor() c.execute( "INSERT OR REPLACE INTO detected_text(uuid, text_data) VALUES (?, ?);", - (uuid, text_json), + (uuid, text_json,), ) conn.commit() except Error as e: diff --git a/osxphotos/phototemplate.py b/osxphotos/phototemplate.py index 39d9deec..ce15e0fd 100644 --- a/osxphotos/phototemplate.py +++ b/osxphotos/phototemplate.py @@ -3,6 +3,7 @@ import datetime import json import locale +import logging import os import pathlib import shlex @@ -1444,7 +1445,7 @@ def _get_detected_text(photo, exportdb, confidence=TEXT_DETECTION_CONFIDENCE_THR ) detected_text = exportdb.get_detected_text_for_uuid(photo.uuid) - if detected_text: + if detected_text is not None: detected_text = json.loads(detected_text) else: path = ( @@ -1459,6 +1460,9 @@ def _get_detected_text(photo, exportdb, confidence=TEXT_DETECTION_CONFIDENCE_THR try: detected_text = detect_text(path) except Exception as e: - detected_text = [] + logging.warning( + f"Error detecting text in image {photo.uuid} at {path}: {e}" + ) + return [] exportdb.set_detected_text_for_uuid(photo.uuid, json.dumps(detected_text)) return [text for text, conf in detected_text if conf >= confidence] diff --git a/tests/test_export_db.py b/tests/test_export_db.py index 5854fbc8..98a82a19 100644 --- a/tests/test_export_db.py +++ b/tests/test_export_db.py @@ -1,5 +1,7 @@ """ Test ExportDB """ +import json + import pytest EXIF_DATA = """[{"_CreatedBy": "osxphotos, https://github.com/RhetTbull/osxphotos", "EXIF:ImageDescription": "\u2068Elder Park\u2069, \u2068Adelaide\u2069, \u2068Australia\u2069", "XMP:Description": "\u2068Elder Park\u2069, \u2068Adelaide\u2069, \u2068Australia\u2069", "XMP:Title": "Elder Park", "EXIF:GPSLatitude": "34 deg 55' 8.01\" S", "EXIF:GPSLongitude": "138 deg 35' 48.70\" E", "Composite:GPSPosition": "34 deg 55' 8.01\" S, 138 deg 35' 48.70\" E", "EXIF:GPSLatitudeRef": "South", "EXIF:GPSLongitudeRef": "East", "EXIF:DateTimeOriginal": "2017:06:20 17:18:56", "EXIF:OffsetTimeOriginal": "+09:30", "EXIF:ModifyDate": "2020:05:18 14:42:04"}]""" @@ -12,10 +14,11 @@ DATABASE_VERSION1 = "tests/export_db_version1.db" def test_export_db(): - """ test ExportDB """ + """test ExportDB""" import os import tempfile - from osxphotos.export_db import ExportDB, OSXPHOTOS_EXPORTDB_VERSION + + from osxphotos.export_db import OSXPHOTOS_EXPORTDB_VERSION, ExportDB tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") dbname = os.path.join(tempdir.name, ".osxphotos_export.db") @@ -47,6 +50,9 @@ def test_export_db(): assert db.get_sidecar_for_file(filepath) == (SIDECAR_DATA, (13, 14, 15)) assert db.get_previous_uuids() == ["FOO-BAR"] + db.set_detected_text_for_uuid("FOO-BAR", json.dumps([["foo", 0.5]])) + assert json.loads(db.get_detected_text_for_uuid("FOO-BAR")) == [["foo", 0.5]] + # test set_data which sets all at the same time filepath2 = os.path.join(tempdir.name, "test2.jpg") db.set_data( @@ -80,6 +86,7 @@ def test_export_db(): assert db.get_stat_converted_for_file(filepath2) == (7, 8, 9) assert db.get_stat_edited_for_file(filepath2) == (10, 11, 12) assert sorted(db.get_previous_uuids()) == (["BAR-FOO", "FOO-BAR"]) + assert json.loads(db.get_detected_text_for_uuid("FOO-BAR")) == [["foo", 0.5]] # update data db.set_uuid_for_file(filepath, "FUBAR") @@ -88,10 +95,11 @@ def test_export_db(): def test_export_db_no_op(): - """ test ExportDBNoOp """ + """test ExportDBNoOp""" import os import tempfile - from osxphotos.export_db import ExportDBNoOp, OSXPHOTOS_EXPORTDB_VERSION + + from osxphotos.export_db import OSXPHOTOS_EXPORTDB_VERSION, ExportDBNoOp tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") db = ExportDBNoOp() @@ -121,6 +129,9 @@ def test_export_db_no_op(): assert db.get_sidecar_for_file(filepath) == (None, (None, None, None)) assert db.get_previous_uuids() == [] + db.set_detected_text_for_uuid("FOO-BAR", json.dumps([["foo", 0.5]])) + assert db.get_detected_text_for_uuid("FOO-BAR") is None + # test set_data which sets all at the same time filepath2 = os.path.join(tempdir.name, "test2.jpg") db.set_data( @@ -148,13 +159,14 @@ def test_export_db_no_op(): def test_export_db_in_memory(): - """ test ExportDBInMemory """ + """test ExportDBInMemory""" import os import tempfile + from osxphotos.export_db import ( + OSXPHOTOS_EXPORTDB_VERSION, ExportDB, ExportDBInMemory, - OSXPHOTOS_EXPORTDB_VERSION, ) tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") @@ -174,6 +186,7 @@ def test_export_db_in_memory(): db.set_stat_edited_for_file(filepath, (10, 11, 12)) db.set_sidecar_for_file(filepath, SIDECAR_DATA, (13, 14, 15)) assert db.get_previous_uuids() == ["FOO-BAR"] + db.set_detected_text_for_uuid("FOO-BAR", json.dumps([["foo", 0.5]])) db.close() @@ -192,6 +205,7 @@ def test_export_db_in_memory(): assert dbram.get_stat_edited_for_file(filepath) == (10, 11, 12) assert dbram.get_sidecar_for_file(filepath) == (SIDECAR_DATA, (13, 14, 15)) assert dbram.get_previous_uuids() == ["FOO-BAR"] + assert json.loads(dbram.get_detected_text_for_uuid("FOO-BAR")) == [["foo", 0.5]] # change a value dbram.set_uuid_for_file(filepath, "FUBAR") @@ -202,6 +216,7 @@ def test_export_db_in_memory(): dbram.set_stat_converted_for_file(filepath, (1, 2, 3)) dbram.set_stat_edited_for_file(filepath, (4, 5, 6)) dbram.set_sidecar_for_file(filepath, "FUBAR", (20, 21, 22)) + dbram.set_detected_text_for_uuid("FUBAR", json.dumps([["bar", 0.5]])) assert dbram.get_uuid_for_file(filepath_lower) == "FUBAR" assert dbram.get_info_for_uuid("FUBAR") == INFO_DATA2 @@ -212,6 +227,7 @@ def test_export_db_in_memory(): assert dbram.get_stat_edited_for_file(filepath) == (4, 5, 6) assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22)) assert dbram.get_previous_uuids() == ["FUBAR"] + assert json.loads(dbram.get_detected_text_for_uuid("FUBAR")) == [["bar", 0.5]] dbram.close() @@ -228,13 +244,15 @@ def test_export_db_in_memory(): assert db.get_previous_uuids() == ["FOO-BAR"] assert db.get_info_for_uuid("FUBAR") is None + assert db.get_detected_text_for_uuid("FUBAR") is None def test_export_db_in_memory_nofile(): - """ test ExportDBInMemory with no dbfile """ + """test ExportDBInMemory with no dbfile""" import os import tempfile - from osxphotos.export_db import ExportDBInMemory, OSXPHOTOS_EXPORTDB_VERSION + + from osxphotos.export_db import OSXPHOTOS_EXPORTDB_VERSION, ExportDBInMemory tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_") filepath = os.path.join(tempdir.name, "test.JPG") @@ -254,6 +272,7 @@ def test_export_db_in_memory_nofile(): dbram.set_stat_converted_for_file(filepath, (1, 2, 3)) dbram.set_stat_edited_for_file(filepath, (4, 5, 6)) dbram.set_sidecar_for_file(filepath, "FUBAR", (20, 21, 22)) + dbram.set_detected_text_for_uuid("FUBAR", json.dumps([["bar", 0.5]])) assert dbram.get_uuid_for_file(filepath_lower) == "FUBAR" assert dbram.get_info_for_uuid("FUBAR") == INFO_DATA2 @@ -264,5 +283,6 @@ def test_export_db_in_memory_nofile(): assert dbram.get_stat_edited_for_file(filepath) == (4, 5, 6) assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22)) assert dbram.get_previous_uuids() == ["FUBAR"] - + assert json.loads(dbram.get_detected_text_for_uuid("FUBAR")) == [["bar", 0.5]] + dbram.close() diff --git a/tests/test_template.py b/tests/test_template.py index 07e74d91..4382e842 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -1,4 +1,5 @@ """ Test template.py """ +import json import os import re @@ -7,6 +8,7 @@ from photoinfo_mock import PhotoInfoMock import osxphotos from osxphotos.exiftool import get_exiftool_path +from osxphotos.export_db import ExportDBInMemory from osxphotos.phototemplate import ( TEMPLATE_SUBSTITUTIONS, TEMPLATE_SUBSTITUTIONS_MULTI_VALUED, @@ -1177,3 +1179,13 @@ def test_detected_text(photosdb): for template, value in TEMPLATE_VALUES_DETECTED_TEXT.items(): rendered, _ = photo.render_template(template) assert value in "".join(rendered) + + +def test_detected_text_caching(photosdb): + """Test {detected_text} template caches values""" + exportdb = ExportDBInMemory(None) + exportdb.set_detected_text_for_uuid(UUID_DETECTED_TEXT, json.dumps([["foo", 0.9]])) + photo = photosdb.get_photo(UUID_DETECTED_TEXT) + options = RenderOptions(exportdb=exportdb) + rendered, _ = photo.render_template("{detected_text}", options=options) + assert rendered[0] == "foo"