read exif only on access, sort with progress bar

This commit is contained in:
t.animal
2014-09-04 16:01:48 +02:00
parent b8863c6e88
commit 4beee5e06a
3 changed files with 58 additions and 12 deletions

View File

@@ -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)

View File

@@ -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')

View File

@@ -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']