Просмотр исходного кода

Fix homepage plugin configuration inconsistencies

- Fix userWatchStats plugin config keys to match default config pattern:
  - Update userWatchStatsURL → homepageUserWatchStatsURL
  - Update userWatchStatsApikey → homepageUserWatchStatsToken
  - Update all related config references throughout the plugin

- Fix JellyStat plugin permissions to include API key validation:
  - Add jellyStatApikey to required 'not_empty' checks in permissions
  - This ensures both URL and API key are validated before allowing access

These changes resolve API endpoint authorization errors by ensuring
proper configuration validation for both homepage plugins.
mgomon 10 месяцев назад
Родитель
Сommit
4e86e2241c
3 измененных файлов с 85 добавлено и 21 удалено
  1. 4 2
      api/homepage/jellystat.php
  2. 19 19
      api/homepage/userWatchStats.php
  3. 62 0
      server.log

+ 4 - 2
api/homepage/jellystat.php

@@ -146,7 +146,8 @@ trait JellyStatHomepageItem
                     'homepageJellyStatAuth',
                 ],
                 'not_empty' => [
-                    'jellyStatURL'
+                    'jellyStatURL',
+                    'jellyStatApikey'
                 ]
             ],
             'main' => [
@@ -157,7 +158,8 @@ trait JellyStatHomepageItem
                     'homepageJellyStatAuth'
                 ],
                 'not_empty' => [
-                    'jellyStatURL'
+                    'jellyStatURL',
+                    'jellyStatApikey'
                 ]
             ]
         ];

+ 19 - 19
api/homepage/userWatchStats.php

@@ -32,10 +32,10 @@ trait HomepageUserWatchStats
                         ['name' => 'Emby', 'value' => 'emby'],
                         ['name' => 'Jellyfin', 'value' => 'jellyfin']
                     ]]),
-                    $this->settingsOption('url', 'userWatchStatsURL'),
-                    $this->settingsOption('token', 'userWatchStatsApikey'),
-                    $this->settingsOption('disable-cert-check', 'userWatchStatsDisableCertCheck'),
-                    $this->settingsOption('use-custom-certificate', 'userWatchStatsUseCustomCertificate'),
+                    $this->settingsOption('url', 'homepageUserWatchStatsURL'),
+                    $this->settingsOption('token', 'homepageUserWatchStatsToken'),
+                    $this->settingsOption('disable-cert-check', 'homepageUserWatchStatsDisableCertCheck'),
+                    $this->settingsOption('use-custom-certificate', 'homepageUserWatchStatsUseCustomCertificate'),
                 ],
                 'Display Options' => [
                     $this->settingsOption('number', 'homepageUserWatchStatsRefresh', ['label' => 'Auto-refresh Interval (minutes)', 'min' => 1, 'max' => 60]),
@@ -65,10 +65,10 @@ trait HomepageUserWatchStats
         $mediaServer = $this->config['homepageUserWatchStatsService'] ?? 'plex';
         
         // Get URL and token from plugin-specific config  
-        $url = $this->config['userWatchStatsURL'] ?? '';
-        $token = $this->config['userWatchStatsApikey'] ?? '';
-        $disableCert = $this->config['userWatchStatsDisableCertCheck'] ?? false;
-        $customCert = $this->config['userWatchStatsUseCustomCertificate'] ?? false;
+        $url = $this->config['homepageUserWatchStatsURL'] ?? '';
+        $token = $this->config['homepageUserWatchStatsToken'] ?? '';
+        $disableCert = $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false;
+        $customCert = $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false;
         
         if (empty($url) || empty($token)) {
             $serverName = ucfirst($mediaServer) . ($mediaServer === 'plex' ? ' (Tautulli)' : '');
@@ -139,8 +139,8 @@ trait HomepageUserWatchStats
                     'homepageUserWatchStatsAuth',
                 ],
                 'not_empty' => [
-                    'userWatchStatsURL',
-                    'userWatchStatsApikey'
+                    'homepageUserWatchStatsURL',
+                    'homepageUserWatchStatsToken'
                 ]
             ],
             'main' => [
@@ -151,8 +151,8 @@ trait HomepageUserWatchStats
                     'homepageUserWatchStatsAuth'
                 ],
                 'not_empty' => [
-                    'userWatchStatsURL',
-                    'userWatchStatsApikey'
+                    'homepageUserWatchStatsURL',
+                    'homepageUserWatchStatsToken'
                 ]
             ]
         ];
