Skip to content
Snippets Groups Projects
Commit a620b20d authored by Damien McKenna's avatar Damien McKenna Committed by Damien McKenna
Browse files

Issue #3365915 by DamienMcKenna: Merge Views RSS Media submodules.

parent 528f1b3a
No related branches found
No related tags found
No related merge requests found
Advanced Views RSS Feed 8.x-2.x-dev, 2022-xx-xx
-----------------------------------------------
#3365915 by DamienMcKenna: Merge Views RSS Media submodules.
Advanced Views RSS Feed 8.x-2.0, 2023-06-14
......
<?php
/**
* @file
* Preprocess functions for Views RSS: Media Elements module.
*/
use Drupal\file\FileInterface;
use Drupal\image\Entity\ImageStyle;
/**
* Preprocess function for item <media:content> element.
*/
function views_rss_media_preprocess_item_content(&$variables) {
// No raw value = no preprocessing.
if (empty($variables['raw']['items'])) {
return;
}
$variables['elements'] = array();
foreach ($variables['raw']['items'] as $item) {
// File fields.
if (!empty($item['rendered']['#file'])) {
$file = $item['rendered']['#file'];
}
// Image fields.
if (!empty($item['rendered']['#item']->entity)) {
$file = $item['rendered']['#item']->entity;
}
// Start building RSS element.
$element = array(
'key' => 'media:content',
'attributes' => array(),
);
// File entity found.
if ($file instanceof FileInterface) {
$mime_type = $file->getMimeType();
// Image style is defined, need to link to resized version.
if ($image_style_name = $item['rendered']['#image_style']) {
$image_style = ImageStyle::load($image_style_name);
$uri = $image_style->buildUri($file->getFileUri());
$element['attributes'] = array(
'url' => file_create_url($uri),
'fileSize' => filesize(\Drupal::service('file_system')->realpath($uri)),
'type' => $mime_type,
);
}
// Normal image size.
else {
$element['attributes'] = array(
'url' => file_create_url($file->getFileUri()),
'fileSize' => $file->getSize(),
'type' => $mime_type,
);
}
list($medium) = explode('/', $mime_type);
$element['attributes']['medium'] = $medium;
}
// No file entity found, but something still was assigned to be displayed
// as enclosure, so we just put its value in the url attribute.
elseif (!empty($item['rendered']['#markup'])) {
$element['attributes']['url'] = $item['rendered']['#markup'];
}
$variables['elements'][] = $element;
}
}
/**
* Preprocess function for item <media:title> and <media:description> elements.
*/
function views_rss_media_preprocess_item_text(&$variables) {
foreach ($variables['elements'] as $delta => $element) {
if (!empty($element['value'])) {
$type = 'plain';
$value_decoded = htmlspecialchars_decode($element['value'], ENT_QUOTES);
if ($value_decoded != strip_tags($value_decoded)) {
$type = 'html';
}
$variables['elements'][$delta]['attributes']['type'] = $type;
}
}
}
/**
* Preprocess function for item <enclosure> element.
*/
function views_rss_media_preprocess_item_thumbnail(&$variables) {
// No raw values = no preprocessing.
if (empty($variables['raw']['items'])) {
return;
}
$variables['elements'] = array();
foreach ($variables['raw']['items'] as $item) {
// File fields.
if (!empty($item['rendered']['#file'])) {
$file = $item['rendered']['#file'];
}
// Image fields.
if (!empty($item['rendered']['#item']->entity)) {
$file = $item['rendered']['#item']->entity;
}
// Start building RSS element.
$element = array(
'key' => 'media:thumbnail',
'attributes' => array(),
);
// File entity found.
if (!empty($file)) {
// Image style is defined, need to link to resized version.
if ($image_style_name = $item['rendered']['#image_style']) {
$image_style = ImageStyle::load($image_style_name);
$element['attributes']['url'] = file_create_url($image_style->buildUri($file->getFileUri()));
}
// Normal image size.
else {
$element['attributes']['url'] = $file->createFileUrl(FALSE);
}
}
// No file entity found, but something still was assigned to be displayed
// as enclosure, so we just put its value in the url attribute.
elseif (!empty($item['rendered']['#markup'])) {
$element['attributes']['url'] = $item['rendered']['#markup'];
}
$variables['elements'][] = $element;
}
}
/**
* Preprocess function for item <media:category> element.
*
* @see views_rss_core_preprocess_item_category()
*/
function views_rss_media_preprocess_item_category(&$variables) {
// No raw values = no preprocessing.
if (empty($variables['raw']['items'])) {
return;
}
$variables['elements'] = array();
foreach ($variables['raw']['items'] as $item) {
// According to RSS Advisory Board, the category's value should be
// a slash-delimited string that identifies a hierarchical position
// in the taxonomy.
$values = array();
// Load parent term objects (this includes original term as well).
if ($parents = \Drupal::entityTypeManager()->getStorage('taxonomy_term')->loadAllParents($item['raw']->entity->id())) {
foreach ($parents as $parent) {
$values[] = $parent->label();
}
}
$element = array(
'key' => 'media:category',
'value' => implode('/', array_reverse($values)),
'attributes' => array(
'label' => $item['raw']->entity->label(),
),
);
// Drupal uses term URL for domain attribute on main category element
// (similar to media:category). RSS Best Practices say that domain attribute
// identifies the category's taxonomy - which suggests either vocabulary
// name or its URL. We don't have any safe way to know public vocabulary
// URL, could use its name instead though? @TODO?
if ($item['raw']->target_id) {
$element['attributes']['scheme'] = $item['raw']->entity->url('canonical', array('absolute' => TRUE));
}
$variables['elements'][] = $element;
}
}
name: 'Advanced Views RSS Feed: Media (MRSS) Elements'
type: module
description: 'Provides Media (MRSS) element set.'
package: Views
core_version_requirement: ^8.8 || ^9
dependencies:
- views_rss:views_rss
<?php
/**
* @file
* Provides Media RSS namespace, <channel> and <item> elements for Views RSS module.
*/
/**
* Include file with all preprocess functions.
*/
include_once dirname(__FILE__) . '/views_rss_media.inc';
/**
* Implements hook_views_rss_namespaces().
*/
function views_rss_media_views_rss_namespaces() {
$namespaces['media'] = array(
'prefix' => 'xmlns',
'uri' => 'http://search.yahoo.com/mrss/',
);
return $namespaces;
}
/**
* Implements hook_views_rss_item_elements().
*/
function views_rss_media_views_rss_item_elements() {
$elements['media:content'] = array(
'description' => t('Contains the primary metadata entries needed to index and organize media content.'),
'preprocess functions' => array('views_rss_media_preprocess_item_content'),
'help' => 'http://www.rssboard.org/media-rss#media-content',
);
$elements['media:title'] = array(
'description' => t('The title of the particular media object.'),
'preprocess functions' => array(
'views_rss_htmlspecialchars',
'views_rss_media_preprocess_item_text',
),
'help' => 'http://www.rssboard.org/media-rss#media-title',
);
$elements['media:description'] = array(
'description' => t('Short description describing the media object typically a sentence in length.'),
'preprocess functions' => array(
'views_rss_htmlspecialchars',
'views_rss_media_preprocess_item_text',
),
'help' => 'http://www.rssboard.org/media-rss#media-description',
);
$elements['media:keywords'] = array(
'description' => t('Highly relevant keywords describing the media object with typically a maximum of 10 words. The keywords and phrases should be comma-delimited.'),
'help' => 'http://www.rssboard.org/media-rss#media-keywords',
);
$elements['media:thumbnail'] = array(
'description' => t('Allows particular images to be used as representative images for the media object.'),
'preprocess functions' => array('views_rss_media_preprocess_item_thumbnail'),
'help' => 'http://www.rssboard.org/media-rss#media-thumbnails',
);
$elements['media:category'] = array(
'description' => t('Allows a taxonomy to be set that gives an indication of the type of media content, and its particular contents.'),
'preprocess functions' => array('views_rss_media_preprocess_item_category'),
'help' => 'http://www.rssboard.org/media-rss#media-category',
);
return $elements;
}
name: 'Advanced Views RSS Feed: Media getID3'
type: module
description: 'Provides additional metadata for multimedia file formats.'
package: Views
core_version_requirement: ^8 || ^9
dependencies:
- views_rss:views_rss_media
<?php
/**
* @file
* Install hooks for this module.
*/
/**
* Implements hook_requirements().
*/
function views_rss_media_getid3_requirements($phase) {
$requirements = [];
if ($phase === 'install' && !class_exists(getID3::class)) {
$requirements['views_rss_media_getid3'] = [
'description' => t('Views RSS: Media getID3 requires the getID3 library.'),
'severity' => REQUIREMENT_ERROR,
];
}
return $requirements;
}
<?php
/**
* @file
* Hook implementations for this module.
*/
use Drupal\file\FileInterface;
use Drupal\image\Entity\ImageStyle;
/**
* Implements hook_views_rss_item_elements_alter().
*/
function views_rss_media_getid3_views_rss_item_elements_alter(&$elements) {
$elements['views_rss_media']['media:content']['preprocess functions'][] = 'views_rss_media_getid3_preprocess_media_content';
$elements['views_rss_media']['media:thumbnail']['preprocess functions'][] = 'views_rss_media_getid3_preprocess_media_thumbnail';
}
/**
* Preprocess function for item <media:content> element.
*/
function views_rss_media_getid3_preprocess_media_content(&$variables) {
foreach ($variables['raw']['items'] as $index => $item) {
$file = NULL;
// File fields.
if (!empty($item['rendered']['#file'])) {
$file = $item['rendered']['#file'];
}
// Image fields.
if (!empty($item['rendered']['#item']->entity)) {
$file = $item['rendered']['#item']->entity;
}
if ($file instanceof FileInterface) {
$realpath = \Drupal::service('file_system')->realpath($file->getFileUri());
$id3_info = (new getID3())->analyze($realpath);
// Video details.
if (!empty($id3_info['video']['frame_rate'])) {
$variables['elements'][$index]['attributes']['framerate'] = $id3_info['video']['frame_rate'];
}
if (!empty($id3_info['video']['bitrate'])) {
$variables['elements'][$index]['attributes']['bitrate'] = $id3_info['video']['bitrate'];
}
if (!empty($id3_info['video']['resolution_x'])) {
$variables['elements'][$index]['attributes']['width'] = $id3_info['video']['resolution_x'];
}
if (!empty($id3_info['video']['resolution_y'])) {
$variables['elements'][$index]['attributes']['height'] = $id3_info['video']['resolution_y'];
}
// Audio details.
if (!empty($id3_info['audio']['bitrate'])) {
$variables['elements'][$index]['attributes']['bitrate'] = $id3_info['audio']['bitrate'];
}
if (!empty($id3_info['audio']['sample_rate'])) {
$variables['elements'][$index]['attributes']['samplingrate'] = $id3_info['audio']['sample_rate'] / 1000;
}
if (!empty($id3_info['audio']['channels'])) {
$variables['elements'][$index]['attributes']['channels'] = $id3_info['audio']['channels'];
}
// Misc details.
if (!empty($id3_info['playtime_seconds'])) {
$variables['elements'][$index]['attributes']['duration'] = (int) $id3_info['playtime_seconds'];
}
}
}
}
/**
* Preprocess function for item <media:thumbnail> element.
*/
function views_rss_media_getid3_preprocess_media_thumbnail(&$variables) {
foreach ($variables['raw']['items'] as $index => $item) {
$file = NULL;
// File fields.
if (!empty($item['rendered']['#file'])) {
$file = $item['rendered']['#file'];
}
// Image fields.
if (!empty($item['rendered']['#item']->entity)) {
$file = $item['rendered']['#item']->entity;
}
if ($file instanceof FileInterface) {
// Image style is defined, need to link to resized version.
if ($image_style_name = $item['rendered']['#image_style']) {
/** @var \Drupal\image\ImageStyleInterface $image_style */
$image_style = ImageStyle::load($image_style_name);
$uri = $image_style->buildUri($file->getFileUri());
}
// Normal image size.
else {
$uri = $file->getFileUri();
}
$realpath = \Drupal::service('file_system')->realpath($uri);
$id3_info = (new getID3())->analyze($realpath);
if (!empty($id3_info['video']['resolution_x'])) {
$variables['elements'][$index]['attributes']['width'] = $id3_info['video']['resolution_x'];
}
if (!empty($id3_info['video']['resolution_y'])) {
$variables['elements'][$index]['attributes']['height'] = $id3_info['video']['resolution_y'];
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment