summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-06-05 22:44:11 +0300
committerPaul Buetow <paul@buetow.org>2026-06-05 22:44:11 +0300
commit071bac8bd9c2f78aae1d185545cc141428d98a70 (patch)
tree8da7be668e88f8c21ee1914ae65584b08bb0a57e
parent5ab5307714784b766b8e66821dbf498eaadf097c (diff)
Accumulate view redirect manifest during render
-rwxr-xr-xbin/photoalbum66
-rwxr-xr-xsrc/photoalbum.sh66
-rwxr-xr-xtests/cli.sh25
3 files changed, 87 insertions, 70 deletions
diff --git a/bin/photoalbum b/bin/photoalbum
index 77c24ee..f43fe41 100755
--- a/bin/photoalbum
+++ b/bin/photoalbum
@@ -1152,20 +1152,6 @@ maybe_shuffle() {
fi
}
-last_view_number() {
- local -r page="$1"; shift
- local -r html_dir="$1"; shift
-
- find "$DIST_DIR/$html_dir" \
- -maxdepth 1 \
- -regextype posix-egrep \
- -regex ".*/${page}-[0-9]+\\.html" \
- -printf '%f\n' \
- | sed -n "s/^${page}-\\([0-9][0-9]*\\)\\.html$/\\1/p" \
- | sort -n \
- | tail -n 1
-}
-
album_photo_files() {
local -r photos_dir="$1"; shift
@@ -1466,36 +1452,40 @@ render_photo_view_and_details() {
"$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
- local -i max_page=0
- local -a prefixes=()
+ # 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
- local prefix
-
- mapfile -t prefixes < <(
- find "$DIST_DIR/$html_dir" \
- -maxdepth 1 \
- -regextype posix-egrep \
- -regex '.*/[0-9]+-[0-9]+\.html' \
- -printf '%f\n' \
- | cut -d'-' -f1 \
- | sort -n -u
- )
- if (( ${#prefixes[@]} == 0 )); then
+ if (( ${#view_pages_ref[@]} == 0 )); then
return
fi
- max_page=${prefixes[$(( ${#prefixes[@]} - 1 ))]}
-
- for prefix in "${prefixes[@]}"; do
- page="$prefix"
- lastview=$(last_view_number "$page" "$html_dir")
+ 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 ))"
@@ -1671,6 +1661,12 @@ render_album_pages() {
# 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")
@@ -1712,13 +1708,15 @@ render_album_pages() {
"$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"
+ render_view_redirects "$html_dir" rendered_view_pages rendered_last_views
render_album_index "$photos_dir" "$html_dir" "$blurs_dir" "$backhref"
}
diff --git a/src/photoalbum.sh b/src/photoalbum.sh
index 865fc45..a54616f 100755
--- a/src/photoalbum.sh
+++ b/src/photoalbum.sh
@@ -1152,20 +1152,6 @@ maybe_shuffle() {
fi
}
-last_view_number() {
- local -r page="$1"; shift
- local -r html_dir="$1"; shift
-
- find "$DIST_DIR/$html_dir" \
- -maxdepth 1 \
- -regextype posix-egrep \
- -regex ".*/${page}-[0-9]+\\.html" \
- -printf '%f\n' \
- | sed -n "s/^${page}-\\([0-9][0-9]*\\)\\.html$/\\1/p" \
- | sort -n \
- | tail -n 1
-}
-
album_photo_files() {
local -r photos_dir="$1"; shift
@@ -1466,36 +1452,40 @@ render_photo_view_and_details() {
"$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
- local -i max_page=0
- local -a prefixes=()
+ # 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
- local prefix
-
- mapfile -t prefixes < <(
- find "$DIST_DIR/$html_dir" \
- -maxdepth 1 \
- -regextype posix-egrep \
- -regex '.*/[0-9]+-[0-9]+\.html' \
- -printf '%f\n' \
- | cut -d'-' -f1 \
- | sort -n -u
- )
- if (( ${#prefixes[@]} == 0 )); then
+ if (( ${#view_pages_ref[@]} == 0 )); then
return
fi
- max_page=${prefixes[$(( ${#prefixes[@]} - 1 ))]}
-
- for prefix in "${prefixes[@]}"; do
- page="$prefix"
- lastview=$(last_view_number "$page" "$html_dir")
+ 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 ))"
@@ -1671,6 +1661,12 @@ render_album_pages() {
# 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")
@@ -1712,13 +1708,15 @@ render_album_pages() {
"$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"
+ render_view_redirects "$html_dir" rendered_view_pages rendered_last_views
render_album_index "$photos_dir" "$html_dir" "$blurs_dir" "$backhref"
}
diff --git a/tests/cli.sh b/tests/cli.sh
index dee41e9..66c3075 100755
--- a/tests/cli.sh
+++ b/tests/cli.sh
@@ -1979,6 +1979,12 @@ test_render_view_redirects_uses_numeric_last_view() {
local dist_dir
local html_dir
local redirect_html
+ # 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=()
local view
test::setup
@@ -1996,11 +2002,14 @@ test_render_view_redirects_uses_numeric_last_view() {
for view in 1 2 3 4 5 6 7 8 9 10; do
: > "$dist_dir/1-$view.html"
+ record_rendered_view_page rendered_view_pages rendered_last_views \
+ 1 "$view"
done
: > "$dist_dir/2-1.html"
+ record_rendered_view_page rendered_view_pages rendered_last_views 2 1
touch -t 202606050000 "$dist_dir"/1-*.html "$dist_dir/2-1.html"
- render_view_redirects "$html_dir"
+ render_view_redirects "$html_dir" rendered_view_pages rendered_last_views
test::assert_file_exists "$dist_dir/1-11.html"
redirect_html=$(<"$dist_dir/1-11.html")
@@ -2014,6 +2023,12 @@ test_render_view_redirects_wraps_when_last_page_full() {
local html_dir
local next_redirect_html
local prev_redirect_html
+ # 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=()
local view
test::setup
@@ -2033,9 +2048,15 @@ test_render_view_redirects_wraps_when_last_page_full() {
: > "$dist_dir/1-$view.html"
: > "$dist_dir/2-$view.html"
: > "$dist_dir/3-$view.html"
+ record_rendered_view_page rendered_view_pages rendered_last_views \
+ 1 "$view"
+ record_rendered_view_page rendered_view_pages rendered_last_views \
+ 2 "$view"
+ record_rendered_view_page rendered_view_pages rendered_last_views \
+ 3 "$view"
done
- render_view_redirects "$html_dir"
+ render_view_redirects "$html_dir" rendered_view_pages rendered_last_views
test::assert_file_exists "$dist_dir/0-2.html"
test::assert_file_exists "$dist_dir/3-3.html"