diff options
author | Nils <git@velohero.com> | 2016-11-06 12:40:01 +0100 |
---|---|---|
committer | Nils <git@velohero.com> | 2016-11-06 12:40:01 +0100 |
commit | 83560c97b635622897c5c801d3960579bfdf732f (patch) | |
tree | 92c3934efe6fdde3c23cc86c58f00b8f10012bb4 | |
parent | e98190fb33371ff1a206010a94b94604d6435be5 (diff) |
first commit
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | README.md | 51 | ||||
-rwxr-xr-x | gallery.sh | 256 |
3 files changed, 308 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..496ee2c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.DS_Store
\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..95d2042 --- /dev/null +++ b/README.md @@ -0,0 +1,51 @@ +gallery.sh +========== + +Bash Script to generate static web galleries. No server-side programs (i.e. PHP, MySQL) required. + +Overview +-------- +`gallery.sh` is simple bash shell script which generates static html thumbnail (image, photo) galleries using the `convert` and `jhead` command-line utilities. +It requires no special server-side script to run to view image galleries because everything is pre-rendered. +It offers several features: +* Responsive layout +* Thumbnails which fill the browser efficiently +* Download the original image file +* Nice and simple Bootstrap CSS layout +* Locally previewable galleries by accessing images locally (e.g. file:///home/nils/pics/gallery/index.html) +* JPEG header EXIF data extraction +* Auto-rotation of veritcal images + +This combination of features makes a better user experience than pretty much all the big online photo hosts. +All you need is a place to host your plain html and jpeg files. This can also be Amazon S3. + +Requirements +------------ +* ImageMagick (http://www.imagemagick.org/) for the `convert` utility. +* JHead (https://wiki.ubuntuusers.de/JHead/) for EXIF data extraction + +On a debian-based system (Ubuntu), just run `apt-get install imagemagick jhead` as root. + +Under macOS you can install it with MacPort (https://www.macports.org/): `sudo port install imagemagick jhead` + +Usage +----- + + gallery.sh [-t <title>] [-h] + +`gallery.sh` works in the **current** directory. Just load the index.html in a browser see the output. + +The directory should contain a bunch of JPEG (.jpg or .JPG) files. It does not work recursively. +ZIP files (.zip or .ZIP) and movies (.mov or .MOV) are also considered. They appear as a download button in the gallery. + +Screenshots +----------- + +![Gallery](http://i.imgur.com/TOxgphm.jpg) + +![Image](http://i.imgur.com/iqQzst2.jpg) + +License +------- +GNU Public License version 3. +Please feel free to fork and modify this on GitHub (https://github.com/Cyclenerd/gallery_shell).
\ No newline at end of file diff --git a/gallery.sh b/gallery.sh new file mode 100755 index 0000000..b655339 --- /dev/null +++ b/gallery.sh @@ -0,0 +1,256 @@ +#!/bin/bash + +# gallery.sh +# Author: Nils Knieling - https://github.com/Cyclenerd/gallery_shell +# Inspired by: Shapor Naghibzadeh - https://github.com/shapor/bashgal + +######################################################################################### +#### Configuration Section +######################################################################################### + +height_small=187 +height_large=768 +quality=85 +thumbdir=__thumbs +htmlfile=index.html +title="Gallery" +footer='Created with <a href="https://github.com/Cyclenerd/gallery_shell">gallery.sh</a>' + +# Use convert from ImageMagick +convert="convert" +# Use JHead for EXIF Information +exif="jhead" + +# Bootstrap (currently v3.3.7) +# Latest compiled and minified CSS +stylesheet="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" + +downloadicon='<span class="glyphicon glyphicon-floppy-save" aria-hidden="true"></span>' +movieicon='<span class="glyphicon glyphicon-film" aria-hidden="true"></span>' +homeicon='<span class="glyphicon glyphicon-home" aria-hidden="true"></span>' + +function debug { + return 0 # 0=enable, 1=disable debugging output +} + +######################################################################################### +#### End Configuration Section +######################################################################################### + + +me=$(basename "$0") +datetime=$(date -u "+%Y-%m-%d %H:%M:%S") +datetime+=" UTC" + +function usage { + echo "usage: $me [-t <title>] [-h]" + echo " [-t <title>] sets the title (default: $title)" + echo " [-h] displays help (this message)" +} + +while getopts ":t:h" opt; do + case $opt in + t) + title="$OPTARG" + ;; + h) + usage + exit 0 + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + exit 1 + ;; + esac +done + +debug && echo "- $me : $datetime" + +### Check Commands +command -v $convert >/dev/null 2>&1 || { echo >&2 "!!! $convert it's not installed. Aborting."; exit 1; } +command -v $exif >/dev/null 2>&1 || { echo >&2 "!!! $exif it's not installed. Aborting."; exit 1; } + +### Create Folders +[[ -d $thumbdir ]] || mkdir $thumbdir || exit 2 + +heights[0]=$height_small +heights[1]=$height_large +for res in ${heights[*]}; do + [[ -d $thumbdir/$res ]] || mkdir -p $thumbdir/$res || exit 3 +done + +#### Create Startpage +debug && echo "+" $htmlfile +cat > "$htmlfile" << EOF +<!DOCTYPE HTML> +<html lang="en"> +<head> + <meta charset="utf-8"> + <title>$title</title> + <meta name="viewport" content="width=device-width"> + <meta name="robots" content="noindex, nofollow"> + <link rel="stylesheet" href="$stylesheet"> +</head> +<body> +<div class="container"> + <div class="row"> + <div class="col-xs-12"> + <div class="page-header"><h1>$title</h1></div> + </div> + </div> +EOF + +### Photos (JPG) +if [[ $(ls -l | grep -i jpg | wc -l) -gt 0 ]]; then + +echo '<div class="row">' >> "$htmlfile" +## Generate Images +numfiles=0 +for filename in *.[jJ][pP][gG]; do + debug && echo -n "+ $filename: " + filelist[$numfiles]=$filename + let numfiles++ + for res in ${heights[*]}; do + debug && echo -n "$thumbdir/$res " + if [[ ! -s $thumbdir/$res/$filename ]]; then + $convert -auto-orient -strip -quality $quality -resize x$res "$filename" "$thumbdir/$res/$filename" + fi + done + debug && echo + cat >> "$htmlfile" << EOF +<div class="col-md-3 col-sm-12"> + <p> + <a href="$thumbdir/$filename.html"><img src="$thumbdir/$height_small/$filename" alt="" class="img-responsive"></a> + <div class="hidden-md hidden-lg"><hr></div> + </p> +</div> +EOF +[[ $(( $numfiles % 4 )) -eq 0 ]] && echo '<div class="clearfix visible-md visible-lg"></div>' >> "$htmlfile" +done +echo '</div>' >> "$htmlfile" + +## Generate the HTML Files for Images in thumbdir +file=0 +while [[ $file -lt $numfiles ]]; do + filename=${filelist[$file]} + prev= next= + [[ $file -ne 0 ]] && prev=${filelist[$((file - 1))]} + [[ $file -ne $((numfiles - 1)) ]] && next=${filelist[$((file + 1))]} + imagehtmlfile=$thumbdir/$filename.html + exifinfo=$($exif "$filename") + filesize=$(ls -lah "$filename" | awk '{ print $5}') + cat > "$imagehtmlfile" << EOF +<!DOCTYPE HTML> +<html lang="en"> +<head> +<meta charset="utf-8"> +<title>$filename</title> +<meta name="viewport" content="width=device-width"> +<meta name="robots" content="noindex, nofollow"> +<link rel="stylesheet" href="$stylesheet"> +</head> +<body> +<div class="container"> +<div class="row"> + <div class="col-xs-12"> + <div class="page-header"><h2><a href="../$htmlfile">$homeicon</a> <span class="text-muted">/</span> $filename</h2></div> + </div> +</div> +EOF + + # Pager + echo '<div class="row"><div class="col-xs-12"><nav><ul class="pager">' >> "$imagehtmlfile" + [[ $prev ]] && echo '<li class="previous"><a href="'$prev'.html"><span aria-hidden="true">←</span></a></li>' >> "$imagehtmlfile" + [[ $next ]] && echo '<li class="next"><a href="'$next'.html"><span aria-hidden="true">→</span></a></li>' >> "$imagehtmlfile" + echo '</ul></nav></div></div>' >> "$imagehtmlfile" + + cat >> "$imagehtmlfile" << EOF +<div class="row"> + <div class="col-xs-12"> + <p><img src="$height_large/$filename" class="img-responsive" alt=""></p> + </div> +</div> +<div class="row"> + <div class="col-xs-12"> + <p><a class="btn btn-info btn-lg" href="../$filename">$downloadicon Download Original Image File ($filesize)</a></p> + </div> +</div> +EOF + + # EXIF + if [[ $exifinfo ]]; then + cat >> "$imagehtmlfile" << EOF +<div class="row"> +<div class="col-xs-12"> +<pre> +$exifinfo +</pre> +</div> +</div> +EOF + fi + + # Footer + cat >> "$imagehtmlfile" << EOF +</div> +</body> +</html> +EOF + let file++ +done + +fi + +### Movies (MOV) +if [[ $(ls -l | grep -i mov | wc -l) -gt 0 ]]; then + cat >> "$htmlfile" << EOF + <div class="row"> + <div class="col-xs-12"> + <div class="page-header"><h2>Movies</h2></div> + </div> + </div> + <div class="row"> + <div class="col-xs-12"> +EOF + for filename in *.[mM][oO][vV]; do + filesize=$(ls -lah $filename | awk '{ print $5}') + cat >> "$htmlfile" << EOF +<a href="$filename" class="btn btn-primary" role="button">$movieicon $filename ($filesize)</a> +EOF + done + echo '</div></div>' >> "$htmlfile" +fi + +### Downloads (ZIP) +if [[ $(ls -l | grep -i zip | wc -l) -gt 0 ]]; then + cat >> "$htmlfile" << EOF + <div class="row"> + <div class="col-xs-12"> + <div class="page-header"><h2>Downloads</h2></div> + </div> + </div> + <div class="row"> + <div class="col-xs-12"> +EOF + for filename in *.[zZ][iI][pP]; do + filesize=$(ls -lah $filename | awk '{ print $5}') + cat >> "$htmlfile" << EOF +<a href="$filename" class="btn btn-primary" role="button">$downloadicon $filename ($filesize)</a> +EOF + done + echo '</div></div>' >> "$htmlfile" +fi + +### Footer +cat >> "$htmlfile" << EOF +<hr> +<footer> + <p>$footer</p> + <p class="text-muted">$datetime</p> +</footer> +</div> <!-- // container --> +</body> +</html> +EOF + +debug && echo "= done :-)"
\ No newline at end of file |