diff --git a/.codex-temp/php-server.err.log b/.codex-temp/php-server.err.log index 3f35db5..b5cb368 100644 --- a/.codex-temp/php-server.err.log +++ b/.codex-temp/php-server.err.log @@ -205,3 +205,285 @@ Stack trace: [Sat Apr 4 19:33:39 2026] 127.0.0.1:51368 Accepted [Sat Apr 4 19:33:40 2026] 127.0.0.1:51368 [200]: GET /favicon.ico [Sat Apr 4 19:33:40 2026] 127.0.0.1:51368 Closing +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 Accepted +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 [302]: GET /settings.php +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51175 Closing +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 Accepted +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 [200]: GET /login.php +[Sat Apr 4 19:40:22 2026] 127.0.0.1:51176 Closing +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 Accepted +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 [302]: GET /settings.php +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57107 Closing +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 Accepted +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 [200]: GET /login.php +[Sat Apr 4 19:40:54 2026] 127.0.0.1:57108 Closing +[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 Accepted +[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 [200]: GET /my_favorites.php +[Sat Apr 4 19:43:07 2026] 127.0.0.1:60471 Closing +[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 Accepted +[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 [200]: GET /css/style.css +[Sat Apr 4 19:43:07 2026] 127.0.0.1:63523 Closing +[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 Accepted +[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 Accepted +[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 [200]: GET /images/star16x16.png +[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 19:43:07 2026] 127.0.0.1:53915 Closing +[Sat Apr 4 19:43:07 2026] 127.0.0.1:65359 Closing +[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 Accepted +[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 [200]: GET /favicon.ico +[Sat Apr 4 19:43:08 2026] 127.0.0.1:57355 Closing +[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 Accepted +[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 [200]: GET /settings.php +[Sat Apr 4 19:43:10 2026] 127.0.0.1:51011 Closing +[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 Accepted +[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 [200]: GET /css/style.css +[Sat Apr 4 19:43:10 2026] 127.0.0.1:60289 Closing +[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 Accepted +[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 [200]: GET /images/star16x16.png +[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 Accepted +[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 19:43:10 2026] 127.0.0.1:63366 Closing +[Sat Apr 4 19:43:10 2026] 127.0.0.1:58674 Closing +[Sat Apr 4 19:43:10 2026] 127.0.0.1:54239 Accepted +[Sat Apr 4 19:43:11 2026] 127.0.0.1:54239 [200]: GET /favicon.ico +[Sat Apr 4 19:43:11 2026] 127.0.0.1:54239 Closing +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 Accepted +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 [200]: GET /settings.php +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59536 Closing +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 Accepted +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 [200]: GET /css/style.css +[Sat Apr 4 19:48:27 2026] 127.0.0.1:59856 Closing +[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 Accepted +[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 Accepted +[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 [200]: GET /images/star16x16.png +[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 19:48:27 2026] 127.0.0.1:60559 Closing +[Sat Apr 4 19:48:27 2026] 127.0.0.1:50765 Closing +[Sat Apr 4 19:48:27 2026] 127.0.0.1:64157 Accepted +[Sat Apr 4 19:48:28 2026] 127.0.0.1:64157 [200]: GET /favicon.ico +[Sat Apr 4 19:48:28 2026] 127.0.0.1:64157 Closing +[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 Accepted +[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 [200]: POST /settings.php +[Sat Apr 4 19:48:36 2026] 127.0.0.1:53240 Closing +[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 Accepted +[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 [200]: GET /css/style.css +[Sat Apr 4 19:48:36 2026] 127.0.0.1:52502 Closing +[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 Accepted +[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 Accepted +[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 [200]: GET /images/star16x16.png +[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 19:48:36 2026] 127.0.0.1:57085 Closing +[Sat Apr 4 19:48:36 2026] 127.0.0.1:58526 Closing +[Sat Apr 4 19:48:36 2026] 127.0.0.1:62820 Accepted +[Sat Apr 4 19:48:37 2026] 127.0.0.1:62820 [200]: GET /favicon.ico +[Sat Apr 4 19:48:37 2026] 127.0.0.1:62820 Closing +[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 Accepted +[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 [200]: GET /telegram/connect.php +[Sat Apr 4 19:48:45 2026] 127.0.0.1:65378 Closing +[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 Accepted +[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 [200]: GET /css/style.css +[Sat Apr 4 19:48:45 2026] 127.0.0.1:63398 Closing +[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 Accepted +[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 Accepted +[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 [200]: GET /images/star16x16.png +[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 19:48:45 2026] 127.0.0.1:59277 Closing +[Sat Apr 4 19:48:45 2026] 127.0.0.1:53328 Closing +[Sat Apr 4 19:48:45 2026] 127.0.0.1:64543 Accepted +[Sat Apr 4 19:48:46 2026] 127.0.0.1:64543 [200]: GET /favicon.ico +[Sat Apr 4 19:48:46 2026] 127.0.0.1:64543 Closing +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 Accepted +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 [302]: GET /telegram/connect.php +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49354 Closing +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 Accepted +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 [200]: GET /login.php +[Sat Apr 4 19:51:52 2026] 127.0.0.1:49355 Closing +[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 Accepted +[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 [302]: GET /telegram/connect.php +[Sat Apr 4 19:56:56 2026] 127.0.0.1:49500 Closing +[Sat Apr 4 19:56:56 2026] 127.0.0.1:49501 Accepted +[Sat Apr 4 19:56:57 2026] 127.0.0.1:49501 [200]: GET /login.php +[Sat Apr 4 19:56:57 2026] 127.0.0.1:49501 Closing +[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 Accepted +[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 [302]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:10:11 2026] 127.0.0.1:51757 Closing +[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 Accepted +[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 [200]: GET /admin_users.php +[Sat Apr 4 20:10:45 2026] 127.0.0.1:61088 Closing +[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 Accepted +[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 [200]: GET /css/style.css +[Sat Apr 4 20:10:45 2026] 127.0.0.1:58250 Closing +[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 Accepted +[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 [200]: GET /images/star16x16.png +[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 Accepted +[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:10:45 2026] 127.0.0.1:62701 Closing +[Sat Apr 4 20:10:45 2026] 127.0.0.1:50531 Closing +[Sat Apr 4 20:10:45 2026] 127.0.0.1:60043 Accepted +[Sat Apr 4 20:10:46 2026] 127.0.0.1:60043 [200]: GET /favicon.ico +[Sat Apr 4 20:10:46 2026] 127.0.0.1:60043 Closing +[Sat Apr 4 20:10:48 2026] 127.0.0.1:49369 Accepted +[Sat Apr 4 20:10:49 2026] 127.0.0.1:49369 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:10:49 2026] 127.0.0.1:49369 Closing +[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 Accepted +[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 [200]: GET /css/style.css +[Sat Apr 4 20:10:49 2026] 127.0.0.1:53364 Closing +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 Accepted +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 [200]: GET /images/star16x16.png +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57509 Closing +[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 Accepted +[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:10:49 2026] 127.0.0.1:60548 Closing +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 Accepted +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 [200]: GET /favicon.ico +[Sat Apr 4 20:10:49 2026] 127.0.0.1:57884 Closing +[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 Accepted +[Sat Apr 4 20:10:56 2026] PHP Fatal error: Uncaught Error: Call to undefined function mb_strlen() in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php:225 +Stack trace: +#0 {main} + thrown in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 225 +[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 [200]: POST /telegram/broadcast_test.php - Uncaught Error: Call to undefined function mb_strlen() in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php:225 +Stack trace: +#0 {main} + thrown in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 225 +[Sat Apr 4 20:10:56 2026] 127.0.0.1:60086 Closing +[Sat Apr 4 20:10:56 2026] 127.0.0.1:60739 Accepted +[Sat Apr 4 20:10:57 2026] 127.0.0.1:60739 [200]: GET /favicon.ico +[Sat Apr 4 20:10:57 2026] 127.0.0.1:60739 Closing +[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 Accepted +[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:11:41 2026] 127.0.0.1:63735 Closing +[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 Accepted +[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 [200]: GET /favicon.ico +[Sat Apr 4 20:11:42 2026] 127.0.0.1:57750 Closing +[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 Accepted +[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:11:43 2026] 127.0.0.1:49797 Closing +[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 Accepted +[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 [200]: GET /css/style.css +[Sat Apr 4 20:11:43 2026] 127.0.0.1:57009 Closing +[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 Accepted +[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 Accepted +[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 [200]: GET /images/star16x16.png +[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:11:44 2026] 127.0.0.1:59357 Closing +[Sat Apr 4 20:11:44 2026] 127.0.0.1:56268 Closing +[Sat Apr 4 20:11:44 2026] 127.0.0.1:64168 Accepted +[Sat Apr 4 20:11:45 2026] 127.0.0.1:64168 [200]: GET /favicon.ico +[Sat Apr 4 20:11:45 2026] 127.0.0.1:64168 Closing +[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 Accepted +[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 [200]: POST /telegram/broadcast_test.php +[Sat Apr 4 20:11:45 2026] 127.0.0.1:51771 Closing +[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 Accepted +[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 [200]: GET /css/style.css +[Sat Apr 4 20:11:45 2026] 127.0.0.1:53274 Closing +[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 Accepted +[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 [200]: GET /images/star16x16.png +[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 Accepted +[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:11:46 2026] 127.0.0.1:61053 Closing +[Sat Apr 4 20:11:46 2026] 127.0.0.1:49236 Closing +[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 Accepted +[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 [200]: GET /favicon.ico +[Sat Apr 4 20:11:46 2026] 127.0.0.1:50467 Closing +[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 Accepted +[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:15:27 2026] 127.0.0.1:55582 Closing +[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 Accepted +[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 [200]: GET /css/style.css +[Sat Apr 4 20:15:27 2026] 127.0.0.1:64068 Closing +[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 Accepted +[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 [200]: GET /images/star16x16.png +[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 Accepted +[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:15:27 2026] 127.0.0.1:63912 Closing +[Sat Apr 4 20:15:27 2026] 127.0.0.1:54947 Closing +[Sat Apr 4 20:15:27 2026] 127.0.0.1:51829 Accepted +[Sat Apr 4 20:15:28 2026] 127.0.0.1:51829 [200]: GET /favicon.ico +[Sat Apr 4 20:15:28 2026] 127.0.0.1:51829 Closing +[Sat Apr 4 20:15:49 2026] 127.0.0.1:63140 Accepted +[Sat Apr 4 20:15:49 2026] PHP Warning: Undefined variable $ErrorActionPreference in C:\Users\ich\source\repos\skyview.astronomiemuseum.de\public\telegram\broadcast_test.php on line 77 += : Die Benennung "=" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausfhrbaren +Programms erkannt. šberprfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und +wiederholen Sie den Vorgang. +In Zeile:1 Zeichen:2 ++ = 'Stop' ++ ~ + + CategoryInfo : ObjectNotFound: (=:String) [], CommandNotFoundException + + FullyQualifiedErrorId : CommandNotFoundException + +[Sat Apr 4 20:15:50 2026] 127.0.0.1:63140 [200]: POST /telegram/broadcast_test.php +[Sat Apr 4 20:15:50 2026] 127.0.0.1:63140 Closing +[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 Accepted +[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 [200]: GET /css/style.css +[Sat Apr 4 20:15:50 2026] 127.0.0.1:56354 Closing +[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 Accepted +[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 Accepted +[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 [200]: GET /images/star16x16.png +[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:15:50 2026] 127.0.0.1:57107 Closing +[Sat Apr 4 20:15:50 2026] 127.0.0.1:63396 Closing +[Sat Apr 4 20:15:50 2026] 127.0.0.1:55764 Accepted +[Sat Apr 4 20:15:51 2026] 127.0.0.1:55764 [200]: GET /favicon.ico +[Sat Apr 4 20:15:51 2026] 127.0.0.1:55764 Closing +[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 Accepted +[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:16:40 2026] 127.0.0.1:55289 Closing +[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 Accepted +[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 [200]: GET /css/style.css +[Sat Apr 4 20:16:40 2026] 127.0.0.1:58669 Closing +[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 Accepted +[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 [200]: GET /images/star16x16.png +[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 Accepted +[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:16:40 2026] 127.0.0.1:50546 Closing +[Sat Apr 4 20:16:40 2026] 127.0.0.1:51858 Closing +[Sat Apr 4 20:16:40 2026] 127.0.0.1:54376 Accepted +[Sat Apr 4 20:16:41 2026] 127.0.0.1:54376 [200]: GET /favicon.ico +[Sat Apr 4 20:16:41 2026] 127.0.0.1:54376 Closing +[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 Accepted +[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 [200]: POST /telegram/broadcast_test.php +[Sat Apr 4 20:16:49 2026] 127.0.0.1:61162 Closing +[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 Accepted +[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 [200]: GET /css/style.css +[Sat Apr 4 20:16:49 2026] 127.0.0.1:49802 Closing +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 Accepted +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 [200]: GET /images/star16x16.png +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 Accepted +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65086 Closing +[Sat Apr 4 20:16:49 2026] 127.0.0.1:65460 Closing +[Sat Apr 4 20:16:49 2026] 127.0.0.1:63450 Accepted +[Sat Apr 4 20:16:50 2026] 127.0.0.1:63450 [200]: GET /favicon.ico +[Sat Apr 4 20:16:50 2026] 127.0.0.1:63450 Closing +[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 Accepted +[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 [200]: GET /telegram/broadcast_test.php +[Sat Apr 4 20:18:27 2026] 127.0.0.1:55134 Closing +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 Accepted +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 [200]: GET /css/style.css +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59680 Closing +[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 Accepted +[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 [200]: GET /images/star16x16.png +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 Accepted +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:18:27 2026] 127.0.0.1:62473 Closing +[Sat Apr 4 20:18:27 2026] 127.0.0.1:59162 Closing +[Sat Apr 4 20:18:27 2026] 127.0.0.1:65020 Accepted +[Sat Apr 4 20:18:28 2026] 127.0.0.1:65020 [200]: GET /favicon.ico +[Sat Apr 4 20:18:28 2026] 127.0.0.1:65020 Closing +[Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 Accepted +#< CLIXML +System.Management.Automation.PSCustomObjectSystem.Object1Module werden fr erstmalige Verwendung vorbereitet.0-1-1Completed-1 [Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 [200]: POST /telegram/broadcast_test.php +[Sat Apr 4 20:18:31 2026] 127.0.0.1:57969 Closing +[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 Accepted +[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 [200]: GET /css/style.css +[Sat Apr 4 20:18:31 2026] 127.0.0.1:49876 Closing +[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 Accepted +[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 [200]: GET /images/star16x16.png +[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 Accepted +[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 [200]: GET /images/star16x16_rays.png +[Sat Apr 4 20:18:31 2026] 127.0.0.1:64150 Closing +[Sat Apr 4 20:18:31 2026] 127.0.0.1:56561 Closing +[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 Accepted +[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 [200]: GET /favicon.ico +[Sat Apr 4 20:18:32 2026] 127.0.0.1:60491 Closing diff --git a/.codex-temp/php-server.out.log b/.codex-temp/php-server.out.log index e69de29..fda3dc0 100644 --- a/.codex-temp/php-server.out.log +++ b/.codex-temp/php-server.out.log @@ -0,0 +1,2 @@ +
+Warning: Module "mysqli" is already loaded in Unknown on line 0
diff --git a/config/skyview.sql b/config/skyview.sql index de50a59..1263889 100644 --- a/config/skyview.sql +++ b/config/skyview.sql @@ -482,10 +482,11 @@ CREATE TABLE IF NOT EXISTS `moon_craters` ( -- Daten-Export vom Benutzer nicht ausgewÀhlt --- Exportiere Struktur von Tabelle d0467f49.sat_import_runs -CREATE TABLE IF NOT EXISTS `sat_import_runs` ( +-- Exportiere Struktur von Tabelle d0467f49.app_import_runs +CREATE TABLE IF NOT EXISTS `app_import_runs` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `source` varchar(32) NOT NULL, + `source_url` varchar(500) DEFAULT NULL, `started_at` datetime NOT NULL, `finished_at` datetime DEFAULT NULL, `records_received` int(11) NOT NULL DEFAULT 0, @@ -494,8 +495,8 @@ CREATE TABLE IF NOT EXISTS `sat_import_runs` ( `status` varchar(32) NOT NULL, `message` text DEFAULT NULL, PRIMARY KEY (`id`), - KEY `idx_sat_import_runs_source` (`source`), - KEY `idx_sat_import_runs_started_at` (`started_at`) + KEY `idx_app_import_runs_source` (`source`), + KEY `idx_app_import_runs_started_at` (`started_at`) ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- Daten-Export vom Benutzer nicht ausgewÀhlt @@ -638,6 +639,29 @@ CREATE TABLE IF NOT EXISTS `star_hipparcos` ( -- Daten-Export vom Benutzer nicht ausgewÀhlt +-- Exportiere Struktur von Tabelle d0467f49.aavso_tcrb_observations +CREATE TABLE IF NOT EXISTS `aavso_tcrb_observations` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `source_row_key` varchar(50) DEFAULT NULL, + `star_name` varchar(50) NOT NULL DEFAULT 'T CrB', + `jd` decimal(16,6) NOT NULL, + `observed_at_utc` datetime NOT NULL, + `calendar_date_text` varchar(64) DEFAULT NULL, + `magnitude` decimal(8,3) NOT NULL, + `magnitude_error` decimal(8,3) DEFAULT NULL, + `filter_code` varchar(20) DEFAULT NULL, + `observer_code` varchar(20) DEFAULT NULL, + `notes_raw` longtext DEFAULT NULL, + `imported_at` datetime NOT NULL DEFAULT current_timestamp(), + `created_at` datetime NOT NULL DEFAULT current_timestamp(), + `updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(), + PRIMARY KEY (`id`), + UNIQUE KEY `uq_aavso_tcrb_observation` (`jd`,`filter_code`,`observer_code`), + KEY `idx_aavso_tcrb_observed_at_utc` (`observed_at_utc`), + KEY `idx_aavso_tcrb_filter_code` (`filter_code`), + KEY `idx_aavso_tcrb_observer_code` (`observer_code`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='AAVSO WebObs CCD-Beobachtungen fuer T CrB'; + /*!40103 SET TIME_ZONE=IFNULL(@OLD_TIME_ZONE, 'system') */; /*!40101 SET SQL_MODE=IFNULL(@OLD_SQL_MODE, '') */; /*!40014 SET FOREIGN_KEY_CHECKS=IFNULL(@OLD_FOREIGN_KEY_CHECKS, 1) */; diff --git a/php-server.err.log b/php-server.err.log new file mode 100644 index 0000000..af389a9 --- /dev/null +++ b/php-server.err.log @@ -0,0 +1,434 @@ +[Sun Apr 5 08:41:18 2026] PHP Warning: Module "mysqli" is already loaded in Unknown on line 0 +[Sun Apr 5 08:41:18 2026] PHP 8.4.5 Development Server (http://127.0.0.1:8000) started +[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 Accepted +[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 [200]: GET / +[Sun Apr 5 08:41:20 2026] 127.0.0.1:56954 Closing +[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 Accepted +[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 [200]: GET / +[Sun Apr 5 08:41:47 2026] 127.0.0.1:56958 Closing +[Sun Apr 5 09:03:20 2026] 127.0.0.1:58699 Accepted +[Sun Apr 5 09:03:21 2026] 127.0.0.1:58699 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:03:22 2026] 127.0.0.1:58699 Closing +[Sun Apr 5 09:04:28 2026] 127.0.0.1:57870 Accepted +[Sun Apr 5 09:04:29 2026] 127.0.0.1:57870 [200]: GET / +[Sun Apr 5 09:04:29 2026] 127.0.0.1:57870 Closing +[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 Accepted +[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 [200]: GET /css/style.css +[Sun Apr 5 09:04:29 2026] 127.0.0.1:59118 Closing +[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 Accepted +[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 Accepted +[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 [200]: GET /images/star16x16.png +[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:04:29 2026] 127.0.0.1:50781 Closing +[Sun Apr 5 09:04:29 2026] 127.0.0.1:62400 Closing +[Sun Apr 5 09:04:29 2026] 127.0.0.1:50410 Accepted +[Sun Apr 5 09:04:30 2026] 127.0.0.1:50410 [200]: GET /favicon.ico +[Sun Apr 5 09:04:30 2026] 127.0.0.1:50410 Closing +[Sun Apr 5 09:04:30 2026] 127.0.0.1:58330 Accepted +[Sun Apr 5 09:04:33 2026] 127.0.0.1:58331 Accepted +[Sun Apr 5 09:04:33 2026] 127.0.0.1:58331 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:04:34 2026] 127.0.0.1:58331 Closing +[Sun Apr 5 09:04:34 2026] 127.0.0.1:58330 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:04:34 2026] 127.0.0.1:58330 Closing +[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 Accepted +[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 [200]: GET /css/style.css +[Sun Apr 5 09:04:35 2026] 127.0.0.1:54593 Closing +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 Accepted +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 Accepted +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 [200]: GET /images/star16x16.png +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62799 Closing +[Sun Apr 5 09:04:35 2026] 127.0.0.1:62898 Closing +[Sun Apr 5 09:04:35 2026] 127.0.0.1:57032 Accepted +[Sun Apr 5 09:04:36 2026] 127.0.0.1:57032 [200]: GET /favicon.ico +[Sun Apr 5 09:04:36 2026] 127.0.0.1:57032 Closing +[Sun Apr 5 09:04:36 2026] 127.0.0.1:52221 Accepted +[Sun Apr 5 09:05:00 2026] 127.0.0.1:52221 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=I&filters%5B%5D=R&filters%5B%5D=Red-Vis.&filters%5B%5D=SG&filters%5B%5D=SI&filters%5B%5D=SR&filters%5B%5D=SU&filters%5B%5D=TB&filters%5B%5D=TG&filters%5B%5D=TR&filters%5B%5D=U&filters%5B%5D=V&filters%5B%5D=Vis. +[Sun Apr 5 09:05:00 2026] 127.0.0.1:52221 Closing +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 Accepted +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 [200]: GET /css/style.css +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51545 Closing +[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 Accepted +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 Accepted +[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 [200]: GET /images/star16x16.png +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:05:00 2026] 127.0.0.1:57177 Closing +[Sun Apr 5 09:05:00 2026] 127.0.0.1:51353 Closing +[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 Accepted +[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 [200]: GET /favicon.ico +[Sun Apr 5 09:05:01 2026] 127.0.0.1:64241 Closing +[Sun Apr 5 09:05:01 2026] 127.0.0.1:50264 Accepted +[Sun Apr 5 09:06:21 2026] 127.0.0.1:50264 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 09:06:21 2026] 127.0.0.1:50264 Closing +[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 Accepted +[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B +[Sun Apr 5 09:06:21 2026] 127.0.0.1:58191 Closing +[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 Accepted +[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 [200]: GET /css/style.css +[Sun Apr 5 09:06:21 2026] 127.0.0.1:63650 Closing +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 Accepted +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 Accepted +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 [200]: GET /images/star16x16.png +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64805 Closing +[Sun Apr 5 09:06:22 2026] 127.0.0.1:64244 Closing +[Sun Apr 5 09:06:22 2026] 127.0.0.1:63043 Accepted +[Sun Apr 5 09:06:23 2026] 127.0.0.1:63043 [200]: GET /favicon.ico +[Sun Apr 5 09:06:23 2026] 127.0.0.1:63043 Closing +[Sun Apr 5 09:06:23 2026] 127.0.0.1:56378 Accepted +[Sun Apr 5 09:06:32 2026] 127.0.0.1:56378 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:06:32 2026] 127.0.0.1:56378 Closing +[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 Accepted +[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 [200]: GET /css/style.css +[Sun Apr 5 09:06:33 2026] 127.0.0.1:55344 Closing +[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 Accepted +[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 Accepted +[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 [200]: GET /images/star16x16.png +[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:06:33 2026] 127.0.0.1:62793 Closing +[Sun Apr 5 09:06:33 2026] 127.0.0.1:50086 Closing +[Sun Apr 5 09:06:33 2026] 127.0.0.1:53067 Accepted +[Sun Apr 5 09:06:34 2026] 127.0.0.1:53067 [200]: GET /favicon.ico +[Sun Apr 5 09:06:34 2026] 127.0.0.1:53067 Closing +[Sun Apr 5 09:06:34 2026] 127.0.0.1:64617 Accepted +[Sun Apr 5 09:06:51 2026] 127.0.0.1:64617 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:06:51 2026] 127.0.0.1:64617 Closing +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 Accepted +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 [200]: GET /css/style.css +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56300 Closing +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 Accepted +[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 Accepted +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 [200]: GET /images/star16x16.png +[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:06:52 2026] 127.0.0.1:56087 Closing +[Sun Apr 5 09:06:52 2026] 127.0.0.1:61670 Closing +[Sun Apr 5 09:06:52 2026] 127.0.0.1:50474 Accepted +[Sun Apr 5 09:06:53 2026] 127.0.0.1:50474 [200]: GET /favicon.ico +[Sun Apr 5 09:06:53 2026] 127.0.0.1:50474 Closing +[Sun Apr 5 09:06:53 2026] 127.0.0.1:57647 Accepted +[Sun Apr 5 09:07:15 2026] 127.0.0.1:57647 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:07:15 2026] 127.0.0.1:57647 Closing +[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 Accepted +[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 [200]: GET /css/style.css +[Sun Apr 5 09:07:15 2026] 127.0.0.1:50671 Closing +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 Accepted +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 [200]: GET /images/star16x16.png +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63305 Closing +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 Accepted +[Sun Apr 5 09:07:15 2026] 127.0.0.1:60051 Accepted +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:07:15 2026] 127.0.0.1:63643 Closing +[Sun Apr 5 09:07:16 2026] 127.0.0.1:60051 [200]: GET /favicon.ico +[Sun Apr 5 09:07:16 2026] 127.0.0.1:60051 Closing +[Sun Apr 5 09:07:26 2026] 127.0.0.1:60054 Accepted +[Sun Apr 5 09:07:27 2026] 127.0.0.1:60054 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:07:28 2026] 127.0.0.1:60054 Closing +[Sun Apr 5 09:07:32 2026] 127.0.0.1:64959 Accepted +[Sun Apr 5 09:07:33 2026] 127.0.0.1:64959 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:07:33 2026] 127.0.0.1:64959 Closing +[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 Accepted +[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 [200]: GET /css/style.css +[Sun Apr 5 09:07:33 2026] 127.0.0.1:52027 Closing +[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 Accepted +[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 Accepted +[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 [200]: GET /images/star16x16.png +[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:07:33 2026] 127.0.0.1:63633 Closing +[Sun Apr 5 09:07:33 2026] 127.0.0.1:57816 Closing +[Sun Apr 5 09:07:33 2026] 127.0.0.1:64706 Accepted +[Sun Apr 5 09:07:34 2026] 127.0.0.1:64706 [200]: GET /favicon.ico +[Sun Apr 5 09:07:34 2026] 127.0.0.1:64706 Closing +[Sun Apr 5 09:07:34 2026] 127.0.0.1:57213 Accepted +[Sun Apr 5 09:08:22 2026] 127.0.0.1:57222 Accepted +[Sun Apr 5 09:08:22 2026] 127.0.0.1:57222 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:08:23 2026] 127.0.0.1:57222 Closing +[Sun Apr 5 09:08:53 2026] 127.0.0.1:57213 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 09:08:53 2026] 127.0.0.1:57213 Closing +[Sun Apr 5 09:08:53 2026] 127.0.0.1:50203 Accepted +[Sun Apr 5 09:08:54 2026] 127.0.0.1:50203 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:08:54 2026] 127.0.0.1:50203 Closing +[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 Accepted +[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 [200]: GET /css/style.css +[Sun Apr 5 09:08:54 2026] 127.0.0.1:50103 Closing +[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 Accepted +[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 Accepted +[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 [200]: GET /images/star16x16.png +[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:08:54 2026] 127.0.0.1:61966 Closing +[Sun Apr 5 09:08:54 2026] 127.0.0.1:56961 Closing +[Sun Apr 5 09:08:54 2026] 127.0.0.1:61750 Accepted +[Sun Apr 5 09:08:55 2026] 127.0.0.1:61750 [200]: GET /favicon.ico +[Sun Apr 5 09:08:55 2026] 127.0.0.1:61750 Closing +[Sun Apr 5 09:08:55 2026] 127.0.0.1:65247 Accepted +[Sun Apr 5 09:09:04 2026] 127.0.0.1:65247 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B +[Sun Apr 5 09:09:04 2026] 127.0.0.1:65247 Closing +[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 Accepted +[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 [200]: GET /css/style.css +[Sun Apr 5 09:09:04 2026] 127.0.0.1:62953 Closing +[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 Accepted +[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 [200]: GET /images/star16x16.png +[Sun Apr 5 09:09:04 2026] 127.0.0.1:59789 Closing +[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 Accepted +[Sun Apr 5 09:09:04 2026] 127.0.0.1:55310 Accepted +[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:09:04 2026] 127.0.0.1:55683 Closing +[Sun Apr 5 09:09:05 2026] 127.0.0.1:55310 [200]: GET /favicon.ico +[Sun Apr 5 09:09:05 2026] 127.0.0.1:55310 Closing +[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 Accepted +[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B +[Sun Apr 5 09:12:33 2026] 127.0.0.1:50465 Closing +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 Accepted +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 [200]: GET /css/style.css +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62337 Closing +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 Accepted +[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 Accepted +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 [200]: GET /images/star16x16.png +[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:12:33 2026] 127.0.0.1:62888 Closing +[Sun Apr 5 09:12:33 2026] 127.0.0.1:53230 Closing +[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 Accepted +[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 [200]: GET /favicon.ico +[Sun Apr 5 09:12:34 2026] 127.0.0.1:50620 Closing +[Sun Apr 5 09:12:34 2026] 127.0.0.1:58601 Accepted +[Sun Apr 5 09:13:55 2026] 127.0.0.1:58601 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 09:13:55 2026] 127.0.0.1:58601 Closing +[Sun Apr 5 09:14:02 2026] 127.0.0.1:58126 Accepted +[Sun Apr 5 09:14:02 2026] 127.0.0.1:58126 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:14:03 2026] 127.0.0.1:58126 Closing +[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 Accepted +[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B +[Sun Apr 5 09:16:48 2026] 127.0.0.1:56884 Closing +[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 Accepted +[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 [200]: GET /css/style.css +[Sun Apr 5 09:16:48 2026] 127.0.0.1:51727 Closing +[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 Accepted +[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 Accepted +[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 [200]: GET /images/star16x16.png +[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:16:49 2026] 127.0.0.1:61828 Closing +[Sun Apr 5 09:16:49 2026] 127.0.0.1:60727 Closing +[Sun Apr 5 09:16:49 2026] 127.0.0.1:51536 Accepted +[Sun Apr 5 09:16:50 2026] 127.0.0.1:51536 [200]: GET /favicon.ico +[Sun Apr 5 09:16:50 2026] 127.0.0.1:51536 Closing +[Sun Apr 5 09:16:50 2026] 127.0.0.1:58994 Accepted +[Sun Apr 5 09:17:36 2026] 127.0.0.1:58994 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:17:36 2026] 127.0.0.1:58994 Closing +[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 Accepted +[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 [200]: GET /css/style.css +[Sun Apr 5 09:17:36 2026] 127.0.0.1:65289 Closing +[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 Accepted +[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 [200]: GET /images/star16x16.png +[Sun Apr 5 09:17:37 2026] 127.0.0.1:54338 Closing +[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 Accepted +[Sun Apr 5 09:17:37 2026] 127.0.0.1:51304 Accepted +[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:17:37 2026] 127.0.0.1:62997 Closing +[Sun Apr 5 09:17:38 2026] 127.0.0.1:51304 [200]: GET /favicon.ico +[Sun Apr 5 09:17:38 2026] 127.0.0.1:51304 Closing +[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 Accepted +[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V&filters%5B%5D=Vis. +[Sun Apr 5 09:18:21 2026] 127.0.0.1:49914 Closing +[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 Accepted +[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 [200]: GET /css/style.css +[Sun Apr 5 09:18:21 2026] 127.0.0.1:51379 Closing +[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 Accepted +[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 Accepted +[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 [200]: GET /images/star16x16.png +[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:18:21 2026] 127.0.0.1:53012 Closing +[Sun Apr 5 09:18:21 2026] 127.0.0.1:64244 Closing +[Sun Apr 5 09:18:21 2026] 127.0.0.1:59012 Accepted +[Sun Apr 5 09:18:22 2026] 127.0.0.1:59012 [200]: GET /favicon.ico +[Sun Apr 5 09:18:22 2026] 127.0.0.1:59012 Closing +[Sun Apr 5 09:18:22 2026] 127.0.0.1:49511 Accepted +[Sun Apr 5 09:18:34 2026] 127.0.0.1:49511 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V +[Sun Apr 5 09:18:34 2026] 127.0.0.1:49511 Closing +[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 Accepted +[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 [200]: GET /css/style.css +[Sun Apr 5 09:18:34 2026] 127.0.0.1:53689 Closing +[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 Accepted +[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 [200]: GET /images/star16x16.png +[Sun Apr 5 09:18:35 2026] 127.0.0.1:53724 Closing +[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 Accepted +[Sun Apr 5 09:18:35 2026] 127.0.0.1:54204 Accepted +[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:18:35 2026] 127.0.0.1:57912 Closing +[Sun Apr 5 09:18:36 2026] 127.0.0.1:54204 [200]: GET /favicon.ico +[Sun Apr 5 09:18:36 2026] 127.0.0.1:54204 Closing +[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 Accepted +[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=CV&filters%5B%5D=V +[Sun Apr 5 09:19:09 2026] 127.0.0.1:60535 Closing +[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 Accepted +[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 [200]: GET /css/style.css +[Sun Apr 5 09:19:09 2026] 127.0.0.1:55329 Closing +[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 Accepted +[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 Accepted +[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 [200]: GET /images/star16x16.png +[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:19:09 2026] 127.0.0.1:56639 Closing +[Sun Apr 5 09:19:09 2026] 127.0.0.1:61824 Closing +[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 Accepted +[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 [200]: GET /favicon.ico +[Sun Apr 5 09:19:10 2026] 127.0.0.1:61125 Closing +[Sun Apr 5 09:19:10 2026] 127.0.0.1:52409 Accepted +[Sun Apr 5 09:19:19 2026] 127.0.0.1:52409 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=R&filters%5B%5D=V +[Sun Apr 5 09:19:19 2026] 127.0.0.1:52409 Closing +[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 Accepted +[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 [200]: GET /css/style.css +[Sun Apr 5 09:19:19 2026] 127.0.0.1:64933 Closing +[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 Accepted +[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 [200]: GET /images/star16x16.png +[Sun Apr 5 09:19:19 2026] 127.0.0.1:54659 Closing +[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 Accepted +[Sun Apr 5 09:19:19 2026] 127.0.0.1:59001 Accepted +[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:19:19 2026] 127.0.0.1:56306 Closing +[Sun Apr 5 09:19:20 2026] 127.0.0.1:59001 [200]: GET /favicon.ico +[Sun Apr 5 09:19:20 2026] 127.0.0.1:59001 Closing +[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 Accepted +[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=SU&filters%5B%5D=V +[Sun Apr 5 09:19:28 2026] 127.0.0.1:51610 Closing +[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 Accepted +[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 [200]: GET /css/style.css +[Sun Apr 5 09:19:28 2026] 127.0.0.1:58168 Closing +[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 Accepted +[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 Accepted +[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 [200]: GET /images/star16x16.png +[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:19:28 2026] 127.0.0.1:59299 Closing +[Sun Apr 5 09:19:28 2026] 127.0.0.1:57058 Closing +[Sun Apr 5 09:19:28 2026] 127.0.0.1:51123 Accepted +[Sun Apr 5 09:19:30 2026] 127.0.0.1:51123 [200]: GET /favicon.ico +[Sun Apr 5 09:19:30 2026] 127.0.0.1:51123 Closing +[Sun Apr 5 09:19:30 2026] 127.0.0.1:58163 Accepted +[Sun Apr 5 09:19:43 2026] 127.0.0.1:58163 [200]: GET /tcrb_lightcurve.php? +[Sun Apr 5 09:19:43 2026] 127.0.0.1:58163 Closing +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 Accepted +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 [200]: GET /css/style.css +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63431 Closing +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 Accepted +[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 Accepted +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 [200]: GET /images/star16x16.png +[Sun Apr 5 09:19:43 2026] 127.0.0.1:63810 Closing +[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:19:43 2026] 127.0.0.1:49861 Closing +[Sun Apr 5 09:19:44 2026] 127.0.0.1:55189 Accepted +[Sun Apr 5 09:19:45 2026] 127.0.0.1:55189 [200]: GET /favicon.ico +[Sun Apr 5 09:19:45 2026] 127.0.0.1:55189 Closing +[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 Accepted +[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V +[Sun Apr 5 09:20:52 2026] 127.0.0.1:59913 Closing +[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 Accepted +[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 [200]: GET /css/style.css +[Sun Apr 5 09:20:52 2026] 127.0.0.1:62258 Closing +[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 Accepted +[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 Accepted +[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 [200]: GET /images/star16x16.png +[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:20:53 2026] 127.0.0.1:58865 Closing +[Sun Apr 5 09:20:53 2026] 127.0.0.1:55357 Closing +[Sun Apr 5 09:20:53 2026] 127.0.0.1:53823 Accepted +[Sun Apr 5 09:20:54 2026] 127.0.0.1:53823 [200]: GET /favicon.ico +[Sun Apr 5 09:20:54 2026] 127.0.0.1:53823 Closing +[Sun Apr 5 09:20:54 2026] 127.0.0.1:49851 Accepted +[Sun Apr 5 09:21:56 2026] 127.0.0.1:49851 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 09:21:56 2026] 127.0.0.1:49851 Closing +[Sun Apr 5 09:25:02 2026] 127.0.0.1:51369 Accepted +[Sun Apr 5 09:25:03 2026] 127.0.0.1:51369 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:25:03 2026] 127.0.0.1:51369 Closing +[Sun Apr 5 09:28:00 2026] 127.0.0.1:52013 Accepted +[Sun Apr 5 09:28:01 2026] 127.0.0.1:52013 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:28:01 2026] 127.0.0.1:52013 Closing +[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 Accepted +[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 [200]: GET /css/style.css +[Sun Apr 5 09:28:01 2026] 127.0.0.1:63106 Closing +[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 Accepted +[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 Accepted +[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 [200]: GET /images/star16x16.png +[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:28:01 2026] 127.0.0.1:55381 Closing +[Sun Apr 5 09:28:01 2026] 127.0.0.1:53886 Closing +[Sun Apr 5 09:28:01 2026] 127.0.0.1:53593 Accepted +[Sun Apr 5 09:28:04 2026] 127.0.0.1:53593 [200]: GET /favicon.ico +[Sun Apr 5 09:28:04 2026] 127.0.0.1:53593 Closing +[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 Accepted +[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=I&filters%5B%5D=R&filters%5B%5D=V +[Sun Apr 5 09:28:28 2026] 127.0.0.1:63663 Closing +[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 Accepted +[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 [200]: GET /css/style.css +[Sun Apr 5 09:28:28 2026] 127.0.0.1:61074 Closing +[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 Accepted +[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 Accepted +[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 [200]: GET /images/star16x16.png +[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:28:29 2026] 127.0.0.1:63330 Closing +[Sun Apr 5 09:28:29 2026] 127.0.0.1:65079 Closing +[Sun Apr 5 09:28:29 2026] 127.0.0.1:64619 Accepted +[Sun Apr 5 09:28:30 2026] 127.0.0.1:64619 [200]: GET /favicon.ico +[Sun Apr 5 09:28:30 2026] 127.0.0.1:64619 Closing +[Sun Apr 5 09:28:30 2026] 127.0.0.1:51060 Accepted +[Sun Apr 5 09:28:34 2026] 127.0.0.1:51060 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V +[Sun Apr 5 09:28:34 2026] 127.0.0.1:51060 Closing +[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 Accepted +[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 [200]: GET /css/style.css +[Sun Apr 5 09:28:34 2026] 127.0.0.1:49882 Closing +[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 Accepted +[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 [200]: GET /images/star16x16.png +[Sun Apr 5 09:28:34 2026] 127.0.0.1:57884 Closing +[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 Accepted +[Sun Apr 5 09:28:34 2026] 127.0.0.1:60639 Accepted +[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:28:34 2026] 127.0.0.1:54484 Closing +[Sun Apr 5 09:28:36 2026] 127.0.0.1:60639 [200]: GET /favicon.ico +[Sun Apr 5 09:28:36 2026] 127.0.0.1:60639 Closing +[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 Accepted +[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:30:04 2026] 127.0.0.1:50224 Closing +[Sun Apr 5 09:31:20 2026] 127.0.0.1:51175 Accepted +[Sun Apr 5 09:31:21 2026] 127.0.0.1:51175 [200]: GET /tcrb_lightcurve.php +[Sun Apr 5 09:31:21 2026] 127.0.0.1:51175 Closing +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 Accepted +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 [200]: GET /css/style.css +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58982 Closing +[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 Accepted +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 Accepted +[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 [200]: GET /images/star16x16.png +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:31:21 2026] 127.0.0.1:61557 Closing +[Sun Apr 5 09:31:21 2026] 127.0.0.1:58924 Closing +[Sun Apr 5 09:31:21 2026] 127.0.0.1:57822 Accepted +[Sun Apr 5 09:31:22 2026] 127.0.0.1:57822 [200]: GET /favicon.ico +[Sun Apr 5 09:31:22 2026] 127.0.0.1:57822 Closing +[Sun Apr 5 09:31:22 2026] 127.0.0.1:64591 Accepted +[Sun Apr 5 09:31:37 2026] 127.0.0.1:64591 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=B&filters%5B%5D=V +[Sun Apr 5 09:31:37 2026] 127.0.0.1:64591 Closing +[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 Accepted +[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 [200]: GET /css/style.css +[Sun Apr 5 09:31:37 2026] 127.0.0.1:62566 Closing +[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 Accepted +[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 [200]: GET /images/star16x16.png +[Sun Apr 5 09:31:38 2026] 127.0.0.1:62905 Closing +[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 Accepted +[Sun Apr 5 09:31:38 2026] 127.0.0.1:58223 Accepted +[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:31:38 2026] 127.0.0.1:61446 Closing +[Sun Apr 5 09:31:39 2026] 127.0.0.1:58223 [200]: GET /favicon.ico +[Sun Apr 5 09:31:39 2026] 127.0.0.1:58223 Closing +[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 Accepted +[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 [200]: GET /tcrb_lightcurve.php?filters%5B%5D=V +[Sun Apr 5 09:31:51 2026] 127.0.0.1:51105 Closing +[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 Accepted +[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 [200]: GET /css/style.css +[Sun Apr 5 09:31:51 2026] 127.0.0.1:65141 Closing +[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 Accepted +[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 Accepted +[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 [200]: GET /images/star16x16.png +[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 [200]: GET /images/star16x16_rays.png +[Sun Apr 5 09:31:51 2026] 127.0.0.1:54456 Closing +[Sun Apr 5 09:31:51 2026] 127.0.0.1:62415 Closing +[Sun Apr 5 09:31:51 2026] 127.0.0.1:58480 Accepted +[Sun Apr 5 09:31:52 2026] 127.0.0.1:58480 [200]: GET /favicon.ico +[Sun Apr 5 09:31:52 2026] 127.0.0.1:58480 Closing +[Sun Apr 5 09:31:52 2026] 127.0.0.1:63903 Accepted +[Sun Apr 5 09:32:56 2026] 127.0.0.1:63903 Closed without sending a request; it was probably just an unused speculative preconnection +[Sun Apr 5 09:32:56 2026] 127.0.0.1:63903 Closing diff --git a/php-server.log b/php-server.log new file mode 100644 index 0000000..e69de29 diff --git a/public/header.php b/public/header.php index 555a055..5f0303a 100644 --- a/public/header.php +++ b/public/header.php @@ -55,6 +55,7 @@ $menuGroups = [ ['href' => 'moonphase.php', 'label' => 'Mondphase'], ['href' => 'index_py.php', 'label' => 'Sonne & Mond'], ['href' => 'planetensichtbarkeit.php', 'label' => 'Planetensichtbarkeit'], + ['href' => 'tcrb_lightcurve.php', 'label' => 'T CrB Lichtkurve'], ['href' => 'solarsystem.php', 'label' => 'Sonnensystem'], ['href' => 'jupitersystem.php', 'label' => 'Jupitersystem'], ['href' => 'tagbogen.php', 'label' => 'Tagbogen'], diff --git a/public/tcrb_lightcurve.php b/public/tcrb_lightcurve.php new file mode 100644 index 0000000..62f43d9 --- /dev/null +++ b/public/tcrb_lightcurve.php @@ -0,0 +1,554 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ] +); + +$loggedIn = isset($_SESSION['user_id']); +$pageTitle = 'T CrB Lichtkurve'; +$headerIntroPre = 'Variabler Stern'; +$headerIntroTitle = 'T CrB Lichtkurve'; +$headerIntroSub = 'AAVSO-WebObs-Daten mit waehlbaren Filtern in einem gemeinsamen Plotly-Diagramm.'; +$errors = []; + +function h(?string $value): string +{ + return htmlspecialchars((string) $value, ENT_QUOTES, 'UTF-8'); +} + +$filterRows = $pdo->query(" + SELECT `filter_code`, COUNT(*) AS `entry_count` + FROM `aavso_tcrb_observations` + WHERE `filter_code` IS NOT NULL + AND `filter_code` <> '' + GROUP BY `filter_code` + ORDER BY `filter_code` ASC +")->fetchAll(); + +$availableFilters = []; +foreach ($filterRows as $filterRow) { + $filterCode = trim((string) ($filterRow['filter_code'] ?? '')); + if ($filterCode === '') { + continue; + } + + $availableFilters[] = [ + 'code' => $filterCode, + 'count' => (int) ($filterRow['entry_count'] ?? 0), + ]; +} + +$selectedFilters = array_values(array_unique(array_filter(array_map( + static fn ($value): string => trim((string) $value), + is_array($_GET['filters'] ?? null) ? $_GET['filters'] : [] +), static fn (string $value): bool => $value !== ''))); + +if (empty($selectedFilters)) { + $selectedFilters = in_array('V', array_column($availableFilters, 'code'), true) + ? ['V'] + : array_column($availableFilters, 'code'); +} + +$selectedFilters = array_values(array_intersect($selectedFilters, array_column($availableFilters, 'code'))); + +if (empty($availableFilters)) { + $errors[] = 'In der Tabelle aavso_tcrb_observations sind noch keine T-CrB-Daten vorhanden.'; +} + +$observations = []; +$summary = [ + 'count' => 0, + 'min_utc' => null, + 'max_utc' => null, + 'min_mag' => null, + 'max_mag' => null, +]; + +if (empty($errors) && !empty($selectedFilters)) { + $placeholders = implode(',', array_fill(0, count($selectedFilters), '?')); + $stmt = $pdo->prepare(" + SELECT + `observed_at_utc`, + `jd`, + `magnitude`, + `magnitude_error`, + `filter_code`, + `observer_code`, + `notes_raw` + FROM `aavso_tcrb_observations` + WHERE `filter_code` IN ({$placeholders}) + ORDER BY `observed_at_utc` ASC, `jd` ASC + "); + $stmt->execute($selectedFilters); + $rows = $stmt->fetchAll(); + + foreach ($rows as $row) { + $observedAtUtc = (string) ($row['observed_at_utc'] ?? ''); + $magnitude = isset($row['magnitude']) ? (float) $row['magnitude'] : null; + if ($observedAtUtc === '' || $magnitude === null) { + continue; + } + + $observations[] = [ + 'observed_at_utc' => $observedAtUtc, + 'jd' => isset($row['jd']) ? (float) $row['jd'] : null, + 'magnitude' => $magnitude, + 'magnitude_error' => $row['magnitude_error'] !== null ? (float) $row['magnitude_error'] : null, + 'filter_code' => (string) ($row['filter_code'] ?? ''), + 'observer_code' => (string) ($row['observer_code'] ?? ''), + 'notes_raw' => (string) ($row['notes_raw'] ?? ''), + ]; + + $summary['count']++; + $summary['min_utc'] = $summary['min_utc'] === null || $observedAtUtc < $summary['min_utc'] ? $observedAtUtc : $summary['min_utc']; + $summary['max_utc'] = $summary['max_utc'] === null || $observedAtUtc > $summary['max_utc'] ? $observedAtUtc : $summary['max_utc']; + $summary['min_mag'] = $summary['min_mag'] === null || $magnitude < $summary['min_mag'] ? $magnitude : $summary['min_mag']; + $summary['max_mag'] = $summary['max_mag'] === null || $magnitude > $summary['max_mag'] ? $magnitude : $summary['max_mag']; + } +} + +if (empty($errors) && empty($observations)) { + $errors[] = 'Fuer die ausgewaehlten Filter wurden keine Daten gefunden.'; +} + +$filterPalette = [ + 'U' => '#4c6ef5', + 'B' => '#1c7ed6', + 'V' => '#2b8a3e', + 'R' => '#c92a2a', + 'I' => '#862e9c', + 'CV' => '#495057', + 'TG' => '#0b7285', + 'TB' => '#364fc7', + 'TR' => '#d9480f', +]; + +$chartDatasets = []; +foreach ($selectedFilters as $selectedFilter) { + $chartDatasets[$selectedFilter] = [ + 'filter' => $selectedFilter, + 'color' => $filterPalette[$selectedFilter] ?? sprintf('#%06X', crc32($selectedFilter) & 0xFFFFFF), + 'points' => [], + ]; +} + +foreach ($observations as $observation) { + $filterCode = $observation['filter_code']; + if (!isset($chartDatasets[$filterCode])) { + continue; + } + + $chartDatasets[$filterCode]['points'][] = $observation; +} + +$chartDatasets = array_values(array_filter($chartDatasets, static fn (array $dataset): bool => !empty($dataset['points']))); + +$plotlyTraces = []; +foreach ($chartDatasets as $dataset) { + $xValues = []; + $yValues = []; + $errorValues = []; + $customData = []; + $hasErrors = false; + + foreach ($dataset['points'] as $point) { + $xValues[] = (string) $point['observed_at_utc']; + $yValues[] = (float) $point['magnitude']; + $errorValue = $point['magnitude_error'] !== null ? (float) $point['magnitude_error'] : 0.0; + $errorValues[] = $errorValue; + if ($errorValue > 0) { + $hasErrors = true; + } + + $customData[] = [ + $point['jd'], + $point['observer_code'] !== '' ? $point['observer_code'] : '—', + $point['magnitude_error'] !== null ? number_format((float) $point['magnitude_error'], 3, '.', '') : '—', + ]; + } + + $plotlyTraces[] = [ + 'type' => 'scatter', + 'mode' => 'lines+markers', + 'name' => $dataset['filter'], + 'x' => $xValues, + 'y' => $yValues, + 'line' => [ + 'color' => $dataset['color'], + 'width' => 2, + ], + 'marker' => [ + 'color' => $dataset['color'], + 'size' => 7, + 'line' => [ + 'color' => '#0f172a', + 'width' => 1, + ], + ], + 'error_y' => [ + 'type' => 'data', + 'array' => $errorValues, + 'visible' => $hasErrors, + 'thickness' => 1.1, + 'width' => 3, + 'color' => $dataset['color'], + ], + 'customdata' => $customData, + 'hovertemplate' => 'Filter %{fullData.name}
' + . 'Magnitude %{y:.3f}
' + . 'Fehler %{customdata[2]}
' + . 'UTC %{x}
' + . 'JD %{customdata[0]}
' + . 'Observer %{customdata[1]}', + ]; +} + +$meanSourcePoints = []; +foreach ($chartDatasets as $dataset) { + foreach ($dataset['points'] as $point) { + $meanSourcePoints[] = $point; + } +} + +usort($meanSourcePoints, static function (array $a, array $b): int { + return strcmp((string) $a['observed_at_utc'], (string) $b['observed_at_utc']); +}); + +if (count($meanSourcePoints) >= 3) { + $windowSize = min(11, count($meanSourcePoints)); + if ($windowSize % 2 === 0) { + $windowSize--; + } + + $halfWindow = intdiv($windowSize, 2); + $meanX = []; + $meanY = []; + $meanCustomData = []; + + foreach ($meanSourcePoints as $index => $point) { + $start = max(0, $index - $halfWindow); + $end = min(count($meanSourcePoints) - 1, $index + $halfWindow); + $sum = 0.0; + $count = 0; + + for ($i = $start; $i <= $end; $i++) { + $sum += (float) $meanSourcePoints[$i]['magnitude']; + $count++; + } + + if ($count === 0) { + continue; + } + + $meanValue = $sum / $count; + $meanX[] = (string) $point['observed_at_utc']; + $meanY[] = $meanValue; + $meanCustomData[] = [$count]; + } + + if (!empty($meanX)) { + $plotlyTraces[] = [ + 'type' => 'scatter', + 'mode' => 'lines', + 'name' => 'Mittelkurve', + 'x' => $meanX, + 'y' => $meanY, + 'line' => [ + 'color' => '#f4d35e', + 'width' => 3, + 'dash' => 'solid', + 'shape' => 'spline', + 'smoothing' => 0.7, + ], + 'customdata' => $meanCustomData, + 'hovertemplate' => 'Mittelkurve
' + . 'Magnitude %{y:.3f}
' + . 'UTC %{x}
' + . 'Fenster %{customdata[0]} Punkte', + ]; + } +} + +$plotlyPayload = [ + 'traces' => $plotlyTraces, + 'summary' => $summary, +]; +?> + + + + + + + + + +
+
+

Filter

+
+
+ + +
+ + +
+ +
+ +
+
+ +
+

Lichtkurve

+ + +
+
+ + Messpunkte +
+
+ + Erster UTC-Zeitpunkt +
+
+ + Letzter UTC-Zeitpunkt +
+
+ bis + Magnitudenbereich +
+
+ +
+
+
+ +
+ +
+ + +
+ +
+ +
Noch keine darstellbaren Daten vorhanden.
+ +
+
+ + + + + + diff --git a/scripts/import/import_celestrak_active.php b/scripts/import/import_celestrak_active.php index b845ed4..af34de1 100644 --- a/scripts/import/import_celestrak_active.php +++ b/scripts/import/import_celestrak_active.php @@ -9,7 +9,7 @@ declare(strict_types=1); * Tabellen: * - sat_satellites * - sat_tle_current - * - sat_import_runs + * - app_import_runs */ ini_set('display_errors', '1'); @@ -182,13 +182,15 @@ $recordsUpdated = 0; try { $stmtImportStart = $pdo->prepare(" - INSERT INTO sat_import_runs ( + INSERT INTO app_import_runs ( source, + source_url, started_at, status, message ) VALUES ( :source, + :source_url, NOW(), 'running', NULL @@ -196,6 +198,7 @@ try { "); $stmtImportStart->execute([ ':source' => $sourceName, + ':source_url' => $sourceUrl, ]); $importRunId = (int)$pdo->lastInsertId(); @@ -411,7 +414,7 @@ try { $pdo->commit(); $stmtImportFinish = $pdo->prepare(" - UPDATE sat_import_runs + UPDATE app_import_runs SET finished_at = NOW(), records_received = :records_received, @@ -440,7 +443,7 @@ try { if ($importRunId !== null) { $stmtImportError = $pdo->prepare(" - UPDATE sat_import_runs + UPDATE app_import_runs SET finished_at = NOW(), records_received = :records_received, diff --git a/scripts/import/import_tcrb.php b/scripts/import/import_tcrb.php new file mode 100644 index 0000000..28fd9e0 --- /dev/null +++ b/scripts/import/import_tcrb.php @@ -0,0 +1,704 @@ + PDO::ERRMODE_EXCEPTION, + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, + ] +); + +$tableName = DEFAULT_TABLE_NAME; + +if (!tableExists($pdo, $tableName)) { + writeMessage("Die Zieltabelle `{$tableName}` existiert noch nicht. Wir koennen sie im naechsten Schritt gemeinsam anlegen.", true); + exit(1); +} + +ensureImportRunsTableExists($pdo); + +$insertSql = <<prepare($insertSql); + +$pagesToImport = max(1, (int) ($options['pages'] ?? 1)); +$sourceHtmlPath = $options['html'] ?? null; +$sourceDirectoryPath = $options['dir'] ?? null; +$dryRun = (bool) ($options['dry-run'] ?? false); +$baseUrl = (string) ($options['url'] ?? DEFAULT_TCRB_URL); +$totalImported = 0; +$totalUpserts = 0; +$recordsInserted = 0; +$recordsUpdated = 0; +$importRunId = null; + +if ($sourceHtmlPath !== null && $sourceDirectoryPath !== null) { + writeMessage('Bitte entweder --html oder --dir verwenden, nicht beides gleichzeitig.', true); + exit(1); +} + +$importSources = []; + +if ($sourceDirectoryPath !== null) { + foreach (findHtmlFilesInDirectory($sourceDirectoryPath) as $filePath) { + $importSources[] = [ + 'label' => basename($filePath), + 'html' => loadHtmlFromFile($filePath), + 'is_local_file' => true, + ]; + } + + if (empty($importSources)) { + writeMessage("Im Ordner wurden keine importierbaren HTML/TXT-Dateien gefunden: {$sourceDirectoryPath}", true); + exit(1); + } +} elseif ($sourceHtmlPath !== null) { + $importSources[] = [ + 'label' => basename($sourceHtmlPath), + 'html' => loadHtmlFromFile($sourceHtmlPath), + 'is_local_file' => true, + ]; +} else { + for ($pageNumber = 1; $pageNumber <= $pagesToImport; $pageNumber++) { + $importSources[] = [ + 'label' => 'Seite ' . $pageNumber, + 'html' => downloadUrl(buildPagedUrl($baseUrl, $pageNumber)), + 'is_local_file' => false, + ]; + } +} + +if (!$dryRun) { + $stmtImportStart = $pdo->prepare(" + INSERT INTO app_import_runs ( + source, + source_url, + started_at, + status, + message + ) VALUES ( + :source, + :source_url, + NOW(), + 'running', + NULL + ) + "); + $stmtImportStart->execute([ + ':source' => DEFAULT_IMPORT_SOURCE, + ':source_url' => $sourceDirectoryPath !== null ? $sourceDirectoryPath : ($sourceHtmlPath !== null ? $sourceHtmlPath : $baseUrl), + ]); + $importRunId = (int) $pdo->lastInsertId(); +} + +foreach ($importSources as $sourceIndex => $source) { + $pageNumber = $sourceIndex + 1; + $html = (string) $source['html']; + + $pageData = parseWebObsPage($html); + + if (empty($pageData['observations'])) { + writeMessage(($source['label'] ?? ('Seite ' . $pageNumber)) . ': keine Beobachtungen gefunden.'); + if (($source['is_local_file'] ?? false) === true) { + continue; + } + continue; + } + + writeMessage(sprintf( + '%s: %d Beobachtungen fuer %s gefunden.', + (string) ($source['label'] ?? ('Seite ' . $pageNumber)), + count($pageData['observations']), + $pageData['target_name'] !== '' ? $pageData['target_name'] : 'T CrB' + )); + + if ($dryRun) { + $totalImported += count($pageData['observations']); + continue; + } + + $pdo->beginTransaction(); + + try { + foreach ($pageData['observations'] as $observation) { + $statement->execute([ + ':source_row_key' => $observation['source_row_key'], + ':star_name' => $observation['star_name'], + ':jd' => $observation['jd'], + ':observed_at_utc' => $observation['observed_at_utc'], + ':calendar_date_text' => $observation['calendar_date_text'], + ':magnitude' => $observation['magnitude'], + ':magnitude_error' => $observation['magnitude_error'], + ':filter_code' => $observation['filter_code'], + ':observer_code' => $observation['observer_code'], + ':notes_raw' => $observation['notes_raw'], + ]); + + $affectedRows = (int) $statement->rowCount(); + $totalUpserts += $affectedRows; + if ($affectedRows === 1) { + $recordsInserted++; + } elseif ($affectedRows >= 2) { + $recordsUpdated++; + } + $totalImported++; + } + + $pdo->commit(); + } catch (Throwable $e) { + if ($pdo->inTransaction()) { + $pdo->rollBack(); + } + + if ($importRunId !== null) { + $stmtImportError = $pdo->prepare(" + UPDATE app_import_runs + SET + finished_at = NOW(), + records_received = :records_received, + records_inserted = :records_inserted, + records_updated = :records_updated, + status = 'error', + message = :message + WHERE id = :id + "); + $stmtImportError->execute([ + ':records_received' => $totalImported, + ':records_inserted' => $recordsInserted, + ':records_updated' => $recordsUpdated, + ':message' => substr($e->getMessage(), 0, 65000), + ':id' => $importRunId, + ]); + } + + writeMessage('Import fehlgeschlagen bei ' . (string) ($source['label'] ?? ('Seite ' . $pageNumber)) . ': ' . $e->getMessage(), true); + exit(1); + } +} + +if ($dryRun) { + writeMessage("Dry-Run abgeschlossen. Parsbare Beobachtungen: {$totalImported}."); + exit(0); +} + +if ($importRunId !== null) { + $stmtImportFinish = $pdo->prepare(" + UPDATE app_import_runs + SET + finished_at = NOW(), + records_received = :records_received, + records_inserted = :records_inserted, + records_updated = :records_updated, + status = 'success', + message = NULL + WHERE id = :id + "); + $stmtImportFinish->execute([ + ':records_received' => $totalImported, + ':records_inserted' => $recordsInserted, + ':records_updated' => $recordsUpdated, + ':id' => $importRunId, + ]); +} + +writeMessage("Import abgeschlossen. Verarbeitete Beobachtungen: {$totalImported}. DB-Upserts: {$totalUpserts}."); +exit(0); + +function parseCliArguments(array $argv): array +{ + $options = [ + 'pages' => 1, + 'dry-run' => false, + 'help' => false, + ]; + + foreach (array_slice($argv, 1) as $argument) { + if ($argument === '--dry-run') { + $options['dry-run'] = true; + continue; + } + + if ($argument === '--help' || $argument === '-h') { + $options['help'] = true; + continue; + } + + if (str_starts_with($argument, '--pages=')) { + $options['pages'] = (int) substr($argument, 8); + continue; + } + + if (str_starts_with($argument, '--url=')) { + $options['url'] = (string) substr($argument, 6); + continue; + } + + if (str_starts_with($argument, '--html=')) { + $options['html'] = (string) substr($argument, 7); + continue; + } + + if (str_starts_with($argument, '--dir=')) { + $options['dir'] = (string) substr($argument, 6); + continue; + } + } + + return $options; +} + +function writeUsage(): void +{ + $usageLines = [ + 'Nutzung:', + ' php scripts/import/import_tcrb.php', + ' php scripts/import/import_tcrb.php --pages=3', + ' php scripts/import/import_tcrb.php --html=C:\pfad\webobs.html --dry-run', + ' php scripts/import/import_tcrb.php --dir=C:\Users\ich\Desktop\TCrB', + '', + 'Optionen:', + ' --pages=N Anzahl der zu ladenden Ergebnisseiten, Standard: 1', + ' --url=URL Basis-URL fuer den Abruf, Standard: AAVSO T CrB CCD', + ' --html=PFAD Liest die erste Seite aus einer lokalen HTML-Datei statt aus dem Web', + ' --dir=PFAD Liest alle HTML/TXT-Dateien aus einem Ordner in Dateinamen-Reihenfolge ein', + ' --dry-run Parst nur und schreibt nichts in die DB', + ' --help Diese Hilfe anzeigen', + ]; + + foreach ($usageLines as $line) { + writeMessage($line); + } +} + +function normalizeDbConfig(array $config): array +{ + $config['port'] = isset($config['port']) && (int) $config['port'] > 0 ? (int) $config['port'] : 3306; + $config['charset'] = isset($config['charset']) && $config['charset'] !== '' ? (string) $config['charset'] : 'utf8mb4'; + + return $config; +} + +function tableExists(PDO $pdo, string $tableName): bool +{ + $stmt = $pdo->prepare(' + SELECT COUNT(*) + FROM information_schema.TABLES + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = :table_name + '); + $stmt->execute([':table_name' => $tableName]); + + return (int) $stmt->fetchColumn() > 0; +} + +function ensureImportRunsTableExists(PDO $pdo): void +{ + $pdo->exec(" + CREATE TABLE IF NOT EXISTS `app_import_runs` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `source` varchar(32) NOT NULL, + `source_url` varchar(500) DEFAULT NULL, + `started_at` datetime NOT NULL, + `finished_at` datetime DEFAULT NULL, + `records_received` int(11) NOT NULL DEFAULT 0, + `records_inserted` int(11) NOT NULL DEFAULT 0, + `records_updated` int(11) NOT NULL DEFAULT 0, + `status` varchar(32) NOT NULL, + `message` text DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `idx_app_import_runs_source` (`source`), + KEY `idx_app_import_runs_started_at` (`started_at`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci + "); +} + +function loadHtmlFromFile(string $path): string +{ + if (!is_file($path)) { + throw new RuntimeException("HTML-Datei nicht gefunden: {$path}"); + } + + $html = file_get_contents($path); + if ($html === false || trim($html) === '') { + throw new RuntimeException("HTML-Datei konnte nicht gelesen werden: {$path}"); + } + + return $html; +} + +function findHtmlFilesInDirectory(string $directoryPath): array +{ + if (!is_dir($directoryPath)) { + throw new RuntimeException("Ordner nicht gefunden: {$directoryPath}"); + } + + $entries = scandir($directoryPath); + if ($entries === false) { + throw new RuntimeException("Ordner konnte nicht gelesen werden: {$directoryPath}"); + } + + $filePaths = []; + foreach ($entries as $entry) { + if ($entry === '.' || $entry === '..') { + continue; + } + + $fullPath = rtrim($directoryPath, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $entry; + if (!is_file($fullPath)) { + continue; + } + + $extension = strtolower((string) pathinfo($fullPath, PATHINFO_EXTENSION)); + if (!in_array($extension, ['html', 'htm', 'txt'], true)) { + continue; + } + + $filePaths[] = $fullPath; + } + + natsort($filePaths); + + return array_values($filePaths); +} + +function buildPagedUrl(string $baseUrl, int $pageNumber): string +{ + $parts = parse_url($baseUrl); + if ($parts === false) { + throw new RuntimeException('Ungueltige URL: ' . $baseUrl); + } + + $query = []; + parse_str((string) ($parts['query'] ?? ''), $query); + $query['page'] = $pageNumber; + + $scheme = $parts['scheme'] ?? 'https'; + $host = $parts['host'] ?? ''; + $path = $parts['path'] ?? ''; + $queryString = http_build_query($query); + + return $scheme . '://' . $host . $path . ($queryString !== '' ? '?' . $queryString : ''); +} + +function downloadUrl(string $url): string +{ + if (DIRECTORY_SEPARATOR === '\\' && function_exists('shell_exec')) { + $urlBase64 = base64_encode($url); + $powerShellScript = str_replace( + '__URL_BASE64__', + $urlBase64, + <<<'PS' +$ErrorActionPreference = 'Stop' +$ProgressPreference = 'SilentlyContinue' +$url = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('__URL_BASE64__')) +$response = Invoke-WebRequest -Uri $url -UseBasicParsing -Headers @{ 'User-Agent' = 'SkyView-TCrB-Importer/1.0' } +[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +$response.Content +PS + ); + + $encodedCommandBinary = function_exists('iconv') + ? iconv('UTF-8', 'UTF-16LE', $powerShellScript) + : $powerShellScript; + $encodedCommand = base64_encode($encodedCommandBinary === false ? $powerShellScript : $encodedCommandBinary); + $command = 'powershell -NoProfile -ExecutionPolicy Bypass -EncodedCommand ' . $encodedCommand; + $output = shell_exec($command); + + if ($output !== null && trim($output) !== '') { + return $output; + } + } + + if (function_exists('curl_init')) { + $ch = curl_init($url); + curl_setopt_array($ch, [ + CURLOPT_RETURNTRANSFER => true, + CURLOPT_FOLLOWLOCATION => true, + CURLOPT_CONNECTTIMEOUT => 15, + CURLOPT_TIMEOUT => 60, + CURLOPT_USERAGENT => 'SkyView-TCrB-Importer/1.0', + ]); + + $response = curl_exec($ch); + if ($response === false) { + $error = curl_error($ch); + curl_close($ch); + throw new RuntimeException('Download fehlgeschlagen: ' . $error); + } + + $httpCode = (int) curl_getinfo($ch, CURLINFO_RESPONSE_CODE); + curl_close($ch); + + if ($httpCode < 200 || $httpCode >= 300) { + throw new RuntimeException("Download fehlgeschlagen. HTTP-Status: {$httpCode}"); + } + + return (string) $response; + } + + $context = stream_context_create([ + 'http' => [ + 'method' => 'GET', + 'header' => implode("\r\n", [ + 'User-Agent: SkyView-TCrB-Importer/1.0', + ]), + 'timeout' => 60, + 'ignore_errors' => true, + ], + ]); + + $response = @file_get_contents($url, false, $context); + if ($response === false) { + throw new RuntimeException('Download fehlgeschlagen: keine Antwort erhalten.'); + } + + return $response; +} + +function parseWebObsPage(string $html): array +{ + libxml_use_internal_errors(true); + + $dom = new DOMDocument(); + $loaded = $dom->loadHTML($html); + libxml_clear_errors(); + + if ($loaded === false) { + throw new RuntimeException('HTML konnte nicht geparst werden.'); + } + + $xpath = new DOMXPath($dom); + + $targetName = ''; + $obsInfoNode = $xpath->query("//p[@id='obsinfo']")->item(0); + if ($obsInfoNode instanceof DOMNode) { + $obsInfoText = normalizeWhitespace($obsInfoNode->textContent); + if (preg_match('/for\s+(.+?)\s+from\s+/i', $obsInfoText, $matches) === 1) { + $targetName = trim($matches[1]); + } + } + + $observations = []; + $rowNodes = $xpath->query("//table[contains(@class,'observations')]/tbody/tr[contains(@class,'obs')]"); + if ($rowNodes === false) { + return [ + 'target_name' => $targetName, + 'observations' => [], + ]; + } + + foreach ($rowNodes as $rowNode) { + if (!$rowNode instanceof DOMElement) { + continue; + } + + $rowId = trim((string) $rowNode->getAttribute('id')); + $tdNodes = $xpath->query('./td', $rowNode); + if ($tdNodes === false || $tdNodes->length < 8) { + continue; + } + + $starName = normalizeWhitespace($tdNodes->item(1)?->textContent ?? ''); + $jdText = normalizeWhitespace($tdNodes->item(2)?->textContent ?? ''); + $calendarDateText = normalizeWhitespace($tdNodes->item(3)?->textContent ?? ''); + $magnitudeText = normalizeWhitespace($tdNodes->item(4)?->textContent ?? ''); + $magnitudeErrorText = normalizeWhitespace($tdNodes->item(5)?->textContent ?? ''); + $filterCode = normalizeWhitespace($tdNodes->item(6)?->textContent ?? ''); + $observerCode = normalizeWhitespace($tdNodes->item(7)?->textContent ?? ''); + + if ($jdText === '' || $magnitudeText === '') { + continue; + } + + $detailRow = $xpath->query("//tr[@id='{$rowId}-detail']")->item(0); + $notesRaw = null; + + if ($detailRow instanceof DOMElement) { + $detailCells = $xpath->query(".//table[contains(@class,'obs-detail')]/tbody/tr/td", $detailRow); + if ($detailCells !== false && $detailCells->length >= 6) { + $notesRaw = normalizeWhitespace($detailCells->item(5)?->textContent ?? ''); + $notesRaw = $notesRaw !== '' && $notesRaw !== '—' ? $notesRaw : null; + } + } + + $jd = (float) str_replace(',', '.', $jdText); + $observedAtUtc = jdToUtcString($jd); + + $observations[] = [ + 'source_row_key' => $rowId !== '' ? $rowId : null, + 'star_name' => $starName !== '' ? $starName : ($targetName !== '' ? $targetName : 'T CrB'), + 'jd' => number_format($jd, 6, '.', ''), + 'observed_at_utc' => $observedAtUtc, + 'calendar_date_text' => $calendarDateText !== '' ? $calendarDateText : null, + 'magnitude' => normalizeNumeric($magnitudeText), + 'magnitude_error' => $magnitudeErrorText !== '' ? normalizeNumeric($magnitudeErrorText) : null, + 'filter_code' => $filterCode !== '' ? $filterCode : null, + 'observer_code' => $observerCode !== '' ? $observerCode : null, + 'notes_raw' => $notesRaw, + ]; + } + + return [ + 'target_name' => $targetName, + 'observations' => $observations, + ]; +} + +function normalizeWhitespace(string $value): string +{ + $value = html_entity_decode($value, ENT_QUOTES | ENT_HTML5, 'UTF-8'); + $value = preg_replace('/\s+/u', ' ', trim($value)); + + return $value ?? ''; +} + +function normalizeNumeric(string $value): string +{ + return str_replace(',', '.', trim($value)); +} + +function jdToUtcString(float $jd): string +{ + $jd += 0.5; + $z = (int) floor($jd); + $f = $jd - $z; + + if ($z >= 2299161) { + $alpha = (int) floor(($z - 1867216.25) / 36524.25); + $a = $z + 1 + $alpha - (int) floor($alpha / 4); + } else { + $a = $z; + } + + $b = $a + 1524; + $c = (int) floor(($b - 122.1) / 365.25); + $d = (int) floor(365.25 * $c); + $e = (int) floor(($b - $d) / 30.6001); + + $day = $b - $d - (int) floor(30.6001 * $e) + $f; + $month = $e < 14 ? $e - 1 : $e - 13; + $year = $month > 2 ? $c - 4716 : $c - 4715; + + $dayInteger = (int) floor($day); + $dayFraction = $day - $dayInteger; + + $totalSeconds = (int) round($dayFraction * 86400); + if ($totalSeconds >= 86400) { + $totalSeconds = 86399; + } + + $hours = intdiv($totalSeconds, 3600); + $minutes = intdiv($totalSeconds % 3600, 60); + $seconds = $totalSeconds % 60; + + return sprintf( + '%04d-%02d-%02d %02d:%02d:%02d', + $year, + $month, + $dayInteger, + $hours, + $minutes, + $seconds + ); +} + +function writeMessage(string $message, bool $isError = false): void +{ + $prefix = '[' . date('Y-m-d H:i:s') . '] '; + $stream = $isError ? STDERR : STDOUT; + fwrite($stream, $prefix . $message . PHP_EOL); +}