mirror of https://github.com/pixelfed/pixelfed
commit
aaee812b66
@ -0,0 +1,127 @@
|
||||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Media;
|
||||
use App\Services\MediaService;
|
||||
use App\Services\StatusService;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class MediaReplaceDomainCommand extends Command
|
||||
{
|
||||
protected $signature = 'media:replacedomain {--original= : Original domain to replace} {--new= : New domain to use}';
|
||||
|
||||
protected $description = 'Replace CDN domain in media URLs and clear associated caches';
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$originalDomain = $this->option('original');
|
||||
$newDomain = $this->option('new');
|
||||
|
||||
if (! $originalDomain || ! $newDomain) {
|
||||
$this->error('Both --original and --new options are required');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (! str_starts_with($originalDomain, 'https://')) {
|
||||
$this->error('Original domain must start with https://');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (! str_starts_with($newDomain, 'https://')) {
|
||||
$this->error('New domain must start with https://');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
$originalDomain = rtrim($originalDomain, '/');
|
||||
$newDomain = rtrim($newDomain, '/');
|
||||
|
||||
if (preg_match('/[^a-zA-Z0-9\-\._\/:]/', $originalDomain) ||
|
||||
preg_match('/[^a-zA-Z0-9\-\._\/:]/', $newDomain)) {
|
||||
$this->error('Domains contain invalid characters');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
$sampleMedia = Media::where('cdn_url', 'LIKE', $originalDomain.'%')->first();
|
||||
|
||||
if (! $sampleMedia) {
|
||||
$this->error('No media entries found with the specified domain.');
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
$sampleNewUrl = str_replace($originalDomain, $newDomain, $sampleMedia->cdn_url);
|
||||
|
||||
$this->info('Please verify this URL transformation:');
|
||||
$this->newLine();
|
||||
$this->info('Original URL:');
|
||||
$this->line($sampleMedia->cdn_url);
|
||||
$this->info('Will be changed to:');
|
||||
$this->line($sampleNewUrl);
|
||||
$this->newLine();
|
||||
$this->info('Please verify in your browser that both URLs are accessible.');
|
||||
|
||||
if (! $this->confirm('Do you want to proceed with the replacement?')) {
|
||||
$this->info('Operation cancelled.');
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
$query = Media::where('cdn_url', 'LIKE', $originalDomain.'%');
|
||||
$count = $query->count();
|
||||
|
||||
$this->info("Found {$count} media entries to update.");
|
||||
|
||||
$bar = $this->output->createProgressBar($count);
|
||||
$errors = [];
|
||||
|
||||
$query->chunkById(1000, function ($medias) use ($originalDomain, $newDomain, $bar, &$errors) {
|
||||
foreach ($medias as $media) {
|
||||
try {
|
||||
if (! str_starts_with($media->cdn_url, 'https://')) {
|
||||
$errors[] = "Media ID {$media->id} has invalid URL format: {$media->cdn_url}";
|
||||
$bar->advance();
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
DB::transaction(function () use ($media, $originalDomain, $newDomain) {
|
||||
$media->cdn_url = str_replace($originalDomain, $newDomain, $media->cdn_url);
|
||||
$media->save();
|
||||
|
||||
if ($media->status_id) {
|
||||
MediaService::del($media->status_id);
|
||||
StatusService::del($media->status_id);
|
||||
}
|
||||
});
|
||||
$bar->advance();
|
||||
} catch (\Exception $e) {
|
||||
$errors[] = "Failed to update Media ID {$media->id}: {$e->getMessage()}";
|
||||
$bar->advance();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$bar->finish();
|
||||
$this->newLine();
|
||||
|
||||
if (! empty($errors)) {
|
||||
$this->newLine();
|
||||
$this->warn('Completed with errors:');
|
||||
foreach ($errors as $error) {
|
||||
$this->error($error);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
$this->info('Domain replacement completed successfully.');
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
'helpcenter' => 'Centro de Ayuda',
|
||||
'whatsnew' => 'Novedades',
|
||||
|
||||
'gettingStarted' => 'Primeros Pasos',
|
||||
'sharingMedia' => 'Compartiendo Medios',
|
||||
'profile' => 'Perfil',
|
||||
'stories' => 'Historias',
|
||||
'hashtags' => 'Hashtags',
|
||||
'discover' => 'Descubre',
|
||||
'directMessages' => 'Mensajes Directos',
|
||||
'timelines' => 'Timelines',
|
||||
'embed' => 'Embed',
|
||||
|
||||
'communityGuidelines' => 'Community Guidelines',
|
||||
'whatIsTheFediverse' => '¿Qué es el fediverso?',
|
||||
'controllingVisibility' => 'Controlando la Visibilidad',
|
||||
'blockingAccounts' => 'Bloqueando Cuentas',
|
||||
'safetyTips' => 'Tips de Seguridad',
|
||||
'reportSomething' => 'Reportar Algo',
|
||||
'dataPolicy' => 'Política sobre datos',
|
||||
|
||||
'taggingPeople' => 'Etiquetando Personas'
|
||||
|
||||
];
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search' => 'Buscar',
|
||||
'home' => 'Inicio',
|
||||
'local' => 'Local',
|
||||
'network' => 'Network',
|
||||
'discover' => 'Descubre',
|
||||
'viewMyProfile' => 'Ver mi perfil',
|
||||
'myProfile' => 'Mi Perfil',
|
||||
'myTimeline' => 'Mi Timeline',
|
||||
'publicTimeline' => 'Timeline público',
|
||||
'remoteFollow' => 'Seguidor Remoto',
|
||||
'settings' => 'Configuraciones',
|
||||
'admin' => 'Admin',
|
||||
'logout' => 'Cerrar Sesión',
|
||||
'directMessages' => 'Mensajes Directos',
|
||||
'composePost' => 'Crear Post',
|
||||
];
|
Loading…
Reference in New Issue