2023-04-03 11:28:47 -04:00
< ? php
declare ( strict_types = 1 );
/**
2024-05-24 13:43:47 -04:00
* SPDX - FileCopyrightText : 2023 Nextcloud GmbH and Nextcloud contributors
* SPDX - License - Identifier : AGPL - 3.0 - or - later
2023-04-03 11:28:47 -04:00
*/
namespace OC\Core\Command\Preview ;
use OCP\Files\Config\IUserMountCache ;
use OCP\Files\File ;
use OCP\Files\IRootFolder ;
use OCP\Files\Node ;
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 {
2023-06-12 11:10:19 -04:00
public function __construct (
private IRootFolder $rootFolder ,
private IUserMountCache $userMountCache ,
private IPreview $previewManager ,
) {
2023-04-03 11:28:47 -04:00
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' );
2024-04-22 12:11:32 -04:00
$sizes = array_map ( function ( string $size ) use ( $output ) {
2023-04-03 11:28:47 -04:00
if ( str_contains ( $size , 'x' )) {
$sizeParts = explode ( 'x' , $size , 2 );
} else {
$sizeParts = [ $size , $size ];
}
2024-04-22 12:11:32 -04:00
if ( ! is_numeric ( $sizeParts [ 0 ]) || ! is_numeric ( $sizeParts [ 1 ] ? ? null )) {
2023-04-03 11:28:47 -04:00
$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 ());
2024-02-09 03:54:52 -05:00
return $userFolder -> getFirstNodeById (( int ) $fileInput );
2023-04-03 11:28:47 -04:00
} else {
try {
return $this -> rootFolder -> get ( $fileInput );
} catch ( NotFoundException $e ) {
return null ;
}
}
}
}