From 11bd9ac8407c1a7eb9c67a10498238c4e6a7d393 Mon Sep 17 00:00:00 2001 From: Eskimue Date: Sun, 5 Apr 2026 15:11:37 +0200 Subject: [PATCH] satellitenhimmel gefixt --- .codex-temp/php-server-error.log | 143 +++++++++++++++++++++++++++++++ public/satellitenhimmel.php | 97 +++++++++++++++------ 2 files changed, 213 insertions(+), 27 deletions(-) diff --git a/.codex-temp/php-server-error.log b/.codex-temp/php-server-error.log index 1b0c7d3..6699d74 100644 --- a/.codex-temp/php-server-error.log +++ b/.codex-temp/php-server-error.log @@ -477,3 +477,146 @@ [Sun Apr 5 14:40:50 2026] 127.0.0.1:54921 [200]: POST /sternbedeckungen.php [Sun Apr 5 14:40:50 2026] 127.0.0.1:54921 Closing [Sun Apr 5 14:40:50 2026] 127.0.0.1:61192 Accepted +[Sun Apr 5 14:42:23 2026] 127.0.0.1:61192 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 14:42:23 2026] 127.0.0.1:61192 Closing +[Sun Apr 5 14:42:23 2026] 127.0.0.1:57095 Accepted +[Sun Apr 5 14:42:26 2026] 127.0.0.1:57095 [200]: POST /sternbedeckungen.php +[Sun Apr 5 14:42:26 2026] 127.0.0.1:57095 Closing +[Sun Apr 5 14:42:26 2026] 127.0.0.1:63938 Accepted +[Sun Apr 5 14:42:38 2026] 127.0.0.1:63938 [200]: GET /my_favorites.php +[Sun Apr 5 14:42:38 2026] 127.0.0.1:63938 Closing +[Sun Apr 5 14:42:38 2026] 127.0.0.1:63331 Accepted +[Sun Apr 5 14:42:38 2026] 127.0.0.1:63331 [200]: GET /css/style.css +[Sun Apr 5 14:42:38 2026] 127.0.0.1:63331 Closing +[Sun Apr 5 14:42:39 2026] 127.0.0.1:60816 Accepted +[Sun Apr 5 14:42:39 2026] 127.0.0.1:60816 [200]: GET /images/star16x16.png +[Sun Apr 5 14:42:39 2026] 127.0.0.1:60816 Closing +[Sun Apr 5 14:42:39 2026] 127.0.0.1:55102 Accepted +[Sun Apr 5 14:42:39 2026] 127.0.0.1:56422 Accepted +[Sun Apr 5 14:42:39 2026] 127.0.0.1:55102 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:42:39 2026] 127.0.0.1:55102 Closing +[Sun Apr 5 14:42:40 2026] 127.0.0.1:56422 [200]: GET /favicon.ico +[Sun Apr 5 14:42:40 2026] 127.0.0.1:56422 Closing +[Sun Apr 5 14:46:54 2026] 127.0.0.1:49905 Accepted +[Sun Apr 5 14:46:54 2026] 127.0.0.1:49905 [200]: GET /my_favorites.php +[Sun Apr 5 14:46:54 2026] 127.0.0.1:49905 Closing +[Sun Apr 5 14:46:54 2026] 127.0.0.1:53000 Accepted +[Sun Apr 5 14:46:54 2026] 127.0.0.1:53000 [200]: GET /css/style.css +[Sun Apr 5 14:46:54 2026] 127.0.0.1:53000 Closing +[Sun Apr 5 14:46:54 2026] 127.0.0.1:64715 Accepted +[Sun Apr 5 14:46:54 2026] 127.0.0.1:51812 Accepted +[Sun Apr 5 14:46:54 2026] 127.0.0.1:64715 [200]: GET /images/star16x16.png +[Sun Apr 5 14:46:54 2026] 127.0.0.1:51812 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:46:54 2026] 127.0.0.1:64715 Closing +[Sun Apr 5 14:46:54 2026] 127.0.0.1:51812 Closing +[Sun Apr 5 14:46:54 2026] 127.0.0.1:51021 Accepted +[Sun Apr 5 14:46:56 2026] 127.0.0.1:51021 [200]: GET /favicon.ico +[Sun Apr 5 14:46:56 2026] 127.0.0.1:51021 Closing +[Sun Apr 5 14:46:56 2026] 127.0.0.1:65334 Accepted +[Sun Apr 5 14:49:28 2026] 127.0.0.1:65334 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 14:49:28 2026] 127.0.0.1:65334 Closing +[Sun Apr 5 14:55:24 2026] 127.0.0.1:63672 Accepted +[Sun Apr 5 14:55:25 2026] 127.0.0.1:63672 [200]: GET /my_favorites.php +[Sun Apr 5 14:55:25 2026] 127.0.0.1:63672 Closing +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53252 Accepted +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53252 [200]: GET /css/style.css +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53252 Closing +[Sun Apr 5 14:55:25 2026] 127.0.0.1:54091 Accepted +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53828 Accepted +[Sun Apr 5 14:55:25 2026] 127.0.0.1:54091 [200]: GET /images/star16x16.png +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53828 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:55:25 2026] 127.0.0.1:54091 Closing +[Sun Apr 5 14:55:25 2026] 127.0.0.1:53828 Closing +[Sun Apr 5 14:55:25 2026] 127.0.0.1:49905 Accepted +[Sun Apr 5 14:55:27 2026] 127.0.0.1:49905 [200]: GET /favicon.ico +[Sun Apr 5 14:55:27 2026] 127.0.0.1:49905 Closing +[Sun Apr 5 14:55:27 2026] 127.0.0.1:50160 Accepted +[Sun Apr 5 14:55:46 2026] 127.0.0.1:50160 [200]: POST /my_favorites.php +[Sun Apr 5 14:55:46 2026] 127.0.0.1:50160 Closing +[Sun Apr 5 14:55:46 2026] 127.0.0.1:59416 Accepted +[Sun Apr 5 14:55:46 2026] 127.0.0.1:59416 [200]: GET /css/style.css +[Sun Apr 5 14:55:46 2026] 127.0.0.1:59416 Closing +[Sun Apr 5 14:55:46 2026] 127.0.0.1:60379 Accepted +[Sun Apr 5 14:55:46 2026] 127.0.0.1:60379 [200]: GET /images/star16x16.png +[Sun Apr 5 14:55:46 2026] 127.0.0.1:60379 Closing +[Sun Apr 5 14:55:46 2026] 127.0.0.1:50779 Accepted +[Sun Apr 5 14:55:46 2026] 127.0.0.1:56329 Accepted +[Sun Apr 5 14:55:46 2026] 127.0.0.1:50779 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:55:46 2026] 127.0.0.1:50779 Closing +[Sun Apr 5 14:55:48 2026] 127.0.0.1:56329 [200]: GET /favicon.ico +[Sun Apr 5 14:55:48 2026] 127.0.0.1:56329 Closing +[Sun Apr 5 14:56:26 2026] 127.0.0.1:62168 Accepted +[Sun Apr 5 14:56:26 2026] 127.0.0.1:62168 [200]: POST /my_favorites.php +[Sun Apr 5 14:56:26 2026] 127.0.0.1:62168 Closing +[Sun Apr 5 14:56:26 2026] 127.0.0.1:64930 Accepted +[Sun Apr 5 14:56:26 2026] 127.0.0.1:64930 [200]: GET /css/style.css +[Sun Apr 5 14:56:26 2026] 127.0.0.1:64930 Closing +[Sun Apr 5 14:56:26 2026] 127.0.0.1:52648 Accepted +[Sun Apr 5 14:56:26 2026] 127.0.0.1:50928 Accepted +[Sun Apr 5 14:56:26 2026] 127.0.0.1:52648 [200]: GET /images/star16x16.png +[Sun Apr 5 14:56:26 2026] 127.0.0.1:50928 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:56:26 2026] 127.0.0.1:52648 Closing +[Sun Apr 5 14:56:26 2026] 127.0.0.1:50928 Closing +[Sun Apr 5 14:56:26 2026] 127.0.0.1:63184 Accepted +[Sun Apr 5 14:56:28 2026] 127.0.0.1:63184 [200]: GET /favicon.ico +[Sun Apr 5 14:56:28 2026] 127.0.0.1:63184 Closing +[Sun Apr 5 14:56:28 2026] 127.0.0.1:58923 Accepted +[Sun Apr 5 14:56:45 2026] 127.0.0.1:58923 [200]: POST /my_favorites.php +[Sun Apr 5 14:56:45 2026] 127.0.0.1:58923 Closing +[Sun Apr 5 14:56:46 2026] 127.0.0.1:54324 Accepted +[Sun Apr 5 14:56:46 2026] 127.0.0.1:54324 [200]: GET /css/style.css +[Sun Apr 5 14:56:46 2026] 127.0.0.1:54324 Closing +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52727 Accepted +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52727 [200]: GET /images/star16x16.png +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52727 Closing +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52008 Accepted +[Sun Apr 5 14:56:46 2026] 127.0.0.1:53146 Accepted +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52008 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:56:46 2026] 127.0.0.1:52008 Closing +[Sun Apr 5 14:56:47 2026] 127.0.0.1:53146 [200]: GET /favicon.ico +[Sun Apr 5 14:56:47 2026] 127.0.0.1:53146 Closing +[Sun Apr 5 14:58:28 2026] 127.0.0.1:54578 Accepted +[Sun Apr 5 14:58:28 2026] 127.0.0.1:54578 [200]: GET /my_favorites.php +[Sun Apr 5 14:58:28 2026] 127.0.0.1:54578 Closing +[Sun Apr 5 14:58:28 2026] 127.0.0.1:52348 Accepted +[Sun Apr 5 14:58:28 2026] 127.0.0.1:52348 [200]: GET /css/style.css +[Sun Apr 5 14:58:28 2026] 127.0.0.1:52348 Closing +[Sun Apr 5 14:58:28 2026] 127.0.0.1:53537 Accepted +[Sun Apr 5 14:58:28 2026] 127.0.0.1:53537 [200]: GET /images/star16x16.png +[Sun Apr 5 14:58:28 2026] 127.0.0.1:53537 Closing +[Sun Apr 5 14:58:28 2026] 127.0.0.1:59817 Accepted +[Sun Apr 5 14:58:28 2026] 127.0.0.1:49662 Accepted +[Sun Apr 5 14:58:28 2026] 127.0.0.1:59817 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 14:58:28 2026] 127.0.0.1:59817 Closing +[Sun Apr 5 14:58:30 2026] 127.0.0.1:49662 [200]: GET /favicon.ico +[Sun Apr 5 14:58:30 2026] 127.0.0.1:49662 Closing +[Sun Apr 5 15:02:05 2026] 127.0.0.1:51374 Accepted +[Sun Apr 5 15:02:06 2026] 127.0.0.1:51374 [200]: GET /my_favorites.php +[Sun Apr 5 15:02:06 2026] 127.0.0.1:51374 Closing +[Sun Apr 5 15:02:06 2026] 127.0.0.1:63617 Accepted +[Sun Apr 5 15:02:06 2026] 127.0.0.1:63617 [200]: GET /css/style.css +[Sun Apr 5 15:02:06 2026] 127.0.0.1:63617 Closing +[Sun Apr 5 15:02:06 2026] 127.0.0.1:51057 Accepted +[Sun Apr 5 15:02:06 2026] 127.0.0.1:52314 Accepted +[Sun Apr 5 15:02:06 2026] 127.0.0.1:51057 [200]: GET /images/star16x16.png +[Sun Apr 5 15:02:06 2026] 127.0.0.1:52314 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 15:02:06 2026] 127.0.0.1:51057 Closing +[Sun Apr 5 15:02:06 2026] 127.0.0.1:52314 Closing +[Sun Apr 5 15:02:06 2026] 127.0.0.1:58087 Accepted +[Sun Apr 5 15:02:08 2026] 127.0.0.1:58087 [200]: GET /favicon.ico +[Sun Apr 5 15:02:08 2026] 127.0.0.1:58087 Closing +[Sun Apr 5 15:02:08 2026] 127.0.0.1:63986 Accepted +[Sun Apr 5 15:02:48 2026] 127.0.0.1:63986 [200]: GET /satellitenhimmel.php +[Sun Apr 5 15:02:48 2026] 127.0.0.1:63986 Closing +[Sun Apr 5 15:02:49 2026] 127.0.0.1:56431 Accepted +[Sun Apr 5 15:02:49 2026] 127.0.0.1:56431 [200]: GET /css/style.css +[Sun Apr 5 15:02:49 2026] 127.0.0.1:56431 Closing +[Sun Apr 5 15:02:49 2026] 127.0.0.1:65407 Accepted +[Sun Apr 5 15:02:49 2026] 127.0.0.1:65407 [200]: GET /images/star16x16.png +[Sun Apr 5 15:02:49 2026] 127.0.0.1:65407 Closing +[Sun Apr 5 15:02:49 2026] 127.0.0.1:60622 Accepted +[Sun Apr 5 15:02:49 2026] 127.0.0.1:62270 Accepted +[Sun Apr 5 15:02:49 2026] 127.0.0.1:60622 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 15:02:49 2026] 127.0.0.1:60622 Closing +[Sun Apr 5 15:02:50 2026] 127.0.0.1:62270 [200]: GET /favicon.ico +[Sun Apr 5 15:02:50 2026] 127.0.0.1:62270 Closing diff --git a/public/satellitenhimmel.php b/public/satellitenhimmel.php index 57fca54..41719aa 100644 --- a/public/satellitenhimmel.php +++ b/public/satellitenhimmel.php @@ -39,6 +39,54 @@ function h(?string $value): string return htmlspecialchars((string)$value, ENT_QUOTES, 'UTF-8'); } +function getPythonCandidates(): array +{ + if (PHP_OS_FAMILY === 'Windows') { + return ['python', 'py']; + } + + return ['/usr/bin/python3', '/usr/bin/python', 'python3', 'python']; +} + +function runPythonCommand(string $scriptPath, array $args): array +{ + putenv('PYTHONUTF8=1'); + putenv('PYTHONIOENCODING=utf-8'); + + $escapedArguments = array_map('escapeshellarg', array_merge([$scriptPath], $args)); + $lastError = 'Python konnte nicht gestartet werden.'; + + foreach (getPythonCandidates() as $pythonBinary) { + $command = $pythonBinary . ' ' . implode(' ', $escapedArguments) . ' 2>&1'; + $output = []; + $resultCode = 0; + exec($command, $output, $resultCode); + + $joined = trim(implode("\n", $output)); + $decoded = json_decode($joined, true); + + if (is_array($decoded)) { + return [ + 'ok' => (bool) ($decoded['ok'] ?? false), + 'data' => $decoded, + 'raw' => $joined, + 'command' => $command, + ]; + } + + if ($joined !== '') { + $lastError = $joined; + } elseif ($resultCode !== 0) { + $lastError = 'Fehlercode ' . $resultCode . ' bei ' . $pythonBinary; + } + } + + return [ + 'ok' => false, + 'error' => $lastError, + ]; +} + // ── Satelliten aus DB laden ────────────────────────────────────────────────── function tleChecksum(string $line): int @@ -291,34 +339,29 @@ if (!empty($satellitePayload) && !empty($defaultLocation['latitude'])) { $windowStart = $dayStart->setTimezone(new DateTimeZone('UTC'))->format(DateTime::ATOM); $windowEnd = $dayEnd->setTimezone(new DateTimeZone('UTC'))->format(DateTime::ATOM); - $scriptPath = realpath(__DIR__ . '/py/api.py'); - $satellitesJson = json_encode($satellitePayload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); - - $args = [ - '/usr/bin/python', - escapeshellarg($scriptPath), - escapeshellarg('satellite_passes'), - escapeshellarg((string)$lat), - escapeshellarg((string)$lon), - escapeshellarg((string)$elev), - escapeshellarg($tz), - escapeshellarg($windowStart), - escapeshellarg($windowEnd), - escapeshellarg($satellitesJson), - ]; - - $command = implode(' ', $args) . ' 2>&1'; - $output = []; - $code = 0; - exec($command, $output, $code); - - $joined = implode('', $output); - $decoded = json_decode($joined, true); - - if (is_array($decoded) && ($decoded['ok'] ?? false)) { - $pythonResult = $decoded; + $scriptPath = realpath(__DIR__ . '/py/api.py'); + if ($scriptPath === false) { + $pythonError = 'Das Python-Skript für den Satellitenhimmel wurde nicht gefunden.'; } else { - $pythonError = $joined ?: 'Leere Antwort von Python.'; + $satellitesJson = json_encode($satellitePayload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); + $satellitesPayload = base64_encode((string)$satellitesJson); + + $pythonCall = runPythonCommand($scriptPath, [ + 'satellite_passes', + (string)$lat, + (string)$lon, + (string)$elev, + $tz, + $windowStart, + $windowEnd, + $satellitesPayload, + ]); + + if ($pythonCall['ok'] ?? false) { + $pythonResult = $pythonCall['data']; + } else { + $pythonError = $pythonCall['raw'] ?? $pythonCall['error'] ?? 'Leere Antwort von Python.'; + } } } ?>