View source
<?php
namespace Drupal\video_embed_media\Plugin\media\Source;
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldTypePluginManagerInterface;
use Drupal\media\MediaInterface;
use Drupal\media\MediaSourceBase;
use Drupal\media\MediaTypeInterface;
use Drupal\video_embed_field\ProviderManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class VideoEmbedField extends MediaSourceBase {
protected $providerManager;
protected $mediaSettings;
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, FieldTypePluginManagerInterface $field_type_manager, ConfigFactoryInterface $config_factory, ProviderManagerInterface $provider_manager) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $entity_field_manager, $field_type_manager, $config_factory);
$this->providerManager = $provider_manager;
$this->mediaSettings = $config_factory
->get('media.settings');
}
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static($configuration, $plugin_id, $plugin_definition, $container
->get('entity_type.manager'), $container
->get('entity_field.manager'), $container
->get('plugin.manager.field.field_type'), $container
->get('config.factory'), $container
->get('video_embed_field.provider_manager'));
}
public function defaultConfiguration() {
return [
'source_field' => 'field_media_video_embed_field',
];
}
public function getMetadata(MediaInterface $media, $attribute_name) {
$url = $this
->getVideoUrl($media);
switch ($attribute_name) {
case 'default_name':
if ($provider = $this->providerManager
->loadProviderFromInput($url)) {
return $provider
->getName();
}
return parent::getMetadata($media, 'default_name');
case 'id':
if ($provider = $this->providerManager
->loadProviderFromInput($url)) {
return $provider
->getIdFromInput($url);
}
return FALSE;
case 'source':
case 'source_name':
$definition = $this->providerManager
->loadDefinitionFromInput($url);
if (!empty($definition)) {
return $definition['id'];
}
return FALSE;
case 'image_local':
case 'image_local_uri':
$thumbnail_uri = $this
->getMetadata($media, 'thumbnail_uri');
if (!empty($thumbnail_uri) && file_exists($thumbnail_uri)) {
return $thumbnail_uri;
}
return parent::getMetadata($media, 'thumbnail_uri');
case 'thumbnail_uri':
if ($provider = $this->providerManager
->loadProviderFromInput($url)) {
$provider
->downloadThumbnail();
$thumbnail_uri = $provider
->getLocalThumbnailUri();
if (!empty($thumbnail_uri)) {
return $thumbnail_uri;
}
}
return parent::getMetadata($media, 'thumbnail_uri');
}
return FALSE;
}
public function getMetadataAttributes() {
return [
'id' => $this
->t('Video ID.'),
'source' => $this
->t('Video source machine name.'),
'source_name' => $this
->t('Video source human name.'),
'image_local' => $this
->t('Copies thumbnail image to the local filesystem and returns the URI.'),
'image_local_uri' => $this
->t('Gets URI of the locally saved image.'),
];
}
protected function getVideoUrl(MediaInterface $media) {
$media_type = $this->entityTypeManager
->getStorage('media_type')
->load($media
->bundle());
$source_field = $this
->getSourceFieldDefinition($media_type);
$field_name = $source_field
->getName();
$video_url = $media->{$field_name}->value;
return !empty($video_url) ? $video_url : FALSE;
}
public function createSourceField(MediaTypeInterface $type) {
return parent::createSourceField($type)
->set('label', 'Video Url');
}
public function getSourceFieldDefinition(MediaTypeInterface $type) {
$field = !empty($this->configuration['source_field']) ? $this->configuration['source_field'] : 'field_media_video_embed_field';
if ($field) {
$fields = $this->entityFieldManager
->getFieldDefinitions('media', $type
->id());
return isset($fields[$field]) ? $fields[$field] : NULL;
}
return NULL;
}
}