audiofield-8.x-1.x-dev/src/Commands/AudiofieldCommands.php

src/Commands/AudiofieldCommands.php
<?php

namespace Drupal\audiofield\Commands;

use Drush\Commands\DrushCommands;
use Drush\Drush;
use Drupal\Core\File\FileSystemInterface;
use Drupal\audiofield\AudioFieldPlayerManager;
use Drupal\Core\Archiver\ArchiverManager;

/**
 * A Drush commandfile for Audiofield module.
 */
class AudiofieldCommands extends DrushCommands {

  /**
   * Library discovery service.
   *
   * @var Drupal\audiofield\AudioFieldPlayerManager
   */
  protected $playerManager;

  /**
   * File system service.
   *
   * @var Drupal\Component\FileSystem\FileSystemInterface
   */
  protected $fileSystem;

  /**
   * Archive manager service.
   *
   * @var Drupal\Core\Archiver\ArchiverManager
   */
  protected $archiverManager;

  /**
   * {@inheritdoc}
   */
  public function __construct(AudioFieldPlayerManager $player_manager, FileSystemInterface $file_system, ArchiverManager $archiver_manager) {
    parent::__construct();

    $this->playerManager = $player_manager;
    $this->fileSystem = $file_system;
    $this->archiverManager = $archiver_manager;
  }

  /**
   * Downloads the suggested Audiofield libraries from their remote repos.
   *
   * @param string $installLibrary
   *   The name of the library. If omitted, all libraries will be installed.
   * @param bool $print_messages
   *   Flag indicating if messages should be displayed.
   *
   * @command audiofield:download
   * @aliases audiofield-download
   */
  public function download($installLibrary = '', $print_messages = TRUE) {

    // Get a list of the audiofield plugins.
    $pluginList = $this->playerManager->getDefinitions();

    // If there is an argument, check to make sure its valid.
    if (!empty($installLibrary)) {
      if (!isset($pluginList[$installLibrary . '_audio_player'])) {
        $this->logger()->error(dt('Error: @library is not a valid Audiofield library.', [
          '@library' => $installLibrary,
        ]));
        return;
      }
      // If the argument is valid, we only want to install that plugin.
      $pluginList = [$installLibrary . '_audio_player' => $pluginList[$installLibrary . '_audio_player']];
    }

    // Loop over each plugin and make sure it's library is installed.
    foreach ($pluginList as $pluginName => $plugin) {
      // Create an instance of this plugin.
      $pluginInstance = $this->playerManager->createInstance($pluginName);

      // Only check install if there is a library for the plugin.
      if (!$pluginInstance->getPluginLibrary()) {
        continue;
      }

      // Skip if the plugin is installed.
      if ($pluginInstance->checkInstalled()) {
        if ($print_messages) {
          $this->logger()->notice(dt('Audiofield library for @library is already installed at @location', [
            '@library' => $pluginInstance->getPluginTitle(),
            '@location' => $pluginInstance->getPluginLibraryPath(),
          ]));
        }
        continue;
      }

      // Get the library install path.
      $path = DRUPAL_ROOT . $pluginInstance->getPluginLibraryPath();
      // Create the install directory if it does not exist.
      if (!is_dir($path)) {
        $this->fileSystem->mkdir($path);
      }

      // Download the file.
      $destination = $this->fileSystem->tempnam($this->fileSystem->getTempDirectory(), 'file.') . "tar.gz";
      system_retrieve_file($pluginInstance->getPluginRemoteSource(), $destination, FALSE);
      if (!file_exists($destination)) {
        // Remove the directory.
        $this->fileSystem->rmdir($path);
        $this->logger()->error(dt('Error: unable to download @library.', [
          '@library' => $pluginInstance->getPluginTitle(),
        ]));
        continue;
      }
      $this->fileSystem->move($destination, $path . '/audiofield-dl.zip');
      if (!file_exists($path . '/audiofield-dl.zip')) {
        // Remove the directory where we tried to install.
        $this->fileSystem->rmdir($path);
        if ($print_messages) {
          $this->logger()->error(dt('Error: unable to download Audiofield library @library', [
            '@library' => $pluginInstance->getPluginTitle(),
          ]));
          continue;
        }
      }

      // Unzip the file.
      $zipFile = $this->archiverManager->getInstance(['filepath' => $path . '/audiofield-dl.zip']);
      $zipFile->extract($path);

      // Remove the downloaded zip file.
      $this->fileSystem->unlink($path . '/audiofield-dl.zip');

      // If the library still is not installed, we need to move files.
      if (!$pluginInstance->checkInstalled()) {
        // Find all folders in this directory and move their
        // subdirectories up to the parent directory.
        $directories = $this->fileSystem->scanDirectory($path, '/.*?/', [
          'recurse' => FALSE,
        ]);
        foreach ($directories as $dirName) {
          $this->fileSystem->move($path . '/' . $dirName->filename, $this->fileSystem->getTempDirectory() . '/temp_audiofield', FileSystemInterface::EXISTS_REPLACE);
          $this->fileSystem->rmdir($path);
          $this->fileSystem->move($this->fileSystem->getTempDirectory() . '/temp_audiofield', $path, FileSystemInterface::EXISTS_REPLACE);
        }

        // Projekktor source files need to be installed.
        if ($pluginInstance->getPluginId() == 'projekktor_audio_player') {
          $process = Drush::process('npm install', $path);
          $process->run();
          $process = Drush::process('grunt --force', $path);
          $process->run();
        }
        // Wavesurfer source files need to be installed.
        if ($pluginInstance->getPluginId() == 'wavesurfer_audio_player') {
          $this->logger()->notice(dt('Installing @library', [
            '@library' => $pluginInstance->getPluginTitle(),
          ]));
          $process = Drush::process('npm install', $path);
          $process->run();
          $this->logger()->notice(dt('Building @library', [
            '@library' => $pluginInstance->getPluginTitle(),
          ]));
          $process = Drush::process('npm run build', $path);
          $process->run();
        }
      }
      if ($pluginInstance->checkInstalled()) {
        if ($print_messages) {
          $this->logger()->notice(dt('Audiofield library for @library has been successfully installed at @location', [
            '@library' => $pluginInstance->getPluginTitle(),
            '@location' => $pluginInstance->getPluginLibraryPath(),
          ]));
        }
      }
      else {
        // Remove the directory where we tried to install.
        $this->fileSystem->rmdir($path);
        if ($print_messages) {
          $this->logger()->error(dt('Error: unable to install Audiofield library @library', [
            '@library' => $pluginInstance->getPluginTitle(),
          ]));
        }
      }
    }
  }

