diff --git a/.travis.yml b/.travis.yml index f642eee..3795238 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ python: before_install: # Dependencies to build PIL - sudo apt-get update -qq - - sudo apt-get install -qq libfreetype6-dev libjpeg8-dev zlib1g-dev + - sudo apt-get install -qq libfreetype6-dev libjpeg8-dev zlib1g-dev ffmpeg install: - pip install pytest --use-mirrors - pip install . --use-mirrors diff --git a/requirements.txt b/requirements.txt index 18306a3..9bf7eb8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,3 +5,4 @@ Markdown Pillow pilkit pytest +ffmpeg diff --git a/sigal/gallery.py b/sigal/gallery.py index ec85a40..70753bd 100644 --- a/sigal/gallery.py +++ b/sigal/gallery.py @@ -41,6 +41,9 @@ from .writer import Writer DESCRIPTION_FILE = "index.md" +class FileExtensionError(Exception): + """Raised if we made an error when handling file extensions""" + pass class PathsDb(object): """Container for all the information on the directory structure. @@ -94,20 +97,16 @@ class PathsDb(object): self.db['paths_list'].append(relpath) self.db[relpath] = { - 'img': [f for f in filenames - if os.path.splitext(f)[1] in self.img_ext_list], - 'vid': [f for f in filenames - if os.path.splitext(f)[1] in self.vid_ext_list], + 'medias': [ f for f in filenames if os.path.splitext(f)[1] + in (self.img_ext_list + self.vid_ext_list) ], 'subdir': dirnames } self.db[relpath].update(get_metadata(path)) path_media = [path for path in self.db['paths_list'] - if (self.db[path]['img'] or self.db[path]['vid']) - and path != '.'] + if self.db[path]['medias'] and path != '.'] path_nomedia = [path for path in self.db['paths_list'] - if not (self.db[path]['img'] or self.db[path]['vid']) - and path !='.'] + if not self.db[path]['medias'] and path !='.'] # dir with images: check the thumbnail, and find it if necessary for path in path_media: @@ -142,20 +141,17 @@ class PathsDb(object): return # find and return the first landscape image - for f in self.db[path]['img']: - im = PILImage.open(join(self.basepath, path, f)) - if im.size[0] > im.size[1]: - self.db[path]['thumbnail'] = f - return + for f in self.db[path]['medias']: + base, ext = os.path.splitext(f) + if ext in self.img_ext_list: + im = PILImage.open(join(self.basepath, path, f)) + if im.size[0] > im.size[1]: + self.db[path]['thumbnail'] = f + return - # else try returning the 1st image - if self.db[path]['img']: - self.db[path]['thumbnail'] = self.db[path]['img'][0] - return - - # last, we try the first vid - if self.db[path]['vid']: - self.db[path]['thumbnail'] = self.db[path]['vid'][0] + # else simply return the 1st media file + if self.db[path]['medias']: + self.db[path]['thumbnail'] = self.db[path]['medias'][0] return self.db[path]['thumbnail'] = '' @@ -192,24 +188,22 @@ class Gallery(object): # loop on directories in reversed order, to process subdirectories # before their parent for path in reversed(self.db['paths_list']): - imglist = [os.path.normpath(join(self.settings['source'], path, f)) - for f in self.db[path]['img']] - vidlist = [os.path.normpath(join(self.settings['source'], path, f)) - for f in self.db[path]['vid']] + media_files = [os.path.normpath(join(self.settings['source'], path, f)) + for f in self.db[path]['medias']] # output dir for the current path outpath = os.path.normpath(join(self.settings['destination'], path)) check_or_create_dir(outpath) - if len(imglist) != 0 or len(vidlist) != 0: - self.process_dir(imglist, vidlist, outpath, path, - label_width=label_width) + if len(media_files) != 0: + self.process_dir(media_files, outpath, path, + label_width=label_width) if self.settings['write_html']: self.writer.write(self.db, path) - def process_dir(self, imglist, vidlist, outpath, dirname, label_width=20): + def process_dir(self, media_files, outpath, dirname, label_width=20): """Process a list of images in a directory.""" # Create thumbnails directory and optionally the one for original img @@ -218,8 +212,6 @@ class Gallery(object): if self.settings['keep_orig']: check_or_create_dir(join(outpath, self.settings['orig_dir'])) - media_files = imglist + vidlist - # use progressbar if level is > INFO if self.logger.getEffectiveLevel() > 20: label = colored.green(dirname.ljust(label_width)) @@ -235,19 +227,24 @@ class Gallery(object): # loop on images for f in media_iterator: filename = os.path.split(f)[1] - if f in imglist: + base, ext = os.path.splitext(filename) + if ext in self.settings['img_ext_list']: outname = join(outpath, filename) + elif ext in self.settings['vid_ext_list']: + outname = join(outpath, base + '.webm') else: - outname = join(outpath, os.path.splitext(filename)[0] + '.webm') + raise FileExtensionError if os.path.isfile(outname) and not self.force: self.logger.info("%s exists - skipping", filename) else: self.logger.info(filename) - if f in imglist: + if ext in self.settings['img_ext_list']: process_image(f, outpath, self.settings) - else: + elif ext in self.settings['vid_ext_list']: process_video(f, outpath, self.settings) + else: + raise FileExtensionError except KeyboardInterrupt: sys.exit('Interrupted') diff --git a/sigal/themes/colorbox/templates/index.html b/sigal/themes/colorbox/templates/index.html index 46b50ed..5a58ea6 100644 --- a/sigal/themes/colorbox/templates/index.html +++ b/sigal/themes/colorbox/templates/index.html @@ -67,36 +67,38 @@ {% endif %} - {% if images or videos %} + {% if medias %}
- {% if images or videos %} + {% if medias %} diff --git a/sigal/themes/galleria/templates/index.html b/sigal/themes/galleria/templates/index.html index b25f2f2..4434430 100644 --- a/sigal/themes/galleria/templates/index.html +++ b/sigal/themes/galleria/templates/index.html @@ -57,26 +57,28 @@ {% endif %} - {% if images or videos %} + {% if medias %} {% endif %} @@ -94,7 +96,7 @@ - {% if images or videos %} + {% if medias %} diff --git a/sigal/writer.py b/sigal/writer.py index 690a758..9bc1d45 100644 --- a/sigal/writer.py +++ b/sigal/writer.py @@ -90,8 +90,7 @@ class Writer(object): self.ctx = { 'sigal_link': sigal_link, 'theme': {'name': os.path.basename(self.theme)}, - 'images': [], - 'videos': [], + 'medias': [], 'albums': [], 'breadcumb': '' } @@ -136,20 +135,19 @@ class Writer(object): if relpath != '.': ctx['breadcumb'] = self.get_breadcumb(paths, relpath) - for i in paths[relpath]['img']: - img_ctx = {'file': i, - 'thumb': get_thumb(self.settings, i)} - if self.settings['keep_orig']: - img_ctx['big'] = get_orig(self.settings, i) - ctx['images'].append(img_ctx) - - for i in paths[relpath]['vid']: + for i in paths[relpath]['medias']: + media_ctx = {} base, ext = os.path.splitext(i) - vid_ctx = {'file': base + '.webm', - 'thumb': get_thumb(self.settings, i)} + if ext in self.settings['img_ext_list']: + media_ctx['type'] = 'img' + media_ctx['file'] = i + else: + media_ctx['type'] = 'vid' + media_ctx['file'] = base + '.webm' + media_ctx['thumb'] = get_thumb(self.settings, i) if self.settings['keep_orig']: - vid_ctx['big'] = get_orig(self.settings, i) - ctx['videos'].append(vid_ctx) + media_ctx['big'] = get_orig(self.settings, i) + ctx['medias'].append(media_ctx) for d in paths[relpath]['subdir']: dpath = os.path.normpath(os.path.join(relpath, d)) @@ -165,8 +163,8 @@ class Writer(object): base, ext = os.path.splitext(source) if ext in self.settings['img_ext_list']: sigal.image.generate_thumbnail( - source, thumb_path, self.settings['thumb_size'], None, - fit=self.settings['thumb_fit']) + source, thumb_path, self.settings['thumb_size'], + None, fit=self.settings['thumb_fit']) else: sigal.video.generate_thumbnail( source, thumb_path, self.settings['thumb_size'], diff --git a/tests/test_gallery.py b/tests/test_gallery.py index 3103749..7cd0bbe 100644 --- a/tests/test_gallery.py +++ b/tests/test_gallery.py @@ -13,41 +13,35 @@ REF = { 'dir1': { 'title': 'An example gallery', 'thumbnail': 'test1/11.jpg', - 'img': [], - 'vid': [] + 'medias': [], }, 'dir1/test1': { 'title': 'An example sub-category', 'thumbnail': '11.jpg', - 'img': ['11.jpg', 'archlinux-kiss-1024x640.png'], - 'vid': [] + 'medias': ['11.jpg', 'archlinux-kiss-1024x640.png'], }, 'dir1/test2': { 'title': 'Test2', 'thumbnail': '21.jpg', - 'img': ['21.jpg', '22.jpg'], - 'vid': [] + 'medias': ['21.jpg', '22.jpg'], }, 'dir2': { 'title': 'Another example gallery', 'thumbnail': 'm57_the_ring_nebula-587px.jpg', - 'img': ['exo20101028-b-full.jpg', + 'medias': ['exo20101028-b-full.jpg', 'm57_the_ring_nebula-587px.jpg', 'Hubble ultra deep field.jpg', 'Hubble Interacting Galaxy NGC 5257.jpg'], - 'vid': [], }, u'accentué': { 'title': u'Accentué', 'thumbnail': u'hélicoïde.jpg', - 'img': [u'hélicoïde.jpg', 'superdupont_source_wikipedia_en.jpg'], - 'vid': [], + 'medias': [u'hélicoïde.jpg', 'superdupont_source_wikipedia_en.jpg'], }, 'video': { 'title': 'Video', 'thumbnail': 'stallman-software-freedom-day-low.ogv', - 'img': [], - 'vid': ['stallman-software-freedom-day-low.ogv'] + 'medias': ['stallman-software-freedom-day-low.ogv'] } } @@ -76,7 +70,7 @@ def test_filelist(db): 'dir1/test2', 'dir2', u'accentué', 'video']) assert set(db['skipped_dir']) == set(['empty', 'dir1/empty']) - assert db['.']['img'] == [] + assert db['.']['medias'] == [] assert set(db['.']['subdir']) == set([u'accentué', 'dir1', 'dir2', 'video']) @@ -91,14 +85,9 @@ def test_thumbnail(db): assert db[p]['thumbnail'] == REF[p]['thumbnail'] -def test_imglist(db): +def test_medialist(db): for p in REF.keys(): - assert set(db[p]['img']) == set(REF[p]['img']) - - -def test_vidlist(db): - for p in REF.keys(): - assert set(db[p]['vid']) == set(REF[p]['vid']) + assert set(db[p]['medias']) == set(REF[p]['medias']) def test_get_subdir(paths):