&1', $output, $exit); if ($exit !== 0) { $detail = 'Piwigo-Aufruf Exit '.$exit; if ($output) $detail .= ': '.implode(' ', array_slice($output, -3)); return false; } return true; } function bratonien_tools_shadow_bridge_variants(array $row, $stage) { $src = new SrcImage($row); $variants = array(); foreach (ImageStdParams::get_defined_type_map() as $type=>$params) { $derivative = new DerivativeImage($params, $src); if ($derivative->same_as_source()) continue; $size = $derivative->get_size(); $max_edge = max((int)($size[0] ?? 0), (int)($size[1] ?? 0)); $priority = $max_edge > 0 && $max_edge <= 1920; if (($stage === 1 && $priority) || ($stage === 2 && !$priority)) { $variants[] = array('name'=>'standard:'.$type, 'derivative'=>$derivative, 'params'=>$params, 'target'=>$derivative->get_path()); } } foreach (ImageStdParams::$custom as $key=>$last_used) { $params = bratonien_tools_webdav_materialize_custom_params($key); if (!$params) continue; $derivative = new DerivativeImage($params, $src); if ($derivative->same_as_source()) continue; $size = $derivative->get_size(); $max_edge = max((int)($size[0] ?? 0), (int)($size[1] ?? 0)); $priority = $max_edge > 0 && $max_edge <= 1920; if (($stage === 1 && $priority) || ($stage === 2 && !$priority)) { $variants[] = array('name'=>'custom:'.$key, 'derivative'=>$derivative, 'params'=>$params, 'target'=>$derivative->get_path()); } } return $variants; } $connection_id = 0; $shadow_relative = ''; $stage = 0; foreach ($argv as $arg) { if (preg_match('/^--connection-id=(\d+)$/', $arg, $m)) $connection_id = (int)$m[1]; elseif (strpos($arg, '--shadow-relative=') === 0) $shadow_relative = ltrim(substr($arg, strlen('--shadow-relative=')), '/'); elseif (preg_match('/^--stage=([12])$/', $arg, $m)) $stage = (int)$m[1]; } if ($connection_id < 1 || $shadow_relative === '' || !in_array($stage, array(1,2), true)) { bratonien_tools_shadow_bridge_fail('Parameter --connection-id, --shadow-relative und --stage=1|2 werden benötigt.', 2); } if (strpos($shadow_relative, '..') !== false || strpos($shadow_relative, "\0") !== false) { bratonien_tools_shadow_bridge_fail('Unsicherer Shadow-Pfad.', 2); } $connection = bratonien_tools_nc_connector_connection($connection_id, false); if (!$connection || empty($connection['enabled'])) bratonien_tools_shadow_bridge_fail('WebDAV-Verbindung wurde nicht gefunden.'); $config = isset($connection['config']) && is_array($connection['config']) ? $connection['config'] : array(); $gallery_root = rtrim((string)($config['parallel_gallery_root'] ?? ''), '/'); if ($gallery_root === '' || !is_dir($gallery_root)) bratonien_tools_shadow_bridge_fail('Shadow-Tree der Verbindung fehlt.'); $shadow_absolute = $gallery_root.'/'.$shadow_relative; if (!is_link($shadow_absolute)) bratonien_tools_shadow_bridge_fail('Shadow-Datei ist kein Symlink: '.$shadow_relative); $shadow_real = realpath($shadow_absolute); if ($shadow_real === false || !is_file($shadow_real)) bratonien_tools_shadow_bridge_fail('Shadow-Ziel ist nicht lesbar: '.$shadow_relative); $root = rtrim(str_replace('\\', '/', PHPWG_ROOT_PATH), '/'); $gallery = rtrim(str_replace('\\', '/', $gallery_root), '/'); if (strpos($gallery.'/', $root.'/') !== 0) bratonien_tools_shadow_bridge_fail('Shadow-Tree liegt außerhalb von Piwigo.'); $relative_gallery = ltrim(substr($gallery, strlen($root)), '/'); $db_path = './'.$relative_gallery.'/'.$shadow_relative; $result = pwg_query("SELECT * FROM ".IMAGES_TABLE." WHERE path='".pwg_db_real_escape_string($db_path)."' LIMIT 2"); $rows = array(); while ($row = pwg_db_fetch_assoc($result)) $rows[] = $row; if (count($rows) !== 1) { bratonien_tools_shadow_bridge_fail('Piwigo kann den Shadow-Pfad nicht eindeutig einem Bild zuordnen: '.$db_path); } $row = $rows[0]; $variants = bratonien_tools_shadow_bridge_variants($row, $stage); $generated = 0; $already = 0; foreach ($variants as $variant) { $reason = ''; if (bratonien_tools_webdav_derivative_cache_valid($variant['target'], $variant['derivative'], $variant['params'], $reason)) { $already++; continue; } $request = bratonien_tools_shadow_bridge_i_request($variant['target']); if ($request === null) bratonien_tools_shadow_bridge_fail($variant['name'].': ungültiger Piwigo-Derivatpfad.'); $detail = ''; if (!bratonien_tools_shadow_bridge_call_i($request, $detail)) { bratonien_tools_shadow_bridge_fail($variant['name'].': '.$detail); } clearstatcache(true, $variant['target']); $reason = ''; if (!bratonien_tools_webdav_derivative_cache_valid($variant['target'], $variant['derivative'], $variant['params'], $reason)) { bratonien_tools_shadow_bridge_fail($variant['name'].': Piwigo hat kein gültiges Derivat erzeugt ('.$reason.').'); } $generated++; } echo json_encode(array( 'ok'=>true, 'connection_id'=>$connection_id, 'shadow_relative'=>$shadow_relative, 'stage'=>$stage, 'piwigo_image_id'=>(int)$row['id'], 'variants'=>count($variants), 'generated'=>$generated, 'already_valid'=>$already, ), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)."\n"; exit(0);