Răsfoiți Sursa

Update discover, add network trending using Beagle API

Daniel Supernault 1 an în urmă
părinte
comite
2cae8b48de

+ 8 - 0
app/Http/Controllers/DiscoverController.php

@@ -11,6 +11,7 @@ use App\Services\BookmarkService;
 use App\Services\ConfigCacheService;
 use App\Services\FollowerService;
 use App\Services\HashtagService;
+use App\Services\Internal\BeagleService;
 use App\Services\LikeService;
 use App\Services\ReblogService;
 use App\Services\SnowflakeService;
@@ -420,4 +421,11 @@ class DiscoverController extends Controller
 
         return response()->json($ids, 200, [], JSON_UNESCAPED_SLASHES);
     }
+
+    public function discoverNetworkTrending(Request $request)
+    {
+        abort_if(! $request->user(), 404);
+
+        return BeagleService::getDiscoverPosts();
+    }
 }

+ 69 - 5
app/Services/Internal/BeagleService.php

@@ -2,18 +2,23 @@
 
 namespace App\Services\Internal;
 
-use Illuminate\Support\Facades\Cache;
-use Illuminate\Support\Facades\Http;
+use App\Services\InstanceService;
+use App\Services\StatusService;
+use App\Util\ActivityPub\Helpers;
 use Illuminate\Http\Client\ConnectionException;
 use Illuminate\Http\Client\RequestException;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Http;
 
 class BeagleService
 {
     const DEFAULT_RULES_CACHE_KEY = 'pf:services:beagle:default_rules:v1';
 
+    const DISCOVER_CACHE_KEY = 'pf:services:beagle:discover:v1';
+
     public static function getDefaultRules()
     {
-        return Cache::remember(self::DEFAULT_RULES_CACHE_KEY, now()->addDays(7), function() {
+        return Cache::remember(self::DEFAULT_RULES_CACHE_KEY, now()->addDays(7), function () {
             try {
                 $res = Http::withOptions(['allow_redirects' => false])
                     ->timeout(5)
@@ -28,17 +33,76 @@ class BeagleService
                 return;
             }
 
-            if(!$res->ok()) {
+            if (! $res->ok()) {
                 return;
             }
 
             $json = $res->json();
 
-            if(!isset($json['rule_suggestions']) || !count($json['rule_suggestions'])) {
+            if (! isset($json['rule_suggestions']) || ! count($json['rule_suggestions'])) {
                 return [];
             }
+
             return $json['rule_suggestions'];
         });
     }
 
+    public static function getDiscover()
+    {
+        return Cache::remember(self::DISCOVER_CACHE_KEY, now()->addHours(6), function () {
+            try {
+                $res = Http::withOptions(['allow_redirects' => false])
+                    ->withHeaders([
+                        'X-Pixelfed-Api' => 1,
+                    ])->timeout(5)
+                    ->connectTimeout(5)
+                    ->retry(2, 500)
+                    ->get('https://beagle.pixelfed.net/api/v1/discover');
+            } catch (RequestException $e) {
+                return;
+            } catch (ConnectionException $e) {
+                return;
+            } catch (Exception $e) {
+                return;
+            }
+
+            if (! $res->ok()) {
+                return;
+            }
+
+            $json = $res->json();
+
+            if (! isset($json['statuses']) || ! count($json['statuses'])) {
+                return [];
+            }
+
+            return $json['statuses'];
+        });
+    }
+
+    public static function getDiscoverPosts()
+    {
+        $posts = collect(self::getDiscover())
+            ->filter(function ($post) {
+                $bannedInstances = InstanceService::getBannedDomains();
+                $domain = parse_url($post['id'], PHP_URL_HOST);
+
+                return ! in_array($domain, $bannedInstances);
+            })
+            ->map(function ($post) {
+                $domain = parse_url($post['id'], PHP_URL_HOST);
+                if ($domain === config_cache('pixelfed.domain.app')) {
+                    $parts = explode('/', $post['id']);
+                    $id = array_last($parts);
+
+                    return StatusService::get($id);
+                }
+
+                return Helpers::statusFetch($post['id']);
+            })
+            ->values()
+            ->toArray();
+
+        return $posts;
+    }
 }

+ 1 - 0
routes/api.php

@@ -177,6 +177,7 @@ Route::group(['prefix' => 'api'], function() use($middleware) {
             Route::get('accounts/popular', 'Api\ApiV1Controller@discoverAccountsPopular')->middleware($middleware);
             Route::get('posts/trending', 'DiscoverController@trendingApi')->middleware($middleware);
             Route::get('posts/hashtags', 'DiscoverController@trendingHashtags')->middleware($middleware);
+            Route::get('posts/network/trending', 'DiscoverController@discoverNetworkTrending')->middleware($middleware);
         });
 
         Route::group(['prefix' => 'directory'], function () use($middleware) {