Initial Commit
linter / quality (push) Canceled after 0s
tests / ci (8.3) (push) Canceled after 0s
tests / ci (8.4) (push) Canceled after 0s
tests / ci (8.5) (push) Canceled after 0s

This commit is contained in:
2026-08-29 00:17:41 +10:00
parent 37ff8e0a88
commit b2f2d8b104
13 changed files with 378 additions and 35 deletions
+37 -19
View File
@@ -3,6 +3,7 @@
namespace App\Console\Commands;
use App\Models\Post;
use App\Services\PostMediaCacher;
use Illuminate\Console\Attributes\Description;
use Illuminate\Console\Attributes\Signature;
@@ -21,28 +22,45 @@ class ScrapeFeed extends RunsPlaywrightScript
return;
}
$mediaCacher = app(PostMediaCacher::class);
$posts = json_decode(file_get_contents($path), true);
foreach ($posts as $post) {
Post::updateOrCreate(
['id' => $post['id']],
[
'code' => $post['code'],
'username' => $post['username'],
'full_name' => $post['full_name'],
'caption' => $post['caption'],
'accessibility_caption' => $post['accessibility_caption'],
'is_video' => $post['is_video'],
'is_carousel' => $post['is_carousel'],
'like_count' => $post['like_count'],
'comment_count' => $post['comment_count'],
'taken_at' => $post['taken_at'],
'image_url' => $post['image_url'],
'video_url' => $post['video_url'],
'carousel_images' => $post['carousel_images'],
'profile_pic_url' => $post['profile_pic_url'],
]
);
$attributes = [
'code' => $post['code'],
'username' => $post['username'],
'full_name' => $post['full_name'],
'caption' => $post['caption'],
'accessibility_caption' => $post['accessibility_caption'],
'is_video' => $post['is_video'],
'is_carousel' => $post['is_carousel'],
'like_count' => $post['like_count'],
'comment_count' => $post['comment_count'],
'taken_at' => $post['taken_at'],
'image_url' => $post['image_url'],
'video_url' => $post['video_url'],
'carousel_images' => $post['carousel_images'],
'profile_pic_url' => $post['profile_pic_url'],
];
$existing = Post::find($post['id']);
// Once a post's media has been cached locally, its url columns
// no longer point at Instagram — don't let a re-scrape clobber
// them with a freshly (and just as temporarily) signed CDN url.
if ($existing) {
if (! $mediaCacher->isInstagramUrl($existing->image_url)) {
unset($attributes['image_url']);
}
if (! $mediaCacher->isInstagramUrl($existing->video_url)) {
unset($attributes['video_url']);
}
if ($existing->carousel_images && ! $mediaCacher->isInstagramUrl($existing->carousel_images[0]['url'] ?? null)) {
unset($attributes['carousel_images']);
}
}
Post::updateOrCreate(['id' => $post['id']], $attributes);
}
$this->info('Upserted ' . count($posts) . ' posts.');