Added error logging to {detected_text} processing, #499
This commit is contained in:
@@ -1,3 +1,3 @@
|
|||||||
""" version info """
|
""" version info """
|
||||||
|
|
||||||
__version__ = "0.42.69"
|
__version__ = "0.42.70"
|
||||||
|
|||||||
@@ -89,11 +89,11 @@ class ExportDB_ABC(ABC):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def get_detected_text_for_uuid(self, uuid, confidence):
|
def get_detected_text_for_uuid(self, uuid):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
def set_detected_text_for_uuid(self, uuid, text, confidence):
|
def set_detected_text_for_uuid(self, uuid, json_text):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
@@ -170,10 +170,10 @@ class ExportDBNoOp(ExportDB_ABC):
|
|||||||
def get_previous_uuids(self):
|
def get_previous_uuids(self):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def get_detected_text_for_uuid(self, uuid, confidence):
|
def get_detected_text_for_uuid(self, uuid):
|
||||||
return []
|
return None
|
||||||
|
|
||||||
def set_detected_text_for_uuid(self, uuid, text, confidence):
|
def set_detected_text_for_uuid(self, uuid, json_text):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def set_data(
|
def set_data(
|
||||||
@@ -493,7 +493,7 @@ class ExportDB(ExportDB_ABC):
|
|||||||
c = conn.cursor()
|
c = conn.cursor()
|
||||||
c.execute(
|
c.execute(
|
||||||
"INSERT OR REPLACE INTO detected_text(uuid, text_data) VALUES (?, ?);",
|
"INSERT OR REPLACE INTO detected_text(uuid, text_data) VALUES (?, ?);",
|
||||||
(uuid, text_json),
|
(uuid, text_json,),
|
||||||
)
|
)
|
||||||
conn.commit()
|
conn.commit()
|
||||||
except Error as e:
|
except Error as e:
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import datetime
|
import datetime
|
||||||
import json
|
import json
|
||||||
import locale
|
import locale
|
||||||
|
import logging
|
||||||
import os
|
import os
|
||||||
import pathlib
|
import pathlib
|
||||||
import shlex
|
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)
|
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)
|
detected_text = json.loads(detected_text)
|
||||||
else:
|
else:
|
||||||
path = (
|
path = (
|
||||||
@@ -1459,6 +1460,9 @@ def _get_detected_text(photo, exportdb, confidence=TEXT_DETECTION_CONFIDENCE_THR
|
|||||||
try:
|
try:
|
||||||
detected_text = detect_text(path)
|
detected_text = detect_text(path)
|
||||||
except Exception as e:
|
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))
|
exportdb.set_detected_text_for_uuid(photo.uuid, json.dumps(detected_text))
|
||||||
return [text for text, conf in detected_text if conf >= confidence]
|
return [text for text, conf in detected_text if conf >= confidence]
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
""" Test ExportDB """
|
""" Test ExportDB """
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
import pytest
|
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"}]"""
|
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():
|
def test_export_db():
|
||||||
""" test ExportDB """
|
"""test ExportDB"""
|
||||||
import os
|
import os
|
||||||
import tempfile
|
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_")
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
||||||
dbname = os.path.join(tempdir.name, ".osxphotos_export.db")
|
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_sidecar_for_file(filepath) == (SIDECAR_DATA, (13, 14, 15))
|
||||||
assert db.get_previous_uuids() == ["FOO-BAR"]
|
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
|
# test set_data which sets all at the same time
|
||||||
filepath2 = os.path.join(tempdir.name, "test2.jpg")
|
filepath2 = os.path.join(tempdir.name, "test2.jpg")
|
||||||
db.set_data(
|
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_converted_for_file(filepath2) == (7, 8, 9)
|
||||||
assert db.get_stat_edited_for_file(filepath2) == (10, 11, 12)
|
assert db.get_stat_edited_for_file(filepath2) == (10, 11, 12)
|
||||||
assert sorted(db.get_previous_uuids()) == (["BAR-FOO", "FOO-BAR"])
|
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
|
# update data
|
||||||
db.set_uuid_for_file(filepath, "FUBAR")
|
db.set_uuid_for_file(filepath, "FUBAR")
|
||||||
@@ -88,10 +95,11 @@ def test_export_db():
|
|||||||
|
|
||||||
|
|
||||||
def test_export_db_no_op():
|
def test_export_db_no_op():
|
||||||
""" test ExportDBNoOp """
|
"""test ExportDBNoOp"""
|
||||||
import os
|
import os
|
||||||
import tempfile
|
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_")
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
||||||
db = ExportDBNoOp()
|
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_sidecar_for_file(filepath) == (None, (None, None, None))
|
||||||
assert db.get_previous_uuids() == []
|
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
|
# test set_data which sets all at the same time
|
||||||
filepath2 = os.path.join(tempdir.name, "test2.jpg")
|
filepath2 = os.path.join(tempdir.name, "test2.jpg")
|
||||||
db.set_data(
|
db.set_data(
|
||||||
@@ -148,13 +159,14 @@ def test_export_db_no_op():
|
|||||||
|
|
||||||
|
|
||||||
def test_export_db_in_memory():
|
def test_export_db_in_memory():
|
||||||
""" test ExportDBInMemory """
|
"""test ExportDBInMemory"""
|
||||||
import os
|
import os
|
||||||
import tempfile
|
import tempfile
|
||||||
|
|
||||||
from osxphotos.export_db import (
|
from osxphotos.export_db import (
|
||||||
|
OSXPHOTOS_EXPORTDB_VERSION,
|
||||||
ExportDB,
|
ExportDB,
|
||||||
ExportDBInMemory,
|
ExportDBInMemory,
|
||||||
OSXPHOTOS_EXPORTDB_VERSION,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
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_stat_edited_for_file(filepath, (10, 11, 12))
|
||||||
db.set_sidecar_for_file(filepath, SIDECAR_DATA, (13, 14, 15))
|
db.set_sidecar_for_file(filepath, SIDECAR_DATA, (13, 14, 15))
|
||||||
assert db.get_previous_uuids() == ["FOO-BAR"]
|
assert db.get_previous_uuids() == ["FOO-BAR"]
|
||||||
|
db.set_detected_text_for_uuid("FOO-BAR", json.dumps([["foo", 0.5]]))
|
||||||
|
|
||||||
db.close()
|
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_stat_edited_for_file(filepath) == (10, 11, 12)
|
||||||
assert dbram.get_sidecar_for_file(filepath) == (SIDECAR_DATA, (13, 14, 15))
|
assert dbram.get_sidecar_for_file(filepath) == (SIDECAR_DATA, (13, 14, 15))
|
||||||
assert dbram.get_previous_uuids() == ["FOO-BAR"]
|
assert dbram.get_previous_uuids() == ["FOO-BAR"]
|
||||||
|
assert json.loads(dbram.get_detected_text_for_uuid("FOO-BAR")) == [["foo", 0.5]]
|
||||||
|
|
||||||
# change a value
|
# change a value
|
||||||
dbram.set_uuid_for_file(filepath, "FUBAR")
|
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_converted_for_file(filepath, (1, 2, 3))
|
||||||
dbram.set_stat_edited_for_file(filepath, (4, 5, 6))
|
dbram.set_stat_edited_for_file(filepath, (4, 5, 6))
|
||||||
dbram.set_sidecar_for_file(filepath, "FUBAR", (20, 21, 22))
|
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_uuid_for_file(filepath_lower) == "FUBAR"
|
||||||
assert dbram.get_info_for_uuid("FUBAR") == INFO_DATA2
|
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_stat_edited_for_file(filepath) == (4, 5, 6)
|
||||||
assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22))
|
assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22))
|
||||||
assert dbram.get_previous_uuids() == ["FUBAR"]
|
assert dbram.get_previous_uuids() == ["FUBAR"]
|
||||||
|
assert json.loads(dbram.get_detected_text_for_uuid("FUBAR")) == [["bar", 0.5]]
|
||||||
|
|
||||||
dbram.close()
|
dbram.close()
|
||||||
|
|
||||||
@@ -228,13 +244,15 @@ def test_export_db_in_memory():
|
|||||||
assert db.get_previous_uuids() == ["FOO-BAR"]
|
assert db.get_previous_uuids() == ["FOO-BAR"]
|
||||||
|
|
||||||
assert db.get_info_for_uuid("FUBAR") is None
|
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():
|
def test_export_db_in_memory_nofile():
|
||||||
""" test ExportDBInMemory with no dbfile """
|
"""test ExportDBInMemory with no dbfile"""
|
||||||
import os
|
import os
|
||||||
import tempfile
|
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_")
|
tempdir = tempfile.TemporaryDirectory(prefix="osxphotos_")
|
||||||
filepath = os.path.join(tempdir.name, "test.JPG")
|
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_converted_for_file(filepath, (1, 2, 3))
|
||||||
dbram.set_stat_edited_for_file(filepath, (4, 5, 6))
|
dbram.set_stat_edited_for_file(filepath, (4, 5, 6))
|
||||||
dbram.set_sidecar_for_file(filepath, "FUBAR", (20, 21, 22))
|
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_uuid_for_file(filepath_lower) == "FUBAR"
|
||||||
assert dbram.get_info_for_uuid("FUBAR") == INFO_DATA2
|
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_stat_edited_for_file(filepath) == (4, 5, 6)
|
||||||
assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22))
|
assert dbram.get_sidecar_for_file(filepath) == ("FUBAR", (20, 21, 22))
|
||||||
assert dbram.get_previous_uuids() == ["FUBAR"]
|
assert dbram.get_previous_uuids() == ["FUBAR"]
|
||||||
|
assert json.loads(dbram.get_detected_text_for_uuid("FUBAR")) == [["bar", 0.5]]
|
||||||
|
|
||||||
dbram.close()
|
dbram.close()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
""" Test template.py """
|
""" Test template.py """
|
||||||
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -7,6 +8,7 @@ from photoinfo_mock import PhotoInfoMock
|
|||||||
|
|
||||||
import osxphotos
|
import osxphotos
|
||||||
from osxphotos.exiftool import get_exiftool_path
|
from osxphotos.exiftool import get_exiftool_path
|
||||||
|
from osxphotos.export_db import ExportDBInMemory
|
||||||
from osxphotos.phototemplate import (
|
from osxphotos.phototemplate import (
|
||||||
TEMPLATE_SUBSTITUTIONS,
|
TEMPLATE_SUBSTITUTIONS,
|
||||||
TEMPLATE_SUBSTITUTIONS_MULTI_VALUED,
|
TEMPLATE_SUBSTITUTIONS_MULTI_VALUED,
|
||||||
@@ -1177,3 +1179,13 @@ def test_detected_text(photosdb):
|
|||||||
for template, value in TEMPLATE_VALUES_DETECTED_TEXT.items():
|
for template, value in TEMPLATE_VALUES_DETECTED_TEXT.items():
|
||||||
rendered, _ = photo.render_template(template)
|
rendered, _ = photo.render_template(template)
|
||||||
assert value in "".join(rendered)
|
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"
|
||||||
|
|||||||
Reference in New Issue
Block a user