<?php
namespace App\Subscriber\Content;
use App\Entity\ContentImageset;
use App\Entity\ContentTypeAbstract;
use App\Event\Content\ContentPreviewsSelectedEvent;
use App\Event\Content\ContentVideoDeleteEvent;
use App\Event\Content\PreviewImagePixelatedEvent;
use App\Service\Content\ImagesetService;
use App\Service\Content\PreviewService;
use App\Service\Content\SnapshotService;
use App\Service\Media\StorageLayer;
use Liip\ImagineBundle\Service\FilterService;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class PreviewImageSubscriber implements EventSubscriberInterface
{
protected PreviewService $service;
protected FilterService $filterService;
protected SnapshotService $snapshotService;
protected ImagesetService $imagesetService;
protected LoggerInterface $logger;
protected StorageLayer $storageLayer;
/**
* PreviewImageSubscriber constructor.
*/
public function __construct(PreviewService $service, SnapshotService $snapshotService,
FilterService $filterService, ImagesetService $imagesetService,
LoggerInterface $logger, StorageLayer $storageLayer)
{
$this->service = $service;
$this->snapshotService = $snapshotService;
$this->filterService = $filterService;
$this->imagesetService = $imagesetService;
$this->logger = $logger;
$this->storageLayer = $storageLayer;
}
public static function getSubscribedEvents(): array
{
return [
PreviewImagePixelatedEvent::class => [
['onPreviewPhotoPixelatedCreateLiipImages', 0],
],
ContentVideoDeleteEvent::class => [
['onVideoDeleteRemovePreviews', 9998],
],
ContentPreviewsSelectedEvent::class => [
['removeExistingPreviewCacheFiles', 9999],
['removeExistingPublicPreviewFiles', 9998],
['onPreviewsSelectedCreateLiipImages', 0],
],
];
}
public function onPreviewsSelectedCreateLiipImages(ContentPreviewsSelectedEvent $event)
{
$content = $event->getEntity();
$numbers = $event->getSelectedNumbers();
if ($video = $content->getVideo()) {
$snapshots = $this->snapshotService->getSnapshots($video);
$pos = 1;
foreach ($numbers as $number) {
$this->service->createPreviewPhotosFromSnapshot($video, $snapshots[$number], $pos);
$original = $this->service->getPreviewPhoto($video, $pos, true);
foreach (['preview_big', 'preview_small'] as $filter) {
$this->service->getUrlForPhoto($original, $filter);
}
++$pos;
}
}
if ($imageset = $content->getImageset()) {
$i = 1;
foreach ($numbers as $pos => $imageId) {
if ($image = $this->imagesetService->getImagesetImageById($imageId)) {
$this->service->createPreviewPhotosFromImagesetImage($imageset, $image, $i);
$original = $this->service->getPreviewPhoto($imageset, $i, true);
foreach (['previmg_big', 'previmg_small'] as $filter) {
$this->service->getUrlForPhoto($original, $filter);
}
} else {
$this->logger->critical('Failed to find ImagesetImage with ID '.$imageId);
}
++$i;
}
}
}
public function removeExistingPublicPreviewFiles(ContentPreviewsSelectedEvent $event)
{
$this->service->deletePreviewsForContent($event->getEntity());
}
public function removeExistingPreviewCacheFiles(ContentPreviewsSelectedEvent $event)
{
/**
* @var $abstract ContentTypeAbstract
*/
$abstract = $event->getEntity()->getContent();
$filters = ['preview_small', 'preview_big'];
if ($abstract instanceof ContentImageset) {
$filters = ['previmg_small', 'previmg_big'];
}
foreach ($this->service->getSoftcorePreviewPhotos($abstract) as $photo) {
foreach ($filters as $filter) {
$this->service->removeCacheForPreviewPhoto($photo, $filter);
}
}
foreach ($this->service->getHardcorePreviewPhotos($abstract) as $photo) {
foreach ($filters as $filter) {
$this->service->removeCacheForPreviewPhoto($photo, $filter);
}
}
}
public function onVideoDeleteRemovePreviews(ContentVideoDeleteEvent $event)
{
if ($content = $event->getEntity()->getContent()) {
$this->service->deletePreviewsForContent($content);
}
}
public function onPreviewPhotoPixelatedCreateLiipImages(PreviewImagePixelatedEvent $event)
{
$filters = [
'preview_small',
'preview_big',
];
if ($event->getEntity() instanceof ContentImageset) {
$filters = [
'previmg_small',
'previmg_big',
];
}
$photo = $event->getPreviewPhoto();
foreach ($filters as $filter) {
$this->service->removeCacheForPreviewPhoto($photo, $filter);
$this->service->getUrlForPhoto($photo, $filter);
}
}
}