Update public/network timelines, fix non-redis response and fix reblogs in home feed

This commit is contained in:
Daniel Supernault 2024-02-11 20:21:46 -07:00
parent 7b8977e9cc
commit 8b4ac5cc0b
No known key found for this signature in database
GPG key ID: 23740873EE6F76A1
3 changed files with 85 additions and 28 deletions

View file

@ -2523,6 +2523,7 @@ class ApiV1Controller extends Controller
$napi = $request->has(self::PF_API_ENTITY_KEY);
$min = $request->input('min_id');
$max = $request->input('max_id');
$minOrMax = $request->anyFilled(['max_id', 'min_id']);
$limit = $request->input('limit') ?? 20;
$user = $request->user();
@ -2535,6 +2536,8 @@ class ApiV1Controller extends Controller
$filtered = $user ? UserFilterService::filters($user->profile_id) : [];
AccountService::setLastActive($user->id);
$domainBlocks = UserFilterService::domainBlocks($user->profile_id);
$hideNsfw = config('instance.hide_nsfw_on_public_feeds');
$amin = SnowflakeService::byDate(now()->subDays(config('federation.network_timeline_days_falloff')));
if($remote) {
if(config('instance.timeline.network.cached')) {
@ -2554,35 +2557,79 @@ class ApiV1Controller extends Controller
} else {
$feed = Status::select(
'id',
'profile_id',
'uri',
'type',
'visibility',
'scope',
'local',
'created_at',
'profile_id',
'in_reply_to_id',
'reblog_of_id'
)
->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
->where('visibility', 'public')
->whereLocal(false)
->orderByDesc('id')
->take(($limit * 2))
->pluck('id');
)
->when($minOrMax, function($q, $minOrMax) use($min, $max) {
$dir = $min ? '>' : '<';
$id = $min ?? $max;
return $q->where('id', $dir, $id);
})
->whereNull(['in_reply_to_id', 'reblog_of_id'])
->when($hideNsfw, function($q, $hideNsfw) {
return $q->where('is_nsfw', false);
})
->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
->whereLocal(false)
->whereScope('public')
->where('id', '>', $amin)
->orderByDesc('id')
->limit(($limit * 2))
->pluck('id')
->values()
->toArray();
}
} else {
if(config('instance.timeline.local.cached')) {
Cache::remember('api:v1:timelines:public:cache_check', 10368000, function() {
if(PublicTimelineService::count() == 0) {
PublicTimelineService::warmCache(true, 400);
}
});
}
if($local || !$remote && !$local) {
Cache::remember('api:v1:timelines:public:cache_check', 10368000, function() {
if(PublicTimelineService::count() == 0) {
PublicTimelineService::warmCache(true, 400);
if ($max) {
$feed = PublicTimelineService::getRankedMaxId($max, $limit + 5);
} else if ($min) {
$feed = PublicTimelineService::getRankedMinId($min, $limit + 5);
} else {
$feed = PublicTimelineService::get(0, $limit + 5);
}
});
if ($max) {
$feed = PublicTimelineService::getRankedMaxId($max, $limit + 5);
} else if ($min) {
$feed = PublicTimelineService::getRankedMinId($min, $limit + 5);
} else {
$feed = PublicTimelineService::get(0, $limit + 5);
$feed = Status::select(
'id',
'uri',
'type',
'scope',
'local',
'created_at',
'profile_id',
'in_reply_to_id',
'reblog_of_id'
)
->when($minOrMax, function($q, $minOrMax) use($min, $max) {
$dir = $min ? '>' : '<';
$id = $min ?? $max;
return $q->where('id', $dir, $id);
})
->whereNull(['in_reply_to_id', 'reblog_of_id'])
->when($hideNsfw, function($q, $hideNsfw) {
return $q->where('is_nsfw', false);
})
->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album'])
->whereLocal(true)
->whereScope('public')
->where('id', '>', $amin)
->orderByDesc('id')
->limit(($limit * 2))
->pluck('id')
->values()
->toArray();
}
}

View file

@ -29,6 +29,7 @@ return [
],
'local' => [
'cached' => env('INSTANCE_PUBLIC_TIMELINE_CACHED', false),
'is_public' => env('INSTANCE_PUBLIC_LOCAL_TIMELINE', false)
],

View file

@ -187,7 +187,7 @@
forceUpdateIdx: 0,
showReblogBanner: false,
enablingReblogs: false,
baseApi: '/api/v1/pixelfed/timelines/',
baseApi: '/api/v1/timelines/',
}
},
@ -204,7 +204,7 @@
}
if(window.App.config.ab.hasOwnProperty('cached_home_timeline')) {
const cht = window.App.config.ab.cached_home_timeline == true;
this.baseApi = cht ? '/api/v1/timelines/' : '/api/pixelfed/v1/timelines/';
this.baseApi = cht ? '/api/v1/timelines/' : '/api/v1/timelines/';
}
this.fetchSettings();
},
@ -261,10 +261,19 @@
}
} else {
url = this.baseApi + this.getScope();
params = {
max_id: this.max_id,
limit: 6,
'_pe': 1,
if(this.max_id === 0) {
params = {
min_id: 1,
limit: 6,
'_pe': 1,
}
} else {
params = {
max_id: this.max_id,
limit: 6,
'_pe': 1,
}
}
}
if(this.getScope() === 'network') {