setName('preview:generate') ->setDescription('generate a preview for a file') ->addArgument('file', InputArgument::REQUIRED, 'path or fileid of the file to generate the preview for') ->addOption('size', 's', InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED, 'size to generate the preview for in pixels, defaults to 64x64', ['64x64']) ->addOption('crop', 'c', InputOption::VALUE_NONE, 'crop the previews instead of maintaining aspect ratio') ->addOption('mode', 'm', InputOption::VALUE_REQUIRED, "mode for generating uncropped previews, 'cover' or 'fill'", IPreview::MODE_FILL); } protected function execute(InputInterface $input, OutputInterface $output): int { $fileInput = $input->getArgument('file'); $sizes = $input->getOption('size'); $sizes = array_map(function (string $size) use ($output) { if (str_contains($size, 'x')) { $sizeParts = explode('x', $size, 2); } else { $sizeParts = [$size, $size]; } if (!is_numeric($sizeParts[0]) || !is_numeric($sizeParts[1] ?? null)) { $output->writeln("Invalid size $size"); return null; } return array_map('intval', $sizeParts); }, $sizes); if (in_array(null, $sizes)) { return 1; } $mode = $input->getOption('mode'); if ($mode !== IPreview::MODE_FILL && $mode !== IPreview::MODE_COVER) { $output->writeln("Invalid mode $mode"); return 1; } $crop = $input->getOption('crop'); $file = $this->getFile($fileInput); if (!$file) { $output->writeln("File $fileInput not found"); return 1; } if (!$file instanceof File) { $output->writeln("Can't generate previews for folders"); return 1; } if (!$this->previewManager->isAvailable($file)) { $output->writeln('No preview generator available for file of type' . $file->getMimetype() . ''); return 1; } $specifications = array_map(function (array $sizes) use ($crop, $mode) { return [ 'width' => $sizes[0], 'height' => $sizes[1], 'crop' => $crop, 'mode' => $mode, ]; }, $sizes); $this->previewManager->generatePreviews($file, $specifications); if (count($specifications) > 1) { $output->writeln('generated ' . count($specifications) . ' previews'); } else { $output->writeln('preview generated'); } return 0; } private function getFile(string $fileInput): ?Node { if (is_numeric($fileInput)) { $mounts = $this->userMountCache->getMountsForFileId((int)$fileInput); if (!$mounts) { return null; } $mount = $mounts[0]; $userFolder = $this->rootFolder->getUserFolder($mount->getUser()->getUID()); return $userFolder->getFirstNodeById((int)$fileInput); } else { try { return $this->rootFolder->get($fileInput); } catch (NotFoundException $e) { return null; } } } }