From 1ff644bfdc3f329b34e676b462c5be55619b5c17 Mon Sep 17 00:00:00 2001
From: Rosie Le Faive <lefaive@gmail.com>
Date: Fri, 9 Dec 2022 11:41:36 -0400
Subject: [PATCH] No infinite derivatives.

---
 src/EventGenerator/EmitEvent.php                 | 4 ++++
 src/Plugin/Action/AbstractGenerateDerivative.php | 7 +++++++
 2 files changed, 11 insertions(+)

diff --git a/src/EventGenerator/EmitEvent.php b/src/EventGenerator/EmitEvent.php
index 683f3e8b..2e0d226e 100644
--- a/src/EventGenerator/EmitEvent.php
+++ b/src/EventGenerator/EmitEvent.php
@@ -157,6 +157,10 @@ abstract class EmitEvent extends ConfigurableActionBase implements ContainerFact
 
       $user = $this->entityTypeManager->getStorage('user')->load($this->account->id());
       $data = $this->generateData($entity);
+      // If $data is the bool false, then abort. No error, but don't emit event.
+      if ($data === FALSE) {
+        return;
+      }
 
       $event = $this->eventDispatcher->dispatch(
         StompHeaderEvent::EVENT_NAME,
diff --git a/src/Plugin/Action/AbstractGenerateDerivative.php b/src/Plugin/Action/AbstractGenerateDerivative.php
index b22201e1..129af994 100644
--- a/src/Plugin/Action/AbstractGenerateDerivative.php
+++ b/src/Plugin/Action/AbstractGenerateDerivative.php
@@ -60,6 +60,13 @@ class AbstractGenerateDerivative extends AbstractGenerateDerivativeBase {
       throw new \RuntimeException("Could not locate taxonomy term with uri: " . $this->configuration['derivative_term_uri'], 500);
     }
 
+    // See if there is a destination media already set, and abort if it's the
+    // same as the source media. Dont cause an error, just don't continue.
+    $derivative_media = $this->utils->getMediaWithTerm($entity, $derivative_term);
+    if (!is_null($derivative_media) && $derivative_media->id() == $source_media->id()) {
+      return FALSE;
+    }
+
     $route_params = [
       'node' => $entity->id(),
       'media_type' => $this->configuration['destination_media_type'],