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);
}
}
}
}
