diff --git a/sigal/gallery.py b/sigal/gallery.py index 30a1d3b..05a377d 100644 --- a/sigal/gallery.py +++ b/sigal/gallery.py @@ -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) diff --git a/sigal/signals.py b/sigal/signals.py index c175d33..534317d 100644 --- a/sigal/signals.py +++ b/sigal/signals.py @@ -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') diff --git a/tests/test_gallery.py b/tests/test_gallery.py index 3fe3e11..1bd86ec 100644 --- a/tests/test_gallery.py +++ b/tests/test_gallery.py @@ -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']