View source
<?php
namespace Drupal\blazy;
class BlazyMedia {
private static $mediaData;
public static function build(array &$element = []) {
$attributes =& $element['#attributes'];
$settings =& $element['#settings'];
$settings['player'] = empty($settings['lightbox']) && $settings['media_switch'] == 'media';
$settings['use_image'] = !empty($settings['media_switch']);
$iframe_attributes = [
'data-src' => $settings['embed_url'],
'src' => 'about:blank',
'class' => [
'b-lazy',
'media__element',
],
'allowfullscreen' => '',
];
if (empty($settings['ratio']) && $settings['width']) {
$iframe_attributes['width'] = $settings['width'];
$iframe_attributes['height'] = $settings['height'];
}
$allow = '';
if (strpos($settings['embed_url'], 'youtu') !== FALSE) {
$allow = $iframe_attributes['allow'] = 'autoplay; accelerometer; encrypted-media; gyroscope; picture-in-picture';
}
$player_attributes = [
'class' => 'media__icon media__icon--play',
'data-url' => $settings['autoplay_url'],
];
if ($settings['use_media']) {
$iframe = [
'#type' => 'html_tag',
'#tag' => 'iframe',
'#value' => '',
'#attributes' => $iframe_attributes,
];
if ($settings['player']) {
$icon = '<span class="media__icon media__icon--close"></span>';
$iframe = [
'#markup' => $icon . '<span' . drupal_attributes($player_attributes) . '></span>',
];
}
$element['#iframe'] = $iframe;
$attributes['class'][] = 'media--player';
$attributes['loading'] = 'lazy';
}
$attributes['data-media'] = drupal_json_encode([
'type' => $settings['type'],
'scheme' => $settings['scheme'],
'allow' => $allow,
]);
}
public static function imageItem($file) {
if (!isset($file->uri)) {
return FALSE;
}
try {
$wrapper = file_stream_wrapper_get_instance_by_uri($file->uri);
if (!is_object($wrapper)) {
throw new \Exception('Unable to find matching wrapper');
}
$uri = $file->type == 'image' ? $file->uri : $wrapper
->getLocalThumbnailPath();
} catch (\Exception $e) {
}
if (!isset($uri)) {
return FALSE;
}
list($type) = explode('/', file_get_mimetype($uri), 2);
if ($type == 'image' && ($image = image_get_info($uri))) {
$item = new \stdClass();
$item->target_id = $file->fid;
$item->width = $image['width'];
$item->height = $image['height'];
$item->alt = $file->filename;
$item->uri = $uri;
return $item;
}
return FALSE;
}
public static function getMediaData(array $settings = []) {
if (!isset(static::$mediaData[hash('md2', $settings['media_uri'])])) {
$media_settings = self::getMediaSettings($settings);
$scheme = $settings['scheme'];
$theme_function = 'media_' . $scheme . '_theme';
if ($media_settings && is_callable($theme_function)) {
ctools_include('media_' . $scheme . '.theme', 'media_' . $scheme, 'themes');
$function = 'media_' . $scheme . '_preprocess_media_' . $scheme . '_video';
if (is_callable($function)) {
$media_settings['captions'] = 0;
$variables = [
'options' => $media_settings,
'uri' => $settings['media_uri'],
];
$function($variables);
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on' ? 'https' : 'http';
$variables['url'] = str_replace([
'http://',
'https://',
], $protocol . '://', $variables['url']);
static::$mediaData[hash('md2', $settings['media_uri'])] = $variables;
}
}
}
return static::$mediaData[hash('md2', $settings['media_uri'])];
}
public static function getMediaSettings(array $settings = []) {
ctools_include('export');
$formatter = 'media_' . $settings['scheme'] . '_' . $settings['type'];
$name = $settings['type'] . '__' . $settings['view_mode'] . '__' . $formatter;
$displays = ctools_export_load_object('file_display', 'names', [
$name,
]);
return $displays[$name] ? $displays[$name]->settings : FALSE;
}
}