read exif only on access, sort with progress bar
This commit is contained in:
@@ -148,9 +148,40 @@ class Image(Media):
|
||||
|
||||
def __init__(self, filename, path, settings):
|
||||
super(Image, self).__init__(filename, path, settings)
|
||||
self.raw_exif, self.exif = get_exif_tags(self.src_path)
|
||||
self._raw_exif = None
|
||||
self._exif = None
|
||||
|
||||
@property
|
||||
def date(self):
|
||||
if self.exif is not None and 'dateobj' in self.exif:
|
||||
self.date = self.exif['dateobj']
|
||||
return self.exif['dateobj']
|
||||
else:
|
||||
return self._date
|
||||
|
||||
@date.setter
|
||||
def date(self, value):
|
||||
self._date = value
|
||||
|
||||
@property
|
||||
def exif(self):
|
||||
if not self._exif:
|
||||
self._raw_exif, self._exif = get_exif_tags(self.src_path)
|
||||
return self._exif
|
||||
|
||||
@exif.setter
|
||||
def exif(self, value):
|
||||
self._exif = value
|
||||
|
||||
@property
|
||||
def raw_exif(self):
|
||||
if not self._raw_exif:
|
||||
self._raw_exif, self._exif = get_exif_tags(self.src_path)
|
||||
return self._raw_exif
|
||||
|
||||
@raw_exif.setter
|
||||
def raw_exif(self, value):
|
||||
self._raw_exif = value
|
||||
|
||||
|
||||
|
||||
class Video(Media):
|
||||
@@ -231,16 +262,6 @@ class Album(UnicodeMixin):
|
||||
self.medias_count[media.type] += 1
|
||||
medias.append(media)
|
||||
|
||||
# sort images
|
||||
if medias:
|
||||
medias_sort_attr = settings['medias_sort_attr']
|
||||
if medias_sort_attr == 'date':
|
||||
key = lambda s: s.date or datetime.now()
|
||||
else:
|
||||
key = lambda s: strxfrm(getattr(s, medias_sort_attr))
|
||||
|
||||
medias.sort(key=key, reverse=settings['medias_sort_reverse'])
|
||||
|
||||
signals.album_initialized.send(self)
|
||||
|
||||
def __repr__(self):
|
||||
@@ -284,6 +305,22 @@ class Album(UnicodeMixin):
|
||||
check_or_create_dir(join(self.dst_path,
|
||||
self.settings['thumb_dir']))
|
||||
|
||||
if self.medias and self.settings['keep_orig']:
|
||||
self.orig_path = join(self.dst_path, self.settings['orig_dir'])
|
||||
check_or_create_dir(self.orig_path)
|
||||
|
||||
def sort_medias(self, medias_sort_attr):
|
||||
if self.medias:
|
||||
if medias_sort_attr == 'date':
|
||||
key = lambda s: s.date or datetime.now()
|
||||
else:
|
||||
key = lambda s: strxfrm(getattr(s, medias_sort_attr))
|
||||
|
||||
self.medias.sort(key=key,
|
||||
reverse=self.settings['medias_sort_reverse'])
|
||||
|
||||
signals.medias_sorted.send(self)
|
||||
|
||||
@property
|
||||
def images(self):
|
||||
"""List of images (:class:`~sigal.gallery.Image`)."""
|
||||
@@ -473,6 +510,10 @@ class Gallery(object):
|
||||
album.create_output_directories()
|
||||
albums[relpath] = album
|
||||
|
||||
with progressbar(albums.values(), label="Sorting media") as progressAlbums:
|
||||
for album in progressAlbums:
|
||||
album.sort_medias(settings['medias_sort_attr'])
|
||||
|
||||
self.logger.debug('Albums:\n%r', albums.values())
|
||||
signals.gallery_initialized.send(self)
|
||||
|
||||
|
||||
@@ -8,3 +8,4 @@ album_initialized = signal('album_initialized')
|
||||
gallery_initialized = signal('gallery_initialized')
|
||||
gallery_build = signal('gallery_build')
|
||||
media_initialized = signal('media_initialized')
|
||||
medias_sorted = signal('medias_sorted')
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import locale
|
||||
import os
|
||||
import pytest
|
||||
import datetime
|
||||
|
||||
from os.path import join
|
||||
from sigal.gallery import Album, Media, Image, Video, Gallery
|
||||
@@ -98,6 +99,7 @@ def test_media_orig(settings, tmpdir):
|
||||
def test_image(settings, tmpdir):
|
||||
settings['destination'] = str(tmpdir)
|
||||
m = Image('11.jpg', 'dir1/test1', settings)
|
||||
assert m.date == datetime.datetime(2006, 1, 22, 10, 32, 42)
|
||||
assert m.exif['datetime'] == u'Sunday, 22. January 2006'
|
||||
|
||||
os.makedirs(join(settings['destination'], 'dir1', 'test1', 'thumbnails'))
|
||||
@@ -169,11 +171,13 @@ def test_medias_sort(settings):
|
||||
|
||||
settings['medias_sort_reverse'] = True
|
||||
a = Album('dir1/test2', settings, album['subdirs'], album['medias'], gal)
|
||||
a.sort_medias(settings['medias_sort_attr'])
|
||||
assert [im.filename for im in a.images] == list(reversed(album['medias']))
|
||||
|
||||
settings['medias_sort_attr'] = 'date'
|
||||
settings['medias_sort_reverse'] = False
|
||||
a = Album('dir1/test2', settings, album['subdirs'], album['medias'], gal)
|
||||
a.sort_medias(settings['medias_sort_attr'])
|
||||
assert [im.filename for im in a.images] == ['22.jpg', '21.jpg',
|
||||
'archlinux-kiss-1024x640.png']
|
||||
|
||||
|
||||
Reference in New Issue
Block a user