diff options
| author | Paul Buetow <paul@buetow.org> | 2026-06-05 22:44:11 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-06-05 22:44:11 +0300 |
| commit | 071bac8bd9c2f78aae1d185545cc141428d98a70 (patch) | |
| tree | 8da7be668e88f8c21ee1914ae65584b08bb0a57e | |
| parent | 5ab5307714784b766b8e66821dbf498eaadf097c (diff) | |
Accumulate view redirect manifest during render
| -rwxr-xr-x | bin/photoalbum | 66 | ||||
| -rwxr-xr-x | src/photoalbum.sh | 66 | ||||
| -rwxr-xr-x | tests/cli.sh | 25 |
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" |