@@ -375,8 +375,8 @@ trait HomepageUserWatchStats
      */
     private function getEmbyWatchStats($days = 30)
     {
-        $embyUrl = $this->config['userWatchStatsURL'] ?? '';
-        $embyToken = $this->config['userWatchStatsApikey'] ?? '';
+        $embyUrl = $this->config['homepageUserWatchStatsURL'] ?? '';
+        $embyToken = $this->config['homepageUserWatchStatsToken'] ?? '';
         
         if (empty($embyUrl) || empty($embyToken)) {
             return ['error' => true, 'message' => 'Emby URL or API key not configured'];
@@ -513,7 +513,7 @@ trait HomepageUserWatchStats
                   '&SortBy=DateCreated&SortOrder=Descending&Limit=10';
         
         try {
-            $options = $this->requestOptions($url, null, $this->config['userWatchStatsDisableCertCheck'] ?? false, $this->config['userWatchStatsUseCustomCertificate'] ?? false);
+            $options = $this->requestOptions($url, null, $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false, $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false);
             $response = Requests::get($apiURL, [], $options);
             
             if ($response->success) {
@@ -549,7 +549,7 @@ trait HomepageUserWatchStats
         $apiURL = rtrim($url, '/') . '/emby/System/ActivityLog/Entries?api_key=' . $token . '&Limit=1000&HasUserId=true';
         
         try {
-            $options = $this->requestOptions($url, null, $this->config['userWatchStatsDisableCertCheck'] ?? false, $this->config['userWatchStatsUseCustomCertificate'] ?? false);
+            $options = $this->requestOptions($url, null, $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false, $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false);
             $response = Requests::get($apiURL, [], $options);
             
             if ($response->success) {
@@ -625,7 +625,7 @@ trait HomepageUserWatchStats
                   '&Fields=Name,PlayCount,UserData,RunTimeTicks,ProductionYear&SortBy=PlayCount&SortOrder=Descending';
         
         try {
-            $options = $this->requestOptions($url, null, $this->config['userWatchStatsDisableCertCheck'] ?? false, $this->config['userWatchStatsUseCustomCertificate'] ?? false);
+            $options = $this->requestOptions($url, null, $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false, $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false);
             $response = Requests::get($apiURL, [], $options);
             
             if ($response->success) {
@@ -671,7 +671,7 @@ trait HomepageUserWatchStats
         $apiURL = rtrim($url, '/') . '/emby/Users?api_key=' . $token;
         
         try {
-            $options = $this->requestOptions($url, null, $this->config['userWatchStatsDisableCertCheck'] ?? false, $this->config['userWatchStatsUseCustomCertificate'] ?? false);
+            $options = $this->requestOptions($url, null, $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false, $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false);
             $response = Requests::get($apiURL, [], $options);
             
             if ($response->success) {
@@ -693,7 +693,7 @@ trait HomepageUserWatchStats
         $apiURL = rtrim($url, '/') . '/emby/Items/Latest?api_key=' . $token . '&Limit=10&Recursive=true&IncludeItemTypes=Movie,Episode';
         
         try {
-            $options = $this->requestOptions($url, null, $this->config['userWatchStatsDisableCertCheck'] ?? false, $this->config['userWatchStatsUseCustomCertificate'] ?? false);
+            $options = $this->requestOptions($url, null, $this->config['homepageUserWatchStatsDisableCertCheck'] ?? false, $this->config['homepageUserWatchStatsUseCustomCertificate'] ?? false);
             $response = Requests::get($apiURL, [], $options);
             
             if ($response->success) {

+ 62 - 0
server.log

@@ -0,0 +1,62 @@
+[Sun Aug  3 21:10:29 2025] PHP 8.4.10 Development Server (http://localhost:8000) started
+[Sun Aug  3 21:10:30 2025] [::1]:60223 Accepted
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\queue(): Implicitly marking parameter $assign as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 24
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\each(): Implicitly marking parameter $onFulfilled as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 260
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\each(): Implicitly marking parameter $onRejected as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 260
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\each_limit(): Implicitly marking parameter $onFulfilled as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 285
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\each_limit(): Implicitly marking parameter $onRejected as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 285
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  GuzzleHttp\Promise\each_limit_all(): Implicitly marking parameter $onFulfilled as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/guzzlehttp/promises/src/functions.php on line 307
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::times(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 117
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::filter(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 490
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::when(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 507
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::whenEmpty(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 525
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::whenNotEmpty(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 537
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::unless(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 550
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::unlessEmpty(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 562
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::unlessNotEmpty(): Implicitly marking parameter $default as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 574
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::first(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 757
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::last(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1007
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Collection::sort(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1566
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1911
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1922
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1934
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1949
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1890
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1869
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1838
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Arr::first(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Arr.php on line 162
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Tightenco\Collect\Support\Arr::last(): Implicitly marking parameter $callback as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Arr.php on line 191
+[Sun Aug  3 21:10:30 2025] PHP Deprecated:  Organizr::setResponse(): Implicitly marking parameter $message as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/classes/organizr.class.php on line 762
+[Sun Aug  3 21:10:30 2025] PHP Fatal error:  Trait method JellyStatHomepageItem::formatDuration has not been applied as Organizr::formatDuration, because of collision with HomepageUserWatchStats::formatDuration in /Users/mgomon/Documents/Code/organizr/api/classes/organizr.class.php on line 5
+[Sun Aug  3 21:10:30 2025] [::1]:60223 [200]: GET /api/v2/homepage/jellystat - Trait method JellyStatHomepageItem::formatDuration has not been applied as Organizr::formatDuration, because of collision with HomepageUserWatchStats::formatDuration in /Users/mgomon/Documents/Code/organizr/api/classes/organizr.class.php on line 5
+[Sun Aug  3 21:10:30 2025] [::1]:60223 Closing
+[Sun Aug  3 21:30:41 2025] [::1]:62129 Accepted
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1911
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1922
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1934
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1949
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1890
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1869
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1838
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Organizr::setResponse(): Implicitly marking parameter $message as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/classes/organizr.class.php on line 764
+[Sun Aug  3 21:30:41 2025] PHP Warning:  Undefined array key "QUERY_STRING" in /Users/mgomon/Documents/Code/organizr/api/v2/index.php on line 72
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /Users/mgomon/Documents/Code/organizr/api/v2/index.php on line 73
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Slim\Psr7\Factory\StreamFactory::createStreamFromFile(): Implicitly marking parameter $cache as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/slim/psr7/src/Factory/StreamFactory.php on line 52
+[Sun Aug  3 21:30:41 2025] PHP Deprecated:  Slim\Psr7\Factory\StreamFactory::createStreamFromResource(): Implicitly marking parameter $cache as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/slim/psr7/src/Factory/StreamFactory.php on line 105
+[Sun Aug  3 21:30:42 2025] PHP Deprecated:  Slim\Psr7\Stream::__construct(): Implicitly marking parameter $cache as nullable is deprecated, the explicit nullable type must be used instead in /Users/mgomon/Documents/Code/organizr/api/vendor/slim/psr7/src/Stream.php on line 97
+[Sun Aug  3 21:30:42 2025] PHP Warning:  Cannot modify header information - headers already sent by (output started at /Users/mgomon/Documents/Code/organizr/api/vendor/slim/psr7/src/Stream.php:97) in /Users/mgomon/Documents/Code/organizr/api/functions/normal-functions.php on line 343
+[Sun Aug  3 21:30:42 2025] PHP Warning:  Cannot modify header information - headers already sent by (output started at /Users/mgomon/Documents/Code/organizr/api/vendor/slim/psr7/src/Stream.php:97) in /Users/mgomon/Documents/Code/organizr/api/functions/normal-functions.php on line 349
+[Sun Aug  3 21:30:42 2025] [::1]:62129 [200]: GET /api/v2/homepage
+[Sun Aug  3 21:30:42 2025] [::1]:62129 Closing
+[Sun Aug  3 21:31:02 2025] [::1]:62158 Accepted
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetExists($key) should either be compatible with ArrayAccess::offsetExists(mixed $offset): bool, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1911
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetGet($key) should either be compatible with ArrayAccess::offsetGet(mixed $offset): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1922
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetSet($key, $value) should either be compatible with ArrayAccess::offsetSet(mixed $offset, mixed $value): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1934
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::offsetUnset($key) should either be compatible with ArrayAccess::offsetUnset(mixed $offset): void, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1949
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::count() should either be compatible with Countable::count(): int, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1890
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::getIterator() should either be compatible with IteratorAggregate::getIterator(): Traversable, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1869
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  Return type of Tightenco\Collect\Support\Collection::jsonSerialize() should either be compatible with JsonSerializable::jsonSerialize(): mixed, or the #[\ReturnTypeWillChange] attribute should be used to temporarily suppress the notice in /Users/mgomon/Documents/Code/organizr/api/vendor/tightenco/collect/src/Collect/Support/Collection.php on line 1838
+[Sun Aug  3 21:31:02 2025] PHP Warning:  Undefined array key "QUERY_STRING" in /Users/mgomon/Documents/Code/organizr/api/v2/index.php on line 72
+[Sun Aug  3 21:31:02 2025] PHP Deprecated:  stripos(): Passing null to parameter #1 ($haystack) of type string is deprecated in /Users/mgomon/Documents/Code/organizr/api/v2/index.php on line 73
+[Sun Aug  3 21:31:02 2025] [::1]:62158 [401]: GET /api/v2/homepage/jellystat
+[Sun Aug  3 21:31:02 2025] [::1]:62158 Closing