Browse Source
add command to generate a preview for a file
add command to generate a preview for a file
Signed-off-by: Robin Appelman <robin@icewind.nl>pull/37559/head
No known key found for this signature in database
GPG Key ID: 42B69D8A64526EFB
4 changed files with 144 additions and 0 deletions
-
141core/Command/Preview/Generate.php
-
1core/register_command.php
-
1lib/composer/composer/autoload_classmap.php
-
1lib/composer/composer/autoload_static.php
@ -0,0 +1,141 @@ |
|||
<?php |
|||
|
|||
declare(strict_types=1); |
|||
/** |
|||
* @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl> |
|||
* |
|||
* @license GNU AGPL version 3 or any later version |
|||
* |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU Affero General Public License as |
|||
* published by the Free Software Foundation, either version 3 of the |
|||
* License, or (at your option) any later version. |
|||
* |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU Affero General Public License for more details. |
|||
* |
|||
* You should have received a copy of the GNU Affero General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
* |
|||
*/ |
|||
|
|||
namespace OC\Core\Command\Preview; |
|||
|
|||
use OCP\Files\Config\IUserMountCache; |
|||
use OCP\Files\IRootFolder; |
|||
use OCP\Files\Node; |
|||
use OCP\Files\File; |
|||
use OCP\Files\NotFoundException; |
|||
use OCP\IPreview; |
|||
use Symfony\Component\Console\Command\Command; |
|||
use Symfony\Component\Console\Input\InputArgument; |
|||
use Symfony\Component\Console\Input\InputInterface; |
|||
use Symfony\Component\Console\Input\InputOption; |
|||
use Symfony\Component\Console\Output\OutputInterface; |
|||
|
|||
class Generate extends Command { |
|||
private IRootFolder $rootFolder; |
|||
private IUserMountCache $userMountCache; |
|||
private IPreview $previewManager; |
|||
|
|||
public function __construct(IRootFolder $rootFolder, IUserMountCache $userMountCache, IPreview $previewManager) { |
|||
$this->rootFolder = $rootFolder; |
|||
$this->userMountCache = $userMountCache; |
|||
$this->previewManager = $previewManager; |
|||
|
|||
parent::__construct(); |
|||
} |
|||
|
|||
protected function configure() { |
|||
$this |
|||
->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, &$error) { |
|||
if (str_contains($size, 'x')) { |
|||
$sizeParts = explode('x', $size, 2); |
|||
} else { |
|||
$sizeParts = [$size, $size]; |
|||
} |
|||
if (!is_numeric($sizeParts[0]) || !is_numeric($sizeParts[1])) { |
|||
$output->writeln("<error>Invalid size $size</error>"); |
|||
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("<error>Invalid mode $mode</error>"); |
|||
return 1; |
|||
} |
|||
$crop = $input->getOption("crop"); |
|||
$file = $this->getFile($fileInput); |
|||
if (!$file) { |
|||
$output->writeln("<error>File $fileInput not found</error>"); |
|||
return 1; |
|||
} |
|||
if (!$file instanceof File) { |
|||
$output->writeln("<error>Can't generate previews for folders</error>"); |
|||
return 1; |
|||
} |
|||
|
|||
if (!$this->previewManager->isAvailable($file)) { |
|||
$output->writeln("<error>No preview generator available for file of type" . $file->getMimetype() . "</error>"); |
|||
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 <info>" . count($specifications) . "</info> 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()); |
|||
$nodes = $userFolder->getById((int)$fileInput); |
|||
if (!$nodes) { |
|||
return null; |
|||
} |
|||
return $nodes[0]; |
|||
} else { |
|||
try { |
|||
return $this->rootFolder->get($fileInput); |
|||
} catch (NotFoundException $e) { |
|||
return null; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue