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:
parent
770e173cf8
commit
629e812861
@ -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]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user