From ac30a9859a7023b08699f58bf85ec4744d871b67 Mon Sep 17 00:00:00 2001
From: Alex Pott <alex.a.pott@googlemail.com>
Date: Fri, 13 Jan 2023 16:38:55 +0000
Subject: [PATCH] Issue #3088168 by DuaelFr, dww, Ambient.Impact, alexpott:
 Media thumbnail dimensions are wrong for YouTube videos

---
 .../media/src/Annotation/MediaSource.php      | 14 +++++
 core/modules/media/src/Entity/Media.php       | 52 +++++++++++++++++++
 .../tests/src/Kernel/MediaSourceTest.php      | 19 +++++++
 3 files changed, 85 insertions(+)

diff --git a/core/modules/media/src/Annotation/MediaSource.php b/core/modules/media/src/Annotation/MediaSource.php
index 1286601b2967..12d940922a12 100644
--- a/core/modules/media/src/Annotation/MediaSource.php
+++ b/core/modules/media/src/Annotation/MediaSource.php
@@ -89,6 +89,20 @@ class MediaSource extends Plugin {
    */
   public $thumbnail_uri_metadata_attribute = 'thumbnail_uri';
 
+  /**
+   * The metadata attribute name to provide the thumbnail width.
+   *
+   * @var string
+   */
+  public $thumbnail_width_metadata_attribute = 'thumbnail_width';
+
+  /**
+   * The metadata attribute name to provide the thumbnail height.
+   *
+   * @var string
+   */
+  public $thumbnail_height_metadata_attribute = 'thumbnail_height';
+
   /**
    * (optional) The metadata attribute name to provide the thumbnail alt.
    *
diff --git a/core/modules/media/src/Entity/Media.php b/core/modules/media/src/Entity/Media.php
index e4e0cab0623b..967e933063ec 100644
--- a/core/modules/media/src/Entity/Media.php
+++ b/core/modules/media/src/Entity/Media.php
@@ -154,6 +154,8 @@ public function getSource() {
    */
   protected function updateThumbnail($from_queue = FALSE) {
     $this->thumbnail->target_id = $this->loadThumbnail($this->getThumbnailUri($from_queue))->id();
+    $this->thumbnail->width = $this->getThumbnailWidth($from_queue);
+    $this->thumbnail->height = $this->getThumbnailHeight($from_queue);
 
     // Set the thumbnail alt.
     $media_source = $this->getSource();
@@ -258,6 +260,56 @@ protected function getThumbnailUri($from_queue) {
     return $source->getMetadata($this, $source->getPluginDefinition()['thumbnail_uri_metadata_attribute']);
   }
 
+  /**
+   * Gets the width of the thumbnail of a media item.
+   *
+   * @param bool $from_queue
+   *   Specifies whether the thumbnail is being fetched from the queue.
+   *
+   * @return int|null
+   *   The width of the thumbnail of the media item or NULL if the media is new
+   *   and the thumbnails are set to be downloaded in a queue.
+   *
+   * @internal
+   */
+  protected function getThumbnailWidth(bool $from_queue): ?int {
+    $thumbnails_queued = $this->bundle->entity->thumbnailDownloadsAreQueued();
+    if ($thumbnails_queued && $this->isNew()) {
+      return NULL;
+    }
+    elseif ($thumbnails_queued && !$from_queue) {
+      return $this->get('thumbnail')->width;
+    }
+
+    $source = $this->getSource();
+    return $source->getMetadata($this, $source->getPluginDefinition()['thumbnail_width_metadata_attribute']);
+  }
+
+  /**
+   * Gets the height of the thumbnail of a media item.
+   *
+   * @param bool $from_queue
+   *   Specifies whether the thumbnail is being fetched from the queue.
+   *
+   * @return int|null
+   *   The height of the thumbnail of the media item or NULL if the media is new
+   *   and the thumbnails are set to be downloaded in a queue.
+   *
+   * @internal
+   */
+  protected function getThumbnailHeight(bool $from_queue): ?int {
+    $thumbnails_queued = $this->bundle->entity->thumbnailDownloadsAreQueued();
+    if ($thumbnails_queued && $this->isNew()) {
+      return NULL;
+    }
+    elseif ($thumbnails_queued && !$from_queue) {
+      return $this->get('thumbnail')->height;
+    }
+
+    $source = $this->getSource();
+    return $source->getMetadata($this, $source->getPluginDefinition()['thumbnail_height_metadata_attribute']);
+  }
+
   /**
    * Determines if the source field value has changed.
    *
diff --git a/core/modules/media/tests/src/Kernel/MediaSourceTest.php b/core/modules/media/tests/src/Kernel/MediaSourceTest.php
index 07e764544848..b6e67c897d42 100644
--- a/core/modules/media/tests/src/Kernel/MediaSourceTest.php
+++ b/core/modules/media/tests/src/Kernel/MediaSourceTest.php
@@ -300,6 +300,25 @@ public function testThumbnail() {
     $this->assertEmpty($media->thumbnail->title);
     $this->assertSame('', $media->thumbnail->alt);
 
+    // Set the width and height metadata attributes and make sure they're used
+    // for the thumbnail.
+    \Drupal::state()->set('media_source_test_definition', [
+      'thumbnail_width_metadata_attribute' => 'width',
+      'thumbnail_height_metadata_attribute' => 'height',
+    ]);
+    \Drupal::state()->set('media_source_test_attributes', [
+      'width' => ['value' => 1024],
+      'height' => ['value' => 768],
+    ]);
+    $media = Media::create([
+      'bundle' => $this->testMediaType->id(),
+      'name' => 'Are you looking at me?',
+      'field_media_test' => 'some_value',
+    ]);
+    $media->save();
+    $this->assertSame(1024, $media->thumbnail->width);
+    $this->assertSame(768, $media->thumbnail->height);
+
     // Enable queued thumbnails and make sure that the entity gets the default
     // thumbnail initially.
     \Drupal::state()->set('media_source_test_definition', []);
-- 
GitLab