  /**
   * Updates Audiofield libraries from their remote repos if out of date.
   *
   * @param string $updateLibrary
   *   The name of the library. If omitted, all libraries will be updated.
   * @param bool $print_messages
   *   Flag indicating if messages should be displayed.
   *
   * @command audiofield:update
   * @aliases audiofield-update
   */
  public function update($updateLibrary = '', $print_messages = TRUE) {

    // Get a list of the audiofield plugins.
    $pluginList = $this->playerManager->getDefinitions();

    // If there is an argument, check to make sure its valid.
    if (!empty($updateLibrary)) {
      if (!isset($pluginList[$updateLibrary . '_audio_player'])) {
        $this->logger()->error(dt('Error: @library is not a valid Audiofield library.', [
          '@library' => $updateLibrary,
        ]));
        return;
      }
      // If the argument is valid, we only want to install that plugin.
      $pluginList = [$updateLibrary . '_audio_player' => $pluginList[$updateLibrary . '_audio_player']];
    }

    // Loop over each plugin and make sure it's library is installed.
    foreach ($pluginList as $pluginName => $plugin) {
      // Create an instance of this plugin.
      $pluginInstance = $this->playerManager->createInstance($pluginName);

      // Only check install if there is a library for the plugin.
      if (!$pluginInstance->getPluginLibrary()) {
        continue;
      }

      // Get the library install path.
      $path = DRUPAL_ROOT . $pluginInstance->getPluginLibraryPath();

      // If the library isn't installed at all we just run the install.
      if (!$pluginInstance->checkInstalled(FALSE)) {
        $this->download($pluginInstance->getPluginLibraryName());
        continue;
      }

      // Don't updating the library if its up to date.
      if ($pluginInstance->checkVersion(FALSE)) {
        $this->logger()->notice(dt('Audiofield library for @library is already up to date', [
          '@library' => $pluginInstance->getPluginTitle(),
        ]));
        continue;
      }

      // Move the current installation to the temp directory.
      $this->fileSystem->move($path, $this->fileSystem->getTempDirectory() . '/temp_audiofield', TRUE);
      // If the directory failed to move, just delete it.
      if (is_dir($path)) {
        $this->fileSystem->rmdir($path);
      }

      // Run the install command now to get the latest version.
      $this->download($updateLibrary, FALSE);

      // Check if library has been properly installed.
      if ($pluginInstance->checkInstalled()) {
        // Remove the temporary directory.
        $this->fileSystem->rmdir($this->fileSystem->getTempDirectory() . '/temp_audiofield');
        $this->logger()->notice(dt('Audiofield library for @library has been successfully updated at @location', [
          '@library' => $pluginInstance->getPluginTitle(),
          '@location' => $pluginInstance->getPluginLibraryPath(),
        ]));
      }
      else {
        // Remove the directory where we tried to install.
        $this->fileSystem->rmdir($path);
        $this->logger()->error(dt('Error: unable to update Audiofield library @library', [
          '@library' => $pluginInstance->getPluginTitle(),
        ]));
        // Restore the original install since we failed to update.
        $this->fileSystem->move($this->fileSystem->getTempDirectory() . '/temp_audiofield', $path, TRUE);
      }
    }
  }

}

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

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