Alexander O'Neill
1 year ago
3 changed files with 195 additions and 0 deletions
@ -0,0 +1,10 @@
|
||||
langcode: en |
||||
status: true |
||||
dependencies: |
||||
module: |
||||
- islandora_iiif |
||||
id: media_attributes_from_iiif_action |
||||
label: 'Media attributes from IIIF' |
||||
type: media |
||||
plugin: islandora_iiif:media_attributes_from_iiif_action:media |
||||
configuration: { } |
@ -0,0 +1,16 @@
|
||||
<?php |
||||
|
||||
/** |
||||
* @file |
||||
* Install/update hook implementations. |
||||
*/ |
||||
|
||||
/** |
||||
* Add Media Attributes from IIIF action. |
||||
*/ |
||||
function islandora_iiif_update_92001(&$sandbox) { |
||||
$config_id = 'system.action.media_attributes_from_iiif_action'; |
||||
$config_path = \Drupal::service('extension.list.module')->getPath('islandora_iiif') . '/config/optional/' . $config_id .'.yml'; |
||||
$data = \Symfony\Component\Yaml\Yaml::parseFile($config_path); |
||||
\Drupal::configFactory()->getEditable($config_id)->setData($data)->save(TRUE); |
||||
} |
@ -0,0 +1,169 @@
|
||||
<?php |
||||
|
||||
namespace Drupal\islandora_iiif\Plugin\Action; |
||||
|
||||
use Drupal\Component\Datetime\TimeInterface; |
||||
use Drupal\Core\Action\Plugin\Action\SaveAction; |
||||
use Drupal\Core\Config\ImmutableConfig; |
||||
use Drupal\Core\Entity\EntityInterface; |
||||
use Drupal\Core\Entity\EntityTypeManagerInterface; |
||||
use Drupal\file\FileInterface; |
||||
use Drupal\Core\Logger\LoggerChannelInterface; |
||||
use Drupal\Core\Session\AccountInterface; |
||||
use Drupal\islandora\IslandoraUtils; |
||||
use Drupal\islandora\MediaSource\MediaSourceService; |
||||
use Drupal\islandora_iiif\IiifInfo; |
||||
use Drupal\media\MediaInterface; |
||||
use Drupal\node\NodeInterface; |
||||
use GuzzleHttp\Client; |
||||
use Symfony\Component\DependencyInjection\ContainerInterface; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
/** |
||||
* Provides an action that can save any entity. |
||||
* |
||||
* @Action( |
||||
* id = "islandora_iiif:media_attributes_from_iiif_action", |
||||
* action_label = @Translation("Add image dimensions retrieved from the IIIF server"), |
||||
* deriver = "Drupal\Core\Action\Plugin\Action\Derivative\EntityChangedActionDeriver", |
||||
* ) |
||||
*/ |
||||
class MediaAttributesFromIiif extends SaveAction { |
||||
|
||||
/** |
||||
* The HTTP client |
||||
* |
||||
* @var \GuzzleHttp\Client; |
||||
*/ |
||||
protected $httpClient; |
||||
|
||||
/** |
||||
* The IIIF Info service. |
||||
* |
||||
* @var IiifInfo |
||||
*/ |
||||
protected $iiifInfo; |
||||
|
||||
/** |
||||
* The logger. |
||||
* |
||||
* @var \Drupal\Core\Logger\LoggerChannelInterface |
||||
*/ |
||||
protected $logger; |
||||
|
||||
/** |
||||
* Islandora utility functions. |
||||
* |
||||
* @var \Drupal\islandora\IslandoraUtils |
||||
*/ |
||||
protected $utils; |
||||
|
||||
/** |
||||
* A MediaSourceService. |
||||
* |
||||
* @var \Drupal\islandora\MediaSource\MediaSourceService |
||||
*/ |
||||
protected $mediaSource; |
||||
|
||||
/** |
||||
* Constructs a TiffMediaSaveAction object. |
||||
* |
||||
* @param mixed[] $configuration |
||||
* A configuration array containing information about the plugin instance. |
||||
* @param string $plugin_id |
||||
* The plugin ID for the plugin instance. |
||||
* @param mixed $plugin_definition |
||||
* The plugin implementation definition. |
||||
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager |
||||
* The entity type manager. |
||||
* @param \Drupal\Component\Datetime\TimeInterface $time |
||||
* @param |
||||
* The time service. |
||||
* @param \Guzzle\Http\Client $http_client |
||||
* The HTTP Client. |
||||
* @param IiifInfo $iiif_info |
||||
* The IIIF INfo service. |
||||
* @param \Drupal\islandora\MediaSource\MediaSourceService $media_source |
||||
* Media source service. |
||||
* @param \Drupal\Core\Logger\LoggerChannelInterface $channel |
||||
* Logger channel. |
||||
*/ |
||||
public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager, TimeInterface $time, Client $http_client, IiifInfo $iiif_info, IslandoraUtils $islandora_utils, MediaSourceService $media_source, LoggerChannelInterface $channel) { |
||||
parent::__construct($configuration, $plugin_id, $plugin_definition, $entity_type_manager, $time); |
||||
|
||||
$this->httpClient = $http_client; |
||||
$this->iiifInfo = $iiif_info; |
||||
$this->utils = $islandora_utils; |
||||
$this->mediaSource = $media_source; |
||||
$this->logger = $channel; |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
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('datetime.time'), |
||||
$container->get('http_client'), |
||||
$container->get('islandora_iiif'), |
||||
$container->get('islandora.utils'), |
||||
$container->get('islandora.media_source_service'), |
||||
$container->get('logger.channel.islandora') |
||||
); |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function execute($entity = NULL ) { |
||||
$width = $height = FALSE; |
||||
|
||||
// Get the original File media use term. |
||||
$original_file_term = $this->utils->getTermForUri('http://pcdm.org/use#OriginalFile'); |
||||
|
||||
/** |
||||
* @var \Drupal\media\MediaInterface $original_file_media |
||||
*/ |
||||
$original_file_mids = $this->utils->getMediaReferencingNodeAndTerm($entity, $original_file_term); |
||||
if (!empty($original_file_mids)) { |
||||
|
||||
// Ordinarily there shouldn't be more than one Original File media but it's not guaranteed. |
||||
foreach($original_file_mids as $original_file_mid) { |
||||
|
||||
/* |
||||
* @var \Drupal\Media\MediaInterface $original_file_media |
||||
*/ |
||||
$original_file_media = $this->entityTypeManager->getStorage('media')->load($original_file_mid); |
||||
|
||||
// Get the media MIME Type |
||||
$original_file = $this->mediaSource->getSourceFile($original_file_media); |
||||
$mime_type = $original_file->getMimeType(); |
||||
|
||||
if (in_array($mime_type, ['image/tiff', 'image/jp2'])) { |
||||
[$width, $height] = $this->iiifInfo->getImageDimensions($original_file); |
||||
} |
||||
|
||||
|
||||
// @todo Make field configurable. Low priority since this whole thing is a workaround for an Islandora limitation. |
||||
if ($original_file_media->hasField('field_width') && $original_file_media->hasField('field_height')) { |
||||
$original_file_media->set('field_height', $height); |
||||
$original_file_media->set('field_width', $width); |
||||
$original_file_media->save(); |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* {@inheritdoc} |
||||
*/ |
||||
public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) { |
||||
|
||||
/** @var \Drupal\Core\Entity\EntityInterface $object */ |
||||
return $object->access('update', $account, $return_as_object); |
||||
} |
||||
|
||||
} |
Loading…
Reference in new issue