<?php declare(strict_types=1); 
 
namespace Shopware\Core\Content\Media\Subscriber; 
 
use Shopware\Core\Content\Media\Aggregate\MediaThumbnail\MediaThumbnailCollection; 
use Shopware\Core\Content\Media\Aggregate\MediaThumbnail\MediaThumbnailEntity; 
use Shopware\Core\Content\Media\MediaEntity; 
use Shopware\Core\Content\Media\MediaEvents; 
use Shopware\Core\Content\Media\Pathname\UrlGeneratorInterface; 
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent; 
use Symfony\Component\EventDispatcher\EventSubscriberInterface; 
 
class MediaLoadedSubscriber implements EventSubscriberInterface 
{ 
    private UrlGeneratorInterface $urlGenerator; 
 
    /** 
     * @internal 
     */ 
    public function __construct(UrlGeneratorInterface $urlGenerator) 
    { 
        $this->urlGenerator = $urlGenerator; 
    } 
 
    public static function getSubscribedEvents(): array 
    { 
        return [ 
            MediaEvents::MEDIA_LOADED_EVENT => [ 
                ['unserialize', 10], 
                ['addUrls'], 
            ], 
        ]; 
    } 
 
    public function addUrls(EntityLoadedEvent $event): void 
    { 
        /** @var MediaEntity $media */ 
        foreach ($event->getEntities() as $media) { 
            if (!$media->hasFile() || $media->isPrivate()) { 
                continue; 
            } 
 
            $media->setUrl($this->urlGenerator->getAbsoluteMediaUrl($media)); 
 
            foreach ($media->getThumbnails() as $thumbnail) { 
                $this->addThumbnailUrl($thumbnail, $media); 
            } 
        } 
    } 
 
    public function unserialize(EntityLoadedEvent $event): void 
    { 
        /** @var MediaEntity $media */ 
        foreach ($event->getEntities() as $media) { 
            if ($media->getMediaTypeRaw()) { 
                $media->setMediaType(unserialize($media->getMediaTypeRaw())); 
            } 
 
            if ($media->getThumbnails() === null) { 
                if ($media->getThumbnailsRo()) { 
                    $media->setThumbnails(unserialize($media->getThumbnailsRo())); 
                } else { 
                    $media->setThumbnails(new MediaThumbnailCollection()); 
                } 
            } 
        } 
    } 
 
    private function addThumbnailUrl(MediaThumbnailEntity $thumbnail, MediaEntity $media): void 
    { 
        $thumbnail->setUrl( 
            $this->urlGenerator->getAbsoluteThumbnailUrl( 
                $media, 
                $thumbnail 
            ) 
        ); 
    } 
}