summary refs log tree commit diff
path: root/www
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--www/photo.causal.agency/.gitignore2
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0832.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0850.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0852.txt4
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0858.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0859.txt6
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0865.txt2
-rw-r--r--www/photo.causal.agency/2024-04-10/IMG_0890.txt9
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1054.txt5
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1058.txt6
-rw-r--r--www/photo.causal.agency/2024-04-14/IMG_1066.txt10
-rw-r--r--www/photo.causal.agency/generate.sh211
-rw-r--r--www/photo.causal.agency/rsync.sh5
13 files changed, 278 insertions, 0 deletions
diff --git a/www/photo.causal.agency/.gitignore b/www/photo.causal.agency/.gitignore
new file mode 100644
index 00000000..a5f66a9d
--- /dev/null
+++ b/www/photo.causal.agency/.gitignore
@@ -0,0 +1,2 @@
+static/
+*.JPG
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0832.txt b/www/photo.causal.agency/2024-04-10/IMG_0832.txt
new file mode 100644
index 00000000..65724024
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0832.txt
@@ -0,0 +1,6 @@
+a red brick wall with some faded black graffiti.
+in the lower third, some bricks are missing
+from the outer layer in an arc shape.
+along the bottom is a ledge of conrete
+lightly covered in brick dust and chunks
+below the missing areas above.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0850.txt b/www/photo.causal.agency/2024-04-10/IMG_0850.txt
new file mode 100644
index 00000000..4cbb3def
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0850.txt
@@ -0,0 +1,6 @@
+grey steel beams of a building in early construction
+on a background of blue sky with some light clouds.
+the beams are intersecting at odd points,
+implying the final building will not be a simple box.
+the sun casts dark shadows into the interiors
+of the I-shaped metal.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0852.txt b/www/photo.causal.agency/2024-04-10/IMG_0852.txt
new file mode 100644
index 00000000..707d7cd6
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0852.txt
@@ -0,0 +1,4 @@
+in the foreground, a metal construction fence.
+behind that, the bright red arm of a sort of small crane.
+the arm is horizontal and crushing a perpendicular piece of fence,
+which has deformed smoothly under it.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0858.txt b/www/photo.causal.agency/2024-04-10/IMG_0858.txt
new file mode 100644
index 00000000..42f243e4
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0858.txt
@@ -0,0 +1,6 @@
+an uneven grid of old wooden-framed windows in an alley.
+the red paint on the frames is peeling badly,
+completely stripped in some spots.
+in the reflections of the lower windows
+we see the roofs of the opposite buildings
+and hints of clouds in the sky.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0859.txt b/www/photo.causal.agency/2024-04-10/IMG_0859.txt
new file mode 100644
index 00000000..ca33d7e0
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0859.txt
@@ -0,0 +1,6 @@
+an old backetball hoop mounted in an alley.
+the backboard has been graffitied
+and vines have invaded.
+a few red strands of net are left hanging from the hoop.
+the fence behind is painted with a design of yellow, purple, white and blue.
+it's the kind of hoop airbud might be hanging around.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0865.txt b/www/photo.causal.agency/2024-04-10/IMG_0865.txt
new file mode 100644
index 00000000..7a955fc2
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0865.txt
@@ -0,0 +1,2 @@
+deep tire tread pressed into mud in the center of an alley.
+a small branch of evergreen lies to one side.
diff --git a/www/photo.causal.agency/2024-04-10/IMG_0890.txt b/www/photo.causal.agency/2024-04-10/IMG_0890.txt
new file mode 100644
index 00000000..9d2cdc43
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-10/IMG_0890.txt
@@ -0,0 +1,9 @@
+a pipe coming out of a light brown brick wall.
+the pipe comes out of a metal square in the centre of the wall,
+travels up and left for a bit,
+before continuing straight up out of frame.
+opposite, in the bottom right,
+is the top of a red metal grate in front
+of a ground-level window.
+the brick below where the pipe enters the wall
+is stained dark.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1054.txt b/www/photo.causal.agency/2024-04-14/IMG_1054.txt
new file mode 100644
index 00000000..f4803ee2
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1054.txt
@@ -0,0 +1,5 @@
+a short wall of natural rock,
+all broken up somewhat neatly
+along horizontal and vertical lines.
+most of the rock is cool grey,
+while some parts are warm brown.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1058.txt b/www/photo.causal.agency/2024-04-14/IMG_1058.txt
new file mode 100644
index 00000000..21aeb189
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1058.txt
@@ -0,0 +1,6 @@
+moss on a bit of exposed natural rock
+surrounded by mostly brown grass.
+there is shorter, darker green and brown moss,
+as well as longer lighter green moss.
+some small pieces of the rock are broken off
+and lay in little piles.
diff --git a/www/photo.causal.agency/2024-04-14/IMG_1066.txt b/www/photo.causal.agency/2024-04-14/IMG_1066.txt
new file mode 100644
index 00000000..81747287
--- /dev/null
+++ b/www/photo.causal.agency/2024-04-14/IMG_1066.txt
@@ -0,0 +1,10 @@
+two green buds on the end of a thin branch
+on a blurry brown backdrop.
+the branch enters the frame
+from the bottom left corner,
+and there are three other pairs of buds
+along it,
+out of focus.
+there is a hint of another bebudded branch
+in the background,
+but there is otherwise very little green.
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/</\&lt;/g
+		s/"/\&quot;/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
diff --git a/www/photo.causal.agency/rsync.sh b/www/photo.causal.agency/rsync.sh
new file mode 100644
index 00000000..957911d2
--- /dev/null
+++ b/www/photo.causal.agency/rsync.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+set -eu
+
+sh generate.sh
+rsync -av static/ scout:/var/www/photo.causal.agency