Update
This commit is contained in:
@@ -20,10 +20,12 @@
|
||||
namespace Database\Seeders;
|
||||
|
||||
use App\Helpers\FirstParty\AI\CloudflareAI;
|
||||
use App\Helpers\FirstParty\Maintenance\MemeMediaMaintenance;
|
||||
use App\Helpers\FirstParty\MediaEngine\MediaEngine;
|
||||
use App\Models\MediaCollection;
|
||||
use App\Models\MemeMedia;
|
||||
use Illuminate\Database\Seeder;
|
||||
use Log;
|
||||
|
||||
class MemeMediaSeeder extends Seeder
|
||||
{
|
||||
@@ -50,7 +52,7 @@ public function run(): void
|
||||
$csv_path = database_path('seeders/data/webm_metadata.csv');
|
||||
$meme_data = $this->parseCsvFile($csv_path);
|
||||
|
||||
$this->command->info('📊 Found '.count($meme_data).' memes to import');
|
||||
$this->command->info('📊 Found ' . count($meme_data) . ' memes to import');
|
||||
|
||||
// Process records individually for PostgreSQL compatibility
|
||||
$total_processed = 0;
|
||||
@@ -58,7 +60,11 @@ public function run(): void
|
||||
$total_failed = 0;
|
||||
|
||||
foreach ($meme_data as $index => $meme_record) {
|
||||
$this->command->info('Processing '.($index + 1).'/'.count($meme_data).': '.$meme_record['filename']);
|
||||
$this->command->info('Processing ' . ($index + 1) . '/' . count($meme_data) . ': ' . $meme_record['filename']);
|
||||
|
||||
|
||||
$meme_record['keywords'] = $this->stringToCleanArray($meme_record['keywords']);
|
||||
|
||||
|
||||
try {
|
||||
// Check for duplicates OUTSIDE of transaction
|
||||
@@ -146,6 +152,18 @@ private function parseCsvFile(string $csv_path): array
|
||||
return $meme_data;
|
||||
}
|
||||
|
||||
private function stringToCleanArray($string)
|
||||
{
|
||||
// Split by comma, clean each element, and filter empty ones
|
||||
return array_filter(array_map(function ($item) {
|
||||
$item = trim($item); // Remove whitespace
|
||||
$item = preg_replace('/[^\w\s]/', '', $item); // Remove punctuation
|
||||
return trim(preg_replace('/\s+/', ' ', $item)); // Clean extra spaces
|
||||
}, explode(',', $string)), function ($value) {
|
||||
return $value !== '';
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Import a single meme with all its formats
|
||||
*/
|
||||
@@ -174,13 +192,13 @@ private function importSingleMeme(array $meme_record): bool
|
||||
'save_url', // Mode: just save URL reference
|
||||
null, // Auto-generate filename
|
||||
'r2', // Disk (not used for URL mode)
|
||||
trim($meme_record['name'])." ({$format})", // Name with format
|
||||
trim($meme_record['name']) . " ({$format})", // Name with format
|
||||
null, // No specific user
|
||||
$config['mime'] // MIME type
|
||||
);
|
||||
|
||||
$media_uuids[$format.'_uuid'] = $media->uuid;
|
||||
$media_urls[$format.'_url'] = $url;
|
||||
$media_uuids[$format . '_uuid'] = $media->uuid;
|
||||
$media_urls[$format . '_url'] = $url;
|
||||
} catch (\Exception $e) {
|
||||
$this->command->error("Failed to create {$format} media for {$meme_record['filename']}: {$e->getMessage()}");
|
||||
throw $e;
|
||||
@@ -190,7 +208,7 @@ private function importSingleMeme(array $meme_record): bool
|
||||
// Generate embedding
|
||||
try {
|
||||
$embedding = CloudflareAI::getVectorEmbeddingBgeSmall(
|
||||
$meme_record['name'].' '.$meme_record['description'].' '.$meme_record['keywords']
|
||||
$meme_record['name'] . ' ' . $meme_record['description'] . ' ' . implode(' ', $meme_record['keywords'])
|
||||
);
|
||||
} catch (\Exception $e) {
|
||||
$this->command->warn("Failed to generate embedding for {$meme_record['filename']}: {$e->getMessage()}");
|
||||
@@ -209,7 +227,8 @@ private function importSingleMeme(array $meme_record): bool
|
||||
}
|
||||
|
||||
// Create MemeMedia record
|
||||
MemeMedia::create([
|
||||
$meme_media = MemeMedia::create([
|
||||
'is_enabled' => true,
|
||||
'original_id' => $meme_record['filename'],
|
||||
'type' => $meme_record['type'],
|
||||
'sub_type' => $meme_record['sub_type'],
|
||||
@@ -228,12 +247,16 @@ private function importSingleMeme(array $meme_record): bool
|
||||
'webm_url' => $media_urls['webm_url'],
|
||||
'gif_url' => $media_urls['gif_url'],
|
||||
'webp_url' => $media_urls['webp_url'],
|
||||
|
||||
// Embedding (may be null)
|
||||
'embedding' => $embedding,
|
||||
]);
|
||||
|
||||
$this->command->info('✅ Imported: '.trim($meme_record['name']));
|
||||
$meme_media->duration = MemeMediaMaintenance::getDurationUsingFfmpeg($meme_media);
|
||||
$meme_media->embedding = $embedding;
|
||||
$meme_media->save();
|
||||
|
||||
// Add keywords as tags
|
||||
$this->attachKeywordsAsTags($meme_media, $meme_record['keywords']);
|
||||
|
||||
$this->command->info('✅ Imported: ' . trim($meme_record['name']));
|
||||
|
||||
return true;
|
||||
} catch (\Exception $e) {
|
||||
@@ -242,12 +265,26 @@ private function importSingleMeme(array $meme_record): bool
|
||||
}
|
||||
}
|
||||
|
||||
private function attachKeywordsAsTags(MemeMedia $meme_media, array $keywords): void
|
||||
{
|
||||
try {
|
||||
$meme_media->attachTags($keywords, 'meme');
|
||||
} catch (\Exception $e) {
|
||||
$this->command->warn("Failed to attach tags to meme media '{$meme_media->name}': " . $e->getMessage());
|
||||
Log::warning("Failed to attach tags", [
|
||||
'category_id' => $meme_media->id,
|
||||
'keywords' => $keywords,
|
||||
'error' => $e->getMessage()
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate CDN URL for specific format
|
||||
*/
|
||||
private function generateCdnUrl(string $base_filename, string $extension): string
|
||||
{
|
||||
return self::CDN_BASE_URL."/{$extension}/{$base_filename}.{$extension}";
|
||||
return self::CDN_BASE_URL . "/{$extension}/{$base_filename}.{$extension}";
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user