From d039416dc50fa60545e710ab74b97bb05dea88f6 Mon Sep 17 00:00:00 2001 From: Terranom674 Date: Sat, 5 Sep 2026 23:29:21 +0200 Subject: [PATCH] Correct source orientation before Piwigo derivative generation --- .../lib/piwigo-cache-request-by-shadow.php | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/runtime/lib/piwigo-cache-request-by-shadow.php b/runtime/lib/piwigo-cache-request-by-shadow.php index ca71fbe..d99941c 100644 --- a/runtime/lib/piwigo-cache-request-by-shadow.php +++ b/runtime/lib/piwigo-cache-request-by-shadow.php @@ -23,11 +23,12 @@ $_SERVER['REQUEST_URI'] = '/'; $_SERVER['SCRIPT_NAME'] = '/plugins/bratonien_tools/runtime/lib/piwigo-cache-request-by-shadow.php'; $_SERVER['PHP_SELF'] = $_SERVER['SCRIPT_NAME']; $_SERVER['QUERY_STRING'] = ''; -$_SERVER['HTTP_USER_AGENT'] = 'Bratonien-Piwigo-Shadow-Cache-Bridge/0.9.7.1.17'; +$_SERVER['HTTP_USER_AGENT'] = 'Bratonien-Piwigo-Shadow-Cache-Bridge/0.9.7.1.41'; $_SERVER['HTTPS'] = 'off'; require_once(PHPWG_ROOT_PATH.'include/common.inc.php'); require_once(PHPWG_ROOT_PATH.'include/derivative.inc.php'); +require_once(PHPWG_ROOT_PATH.'admin/include/image.class.php'); if (!defined('BRATONIEN_TOOLS_PATH')) { fwrite(STDERR, "Bratonien Tools ist nicht aktiv.\n"); @@ -72,6 +73,43 @@ function bratonien_tools_shadow_bridge_call_i($request, &$detail=null) return true; } +function bratonien_tools_shadow_bridge_sync_actual_metadata(array &$row, $source_path) +{ + $size = @getimagesize($source_path); + if (!is_array($size) || (int)($size[0] ?? 0) < 1 || (int)($size[1] ?? 0) < 1) + { + bratonien_tools_shadow_bridge_fail('Das temporär eingesetzte Original besitzt keine lesbaren Bildabmessungen.'); + } + + $width = (int)$size[0]; + $height = (int)$size[1]; + $rotation_angle = pwg_image::get_rotation_angle($source_path); + $rotation_angle = $rotation_angle === null ? 0 : (int)$rotation_angle; + $rotation = pwg_image::get_rotation_code_from_angle($rotation_angle); + if ($rotation === null) $rotation = 0; + $rotation = (int)$rotation; + + if ( + (int)($row['width'] ?? 0) === $width + && (int)($row['height'] ?? 0) === $height + && isset($row['rotation']) + && (int)$row['rotation'] === $rotation + ) + { + return false; + } + + pwg_query( + 'UPDATE '.IMAGES_TABLE + .' SET width='.$width.', height='.$height.', rotation='.$rotation + .' WHERE id='.(int)$row['id'].' LIMIT 1' + ); + $row['width'] = $width; + $row['height'] = $height; + $row['rotation'] = $rotation; + return true; +} + function bratonien_tools_shadow_bridge_variants(array $row, $stage) { $src = new SrcImage($row); @@ -151,10 +189,12 @@ if (count($rows) !== 1) bratonien_tools_shadow_bridge_fail('Piwigo kann den Shadow-Pfad nicht eindeutig einem Bild zuordnen: '.$db_path); } $row = $rows[0]; +$metadata_repaired = bratonien_tools_shadow_bridge_sync_actual_metadata($row, $shadow_real); $variants = bratonien_tools_shadow_bridge_variants($row, $stage); $generated = 0; $already = 0; +$invalid_removed = 0; foreach ($variants as $variant) { $reason = ''; @@ -164,6 +204,18 @@ foreach ($variants as $variant) continue; } + // Ein vorhandenes, aber geometrisch falsches Derivat darf nicht an i.php + // vorbeikommen. Piwigo entscheidet sonst allein anhand von mtimes und kann + // eine alte Datei trotz korrigierter Breite/Höhe/EXIF-Rotation behalten. + if (is_file($variant['target'])) + { + if (!@unlink($variant['target'])) + { + bratonien_tools_shadow_bridge_fail($variant['name'].': ungültiges Alt-Derivat konnte nicht entfernt werden ('.$reason.').'); + } + $invalid_removed++; + } + $request = bratonien_tools_shadow_bridge_i_request($variant['target']); if ($request === null) bratonien_tools_shadow_bridge_fail($variant['name'].': ungültiger Piwigo-Derivatpfad.'); @@ -187,8 +239,10 @@ echo json_encode(array( 'shadow_relative'=>$shadow_relative, 'stage'=>$stage, 'piwigo_image_id'=>(int)$row['id'], + 'metadata_repaired'=>$metadata_repaired, 'variants'=>count($variants), 'generated'=>$generated, 'already_valid'=>$already, + 'invalid_removed'=>$invalid_removed, ), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)."\n"; exit(0);