diff options
author | June McEnroe <june@causal.agency> | 2024-04-14 17:47:08 -0400 |
---|---|---|
committer | June McEnroe <june@causal.agency> | 2024-04-14 17:47:08 -0400 |
commit | a4bc37945b812dfaa1a85b9319be6d061d426d12 (patch) | |
tree | ac33f3e9379ffac191c539eefb8f42b73d850ef1 /www/photo.causal.agency/generate.sh | |
parent | Publish "little blessings" (diff) | |
parent | Remove redundant headings from feed (diff) | |
download | src-a4bc37945b812dfaa1a85b9319be6d061d426d12.tar.gz src-a4bc37945b812dfaa1a85b9319be6d061d426d12.zip |
Add 'www/photo.causal.agency/' from commit '3e93e1c8c6c5a41d67ad63c6fd2624df67191d35'
git-subtree-dir: www/photo.causal.agency git-subtree-mainline: 439ed525e5c6b979878b52675054643a5898f85e git-subtree-split: 3e93e1c8c6c5a41d67ad63c6fd2624df67191d35
Diffstat (limited to 'www/photo.causal.agency/generate.sh')
-rw-r--r-- | www/photo.causal.agency/generate.sh | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/www/photo.causal.agency/generate.sh b/www/photo.causal.agency/generate.sh new file mode 100644 index 00000000..4b30db92 --- /dev/null +++ b/www/photo.causal.agency/generate.sh @@ -0,0 +1,211 @@ +#!/bin/sh +set -eu + +mkdir -p static/preview static/thumbnail + +resize() { + local photo=$1 size=$2 output=$3 + if ! test -f $output; then + # FIXME: convert complains about not understanding XML + echo $output >&2 + convert $photo -auto-orient -thumbnail $size $output 2>/dev/null ||: + fi +} + +preview() { + local photo=$1 + local preview=preview/${photo##*/} + resize $photo 25% static/$preview + echo $preview +} + +thumbnail() { + local photo=$1 + local thumbnail=thumbnail/${photo##*/} + resize $photo 5% static/$thumbnail + echo $thumbnail +} + +encode() { + sed ' + s/&/\&/g + s/</\</g + s/"/\"/g + ' "$@" +} + +page_title() { + date -j -f '%F' $1 '+%B %e, %Y' +} + +page_head() { + local date=$1 + local title=$(page_title $date) + cat <<-EOF + <!DOCTYPE html> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="alternate" type="application/atom+xml" href="../feed.atom"> + <title>${title}</title> + <style> + html { color: #bbb; background-color: black; font-family: sans-serif; } + figure { margin: 1em; padding-top: 0.5em; text-align: center; } + img { max-width: calc(100vw - 2.5em); max-height: calc(100vh - 2.5em); } + details { max-width: 78ch; margin: 0.5em auto; } + </style> + <h1>${title}</h1> + EOF +} + +photo_info() { + local photo=$1 + ExposureTime= + FNumber= + FocalLength= + PhotographicSensitivity= + eval $( + identify -format '%[EXIF:*]' $photo 2>/dev/null | + grep -E 'ExposureTime|FNumber|FocalLength|PhotographicSensitivity' | + sed 's/^exif://' + ) +} + +photo_id() { + local photo=$1 + photo=${photo##*/} + photo=${photo%%.*} + echo $photo +} + +page_photo() { + local photo=$1 preview=$2 description=$3 + if ! test -f $description; then + description=/dev/null + fi + photo_info $photo + cat <<-EOF + <figure id="$(photo_id $photo)"> + <a href="${photo##*/}"> + <img src="../${preview}" alt="$(encode $description)"> + </a> + <figcaption> + ${ExposureTime} · + ƒ/$(bc -S 1 -e ${FNumber}) · + $(bc -e ${FocalLength}) mm · + ${PhotographicSensitivity} ISO + <details> + <summary>description</summary> + $(encode $description) + </details> + </figcaption> + </figure> + EOF +} + +index_head() { + cat <<-EOF + <!DOCTYPE html> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="alternate" type="application/atom+xml" href="feed.atom"> + <title>Photos</title> + <style> + html { color: #bbb; background-color: black; font-family: sans-serif; } + a { text-decoration: none; color: inherit; } + </style> + EOF +} + +index_page() { + local date=$1 root=${2:-} + cat <<-EOF + <h1><a href="${root}${root:+/}${date}/">$(page_title $date)</a></h1> + EOF +} + +index_photo() { + local date=$1 photo=$2 thumbnail=$3 root=${4:-} + cat <<-EOF + <a href="${root}${root:+/}${date}/#$(photo_id $photo)"> + <img src="${root}${root:+/}${thumbnail}"> + </a> + EOF +} + +Root=https://photo.causal.agency + +atom_head() { + local updated=$(date -u '+%FT%TZ') + cat <<-EOF + <?xml version="1.0" encoding="utf-8"?> + <feed xmlns="http://www.w3.org/2005/Atom"> + <title>Photos</title> + <author><name>june</name><email>june@causal.agency</email></author> + <link href="${Root}"/> + <link rel="self" href="${Root}/feed.atom"/> + <id>${Root}/</id> + <updated>${updated}</updated> + EOF +} + +atom_entry_head() { + local date=$1 + local updated=$( + date -ju -f '%s' $(stat -f '%m' static/${date}/index.html) '+%FT%TZ' + ) + cat <<-EOF + <entry> + <title>$(page_title $date)</title> + <link href="${Root}/${date}/"/> + <id>${Root}/${date}/</id> + <updated>${updated}</updated> + <content type="html"> + EOF +} + +atom_entry_tail() { + cat <<-EOF + </content> + </entry> + EOF +} + +atom_tail() { + cat <<-EOF + </feed> + EOF +} + +set -- +for date in 20*; do + mkdir -p static/${date} + page=static/${date}/index.html + if ! test -f $page; then + echo $page >&2 + page_head $date >$page + for photo in ${date}/*.JPG; do + preview=$(preview $photo) + if ! test -f static/${photo}; then + ln $photo static/${photo} + fi + page_photo $photo $preview ${photo%.JPG}.txt >>$page + done + fi + set -- $date "$@" +done + +echo static/index.html >&2 +index_head >static/index.html +echo static/feed.atom >&2 +atom_head >static/feed.atom +for date; do + index_page $date >>static/index.html + atom_entry_head $date >>static/feed.atom + for photo in ${date}/*.JPG; do + thumbnail=$(thumbnail $photo) + index_photo $date $photo $thumbnail >>static/index.html + index_photo $date $photo $thumbnail $Root | encode >>static/feed.atom + done + atom_entry_tail >>static/feed.atom +done +atom_tail >>static/feed.atom |