diff --git a/.env.example b/.env.example index eb423aaa..4235fe34 100644 --- a/.env.example +++ b/.env.example @@ -81,3 +81,5 @@ LOG_SLACK_WEBHOOK_URL= FLARE_KEY= IGNITION_OPEN_AI_KEY= + +BRIDGY_MASTODON_TOKEN= diff --git a/app/Console/Commands/ReprocessMediaImages.php b/app/Console/Commands/ReprocessMediaImages.php index c5e22d1b..299f0103 100644 --- a/app/Console/Commands/ReprocessMediaImages.php +++ b/app/Console/Commands/ReprocessMediaImages.php @@ -25,20 +25,18 @@ class ReprocessMediaImages extends Command $dryRun = $this->option('dry-run'); - $this->info("Found {$media->count()} images to reprocess.".($dryRun ? ' (dry run)' : '')); + $this->info("Found {$media->count()} images to reprocess." . ($dryRun ? ' (dry run)' : '')); foreach ($media as $item) { $path = $item->path; if (! Storage::disk('public')->exists($path)) { $this->warn("{$path}: original not found on public disk, skipping."); - continue; } if ($dryRun) { $this->line("{$path} ({$item->image_widths}px wide)"); - continue; } @@ -48,8 +46,7 @@ class ReprocessMediaImages extends Command $file = Storage::disk('public')->get($path); $image = $manager->read($file); } catch (DecoderException) { - $this->warn(' Could not decode image, skipping.'); - + $this->warn(" Could not decode image, skipping."); continue; } @@ -63,9 +60,9 @@ class ReprocessMediaImages extends Command $small = $image->scale(width: 500); Storage::disk('public')->put($basename.'-small.'.$extension, (string) $small->encode()); - $this->info(' Done.'); + $this->info(" Done."); } - $this->info('Reprocessing complete.'.($dryRun ? ' (dry run — no files were changed)' : '')); + $this->info('Reprocessing complete.' . ($dryRun ? ' (dry run — no files were changed)' : '')); } } diff --git a/app/Jobs/SyndicateNoteToBluesky.php b/app/Jobs/SyndicateNoteToBluesky.php index a306801b..f9f2486b 100644 --- a/app/Jobs/SyndicateNoteToBluesky.php +++ b/app/Jobs/SyndicateNoteToBluesky.php @@ -17,11 +17,6 @@ class SyndicateNoteToBluesky implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - /** - * Only try once — retrying would send Bridgy a duplicate publish webmention. - */ - public int $tries = 1; - /** * Create a new job instance. */ @@ -36,32 +31,32 @@ class SyndicateNoteToBluesky implements ShouldQueue */ public function handle(Client $guzzle): void { - $response = $guzzle->request( - 'POST', - 'https://brid.gy/publish/webmention', - [ - 'headers' => [ - 'Accept' => 'application/json', - ], - 'form_params' => [ - 'source' => $this->note->uri, - 'target' => 'https://brid.gy/publish/bluesky', - ], - 'http_errors' => false, - ] - ); - - $body = json_decode((string) $response->getBody(), true); - - if ($response->getStatusCode() === 201) { - $this->note->bluesky_url = $body['url']; - $this->note->save(); - + // We can only make the request if we have an access token + if (config('bridgy.bluesky_token') === null) { return; } - throw new \RuntimeException( - 'Bridgy publish to Bluesky failed: '.($body['error'] ?? (string) $response->getBody()) + // Make micropub request + $response = $guzzle->request( + 'POST', + 'https://brid.gy/micropub', + [ + 'headers' => [ + 'Authorization' => 'Bearer '.config('bridgy.bluesky_token'), + ], + 'json' => [ + 'type' => ['h-entry'], + 'properties' => [ + 'content' => [$this->note->getRawOriginal('note')], + ], + ], + ] ); + + // Parse for syndication URL + if ($response->getStatusCode() === 201) { + $this->note->bluesky_url = $response->getHeader('Location')[0]; + $this->note->save(); + } } } diff --git a/app/Jobs/SyndicateNoteToMastodon.php b/app/Jobs/SyndicateNoteToMastodon.php index 456680e2..07ea3b71 100644 --- a/app/Jobs/SyndicateNoteToMastodon.php +++ b/app/Jobs/SyndicateNoteToMastodon.php @@ -17,11 +17,6 @@ class SyndicateNoteToMastodon implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - /** - * Only try once — retrying would send Bridgy a duplicate publish webmention. - */ - public int $tries = 1; - /** * Create a new job instance. */ @@ -36,32 +31,33 @@ class SyndicateNoteToMastodon implements ShouldQueue */ public function handle(Client $guzzle): void { - $response = $guzzle->request( - 'POST', - 'https://brid.gy/publish/webmention', - [ - 'headers' => [ - 'Accept' => 'application/json', - ], - 'form_params' => [ - 'source' => $this->note->uri, - 'target' => 'https://brid.gy/publish/mastodon', - ], - 'http_errors' => false, - ] - ); - - $body = json_decode((string) $response->getBody(), true); - - if ($response->getStatusCode() === 201) { - $this->note->mastodon_url = $body['url']; - $this->note->save(); - + // We can only make the request if we have an access token + if (config('bridgy.mastodon_token') === null) { return; } - throw new \RuntimeException( - 'Bridgy publish to Mastodon failed: '.($body['error'] ?? (string) $response->getBody()) + // Make micropub request + $response = $guzzle->request( + 'POST', + 'https://brid.gy/micropub', + [ + 'headers' => [ + 'Authorization' => 'Bearer '.config('bridgy.mastodon_token'), + ], + 'json' => [ + 'type' => ['h-entry'], + 'properties' => [ + 'content' => [$this->note->getRawOriginal('note')], + ], + ], + ] ); + + // Parse for syndication URL + if ($response->getStatusCode() === 201) { + $mastodonUrl = $response->getHeader('Location')[0]; + $this->note->mastodon_url = $mastodonUrl; + $this->note->save(); + } } } diff --git a/config/bridgy.php b/config/bridgy.php new file mode 100644 index 00000000..5314afa4 --- /dev/null +++ b/config/bridgy.php @@ -0,0 +1,31 @@ + env('BRIDGY_MASTODON_TOKEN'), + + /* + |-------------------------------------------------------------------------- + | Bluesky Token + |-------------------------------------------------------------------------- + | + | When syndicating posts to Bluesky using Brid.gy’s Micropub endpoint, we + | need to provide an access token. This token can be generated by going to + | https://brid.gy/bluesky and clicking the “Get token” button. + | + */ + + 'bluesky_token' => env('BRIDGY_BLUESKY_TOKEN'), + +]; diff --git a/resources/views/templates/note.blade.php b/resources/views/templates/note.blade.php index 8e83d5d8..b0893387 100644 --- a/resources/views/templates/note.blade.php +++ b/resources/views/templates/note.blade.php @@ -1,10 +1,4 @@