diff -u b/core/modules/media/src/Entity/Media.php b/core/modules/media/src/Entity/Media.php --- b/core/modules/media/src/Entity/Media.php +++ b/core/modules/media/src/Entity/Media.php @@ -148,7 +148,7 @@ } // Set thumbnail. - if (!$this->get('thumbnail')->entity) { + if ($this->getHandler()->updateThumbnail($this)) { \Drupal::service('media.thumbnail_handler')->setThumbnail($this); } } @@ -158,7 +158,7 @@ */ public function postSave(EntityStorageInterface $storage, $update = TRUE) { parent::postSave($storage, $update); - if (!$update && $this->bundle->entity->getQueueThumbnailDownloadsStatus()) { + if ($this->bundle->entity->getQueueThumbnailDownloadsStatus() && $this->getHandler()->updateThumbnail($this)) { $queue = \Drupal::queue('media_entity_thumbnail'); $queue->createItem(['id' => $this->id()]); } diff -u b/core/modules/media/src/MediaHandlerBase.php b/core/modules/media/src/MediaHandlerBase.php --- b/core/modules/media/src/MediaHandlerBase.php +++ b/core/modules/media/src/MediaHandlerBase.php @@ -123,6 +123,24 @@ /** * {@inheritdoc} */ + public function updateThumbnail(MediaInterface $media) { + $source_field = $this->configuration['source_field']; + + if (empty($source_field)) { + throw new \RuntimeException('Source field for media handler is not defined.'); + } + + // Update thumbnail if we don't have a thumbnail yet or if + // the value of the source field changed. + if (!$media->get('thumbnail')->entity || (isset($media->original) && $this->getSourceValue($media)->getValue() != $this->getSourceValue($media->original)->getValue())) { + return TRUE; + } + return FALSE; + } + + /** + * {@inheritdoc} + */ public function getDefaultThumbnail() { return $this->configFactory->get('media.settings')->get('icon_base') . '/generic.png'; } diff -u b/core/modules/media/src/MediaHandlerInterface.php b/core/modules/media/src/MediaHandlerInterface.php --- b/core/modules/media/src/MediaHandlerInterface.php +++ b/core/modules/media/src/MediaHandlerInterface.php @@ -58,6 +58,17 @@ public function attachConstraints(MediaInterface $media); /** + * Determines if the thumbnail should be updated for the media entity. + * + * @param \Drupal\media\MediaInterface $media + * The media entity. + * + * @return bool + * TRUE if the thumbnail should be updated, FALSE otherwise. + */ + public function updateThumbnail(MediaInterface $media); + + /** * Gets thumbnail image. * * Media handler plugin is responsible for returning URI of the generic diff -u b/core/modules/media/src/MediaThumbnailHandler.php b/core/modules/media/src/MediaThumbnailHandler.php --- b/core/modules/media/src/MediaThumbnailHandler.php +++ b/core/modules/media/src/MediaThumbnailHandler.php @@ -36,12 +36,17 @@ /** * {@inheritdoc} */ - public function setThumbnail(MediaInterface $media) { + public function setThumbnail(MediaInterface $media, $from_queue = FALSE) { // If thumbnail fetching should be queued then temporary use default - // thumbnail or fetch it immediately otherwise. + // thumbnail for new files or temporary keep existing thumbnail for + // updates. + // Fetch a new thumbnail immediately otherwise. if ($media->bundle->entity->getQueueThumbnailDownloadsStatus() && $media->isNew()) { $thumbnail_uri = $media->getHandler()->getDefaultThumbnail(); } + elseif ($media->bundle->entity->getQueueThumbnailDownloadsStatus() && !$from_queue) { + $thumbnail_uri = $media->get('thumbnail')->entity->getFileUri(); + } else { $thumbnail_uri = $media->getHandler()->getThumbnail($media); } diff -u b/core/modules/media/src/MediaThumbnailHandlerInterface.php b/core/modules/media/src/MediaThumbnailHandlerInterface.php --- b/core/modules/media/src/MediaThumbnailHandlerInterface.php +++ b/core/modules/media/src/MediaThumbnailHandlerInterface.php @@ -13,6 +13,8 @@ * @param \Drupal\media\MediaInterface $media * The Media entity. + * @param bool $from_queue + * Specifies whether the thumbnail is being fetched from the queue. */ - public function setThumbnail(MediaInterface $media); + public function setThumbnail(MediaInterface $media, $from_queue = FALSE); } diff -u b/core/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php b/core/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php --- b/core/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php +++ b/core/modules/media/src/Plugin/QueueWorker/ThumbnailDownloader.php @@ -62,7 +62,7 @@ public function processItem($data) { /** @var \Drupal\media\MediaInterface $entity */ if ($entity = Media::load($data['id'])) { - $this->thumbnailHandler->setThumbnail($entity); + $this->thumbnailHandler->setThumbnail($entity, TRUE); $entity->save(); } }