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