2015-12-03 06:09:29 +01:00
#!/usr/bin/env python
import os
2015-12-08 06:57:17 +01:00
import sys
2015-12-08 07:04:07 +01:00
import yaml
2015-12-08 09:28:54 +01:00
import shutil
2015-12-08 07:04:07 +01:00
2015-12-08 08:06:39 +01:00
from jinja2 import Environment , FileSystemLoader
2016-02-18 06:43:28 +01:00
from . cache import CACHE
2016-02-18 06:44:12 +01:00
from . utils import error
2016-02-18 06:43:28 +01:00
2016-02-18 06:48:05 +01:00
SETTINGS = {
2016-02-18 17:00:17 +01:00
" show_date " : True ,
2016-02-18 06:48:05 +01:00
" gm " : {
" quality " : 75 ,
2016-02-18 14:27:13 +01:00
" auto-orient " : True ,
" strip " : True ,
" resize " : None
2016-02-18 06:48:05 +01:00
}
2016-02-17 17:53:30 +01:00
}
2016-02-09 07:31:37 +01:00
class Image ( object ) :
base_dir = " "
target_dir = " "
2015-12-11 09:22:36 +01:00
2016-02-09 07:31:37 +01:00
def __init__ ( self , options ) :
# assuming string
if not isinstance ( options , dict ) :
options = { " name " : options }
2016-02-18 09:05:17 +01:00
self . options = SETTINGS [ " gm " ] . copy ( ) # used for caching, if it's modified -> regenerate
self . options . update ( options )
2016-02-15 18:06:00 +01:00
@property
def name ( self ) :
2016-02-18 06:40:56 +01:00
return self . options [ " name " ]
2016-02-15 18:06:00 +01:00
2016-02-18 14:27:13 +01:00
def gm ( self , source , target , options ) :
if CACHE . needs_to_be_generated ( source , target , options ) :
gm_switches = {
" source " : source ,
" target " : target ,
" auto-orient " : " -auto-orient " if options [ " auto-orient " ] else " " ,
" strip " : " -strip " if options [ " strip " ] else " " ,
2016-02-19 08:51:18 +01:00
" quality " : " -quality %s " % options [ " quality " ] if " quality " in options else " -define jpeg:preserve-settings " ,
" resize " : " -resize %s " % options [ " resize " ] if options . get ( " resize " , None ) is not None else " "
2016-02-19 09:52:45 +01:00
2016-02-18 14:27:13 +01:00
}
command = " gm convert {source} { auto-orient} {strip} {quality} {resize} {target} " . format ( * * gm_switches )
print command
os . system ( command )
CACHE . cache_picture ( source , target , options )
else :
print " skipped %s since it ' s already generated (based on source unchanged size and images options set in your gallery ' s settings.yaml) " % target
2016-02-09 07:31:37 +01:00
def copy ( self ) :
source , target = os . path . join ( self . base_dir , self . name ) , os . path . join ( self . target_dir , self . name )
2015-12-11 09:13:52 +01:00
# XXX doing this DOESN'T improve perf at all (or something like 0.1%)
# if os.path.exists(target) and os.path.getsize(source) == os.path.getsize(target):
2016-02-15 11:59:09 +01:00
# print "Skipped %s since the file hasn't been modified based on file size" % source
2015-12-11 09:13:52 +01:00
# return ""
2016-02-18 14:27:13 +01:00
options = self . options . copy ( )
if not options [ " auto-orient " ] and not options [ " strip " ] :
2016-02-15 16:51:32 +01:00
shutil . copyfile ( source , target )
print source , " -> " , target
2016-02-18 08:29:08 +01:00
else :
2016-02-18 14:27:13 +01:00
# Do not consider quality settings here, since we aim to copy the input image
# better to preserve input encoding setting
del options [ " quality " ]
self . gm ( source , target , options )
2015-12-08 09:29:38 +01:00
return " "
2016-02-09 07:31:37 +01:00
def generate_thumbnail ( self , gm_geometry ) :
thumbnail_name = self . name . split ( " . " )
2016-02-17 10:38:17 +01:00
thumbnail_name [ - 2 ] + = " - %s " % gm_geometry
2015-12-09 07:05:48 +01:00
thumbnail_name = " . " . join ( thumbnail_name )
2016-02-09 07:31:37 +01:00
source , target = os . path . join ( self . base_dir , self . name ) , os . path . join ( self . target_dir , thumbnail_name )
2016-02-18 14:27:13 +01:00
options = self . options . copy ( )
options . update ( { " resize " : gm_geometry } )
self . gm ( source , target , options )
2015-12-09 07:05:48 +01:00
return thumbnail_name
2016-02-09 07:31:37 +01:00
def __repr__ ( self ) :
return self . name
2015-12-08 09:29:38 +01:00
2015-12-08 07:28:57 +01:00
def main ( ) :
2015-12-09 06:57:53 +01:00
if os . system ( " which gm > /dev/null " ) != 0 :
2016-02-09 06:35:31 +01:00
sys . stderr . write ( " ERROR: I can ' t locate the ' gm ' binary, I won ' t be able to resize images, please install the ' graphicsmagick ' package. \n " )
sys . exit ( 1 )
2015-12-09 06:57:53 +01:00
2015-12-08 08:06:47 +01:00
error ( os . path . exists ( os . path . join ( os . getcwd ( ) , " settings.yaml " ) ) , " I can ' t find a settings.yaml in the current working directory " )
2015-12-08 07:28:57 +01:00
2015-12-08 07:36:17 +01:00
settings = yaml . safe_load ( open ( " settings.yaml " , " r " ) )
2015-12-08 07:04:07 +01:00
2015-12-08 07:28:57 +01:00
error ( isinstance ( settings , dict ) , " Your settings.yaml should be a dict " )
error ( settings . get ( " title " ) , " You should specify a title in your main settings.yaml " )
2016-02-18 06:39:49 +01:00
2016-02-18 06:48:05 +01:00
if settings . get ( " settings " , { } ) . get ( " gm " ) :
SETTINGS [ " gm " ] . update ( settings [ " settings " ] [ " gm " ] )
2016-02-18 06:39:49 +01:00
2015-12-08 07:34:55 +01:00
front_page_galleries_cover = [ ]
2015-12-08 07:18:41 +01:00
2015-12-08 07:11:55 +01:00
dirs = filter ( lambda x : x not in ( " . " , " .. " ) and os . path . isdir ( x ) and os . path . exists ( os . path . join ( os . getcwd ( ) , x , " settings.yaml " ) ) , os . listdir ( os . getcwd ( ) ) )
2016-02-15 11:59:09 +01:00
error ( dirs , " I can ' t find at least one directory with a settings.yaml in the current working directory (NOT the settings.yaml in your current directory, but one INSIDE A DIRECTORY in your current working directory), you don ' t have any gallery? " )
2015-12-08 07:34:55 +01:00
2015-12-08 09:28:54 +01:00
if not os . path . exists ( " build " ) :
os . makedirs ( " build " )
2016-02-23 05:57:46 +01:00
theme = settings . get ( " settings " , { } ) . get ( " theme " , " exposure " )
2016-02-23 06:00:57 +01:00
error ( os . path . exists ( os . path . join ( os . path . split ( os . path . realpath ( __file__ ) ) [ 0 ] , " themes " , theme ) ) , " ' %s ' is not an existing theme, available themes are ' %s ' " % ( theme , " ' , ' " . join ( os . listdir ( os . path . join ( os . path . split ( os . path . realpath ( __file__ ) ) [ 0 ] , " themes " ) ) ) ) )
2016-02-23 05:57:46 +01:00
templates = Environment ( loader = FileSystemLoader ( [ os . path . realpath ( os . path . join ( os . getcwd ( ) , " templates " ) ) , os . path . join ( os . path . split ( os . path . realpath ( __file__ ) ) [ 0 ] , " themes " , theme , " templates " ) ] ) )
index_template = templates . get_template ( " index.html " )
gallery_index_template = templates . get_template ( " gallery-index.html " )
page_template = templates . get_template ( " page.html " )
2015-12-08 09:28:54 +01:00
# XXX recursively merge directories
2015-12-09 09:03:18 +01:00
if os . path . exists ( os . path . join ( os . getcwd ( ) , " build " , " static " ) ) :
shutil . rmtree ( os . path . join ( os . getcwd ( ) , " build " , " static " ) )
2016-02-23 05:57:46 +01:00
if os . path . exists ( os . path . join ( os . getcwd ( ) , " static " ) ) :
2016-02-19 17:39:17 +01:00
shutil . copytree ( os . path . join ( os . getcwd ( ) , " static " ) , os . path . join ( os . getcwd ( ) , " build " , " static " ) )
else :
2016-02-23 05:57:46 +01:00
shutil . copytree ( os . path . join ( os . path . split ( os . path . realpath ( __file__ ) ) [ 0 ] , " themes " , theme , " static " ) , os . path . join ( os . getcwd ( ) , " build " , " static " ) )
2015-12-08 09:28:54 +01:00
2015-12-08 07:34:55 +01:00
for gallery in dirs :
2015-12-08 08:06:47 +01:00
gallery_settings = yaml . safe_load ( open ( os . path . join ( os . getcwd ( ) , gallery , " settings.yaml " ) , " r " ) )
2015-12-08 07:34:55 +01:00
2015-12-08 08:06:47 +01:00
error ( isinstance ( gallery_settings , dict ) , " Your %s should be a dict " % ( os . path . join ( gallery , " settings.yaml " ) ) )
2015-12-08 07:34:55 +01:00
error ( gallery_settings . get ( " title " ) , " You should specify a title in %s " % ( os . path . join ( gallery , " settings.yaml " ) ) )
2016-02-16 08:41:53 +01:00
2016-02-13 11:21:51 +01:00
if gallery_settings . get ( " public " , True ) :
2016-02-19 11:32:53 +01:00
error ( gallery_settings . get ( " title " ) , " Your gallery describe in %s need to have a title " % ( os . path . join ( gallery , " settings.yaml " ) ) )
2016-02-13 11:21:51 +01:00
error ( gallery_settings . get ( " cover " ) , " You should specify a path to a cover picture in %s " % ( os . path . join ( gallery , " settings.yaml " ) ) )
cover_image_path = os . path . join ( gallery , gallery_settings [ " cover " ] )
2016-02-16 10:11:30 +01:00
error ( os . path . exists ( cover_image_path ) , " File for %s cover image doesn ' t exist at %s " % ( gallery , cover_image_path ) )
2015-12-08 08:22:08 +01:00
2015-12-10 01:45:42 +01:00
front_page_galleries_cover . append ( {
2016-02-16 08:43:46 +01:00
" title " : gallery_settings [ " title " ] ,
2015-12-10 01:45:42 +01:00
" link " : gallery ,
2016-02-16 08:43:46 +01:00
" sub_title " : gallery_settings . get ( " sub_title " , " " ) ,
" date " : gallery_settings . get ( " date " , " " ) ,
" tags " : gallery_settings . get ( " tags " , " " ) ,
2015-12-10 01:45:42 +01:00
" cover " : cover_image_path ,
} )
2015-12-08 07:11:55 +01:00
2015-12-08 09:29:31 +01:00
if not os . path . exists ( os . path . join ( " build " , gallery ) ) :
os . makedirs ( os . path . join ( " build " , gallery ) )
2015-12-08 08:41:02 +01:00
2016-02-09 07:31:37 +01:00
# this should probably be a factory
Image . base_dir = os . path . join ( os . getcwd ( ) , gallery )
Image . target_dir = os . path . join ( os . getcwd ( ) , " build " , gallery )
2016-02-16 08:41:53 +01:00
2016-02-16 08:47:54 +01:00
template_to_render = page_template if gallery_settings . get ( " static " ) else gallery_index_template
open ( os . path . join ( " build " , gallery , " index.html " ) , " w " ) . write ( template_to_render . render ( settings = settings , gallery = gallery_settings , Image = Image ) . encode ( " Utf-8 " ) )
2015-12-08 08:07:24 +01:00
2015-12-10 00:51:21 +01:00
front_page_galleries_cover = reversed ( sorted ( front_page_galleries_cover , key = lambda x : x [ " date " ] ) )
2015-12-08 06:55:01 +01:00
2016-02-16 08:49:03 +01:00
# this should probably be a factory
2016-02-09 07:31:37 +01:00
Image . base_dir = os . getcwd ( )
Image . target_dir = os . path . join ( os . getcwd ( ) , " build " )
open ( os . path . join ( " build " , " index.html " ) , " w " ) . write ( index_template . render ( settings = settings , galleries = front_page_galleries_cover , Image = Image ) . encode ( " Utf-8 " ) )
2015-12-08 10:42:00 +01:00
2015-12-08 06:55:01 +01:00
if __name__ == ' __main__ ' :
main ( )