bridtv-8.x-1.x-dev/src/Plugin/media/Source/Bridtv.php

src/Plugin/media/Source/Bridtv.php
<?php

namespace Drupal\bridtv\Plugin\media\Source;

use Drupal\bridtv\BridResources;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\media\MediaInterface;
use Drupal\media\MediaSourceBase;
use GuzzleHttp\Client;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Defines the Brid.TV Video type.
 *
 * @MediaSource(
 *   id = "bridtv",
 *   label = @Translation("Brid.TV Video"),
 *   description = @Translation("This is a Brid.TV Video."),
 *   allowed_field_types = {"bridtv"},
 *   default_thumbnail_filename = "video.png"
 * )
 */
class Bridtv extends MediaSourceBase {

  /**
   * The brid resources service.
   *
   * @var \Drupal\bridtv\BridResources
   */
  protected $bridResources;

  /**
   * The file system.
   *
   * @var \Drupal\Core\File\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * The Http client.
   *
   * @var \GuzzleHttp\Client
   */
  protected $httpClient;

  /**
   * A list of valid field names to get values for.
   *
   * @var array
   */
  static protected $validNames = [
    'video_id' => 'Brid.TV Video Id',
    'title' => 'Video title',
    'description' => 'Video description',
    'publish_date' => 'Publish date',
    'data' => FALSE,
  ];

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    $instance = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $instance->setBridResources($container->get('bridtv.resources'));
    $instance->setHttpClient($container->get('http_client'));
    $instance->setFileSystem($container->get('file_system'));
    return $instance;
  }

  /**
   * Set the Brid.TV resources service.
   *
   * @param \Drupal\bridtv\BridResources $resources
   *   The Brid.TV resources service.
   */
  protected function setBridResources(BridResources $resources) {
    $this->bridResources = $resources;
  }

  /**
   * Set file system.
   *
   * @param \Drupal\Core\File\FileSystemInterface $fileSystem
   *   The file system.
   */
  protected function setFileSystem(FileSystemInterface $fileSystem) {
    $this->fileSystem = $fileSystem;
  }

  /**
   * Set the Http client.
   *
   * @param \GuzzleHttp\Client $client
   *   The Http client.
   */
  protected function setHttpClient(Client $client) {
    $this->httpClient = $client;
  }

  /**
   * {@inheritdoc}
   */
  public function getMetadataAttributes() {
    $fields = [];
    foreach (static::$validNames as $field => $label) {
      if ($label) {
        $fields[$field] = $this->t('@label', ['@label' => $label]);
      }
    }
    return $fields;
  }

  /**
   * {@inheritdoc}
   */
  public function getMetadata(MediaInterface $media, $name) {
    if (empty($this->configuration['source_field'])) {
      return NULL;
    }
    $data_field = $this->configuration['source_field'];
    switch ($name) {
      case 'default_name':
        if ($title = $media->get($data_field)->first()->get('title')->getValue()) {
          return $title;
        }
        return parent::getMetadata($media, 'default_name');

      case 'thumbnail_uri':
        return $this->getThumbnailUri($media) ?: parent::getMetadata($media, 'thumbnail_uri');

      default:
        if ($media->hasField($data_field) && !$media->get($data_field)->isEmpty()) {
          if (isset(static::$validNames[$name])) {
            return $media->get($data_field)->first()->get($name)->getValue();
          }
        }
        break;
    }
    return NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getThumbnailUri(MediaInterface $media) {
    if (!empty($this->configuration['local_images_uri']) && !empty($this->configuration['source_field'])) {
      $data_field = $this->configuration['source_field'];
      if ($media->hasField($data_field) && !$media->get($data_field)->isEmpty()) {
        $video_id = $this->getMetadata($media, 'video_id');
        $local_file_uri = $this->configuration['local_images_uri'] . '/thumbnail/' . $video_id . '.jpg';
        if (file_exists($local_file_uri)) {
          return $local_file_uri;
        }

        if ($data = $media->get($data_field)->first()->getBridApiData()) {
          if (!empty($data['Video']['image'])) {
            $remote_image_uri = $data['Video']['image'];
            if (!strpos($remote_image_uri, '://') && !(strpos($remote_image_uri, '//') === 0)) {
              $remote_image_uri = $this->bridResources->getSnaphotUrlFor($remote_image_uri);
            }
            $response = $this->httpClient->get($remote_image_uri);
            if ($response->getStatusCode() == 200) {
              $directory = $this->configuration['local_images_uri'] . '/thumbnail';
              if (!is_dir($directory)) {
                $this->fileSystem->prepareDirectory($directory, FileSystemInterface::CREATE_DIRECTORY | FileSystemInterface::MODIFY_PERMISSIONS);
              }
              $this->fileSystem->saveData((string) $response->getBody(), $local_file_uri, FileSystemInterface::EXISTS_REPLACE);
            }
            if (file_exists($local_file_uri)) {
              return $local_file_uri;
            }
          }
        }
      }
    }
    return FALSE;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildConfigurationForm($form, $form_state);

    $form['local_images_uri'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Uri for locally stored images'),
      '#description' => $this->t('The uri location for storing local images. Leave empty to not use local images.'),
      '#default_value' => empty($this->configuration['local_images_uri']) ? NULL : $this->configuration['local_images_uri'],
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function getDefaultThumbnail() {
    return $this->config->get('icon_base') . '/video.png';
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc