album_photo_files() {
local -r photos_dir="$1"; shift
find "$DIST_DIR/$photos_dir" -maxdepth 1 -type f -printf '%f\n' \
| maybe_shuffle
}
start_preview_page() {
local -r photos_dir="$1"; shift
local -r html_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local -r page_name="$1"; shift
local -r header_bar="$1"; shift
local background_image
background_image=$(randomphoto "$photos_dir" "$page_name")
template header "$page_name.html" \
html_dir "$html_dir" \
backhref "$backhref" \
blurs_dir "$blurs_dir" \
background_image "$background_image" \
show_header_bar "$header_bar"
}
finish_preview_page() {
local -r page_name="$1"; shift
local -r html_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
template footer "$page_name.html" \
html_dir "$html_dir" \
backhref "$backhref" \
tarball_name "$tarball_name"
}
finish_preview_page_with_next() {
local -r page_name="$1"; shift
local -r html_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local -r next_page="$1"; shift
local -r prev_page="$1"; shift
template next "$page_name.html" \
html_dir "$html_dir" \
next "$next_page" \
prev "$prev_page"
finish_preview_page "$page_name" "$html_dir" "$backhref" "$tarball_name"
}
render_previous_page_link() {
local -r page_name="$1"; shift
local -r html_dir="$1"; shift
local -r prev_page="$1"; shift
template prev "$page_name.html" \
html_dir "$html_dir" \
prev "$prev_page"
}
render_preview_thumbnail() {
local -r page_name="$1"; shift
local -r html_dir="$1"; shift
local -r thumbs_dir="$1"; shift
local -r backhref="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo_file="$1"; shift
local animation_class
animation_class=$(random_animation_css_class slow "$photo_file")
template preview "$page_name.html" \
html_dir "$html_dir" \
backhref "$backhref" \
thumbs_dir "$thumbs_dir" \
page_num "$page_num" \
preview_num "$preview_num" \
photo "$photo_file" \
animation_class "$animation_class"
}
render_view_page() {
local -r html_dir="$1"; shift
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo_file="$1"; shift
local animation_class
template header "$page_num-$preview_num.html" \
html_dir "$html_dir" \
backhref "$backhref" \
blurs_dir "$blurs_dir" \
background_image "$photo_file" \
show_header_bar 'no'
animation_class=$(random_animation_css_class fast "$photo_file")
template view "$page_num-$preview_num.html" \
html_dir "$html_dir" \
backhref "$backhref" \
photos_dir "$photos_dir" \
page_num "$page_num" \
preview_num "$preview_num" \
photo "$photo_file" \
animation_class "$animation_class"
template footer "$page_num-$preview_num.html" \
html_dir "$html_dir" \
backhref "$backhref" \
tarball_name "$tarball_name"
}
photo_cache_signature() {
local -r photo="$1"; shift
local -r photo_path="$1"; shift
local stat_output
stat_output=$(stat -c '%s:%Y' "$photo_path")
printf '%s:%s\n' "$photo" "$stat_output"
}
print_cached_photo_identify_output() {
local -r cache_file="$1"; shift
local line
local skipped_signature=no
while IFS= read -r line || [ -n "$line" ]; do
if [ "$skipped_signature" = no ]; then
skipped_signature=yes
continue
fi
printf '%s\n' "$line"
done < "$cache_file"
}
cached_photo_identify_output() {
local -r photo="$1"; shift
local -r photo_path="$1"; shift
local cache_dir
local cache_file
local cached_signature=''
local current_signature
cache_dir="$DIST_DIR/.shuriken-cache/exif"
cache_file="$cache_dir/$photo.txt"
current_signature=$(photo_cache_signature "$photo" "$photo_path")
if [ -f "$cache_file" ]; then
IFS= read -r cached_signature < "$cache_file" || true
if [ "$cached_signature" = "$current_signature" ]; then
print_cached_photo_identify_output "$cache_file"
return
fi
fi
mkdir -p "$cache_dir"
printf '%s\n' "$current_signature" > "$cache_file"
imagemagick_identify -verbose "$photo_path" >> "$cache_file" 2>/dev/null \
|| true
print_cached_photo_identify_output "$cache_file"
}
photo_exif_details_html() {
local -r photo="$1"; shift
local -r photo_path="$1"; shift
local key
local key_html
local line
local value
local value_html
local -i exif_count=0
while IFS= read -r line; do
if [[ "$line" =~ ^[[:space:]]*exif:([^:]+):[[:space:]]*(.*)$ ]]; then
key="exif:${BASH_REMATCH[1]}"
value="${BASH_REMATCH[2]}"
key_html=$(_html_escape "$key")
value_html=$(_html_escape "$value")
if (( exif_count == 0 )); then
printf '
\n'
printf '\n'
fi
printf '| %s | %s |
\n' \
"$key_html" \
"$value_html"
(( ++exif_count ))
fi
done < <(cached_photo_identify_output "$photo" "$photo_path")
if (( exif_count == 0 )); then
printf 'No EXIF details available.
\n'
return
fi
printf '\n'
printf '
\n'
}
_first_exif_value_to() {
local -n output_ref="$1"; shift
local -n exif_ref="$1"; shift
local key
output_ref=''
for key in "$@"; do
if [ -n "${exif_ref[$key]:-}" ]; then
# shellcheck disable=SC2034
output_ref="${exif_ref[$key]}"
return
fi
done
}
photo_exif_tooltip_text() {
local -r photo="$1"; shift
local -r photo_path="$1"; shift
local aperture
local camera
local date_time
local iso
local key
local line
local make
local model
local separator=''
local shutter_speed
local -A exif_values=()
local -a tooltip_parts=()
while IFS= read -r line; do
if [[ "$line" =~ ^[[:space:]]*exif:([^:]+):[[:space:]]*(.*)$ ]]; then
exif_values["${BASH_REMATCH[1]}"]="${BASH_REMATCH[2]}"
fi
done < <(cached_photo_identify_output "$photo" "$photo_path")
make="${exif_values[Make]:-}"
model="${exif_values[Model]:-}"
camera="$make"
if [ -n "$model" ]; then
if [ -n "$make" ]; then
case "$model" in
"$make"|"$make "*)
camera="$model"
;;
*)
camera="$make $model"
;;
esac
else
camera="$model"
fi
fi
_first_exif_value_to aperture exif_values FNumber ApertureValue
_first_exif_value_to iso exif_values \
ISOSpeedRatings PhotographicSensitivity ISO
_first_exif_value_to shutter_speed exif_values \
ExposureTime ShutterSpeedValue
_first_exif_value_to date_time exif_values \
DateTimeOriginal DateTimeDigitized DateTime
if [ -n "$camera" ]; then
tooltip_parts+=("Camera: $camera")
fi
if [ -n "$aperture" ]; then
tooltip_parts+=("Aperture: $aperture")
fi
if [ -n "$iso" ]; then
tooltip_parts+=("ISO: $iso")
fi
if [ -n "$shutter_speed" ]; then
tooltip_parts+=("Shutter speed: $shutter_speed")
fi
if [ -n "$date_time" ]; then
tooltip_parts+=("Taken: $date_time")
fi
for key in "${tooltip_parts[@]}"; do
printf '%s%s' "$separator" "$key"
separator='; '
done
if (( ${#tooltip_parts[@]} > 0 )); then
printf '\n'
fi
}
render_details_page() {
local -r html_dir="$1"; shift
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo_file="$1"; shift
local animation_class
local exif_details_html
local exif_tooltip_text
template header "$page_num-$preview_num-details.html" \
html_dir "$html_dir" \
backhref "$backhref" \
blurs_dir "$blurs_dir" \
background_image "$photo_file" \
show_header_bar 'no'
animation_class=$(random_animation_css_class fast "$photo_file")
exif_details_html=$(
photo_exif_details_html "$photo_file" "$INCOMING_DIR/$photo_file"
)
exif_tooltip_text=$(
photo_exif_tooltip_text "$photo_file" "$INCOMING_DIR/$photo_file"
)
template details "$page_num-$preview_num-details.html" \
html_dir "$html_dir" \
backhref "$backhref" \
photos_dir "$photos_dir" \
page_num "$page_num" \
preview_num "$preview_num" \
photo "$photo_file" \
animation_class "$animation_class" \
exif_details "$exif_details_html" \
exif_tooltip "$exif_tooltip_text"
template footer "$page_num-$preview_num-details.html" \
html_dir "$html_dir" \
backhref "$backhref" \
tarball_name "$tarball_name"
}
create_photo_derivatives() {
local -r photos_dir="$1"; shift
local -r thumbs_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r photo="$1"; shift
local dirname
local height
if [[ -f "$DIST_DIR/$thumbs_dir/$photo" \
&& -f "$DIST_DIR/$blurs_dir/$photo" ]]; then
log_verbose "Skipped existing thumb and blur" \
"$(_display_path "$DIST_DIR/$thumbs_dir/$photo") and" \
"$(_display_path "$DIST_DIR/$blurs_dir/$photo")"
return
fi
dirname="$DIST_DIR/$thumbs_dir"
mkdir -p "$dirname"
log_info "Creating thumb $(_display_path "$DIST_DIR/$thumbs_dir/$photo")"
# Double the height, as CSS scales images based on boxing too.
height=$(( THUMBHEIGHT * 2 ))
imagemagick \
"$DIST_DIR/$photos_dir/$photo" \
-geometry "x$height" \
"$DIST_DIR/$thumbs_dir/$photo"
dirname="$DIST_DIR/$blurs_dir"
mkdir -p "$dirname"
log_info "Creating blur $(_display_path "$DIST_DIR/$blurs_dir/$photo")"
imagemagick \
"$DIST_DIR/$thumbs_dir/$photo" \
-flip \
-blur 0x8 \
"$DIST_DIR/$blurs_dir/$photo"
}
create_all_photo_derivatives() {
local -r photos_dir="$1"; shift
local -r thumbs_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -i failed=0
local -a image_job_pids=()
local photo
while IFS= read -r photo; do
wait_for_image_job_slot image_job_pids failed
create_photo_derivatives "$photos_dir" "$thumbs_dir" "$blurs_dir" \
"$photo" &
image_job_pids+=("$!")
done < <(
find "$DIST_DIR/$photos_dir" -maxdepth 1 -type f -printf '%f\n' \
| sort
)
wait_for_image_jobs image_job_pids failed
if (( failed != 0 )); then
return 1
fi
}
render_album_page_thumbnail() {
local -r page_name="$1"; shift
local -r html_dir="$1"; shift
local -r thumbs_dir="$1"; shift
local -r backhref="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo="$1"; shift
render_preview_thumbnail \
"$page_name" \
"$html_dir" \
"$thumbs_dir" \
"$backhref" \
"$page_num" \
"$preview_num" \
"$photo"
}
render_photo_view_and_details() {
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r html_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo="$1"; shift
render_view_page \
"$html_dir" \
"$photos_dir" \
"$blurs_dir" \
"$backhref" \
"$tarball_name" \
"$page_num" \
"$preview_num" \
"$photo"
render_details_page \
"$html_dir" \
"$photos_dir" \
"$blurs_dir" \
"$backhref" \
"$tarball_name" \
"$page_num" \
"$preview_num" \
"$photo"
}
record_rendered_view_page() {
# shellcheck disable=SC2178
local -n view_pages_ref="$1"; shift
# shellcheck disable=SC2178
local -n last_views_ref="$1"; shift
local -r page="$1"; shift
local -r preview="$1"; shift
if [ -z "${last_views_ref[$page]+set}" ]; then
view_pages_ref+=("$page")
fi
last_views_ref["$page"]="$preview"
}
render_view_redirects() {
local -r html_dir="$1"; shift
# shellcheck disable=SC2178
local -n view_pages_ref="$1"; shift
# shellcheck disable=SC2178
local -n last_views_ref="$1"; shift
local lastview
local max_page
local nextredirect
local page
local prevredirect
if (( ${#view_pages_ref[@]} == 0 )); then
return
fi
max_page=${view_pages_ref[$(( ${#view_pages_ref[@]} - 1 ))]}
for page in "${view_pages_ref[@]}"; do
lastview=${last_views_ref[$page]}
prevredirect="${page}-0"
nextredirect="${page}-$(( lastview + 1 ))"
template redirect "$prevredirect.html" \
html_dir "$html_dir" \
redirect_page "$(( page - 1 ))-${MAXPREVIEWS}"
template redirect "$prevredirect-details.html" \
html_dir "$html_dir" \
redirect_page "$(( page - 1 ))-${MAXPREVIEWS}-details"
if (( page == max_page )); then
template redirect "0-$MAXPREVIEWS.html" \
html_dir "$html_dir" \
redirect_page "${page}-$lastview"
template redirect "0-$MAXPREVIEWS-details.html" \
html_dir "$html_dir" \
redirect_page "${page}-$lastview-details"
template redirect "$nextredirect.html" \
html_dir "$html_dir" \
redirect_page '1-1'
template redirect "$nextredirect-details.html" \
html_dir "$html_dir" \
redirect_page '1-1-details'
else
template redirect "$nextredirect.html" \
html_dir "$html_dir" \
redirect_page "$(( page + 1 ))-1"
template redirect "$nextredirect-details.html" \
html_dir "$html_dir" \
redirect_page "$(( page + 1 ))-1-details"
fi
done
}
render_album_index_redirect() {
local -r html_dir="$1"; shift
template 'redirect' 'index.html' \
html_dir "$html_dir" \
redirect_page 'page-1'
}
render_album_splash_page() {
local -r photos_dir="$1"; shift
local -r html_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local html='index.html'
local photo
if (( $# > 0 )); then
html="$1"
shift
fi
photo=$(random_splash_photo "$photos_dir" "$blurs_dir")
template 'splash' "$html" \
html_dir "$html_dir" \
backhref "$backhref" \
blurs_dir "$blurs_dir" \
background_image "$photo" \
photos_dir "$photos_dir" \
photo "$photo" \
enter_page 'page-1'
}
render_album_index() {
local -r photos_dir="$1"; shift
local -r html_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
if [ "${SPLASH_PAGE:-yes}" = yes ]; then
render_album_splash_page "$photos_dir" "$html_dir" "$blurs_dir" \
"$backhref"
else
render_album_index_redirect "$html_dir"
fi
}
album_page_name() {
local -r page_num="$1"; shift
printf 'page-%s\n' "$page_num"
}
advance_album_preview_page() {
local -r photos_dir="$1"; shift
local -r html_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
# shellcheck disable=SC2178
local -n page_name_ref="$1"; shift
# shellcheck disable=SC2178
local -n prev_page_ref="$1"; shift
# shellcheck disable=SC2178
local -n page_num_ref="$1"; shift
# shellcheck disable=SC2178
local -n preview_num_ref="$1"; shift
local next_page_name
next_page_name=$(album_page_name "$(( page_num_ref + 1 ))")
finish_preview_page_with_next \
"$page_name_ref" \
"$html_dir" \
"$backhref" \
"$tarball_name" \
"$next_page_name" \
"${prev_page_ref:-}"
prev_page_ref="$page_name_ref"
(( ++page_num_ref ))
# shellcheck disable=SC2034
preview_num_ref=1
page_name_ref=$(album_page_name "$page_num_ref")
start_preview_page \
"$photos_dir" \
"$html_dir" \
"$blurs_dir" \
"$backhref" \
"$page_name_ref" \
'no'
render_previous_page_link "$page_name_ref" "$html_dir" "$prev_page_ref"
}
queue_album_view_render_job() {
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r html_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local -r page_num="$1"; shift
local -r preview_num="$1"; shift
local -r photo="$1"; shift
# shellcheck disable=SC2178
local -n render_job_pids_ref="$1"; shift
# shellcheck disable=SC2178
local -n render_failed_ref="$1"; shift
wait_for_template_render_job_slot render_job_pids_ref render_failed_ref
render_photo_view_and_details \
"$photos_dir" \
"$blurs_dir" \
"$html_dir" \
"$backhref" \
"$tarball_name" \
"$page_num" \
"$preview_num" \
"$photo" &
render_job_pids_ref+=("$!")
}
wait_for_album_view_render_jobs() {
# shellcheck disable=SC2178
local -n render_job_pids_ref="$1"; shift
# shellcheck disable=SC2178
local -n render_failed_ref="$1"; shift
wait_for_template_render_jobs render_job_pids_ref render_failed_ref
if (( render_failed_ref != 0 )); then
return 1
fi
}
render_album_pages() {
local -r photos_dir="$1"; shift
local -r html_dir="$1"; shift
local -r thumbs_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -r backhref="$1"; shift
local -r tarball_name="$1"; shift
local name
local photo
# Passed by name to advance_album_preview_page.
# shellcheck disable=SC2034
local prev
local -i i=0
local -i num=1
# Passed by name to queue_album_view_render_job.
# shellcheck disable=SC2034
local -i render_failed=0
# Passed by name to queue_album_view_render_job.
# shellcheck disable=SC2034
local -a render_job_pids=()
# Passed by name to record_rendered_view_page and render_view_redirects.
# shellcheck disable=SC2034
local -A rendered_last_views=()
# Passed by name to record_rendered_view_page and render_view_redirects.
# shellcheck disable=SC2034
local -a rendered_view_pages=()
name=$(album_page_name "$num")
start_preview_page \
"$photos_dir" "$html_dir" "$blurs_dir" "$backhref" "$name" 'yes'
while IFS= read -r photo; do
(( ++i ))
if (( i > MAXPREVIEWS )); then
advance_album_preview_page \
"$photos_dir" \
"$html_dir" \
"$blurs_dir" \
"$backhref" \
"$tarball_name" \
name \
prev \
num \
i
fi
render_album_page_thumbnail \
"$name" \
"$html_dir" \
"$thumbs_dir" \
"$backhref" \
"$num" \
"$i" \
"$photo"
queue_album_view_render_job \
"$photos_dir" \
"$blurs_dir" \
"$html_dir" \
"$backhref" \
"$tarball_name" \
"$num" \
"$i" \
"$photo" \
render_job_pids \
render_failed
record_rendered_view_page rendered_view_pages rendered_last_views \
"$num" "$i"
done < <(album_photo_files "$photos_dir")
finish_preview_page "$name" "$html_dir" "$backhref" "$tarball_name"
if ! wait_for_album_view_render_jobs render_job_pids render_failed; then
return 1
fi
render_view_redirects "$html_dir" rendered_view_pages rendered_last_views
render_album_index "$photos_dir" "$html_dir" "$blurs_dir" "$backhref"
}
splash_photo_files() {
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local photo
while IFS= read -r photo; do
if [ -f "$DIST_DIR/$blurs_dir/$photo" ]; then
printf '%s\n' "$photo"
fi
done < <(
find "$DIST_DIR/$photos_dir" -maxdepth 1 -type f -printf '%f\n' \
| sort
)
}
random_splash_photo() {
local -r photos_dir="$1"; shift
local -r blurs_dir="$1"; shift
local -i index
local photo
local -a photos=()
while IFS= read -r photo; do
photos+=("$photo")
done < <(splash_photo_files "$photos_dir" "$blurs_dir")
if (( ${#photos[@]} == 0 )); then
printf 'ERROR: No splash photos found in %s with matching blurs in %s\n' \
"$(_display_path "$DIST_DIR/$photos_dir")" \
"$(_display_path "$DIST_DIR/$blurs_dir")" >&2
return 1
fi
index=$(random_index "photo:$photos_dir:splash" "${#photos[@]}")
printf '%s\n' "${photos[index]}"
}
randomphoto() {
local -r photos_dir="$1"; shift
local -r context="${1:-$photos_dir}"
local -i index
local photo
local -a photos=()
while IFS= read -r photo; do
photos+=("$photo")
done < <(
find "$DIST_DIR/$photos_dir" -maxdepth 1 -type f -printf '%f\n' \
| sort
)
if (( ${#photos[@]} == 0 )); then
printf 'ERROR: No photos found in %s\n' \
"$(_display_path "$DIST_DIR/$photos_dir")" >&2
return 1
fi
index=$(random_index "photo:$photos_dir:$context" "${#photos[@]}")
printf '%s\n' "${photos[index]}"
}
count_files() {
local -r dir="$1"; shift
local -r name="${1:-}"; shift || true
if [ ! -d "$dir" ]; then
printf '0\n'
return
fi
if [ -n "$name" ]; then
find "$dir" -maxdepth 1 -type f -name "$name" | wc -l
else
find "$dir" -maxdepth 1 -type f | wc -l
fi
}
count_incoming_images() {
incoming_image_files | wc -l
}
tarball_name_plan() {
local base
base=$(basename "$INCOMING_DIR")
printf '%s-%s\n' "$base" "${TARBALL_SUFFIX:-.tar}"
}
generated_tarball_name() {
local base
local timestamp
base=$(basename "$INCOMING_DIR")
timestamp=$(current_timestamp_slug)
printf '%s-%s%s\n' "$base" "$timestamp" "${TARBALL_SUFFIX:-.tar}"
}
count_tree_files() {
local -r dir="$1"; shift
local -r name="$1"; shift
if [ ! -d "$dir" ]; then
printf '0\n'
return
fi
find "$dir" -type f -name "$name" | wc -l
}
write_generation_metadata() {
local -r tarball_file="$1"; shift
local -r generated_at=$(current_timestamp_iso)
local -r config_source="${SHURIKEN_CONFIG_SOURCE:-}"
local -r template_name=$(basename "$TEMPLATE_DIR")
local -r source_image_count=$(count_incoming_images)
local -r generated_photo_count=$(count_files "$DIST_DIR/photos")
local -r generated_thumb_count=$(count_files "$DIST_DIR/thumbs")
local -r generated_html_count=$(count_tree_files "$DIST_DIR" '*.html')
{
printf '{\n'
printf ' "generator": {\n'
printf ' "name": "shuriken",\n'
printf ' "version": %s\n' "$(_json_string "$VERSION")"
printf ' },\n'
printf ' "generated_at": %s,\n' "$(_json_string "$generated_at")"
printf ' "config_source": %s,\n' "$(_json_string "$config_source")"
printf ' "template": {\n'
printf ' "name": %s,\n' "$(_json_string "$template_name")"
printf ' "directory": %s\n' "$(_json_string "$TEMPLATE_DIR")"
printf ' },\n'
printf ' "source": {\n'
printf ' "incoming_dir": %s,\n' "$(_json_string "$INCOMING_DIR")"
printf ' "image_count": %s\n' "$source_image_count"
printf ' },\n'
printf ' "generated": {\n'
printf ' "photo_count": %s,\n' "$generated_photo_count"
printf ' "thumb_count": %s,\n' "$generated_thumb_count"
printf ' "html_count": %s\n' "$generated_html_count"
printf ' },\n'
printf ' "tarball": {\n'
printf ' "included": %s,\n' "$(_json_bool "${TARBALL_INCLUDE:-no}")"
printf ' "file": %s\n' "$(_json_string "$tarball_file")"
printf ' },\n'
printf ' "settings": {\n'
printf ' "title": %s,\n' "$(_json_string "${TITLE:-}")"
printf ' "height": %s,\n' "$(_json_string "${HEIGHT:-}")"
printf ' "thumbheight": %s,\n' "$(_json_string "${THUMBHEIGHT:-}")"
printf ' "maxpreviews": %s,\n' "$(_json_string "${MAXPREVIEWS:-}")"
printf ' "image_jobs": %s,\n' "$(_json_string "${IMAGE_JOBS:-}")"
printf ' "random_seed": %s,\n' "$(_json_string "${RANDOM_SEED:-}")"
printf ' "shuffle": %s,\n' "$(_json_bool "${SHUFFLE:-no}")"
printf ' "splash_page": %s,\n' "$(_json_bool "${SPLASH_PAGE:-yes}")"
printf ' "original_basepath": %s\n' \
"$(_json_string "${ORIGINAL_BASEPATH:-}")"
printf ' }\n'
printf '}\n'
} > "$DIST_DIR/shuriken.json"
}
prepare_generation_photo_assets() {
warn_unsupported_incoming_files
mkdir -p "$DIST_DIR/photos"
cleanphotos
scalephotos
create_all_photo_derivatives 'photos' 'thumbs' 'blurs'
}
copy_site_favicon() {
local asset_dir
local favicon_src
asset_dir=$(resolve_default_asset_dir)
favicon_src="$asset_dir/favicon.ico"
if [ ! -r "$favicon_src" ]; then
config_error "favicon file $favicon_src must be readable"
return 1
fi
log_verbose "Copying favicon to $(_display_path "$DIST_DIR/favicon.ico")"
cp "$favicon_src" "$DIST_DIR/favicon.ico"
}
prepare_generation_site_assets() {
copy_site_favicon
}
clear_rendered_html() {
find "$DIST_DIR" -type f -name '*.html' -delete
}
create_generation_archive() {
local -r tarball_name="$1"; shift
if [ "${TARBALL_INCLUDE:-no}" = yes ]; then
tarball "$tarball_name"
fi
}
generate() {
local tarball_name=''
if [ "${TARBALL_INCLUDE:-no}" = yes ]; then
tarball_name=$(generated_tarball_name)
log_verbose \
"Tarball enabled; planned archive:" \
"$(_display_path "$DIST_DIR/$tarball_name")"
else
log_verbose 'Tarball disabled; no archive will be created'
fi
prepare_generation_photo_assets
prepare_generation_site_assets
clear_rendered_html
render_album_pages 'photos' '.' 'thumbs' 'blurs' '.' "$tarball_name"
create_generation_archive "$tarball_name"
write_generation_metadata "$tarball_name"
}
refresh_splash() {
local tmp_html
local tmp_path
tmp_path=$(mktemp "$DIST_DIR/.index.html.XXXXXX")
tmp_html=$(basename "$tmp_path")
if render_album_splash_page 'photos' '.' 'blurs' '.' "$tmp_html" \
&& prepare_generation_site_assets; then
mv "$DIST_DIR/$tmp_html" "$DIST_DIR/index.html"
log_info "Refreshed splash page $(_display_path "$DIST_DIR/index.html")"
return
fi
rm -f "$DIST_DIR/$tmp_html"
return 1
}
dry_run() {
local -i image_count=0
local -i html_index_count=1
local -i page_count=0
local -i redirect_count=0
local -i details_count=0
image_count=$(count_incoming_images)
if (( image_count > 0 )); then
details_count=$image_count
page_count=$(( (image_count + MAXPREVIEWS - 1) / MAXPREVIEWS ))
redirect_count=$(( page_count * 4 + 2 ))
fi
printf 'Dry run: no files will be written.\n'
printf 'Config source: %s\n' "${SHURIKEN_CONFIG_SOURCE:-}"
printf 'Incoming directory: %s\n' "$INCOMING_DIR"
printf 'Output directory: %s\n' "$DIST_DIR"
printf 'Template directory: %s\n' "$TEMPLATE_DIR"
printf 'Title: %s\n' "$TITLE"
printf 'Height: %s\n' "${HEIGHT:-}"
printf 'Thumb height: %s\n' "$THUMBHEIGHT"
printf 'Max previews per page: %s\n' "$MAXPREVIEWS"
printf 'Image jobs: %s\n' "$IMAGE_JOBS"
printf 'Random seed: %s\n' "${RANDOM_SEED:-}"
printf 'Shuffle: %s\n' "${SHUFFLE:-no}"
printf 'Splash page: %s\n' "${SPLASH_PAGE:-yes}"
printf 'Image count: %s\n' "$image_count"
printf 'Tarball setting: %s\n' "${TARBALL_INCLUDE:-no}"
if [ "${TARBALL_INCLUDE:-no}" = yes ]; then
printf 'Tarball name plan: %s\n' "$(tarball_name_plan)"
else
printf 'Tarball name plan: not planned\n'
fi
printf 'Planned directories:\n'
printf ' %s\n' "$DIST_DIR"
printf ' %s/photos\n' "$DIST_DIR"
printf ' %s/thumbs\n' "$DIST_DIR"
printf ' %s/blurs\n' "$DIST_DIR"
printf 'Planned generated files:\n'
if [ "${SPLASH_PAGE:-yes}" = yes ]; then
printf ' %s/index.html (%s splash page)\n' \
"$DIST_DIR" "$html_index_count"
else
printf ' %s/index.html (%s album index redirect)\n' \
"$DIST_DIR" "$html_index_count"
fi
printf ' %s/favicon.ico\n' "$DIST_DIR"
printf ' %s/shuriken.json\n' "$DIST_DIR"
printf ' %s/photos/* (%s image files)\n' "$DIST_DIR" "$image_count"
printf ' %s/thumbs/* (%s image files)\n' "$DIST_DIR" "$image_count"
printf ' %s/blurs/* (%s image files)\n' "$DIST_DIR" "$image_count"
printf ' %s/page-*.html (%s preview pages)\n' "$DIST_DIR" "$page_count"
printf ' %s/[page]-[image].html (%s view pages)\n' \
"$DIST_DIR" "$image_count"
printf ' %s/[page]-[image]-details.html (%s details pages)\n' \
"$DIST_DIR" "$details_count"
printf ' %s/[redirect].html (%s navigation redirects)\n' \
"$DIST_DIR" "$redirect_count"
if [ "${TARBALL_INCLUDE:-no}" = yes ]; then
printf ' %s/%s\n' "$DIST_DIR" "$(tarball_name_plan)"
fi
}