added PhotoInfo
This commit is contained in:
parent
8b61d573ed
commit
7e00ad438b
@ -15,12 +15,10 @@ import sqlite3
|
|||||||
from loguru import logger
|
from loguru import logger
|
||||||
from . import _applescript
|
from . import _applescript
|
||||||
|
|
||||||
# TODO: replace verbose with loguru
|
|
||||||
# replace string formatting with fstrings
|
# replace string formatting with fstrings
|
||||||
|
|
||||||
_debug = False
|
_debug = False
|
||||||
|
|
||||||
|
|
||||||
def _get_os_version():
|
def _get_os_version():
|
||||||
# returns tuple containing OS version
|
# returns tuple containing OS version
|
||||||
# e.g. 10.13.6 = (10, 13, 6)
|
# e.g. 10.13.6 = (10, 13, 6)
|
||||||
@ -34,7 +32,8 @@ def _check_file_exists(filename):
|
|||||||
filename = os.path.abspath(filename)
|
filename = os.path.abspath(filename)
|
||||||
return os.path.exists(filename) and not os.path.isdir(filename)
|
return os.path.exists(filename) and not os.path.isdir(filename)
|
||||||
|
|
||||||
class Photos:
|
|
||||||
|
class PhotosDB:
|
||||||
def __init__(self, dbfile=None):
|
def __init__(self, dbfile=None):
|
||||||
# Dict with information about all photos by uuid
|
# Dict with information about all photos by uuid
|
||||||
self._dbphotos = {}
|
self._dbphotos = {}
|
||||||
@ -79,7 +78,7 @@ class Photos:
|
|||||||
self._setup_applescript()
|
self._setup_applescript()
|
||||||
self._process_database()
|
self._process_database()
|
||||||
|
|
||||||
def keywords(self):
|
def keywords_as_dict(self):
|
||||||
# return keywords as dict of keyword, count in reverse sorted order (descending)
|
# return keywords as dict of keyword, count in reverse sorted order (descending)
|
||||||
keywords = {}
|
keywords = {}
|
||||||
for k in self._dbkeywords_keyword.keys():
|
for k in self._dbkeywords_keyword.keys():
|
||||||
@ -87,6 +86,38 @@ class Photos:
|
|||||||
keywords = dict(sorted(keywords.items(), key=lambda kv: kv[1], reverse=True))
|
keywords = dict(sorted(keywords.items(), key=lambda kv: kv[1], reverse=True))
|
||||||
return keywords
|
return keywords
|
||||||
|
|
||||||
|
def persons_as_dict(self):
|
||||||
|
# return persons as dict of person, count in reverse sorted order (descending)
|
||||||
|
persons = {}
|
||||||
|
for k in self._dbfaces_person.keys():
|
||||||
|
persons[k] = len(self._dbfaces_person[k])
|
||||||
|
persons = dict(sorted(persons.items(), key=lambda kv: kv[1], reverse=True))
|
||||||
|
return persons
|
||||||
|
|
||||||
|
def albums_as_dict(self):
|
||||||
|
# return albums as dict of albums, count in reverse sorted order (descending)
|
||||||
|
albums= {}
|
||||||
|
for k in self._dbalbums_album.keys():
|
||||||
|
albums[k] = len(self._dbalbums_album[k])
|
||||||
|
albums = dict(sorted(albums.items(), key=lambda kv: kv[1], reverse=True))
|
||||||
|
return albums
|
||||||
|
|
||||||
|
def keywords(self):
|
||||||
|
# return list of keywords found in photos database
|
||||||
|
keywords = self._dbkeywords_keyword.keys()
|
||||||
|
return list(keywords)
|
||||||
|
|
||||||
|
def persons(self):
|
||||||
|
# return persons as dict of person, count in reverse sorted order (descending)
|
||||||
|
persons = self._dbfaces_person.keys()
|
||||||
|
return list(persons)
|
||||||
|
|
||||||
|
def albums(self):
|
||||||
|
# return albums as dict of albums, count in reverse sorted order (descending)
|
||||||
|
albums= self._dbalbums_album.keys()
|
||||||
|
return list(albums)
|
||||||
|
|
||||||
|
|
||||||
# Various AppleScripts we need
|
# Various AppleScripts we need
|
||||||
def _setup_applescript(self):
|
def _setup_applescript(self):
|
||||||
self._scpt_export = ""
|
self._scpt_export = ""
|
||||||
@ -410,7 +441,7 @@ class Photos:
|
|||||||
|
|
||||||
# remove temporary copy of the database
|
# remove temporary copy of the database
|
||||||
try:
|
try:
|
||||||
logger.info("Removing temporary database file" + tmp_db)
|
logger.info("Removing temporary database file: " + tmp_db)
|
||||||
os.remove(tmp_db)
|
os.remove(tmp_db)
|
||||||
except:
|
except:
|
||||||
print("Could not remove temporary database: " + tmp_db, file=sys.stderr)
|
print("Could not remove temporary database: " + tmp_db, file=sys.stderr)
|
||||||
@ -439,3 +470,85 @@ class Photos:
|
|||||||
pp.pprint(self._dbphotos)
|
pp.pprint(self._dbphotos)
|
||||||
|
|
||||||
logger.debug(f"processed {len(self._dbphotos)} photos")
|
logger.debug(f"processed {len(self._dbphotos)} photos")
|
||||||
|
|
||||||
|
def photos(self, keywords = [],uuid=[],persons=[],albums=[]):
|
||||||
|
photos = []
|
||||||
|
if not keywords and not uuid and not persons and not albums:
|
||||||
|
#process all the photos
|
||||||
|
photos = list(self._dbphotos.keys())
|
||||||
|
else:
|
||||||
|
if albums is not None:
|
||||||
|
for album in albums:
|
||||||
|
print("album=%s" % album)
|
||||||
|
if album in self._dbalbums_album:
|
||||||
|
print("processing album %s:" % album)
|
||||||
|
photos.extend(self._dbalbums_album[album])
|
||||||
|
else:
|
||||||
|
print("Could not find album '%s' in database" %
|
||||||
|
(album), file=sys.stderr)
|
||||||
|
|
||||||
|
if uuid is not None:
|
||||||
|
for u in uuid:
|
||||||
|
print("uuid=%s" % u)
|
||||||
|
if u in self._dbphotos:
|
||||||
|
print("processing uuid %s:" % u)
|
||||||
|
photos.extend([u])
|
||||||
|
else:
|
||||||
|
print("Could not find uuid '%s' in database" %
|
||||||
|
(u), file=sys.stderr)
|
||||||
|
|
||||||
|
if keywords is not None:
|
||||||
|
for keyword in keywords:
|
||||||
|
print("keyword=%s" % keyword)
|
||||||
|
if keyword in self._dbkeywords_keyword:
|
||||||
|
print("processing keyword %s:" % keyword)
|
||||||
|
photos.extend(self._dbkeywords_keyword[keyword])
|
||||||
|
else:
|
||||||
|
print("Could not find keyword '%s' in database" %
|
||||||
|
(keyword), file=sys.stderr)
|
||||||
|
|
||||||
|
if persons is not None:
|
||||||
|
for person in persons:
|
||||||
|
print("person=%s" % person)
|
||||||
|
if person in self._dbfaces_person:
|
||||||
|
print("processing person %s:" % person)
|
||||||
|
photos.extend(self._dbfaces_person[person])
|
||||||
|
else:
|
||||||
|
print("Could not find person '%s' in database" %
|
||||||
|
(person), file=sys.stderr)
|
||||||
|
|
||||||
|
photoinfo = []
|
||||||
|
for p in photos:
|
||||||
|
info = PhotoInfo(p,self._dbphotos[p])
|
||||||
|
photoinfo.append(info)
|
||||||
|
return photoinfo
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Info about a specific photo, contains all the details we know about the photo
|
||||||
|
including keywords, persons, albums, uuid, path, etc.
|
||||||
|
"""
|
||||||
|
class PhotoInfo():
|
||||||
|
def __init__(self, uuid, info = {}):
|
||||||
|
self.uuid = uuid
|
||||||
|
self.info = info
|
||||||
|
|
||||||
|
self.subs = {
|
||||||
|
'filename' : 'filename',
|
||||||
|
'date' : 'imageDate',
|
||||||
|
'description' : 'extendedDescription',
|
||||||
|
'title' : 'name',
|
||||||
|
'keywords' : 'keywords',
|
||||||
|
}
|
||||||
|
|
||||||
|
def __getattr__(self, name):
|
||||||
|
if name in self.subs:
|
||||||
|
def method(*args):
|
||||||
|
return self.info[self.subs[name]]
|
||||||
|
return method
|
||||||
|
else:
|
||||||
|
logger.error(f"Unknown method {name}")
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user