Switch Bridgy syndication from Micropub to webmention
Bridgy's Micropub endpoint required per-silo access tokens and posted raw markdown content directly. Switch to Bridgy's webmention publish endpoint instead: POST source/target to /publish/webmention and let Bridgy re-fetch the note page, which now carries hidden verification links for silos not yet syndicated. Removes the now-unused config/bridgy.php and BRIDGY_MASTODON_TOKEN env var, and caps both jobs to a single try since retries would send Bridgy a duplicate publish webmention.
This commit is contained in:
parent
11e2c469cb
commit
db09718a96
9 changed files with 167 additions and 94 deletions
|
|
@ -25,18 +25,20 @@ 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;
|
||||
}
|
||||
|
||||
|
|
@ -46,7 +48,8 @@ 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;
|
||||
}
|
||||
|
||||
|
|
@ -60,9 +63,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)' : ''));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ 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.
|
||||
*/
|
||||
|
|
@ -31,32 +36,32 @@ class SyndicateNoteToBluesky implements ShouldQueue
|
|||
*/
|
||||
public function handle(Client $guzzle): void
|
||||
{
|
||||
// We can only make the request if we have an access token
|
||||
if (config('bridgy.bluesky_token') === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Make micropub request
|
||||
$response = $guzzle->request(
|
||||
'POST',
|
||||
'https://brid.gy/micropub',
|
||||
'https://brid.gy/publish/webmention',
|
||||
[
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer '.config('bridgy.bluesky_token'),
|
||||
'Accept' => 'application/json',
|
||||
],
|
||||
'json' => [
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'content' => [$this->note->getRawOriginal('note')],
|
||||
],
|
||||
'form_params' => [
|
||||
'source' => $this->note->uri,
|
||||
'target' => 'https://brid.gy/publish/bluesky',
|
||||
],
|
||||
'http_errors' => false,
|
||||
]
|
||||
);
|
||||
|
||||
// Parse for syndication URL
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
if ($response->getStatusCode() === 201) {
|
||||
$this->note->bluesky_url = $response->getHeader('Location')[0];
|
||||
$this->note->bluesky_url = $body['url'];
|
||||
$this->note->save();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
throw new \RuntimeException(
|
||||
'Bridgy publish to Bluesky failed: '.($body['error'] ?? (string) $response->getBody())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,6 +17,11 @@ 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.
|
||||
*/
|
||||
|
|
@ -31,33 +36,32 @@ class SyndicateNoteToMastodon implements ShouldQueue
|
|||
*/
|
||||
public function handle(Client $guzzle): void
|
||||
{
|
||||
// We can only make the request if we have an access token
|
||||
if (config('bridgy.mastodon_token') === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Make micropub request
|
||||
$response = $guzzle->request(
|
||||
'POST',
|
||||
'https://brid.gy/micropub',
|
||||
'https://brid.gy/publish/webmention',
|
||||
[
|
||||
'headers' => [
|
||||
'Authorization' => 'Bearer '.config('bridgy.mastodon_token'),
|
||||
'Accept' => 'application/json',
|
||||
],
|
||||
'json' => [
|
||||
'type' => ['h-entry'],
|
||||
'properties' => [
|
||||
'content' => [$this->note->getRawOriginal('note')],
|
||||
],
|
||||
'form_params' => [
|
||||
'source' => $this->note->uri,
|
||||
'target' => 'https://brid.gy/publish/mastodon',
|
||||
],
|
||||
'http_errors' => false,
|
||||
]
|
||||
);
|
||||
|
||||
// Parse for syndication URL
|
||||
$body = json_decode((string) $response->getBody(), true);
|
||||
|
||||
if ($response->getStatusCode() === 201) {
|
||||
$mastodonUrl = $response->getHeader('Location')[0];
|
||||
$this->note->mastodon_url = $mastodonUrl;
|
||||
$this->note->mastodon_url = $body['url'];
|
||||
$this->note->save();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
throw new \RuntimeException(
|
||||
'Bridgy publish to Mastodon failed: '.($body['error'] ?? (string) $response->getBody())
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue