From e3dab24b1b5a05b5964b7884cc021b8d1d329d4c Mon Sep 17 00:00:00 2001 From: Eric Bode Date: Thu, 30 Mar 2023 16:17:53 +0200 Subject: [PATCH 1/5] [FEATURE] Add structured data for videos Addition of structured data for videos to enable indexing of video pages by search engines. To ensure that all required structured data is always output, the data from the file properties is added to the respective properties in the following order: "thumbnailUrl" = "previewImage" (from existing ViewHelper) "description" = file.description ?? file.properties.caption ?? file.title ?? file.name "name" = file.title ?? file.name "embedUrl" = publicUrl from OnlineMediaHelper (via a new ViewHelper) "contentUrl" = file.publicUrl "uploadDate" = file.properties.content_creation_date" ?? file.properties.creation_date ?? file.properties.crdate (via new ViewHelper) "duration" = conversion of file.properties.duration to ISO 8601 format (via new ViewHelper) Current constraint: "thumbnailUrl" cannot currently be determined for local videos (like mp4 files). --- .../Format/SecondsToISO8601ViewHelper.php | 55 ++++++++++++++ .../VideoCreationDateViewHelper.php | 76 +++++++++++++++++++ .../ViewHelpers/VideoPublicUrlViewHelper.php | 74 ++++++++++++++++++ .../Partials/Media/Type/Video.html | 49 +++++++++++- 4 files changed, 251 insertions(+), 3 deletions(-) create mode 100644 Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php create mode 100644 Classes/ViewHelpers/VideoCreationDateViewHelper.php create mode 100644 Classes/ViewHelpers/VideoPublicUrlViewHelper.php diff --git a/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php new file mode 100644 index 0000000..a5ebf6e --- /dev/null +++ b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php @@ -0,0 +1,55 @@ + 60 * 60 * 24, 'H' => 60 * 60, 'M' => 60, 'S' => 1); + $pt = 'P'; + $result = ''; + foreach ($intervals as $tag => $divisor) { + $qty = floor($seconds / $divisor); + if (!$qty && $result === '') { + $pt = 'T'; + continue; + } + $seconds -= $qty * $divisor; + $result .= $qty . $tag; + } + if ($result === '') { + $result = '0S'; + } + return $pt . $result; + } +} diff --git a/Classes/ViewHelpers/VideoCreationDateViewHelper.php b/Classes/ViewHelpers/VideoCreationDateViewHelper.php new file mode 100644 index 0000000..466b0d9 --- /dev/null +++ b/Classes/ViewHelpers/VideoCreationDateViewHelper.php @@ -0,0 +1,76 @@ +registerArgument( + 'fileReference', + 'object', + 'FileReference to be used for creating the preview image' + ); + } + + /** + * Returns the absolute web path to the preview image. + * + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return int + * @throws \UnexpectedValueException + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ): int + { + /** @var FileReference|ExtbaseFileReference $fileReference */ + $fileReference = $arguments['fileReference']; + + // get Resource Object (non ExtBase version) + if (is_callable([$fileReference, 'getOriginalResource'])) { + // We have a domain model, so we need to fetch the FAL resource object from there + $fileReference = $fileReference->getOriginalResource(); + } + if (!($fileReference instanceof FileInterface || $fileReference instanceof AbstractFileFolder)) { + throw new \UnexpectedValueException('Supplied file object type ' . get_class($fileReference) . ' must be FileInterface or AbstractFileFolder.', 1454252193); + } + $file = $fileReference->getOriginalFile(); + if ($file->getProperty('content_creation_date')) { + return $file->getProperty('content_creation_date'); + } + if ($file->getProperty('creation_date')) { + return $file->getProperty('creation_date'); + } + if ($file->getProperty('crdate')) { + return $file->getProperty('crdate'); + } + return 0; + } +} diff --git a/Classes/ViewHelpers/VideoPublicUrlViewHelper.php b/Classes/ViewHelpers/VideoPublicUrlViewHelper.php new file mode 100644 index 0000000..669426d --- /dev/null +++ b/Classes/ViewHelpers/VideoPublicUrlViewHelper.php @@ -0,0 +1,74 @@ +registerArgument( + 'fileReference', + 'object', + 'FileReference to be used for creating the preview image' + ); + } + + /** + * Returns the absolute web path to the preview image. + * + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * @return string + * @throws \UnexpectedValueException + */ + public static function renderStatic( + array $arguments, + \Closure $renderChildrenClosure, + RenderingContextInterface $renderingContext + ): string + { + /** @var FileReference|ExtbaseFileReference $fileReference */ + $fileReference = $arguments['fileReference']; + + // get Resource Object (non ExtBase version) + if (is_callable([$fileReference, 'getOriginalResource'])) { + // We have a domain model, so we need to fetch the FAL resource object from there + $fileReference = $fileReference->getOriginalResource(); + } + if (!($fileReference instanceof FileInterface || $fileReference instanceof AbstractFileFolder)) { + throw new \UnexpectedValueException('Supplied file object type ' . get_class($fileReference) . ' must be FileInterface or AbstractFileFolder.', 1454252193); + } + $file = $fileReference->getOriginalFile(); + $helper = OnlineMediaHelperRegistry::getInstance()->getOnlineMediaHelper($file); + if ($helper) { + $publicUrl = $helper->getPublicUrl($file); + } else { + $publicUrl = ''; + } + return $publicUrl; + } +} diff --git a/Resources/Private/Extensions/fluid_styled_content/Partials/Media/Type/Video.html b/Resources/Private/Extensions/fluid_styled_content/Partials/Media/Type/Video.html index b95cd5f..681dff6 100644 --- a/Resources/Private/Extensions/fluid_styled_content/Partials/Media/Type/Video.html +++ b/Resources/Private/Extensions/fluid_styled_content/Partials/Media/Type/Video.html @@ -1,13 +1,15 @@ {namespace jw=JWeiland\VideoShariff\ViewHelpers} + + -
+
From 657b10f6ec7250ded171d3d633c5a6d8eb7b81b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6mken?= <123929835+sfroemkenjw@users.noreply.github.com> Date: Wed, 3 May 2023 09:42:28 +0200 Subject: [PATCH 2/5] Update lines mentioned by php-cs-fixer --- Classes/ViewHelpers/VideoPublicUrlViewHelper.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Classes/ViewHelpers/VideoPublicUrlViewHelper.php b/Classes/ViewHelpers/VideoPublicUrlViewHelper.php index 669426d..bfa6abd 100644 --- a/Classes/ViewHelpers/VideoPublicUrlViewHelper.php +++ b/Classes/ViewHelpers/VideoPublicUrlViewHelper.php @@ -46,11 +46,10 @@ public function initializeArguments(): void * @throws \UnexpectedValueException */ public static function renderStatic( - array $arguments, - \Closure $renderChildrenClosure, + array $arguments, + \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext - ): string - { + ): string { /** @var FileReference|ExtbaseFileReference $fileReference */ $fileReference = $arguments['fileReference']; From c6c9577ee3015fb5bcb84c89f31959112d9b94cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6mken?= <123929835+sfroemkenjw@users.noreply.github.com> Date: Wed, 3 May 2023 09:44:24 +0200 Subject: [PATCH 3/5] Update lines mentioned by php-cs-fixer --- .../Format/SecondsToISO8601ViewHelper.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php index a5ebf6e..d558d81 100644 --- a/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php +++ b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php @@ -29,13 +29,18 @@ class SecondsToISO8601ViewHelper extends AbstractViewHelper * @throws \UnexpectedValueException */ public static function renderStatic( - array $arguments, - \Closure $renderChildrenClosure, + array $arguments, + \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext - ): string - { + ): string { $seconds = (int)$renderChildrenClosure(); - $intervals = array('D' => 60 * 60 * 24, 'H' => 60 * 60, 'M' => 60, 'S' => 1); + $intervals = [ + 'D' => 60 * 60 * 24, + 'H' => 60 * 60, + 'M' => 60, + 'S' => 1 + ]; + $pt = 'P'; $result = ''; foreach ($intervals as $tag => $divisor) { @@ -47,9 +52,11 @@ public static function renderStatic( $seconds -= $qty * $divisor; $result .= $qty . $tag; } + if ($result === '') { $result = '0S'; } + return $pt . $result; } } From 27d734a2ca3329c60e1ea531461d04f39c04a4d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6mken?= <123929835+sfroemkenjw@users.noreply.github.com> Date: Wed, 3 May 2023 09:45:04 +0200 Subject: [PATCH 4/5] Update lines mentioned by php-cs-fixer --- Classes/ViewHelpers/VideoCreationDateViewHelper.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Classes/ViewHelpers/VideoCreationDateViewHelper.php b/Classes/ViewHelpers/VideoCreationDateViewHelper.php index 466b0d9..f0cfee4 100644 --- a/Classes/ViewHelpers/VideoCreationDateViewHelper.php +++ b/Classes/ViewHelpers/VideoCreationDateViewHelper.php @@ -45,11 +45,10 @@ public function initializeArguments(): void * @throws \UnexpectedValueException */ public static function renderStatic( - array $arguments, - \Closure $renderChildrenClosure, + array $arguments, + \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext - ): int - { + ): int { /** @var FileReference|ExtbaseFileReference $fileReference */ $fileReference = $arguments['fileReference']; From c96e8c1ff18392ddd57991ed996113f15f55fd0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20Fr=C3=B6mken?= <123929835+sfroemkenjw@users.noreply.github.com> Date: Wed, 3 May 2023 09:46:04 +0200 Subject: [PATCH 5/5] Add missing comma to last element of array --- Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php index d558d81..84e3a3a 100644 --- a/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php +++ b/Classes/ViewHelpers/Format/SecondsToISO8601ViewHelper.php @@ -38,7 +38,7 @@ public static function renderStatic( 'D' => 60 * 60 * 24, 'H' => 60 * 60, 'M' => 60, - 'S' => 1 + 'S' => 1, ]; $pt = 'P';