1
0
mirror of https://github.com/sjlongland/tornado-gallery.git synced 2025-10-28 09:19:24 +10:00

photo: Initial implementation of photo class.

This commit is contained in:
Stuart Longland 2018-04-08 15:31:55 +10:00
parent 770e173cf8
commit 629e812861
Signed by: stuartl
GPG Key ID: 6AA32EFB18079BAA

View File

@ -6,7 +6,6 @@ import os.path
from time import time
from .metadata import parse_meta
from .photo import Photo
class Photo(object):
@ -14,82 +13,51 @@ class Photo(object):
Representation of a photo in a gallery.
"""
def __init__(self, gallery, name):
def __init__(self, gallery, fs_node):
self._gallery = ref(gallery)
self._name = name
self._title = None
self._desc = None
self._meta_cache = meta_cache
self._meta_mtime = 0
self._fs_cache = fs_cache
self._content = None
self._content_mtime = 0
assert self.name not in self._INSTANCE
self._INSTANCE[self.name] = self
@property
def fs_cache(self):
return self._fs_cache
@property
def meta_cache(self):
return self._meta_cache
@property
def dir(self):
return self._dir
self._fs_node = fs_node
@property
def name(self):
return os.path.basename(self.dir)
return self._fs_node.base_name
@property
def title(self):
self._parse_metadata()
return self._title
def annotation(self):
try:
return self._meta_node['.annotation']
except KeyError:
try:
return self._gallery()._meta[self._fs_node.basename]
except KeyError:
return None
@property
def desc(self):
self._parse_metadata()
return self._desc
def preferred_width(self):
try:
return self._get_meta('.width')
except KeyError:
return None
@property
def content(self):
content_mtime_now = self._content_mtime_now
if self._content_mtime < content_mtime_now:
content = {}
for name in self._fs_cache[self.dir]:
# Grab the file extension and analyse
(_, ext) = name.rsplit('.',1)
if ext.lower() not in ('jpg', 'jpe', 'jpeg', 'gif',
'png', 'tif', 'tiff'):
continue
# This is a photo.
content[name] = Photo(self, name)
self._content = OrderedDict(sorted(content.items(),
key=lambda i : i[0]))
self._content_mtime = content_mtime_now
return self._content.copy()
def preferred_height(self):
try:
return self._get_meta('.height')
except KeyError:
return None
@property
def _meta_file(self):
return os.path.join(self.dir, 'info.txt')
def _meta_node(self):
# Return the metadata node for this photo.
(photo_name, _) = self._fs_node.abs_path.rsplit('.',1)
return self._gallery()._fs_cache['%s.txt' % photo_name]
@property
def _meta_mtime_now(self):
return self._fs_cache[self._meta_file].stat.st_mtime
def _get_meta(self, key):
# Metadata can either be in our own file with the same base name; or
# part of the gallery's metadata.
try:
meta = self._meta_node
except KeyError:
# Retrieve from the parent
return self._gallery._meta[self.name, key]
@property
def _dir_mtime_now(self):
return self._fs_cache[self.dir].stat.st_mtime
def _parse_metadata(self):
meta_mtime_now = self._meta_mtime_now
if meta_mtime_now > self._meta_mtime:
data = self._meta_cache[meta_file]
self._title = data.get('.title', self.name)
self._desc = data.get('.desc', 'No description given')
self._meta_mtime = meta_mtime_now
return meta[key]