From 6f975533f075cc761184b5a7392522264eca6fc1 Mon Sep 17 00:00:00 2001 From: Ken D'Ambrosio Date: Thu, 18 Jun 2026 23:00:17 +0000 Subject: Add per-photo rotate-left/right widget to admin edit page Many older photos (especially pre-EXIF-orientation cameras) are off by a multiple of 90 degrees with no metadata to auto-correct. Each image row in the admin file table now has rotate buttons that physically rotate the file (auto-orienting first to normalize any existing EXIF tag), swap the stored width/height, and clear the cached thumbnail so it regenerates from the corrected image. Co-Authored-By: Claude Sonnet 4.6 --- app.rb | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'app.rb') diff --git a/app.rb b/app.rb index c5f533b..a977455 100644 --- a/app.rb +++ b/app.rb @@ -702,6 +702,43 @@ def save_edits(rel, dir) atomic_write(File.join(dir, 'album.json'), JSON.pretty_generate(data)) end +post '/admin/rotate/' do + require_admin! + rotate_file('', MEDIA_ROOT) +end + +post '/admin/rotate/*' do + require_admin! + rel = params[:splat].first.chomp('/') + rotate_file(rel, resolve_dir(rel)) +end + +def rotate_file(rel, dir) + name = File.basename(params[:file].to_s) + full = File.join(dir, name) + halt 404 unless File.file?(full) + halt 400 unless IMAGE_EXTS.include?(File.extname(name).downcase.delete_prefix('.')) + + degrees = params[:dir] == 'left' ? -90 : 90 + img = MiniMagick::Image.open(full) + img.combine_options do |c| + c.auto_orient + c.rotate degrees + end + img.write(full) + + data = load_album(dir) + data['files'] ||= {} + meta = (data['files'][name] ||= {}) + meta['width'], meta['height'] = meta['height'], meta['width'] if meta['width'] && meta['height'] + atomic_write(File.join(dir, 'album.json'), JSON.pretty_generate(data)) + + thumb = thumb_cache_path(rel.empty? ? name : "#{rel}/#{name}") + File.unlink(thumb) if File.exist?(thumb) + + redirect "/admin/edit/#{rel}" +end + # ── Background update ───────────────────────────────────────────────────────── post '/admin/update' do -- cgit v1.2.3