From c94967207217a7b2775d698eb347ea05b2f84b92 Mon Sep 17 00:00:00 2001 From: ajstanley Date: Wed, 17 Dec 2025 18:52:38 +0000 Subject: [PATCH] working drush --- drush.services.yml | 7 + islandora_inplace_media.info.yml | 4 +- islandora_inplace_media.services.yml | 15 +- .../IslandoraInplaceMediaCommands.php | 140 ++++-------------- .../QueueWorker/InplaceMediaQueueWorker.php | 3 +- src/Service/InplaceMediaProcessor.php | 50 +++++++ 6 files changed, 104 insertions(+), 115 deletions(-) create mode 100644 drush.services.yml create mode 100644 src/Service/InplaceMediaProcessor.php diff --git a/drush.services.yml b/drush.services.yml new file mode 100644 index 0000000..eb34834 --- /dev/null +++ b/drush.services.yml @@ -0,0 +1,7 @@ +services: + islandora_inplace_media.commands: + class: Drupal\islandora_inplace_media\Commands\IslandoraInplaceMediaCommands + arguments: + - '@islandora_inplace_media.processor' + tags: + - { name: drush.command } diff --git a/islandora_inplace_media.info.yml b/islandora_inplace_media.info.yml index a93da23..5947ab0 100644 --- a/islandora_inplace_media.info.yml +++ b/islandora_inplace_media.info.yml @@ -1,7 +1,7 @@ name: 'Islandora Inplace Media' type: module -description: 'Allows Uploaded files to be attched to exisitng nodes as media' -package: Custom +description: 'Allows Uploaded files to be attached to existing nodes as media' +package: Islandora core_version_requirement: ^10 || ^11 dependencies: - islandora:islandora diff --git a/islandora_inplace_media.services.yml b/islandora_inplace_media.services.yml index e819314..1fd59cc 100644 --- a/islandora_inplace_media.services.yml +++ b/islandora_inplace_media.services.yml @@ -1,4 +1,13 @@ services: - islandora_inplace_media.utils: - class: Drupal\islandora_inplace_media\Utils - arguments: ['@entity_type.manager', '@file_system', '@logger.factory', '@entity_field.manager'] + + logger.channel.islandora_inplace_media: + class: Drupal\Core\Logger\LoggerChannel + factory: logger.factory:get + arguments: ['islandora_inplace_media'] + + islandora_inplace_media.processor: + class: Drupal\islandora_inplace_media\Service\InplaceMediaProcessor + arguments: + - '@file_system' + - '@file.repository' + - '@logger.channel.islandora_inplace_media' diff --git a/src/Commands/IslandoraInplaceMediaCommands.php b/src/Commands/IslandoraInplaceMediaCommands.php index 0a091c2..688fdc8 100644 --- a/src/Commands/IslandoraInplaceMediaCommands.php +++ b/src/Commands/IslandoraInplaceMediaCommands.php @@ -1,155 +1,77 @@ fileSystem = $fileSystem; - $this->fileRepository = $fileRepository; - $this->logger = $logger; - $this->state = $state; - $this->queueFactory = $queueFactory; } /** - * Process media files (optionally queued and resumable). + * Create Islandora media from files. * * @command islandora:inplace-media * @aliases iim * * @option source_dir + * Source directory containing files. * @option destination_path + * Destination directory (public://, private://, or absolute). * @option media_type + * Media bundle machine name. * @option media_use + * Taxonomy term ID for field_media_use. * @option file_type - * @option ownership + * Media file field name. + * @option limit + * Maximum number of files to process. + * @option offset + * Number of files to skip before processing. * @option queue * Queue files instead of processing immediately. - * @option reset - * Reset saved progress. */ - public function inplaceMedia(array $options = [ + public function run(array $options = [ 'source_dir' => NULL, 'destination_path' => NULL, 'media_type' => NULL, 'media_use' => NULL, 'file_type' => 'field_media_file', - 'ownership' => NULL, + 'limit' => NULL, + 'offset' => 0, 'queue' => FALSE, - 'reset' => FALSE, - ]): void { - - $files = array_diff(scandir($options['source_dir']), ['.', '..']); - - $job_id = hash('sha256', serialize($options)); - $state_key = "islandora_inplace_media.progress.$job_id"; - - if ($options['reset']) { - $this->state->delete($state_key); - $this->output()->writeln('Progress reset.'); - } - - $processed = $this->state->get($state_key, []); - $remaining = array_values(array_diff($files, $processed)); + ]) { + $files = array_values(array_diff(scandir($options['source_dir']), ['.', '..'])); - if (empty($remaining)) { - $this->output()->success('Nothing left to process.'); - return; + if ($options['offset']) { + $files = array_slice($files, (int) $options['offset']); } - - if ($options['queue']) { - $this->enqueueFiles($remaining, $options); - $this->output()->success('Files queued for processing.'); - return; + if ($options['limit']) { + $files = array_slice($files, 0, (int) $options['limit']); } - $progress = new ProgressBar($this->output(), count($remaining)); + $progress = new ProgressBar($this->output(), count($files)); $progress->start(); - foreach ($remaining as $file_name) { - $this->processFile($file_name, $options); - $processed[] = $file_name; - $this->state->set($state_key, $processed); + foreach ($files as $file) { + if ($options['queue']) { + \Drupal::queue('islandora_inplace_media') + ->createItem(['file' => $file, 'options' => $options]); + } + else { + $this->processor->processFile($file, $options); + } $progress->advance(); } $progress->finish(); - $this->output()->newLine(2); - $this->output()->success('Processing complete.'); - } - - /** - * Enqueue files for background processing. - */ - protected function enqueueFiles(array $files, array $options): void { - $queue = $this->queueFactory->get('islandora_inplace_media'); - - foreach ($files as $file) { - $queue->createItem([ - 'file' => $file, - 'options' => $options, - ]); - } - } - - /** - * Process a single file. - */ - protected function processFile(string $file_name, array $build_data): void { - $source = "{$build_data['source_dir']}/{$file_name}"; - $dest = "{$build_data['destination_path']}/{$file_name}"; - - if (!file_exists($source)) { - $this->logger->warning('Missing file @file', ['@file' => $source]); - return; - } - - $path = ($source === $dest) - ? $dest - : $this->fileSystem->copy($source, $dest, FileExists::Rename); - - $file = $this->fileRepository->loadByUri($path) - ?? File::create(['uri' => $path, 'status' => 1]); - - $file->save(); - - preg_match('/^(\d+)_/', $file_name, $m); - $nid = $m[1] ?? NULL; - - Media::create([ - 'bundle' => $build_data['media_type'], - 'name' => $file_name, - $build_data['file_type'] => ['target_id' => $file->id()], - 'field_media_use' => ['target_id' => $build_data['media_use']], - 'field_media_of' => $nid, - ])->save(); + $this->output()->writeln(''); } } diff --git a/src/Plugin/QueueWorker/InplaceMediaQueueWorker.php b/src/Plugin/QueueWorker/InplaceMediaQueueWorker.php index 8bd2106..1375a02 100644 --- a/src/Plugin/QueueWorker/InplaceMediaQueueWorker.php +++ b/src/Plugin/QueueWorker/InplaceMediaQueueWorker.php @@ -14,7 +14,8 @@ use Drupal\Core\Queue\QueueWorkerBase; class InplaceMediaQueueWorker extends QueueWorkerBase { public function processItem($data) { - \Drupal::service('islandora_inplace_media.commands') + \Drupal::service('islandora_inplace_media.processor') ->processFile($data['file'], $data['options']); } + } diff --git a/src/Service/InplaceMediaProcessor.php b/src/Service/InplaceMediaProcessor.php new file mode 100644 index 0000000..ab2ef6e --- /dev/null +++ b/src/Service/InplaceMediaProcessor.php @@ -0,0 +1,50 @@ +logger->warning('Missing file @file', ['@file' => $source]); + return; + } + + $uri = ($source === $dest) + ? $dest + : $this->fileSystem->copy($source, $dest, FileExists::Rename); + + $fileEntity = $this->fileRepository->loadByUri($uri) + ?? File::create(['uri' => $uri, 'status' => 1]); + + $fileEntity->save(); + + preg_match('/^(\d+)_/', $file, $m); + $nid = $m[1] ?? NULL; + + Media::create([ + 'bundle' => $opts['media_type'], + 'name' => $file, + $opts['file_type'] => ['target_id' => $fileEntity->id()], + 'field_media_use' => ['target_id' => $opts['media_use']], + 'field_media_of' => $nid, + ])->save(); + } + +}