custom/plugins/AsbsImageAnalyzer/src/Subscriber/MediaUploadSubscriber.php line 133

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Asbs\ImageAnalyzer\Subscriber;
  3. use Asbs\ImageAnalyzer\Message\AnalyzeMediaMessage;
  4. use Asbs\ImageAnalyzer\Service\MediaAnalyzer;
  5. use Shopware\Core\Content\Media\MediaEvents;
  6. use Shopware\Core\Content\Media\Event\MediaUploadedEvent;
  7. use Shopware\Core\Content\Media\Message\GenerateThumbnailsMessage;
  8. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
  9. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
  10. use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
  11. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  12. use Shopware\Core\System\SystemConfig\SystemConfigService;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\Messenger\MessageBusInterface;
  15. use Psr\Log\LoggerInterface;
  16. class MediaUploadSubscriber implements EventSubscriberInterface
  17. {
  18.     private MediaAnalyzer $mediaAnalyzer;
  19.     private SystemConfigService $systemConfigService;
  20.     private LoggerInterface $logger;
  21.     private EntityRepositoryInterface $mediaRepository;
  22.     private MessageBusInterface $messageBus;
  23.     
  24.     public function __construct(
  25.         MediaAnalyzer $mediaAnalyzer,
  26.         SystemConfigService $systemConfigService,
  27.         LoggerInterface $logger,
  28.         EntityRepositoryInterface $mediaRepository,
  29.         MessageBusInterface $messageBus
  30.     ) {
  31.         $this->mediaAnalyzer $mediaAnalyzer;
  32.         $this->systemConfigService $systemConfigService;
  33.         $this->logger $logger;
  34.         $this->mediaRepository $mediaRepository;
  35.         $this->messageBus $messageBus;
  36.     }
  37.     
  38.     public static function getSubscribedEvents(): array
  39.     {
  40.         return [
  41.             MediaEvents::MEDIA_WRITTEN_EVENT => 'onMediaWritten',
  42.             MediaUploadedEvent::class => 'onMediaUploaded',
  43.             MediaEvents::MEDIA_LOADED_EVENT => 'onMediaLoaded',
  44.         ];
  45.     }
  46.     
  47.     public function onMediaWritten(EntityWrittenEvent $event): void
  48.     {
  49.         $this->logger->info('MediaUploadSubscriber::onMediaWritten triggered');
  50.         
  51.         $autoAnalyze $this->systemConfigService->get('AsbsImageAnalyzer.config.autoAnalyze');
  52.         $this->logger->info('Auto-analyze config value: ' var_export($autoAnalyzetrue));
  53.         
  54.         if (!$autoAnalyze) {
  55.             $this->logger->info('Auto-analyze is disabled');
  56.             return;
  57.         }
  58.         
  59.         $context $event->getContext();
  60.         
  61.         foreach ($event->getWriteResults() as $writeResult) {
  62.             $this->logger->info('Processing write result', [
  63.                 'operation' => $writeResult->getOperation(),
  64.                 'entity' => $writeResult->getEntityName()
  65.             ]);
  66.             
  67.             // Handle both insert and update operations
  68.             if (!in_array($writeResult->getOperation(), ['insert''update'], true)) {
  69.                 $this->logger->info('Skipping operation: ' $writeResult->getOperation());
  70.                 continue;
  71.             }
  72.             
  73.             $payload $writeResult->getPayload();
  74.             $this->logger->info('Payload data', [
  75.                 'id' => $payload['id'] ?? 'not set',
  76.                 'mimeType' => $payload['mimeType'] ?? 'not set',
  77.                 'alt' => $payload['alt'] ?? 'not set',
  78.                 'hasFile' => isset($payload['uploadedAt']) ? 'yes' 'no'
  79.             ]);
  80.             
  81.             if (!isset($payload['id']) || !isset($payload['mimeType'])) {
  82.                 $this->logger->info('Missing id or mimeType, skipping');
  83.                 continue;
  84.             }
  85.             
  86.             // Skip if alt text already exists (optional check)
  87.             if (isset($payload['alt']) && !empty($payload['alt'])) {
  88.                 $this->logger->info('Media already has alt text, skipping: ' $payload['id']);
  89.                 continue;
  90.             }
  91.             
  92.             // Check if this is an image
  93.             if (strpos($payload['mimeType'], 'image/') !== 0) {
  94.                 $this->logger->info('Media is not an image, skipping: ' $payload['id']);
  95.                 continue;
  96.             }
  97.             
  98.             // For update operations, check if this is the upload completing
  99.             if ($writeResult->getOperation() === 'update') {
  100.                 // Only process if we're updating with file data
  101.                 if (!isset($payload['uploadedAt']) && !isset($payload['fileName']) && !isset($payload['fileSize'])) {
  102.                     $this->logger->info('Update operation but no file data, skipping');
  103.                     continue;
  104.                 }
  105.             } else {
  106.                 // For insert operations, skip if file not yet uploaded
  107.                 if (!isset($payload['uploadedAt']) && !isset($payload['fileName'])) {
  108.                     $this->logger->info('Insert operation but file not yet uploaded, skipping: ' $payload['id']);
  109.                     continue;
  110.                 }
  111.             }
  112.             
  113.             $this->logger->info('Found new media for auto-analysis: ' $payload['id']);
  114.             
  115.             try {
  116.                 // Send analysis to message queue for async processing
  117.                 $message = new AnalyzeMediaMessage($payload['id']);
  118.                 $this->messageBus->dispatch($message);
  119.                 
  120.                 $this->logger->info('Dispatched media analysis message for: ' $payload['id']);
  121.             } catch (\Exception $e) {
  122.                 $this->logger->error('Failed to dispatch media analysis message: ' $e->getMessage(), [
  123.                     'mediaId' => $payload['id'],
  124.                     'exception' => $e->getMessage()
  125.                 ]);
  126.             }
  127.         }
  128.     }
  129.     
  130.     public function onMediaUploaded(MediaUploadedEvent $event): void
  131.     {
  132.         $autoAnalyze $this->systemConfigService->get('AsbsImageAnalyzer.config.autoAnalyze');
  133.         $this->logger->info('MediaUploadedEvent triggered, auto-analyze config: ' var_export($autoAnalyzetrue));
  134.         
  135.         if (!$autoAnalyze) {
  136.             $this->logger->info('Auto-analyze is disabled in configuration');
  137.             return;
  138.         }
  139.         
  140.         $mediaId $event->getMediaId();
  141.         $context $event->getContext();
  142.         
  143.         $this->logger->info('Processing uploaded media ID: ' $mediaId);
  144.         
  145.         try {
  146.             $criteria = new Criteria([$mediaId]);
  147.             $criteria->addAssociation('mediaFolder');
  148.             $media $this->mediaRepository->search($criteria$context)->first();
  149.             
  150.             if ($media) {
  151.                 // Check if it's an image
  152.                 $mimeType $media->getMimeType();
  153.                 if (!$mimeType || strpos($mimeType'image/') !== 0) {
  154.                     $this->logger->info('Uploaded media is not an image, skipping. MimeType: ' . ($mimeType ?? 'null'));
  155.                     return;
  156.                 }
  157.                 
  158.                 // Check if alt text already exists
  159.                 if ($media->getAlt()) {
  160.                     $this->logger->info('Media already has alt text, skipping: ' $media->getAlt());
  161.                     return;
  162.                 }
  163.                 
  164.                 $this->logger->info('Starting analysis for uploaded media: ' $mediaId);
  165.                 $result $this->mediaAnalyzer->analyzeMedia($media$context);
  166.                 $this->logger->info('Analysis completed for media: ' $mediaId ', result: ' json_encode($result));
  167.             } else {
  168.                 $this->logger->warning('Media entity not found after upload: ' $mediaId);
  169.             }
  170.         } catch (\Exception $e) {
  171.             $this->logger->error('Failed to auto-analyze uploaded media: ' $e->getMessage(), [
  172.                 'mediaId' => $mediaId,
  173.                 'exception' => $e->getMessage(),
  174.                 'trace' => $e->getTraceAsString()
  175.             ]);
  176.         }
  177.     }
  178.     
  179.     public function onMediaLoaded(EntityLoadedEvent $event): void
  180.     {
  181.         // This is just for debugging to see if events are triggered
  182.         $this->logger->info('MediaUploadSubscriber::onMediaLoaded triggered');
  183.     }
  184. }