Kaynağa Gözat

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 8 ay önce
ebeveyn
işleme
4e86e2241c
3 değiştirilmiş dosya ile 85 ekleme ve 21 silme
  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