From cae8529359ee4b0733cfbc958ab1405b45f0f2d2 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 11 Mar 2015 16:43:00 +0100 Subject: Register preview providers on the preview manager instead of OC\Preview --- lib/private/preview.php | 64 ++++++---------------------------------- lib/private/preview/provider.php | 2 +- lib/private/previewmanager.php | 55 ++++++++++++++++++++++++++++++++-- 3 files changed, 62 insertions(+), 59 deletions(-) (limited to 'lib/private') diff --git a/lib/private/preview.php b/lib/private/preview.php index 6af1586293f..f55cf280b3e 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -510,7 +510,7 @@ class Preview { if (is_null($this->preview)) { $preview = null; - foreach (self::$providers as $supportedMimeType => $provider) { + foreach (self::getProviders() as $supportedMimeType => $provider) { if (!preg_match($supportedMimeType, $this->mimeType)) { continue; } @@ -757,6 +757,14 @@ class Preview { array_multisort($keys, SORT_DESC, self::$providers); } + protected static function getProviders() { + if (empty(self::$providers)) { + self::initProviders(); + } + + return self::$providers; + } + protected static function registerCoreProviders() { self::registerProvider('OC\Preview\TXT'); self::registerProvider('OC\Preview\MarkDown'); @@ -914,60 +922,6 @@ class Preview { $preview->deleteAllPreviews(); } - /** - * Check if a preview can be generated for a file - * - * @param \OC\Files\FileInfo $file - * @return bool - */ - public static function isAvailable(\OC\Files\FileInfo $file) { - if (!\OC_Config::getValue('enable_previews', true)) { - return false; - } - - $mount = $file->getMountPoint(); - if ($mount and !$mount->getOption('previews', true)){ - return false; - } - - //check if there are preview backends - if (empty(self::$providers)) { - self::initProviders(); - } - - foreach (self::$providers as $supportedMimeType => $provider) { - /** - * @var \OC\Preview\Provider $provider - */ - if (preg_match($supportedMimeType, $file->getMimetype())) { - return $provider->isAvailable($file); - } - } - return false; - } - - /** - * @param string $mimeType - * @return bool - */ - public static function isMimeSupported($mimeType) { - if (!\OC_Config::getValue('enable_previews', true)) { - return false; - } - - //check if there are preview backends - if (empty(self::$providers)) { - self::initProviders(); - } - - foreach(self::$providers as $supportedMimetype => $provider) { - if(preg_match($supportedMimetype, $mimeType)) { - return true; - } - } - return false; - } - /** * @param int $fileId * @return string diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index ead67eaeef7..34c61307238 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -16,7 +16,7 @@ abstract class Provider { /** * Check if a preview can be generated for $path * - * @param \OC\Files\FileInfo $file + * @param \OCP\Files\FileInfo $file * @return bool */ public function isAvailable($file) { diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 85bf609743d..29c205e7309 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -12,6 +12,26 @@ use OCP\image; use OCP\IPreview; class PreviewManager implements IPreview { + /** @var array */ + protected $providers = []; + + /** + * In order to improve lazy loading a closure can be registered which will be + * called in case preview providers are actually requested + * + * $callable has to return an instance of \OC\Preview\Provider + * + * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider + * @param \Closure $callable + * @return void + */ + public function registerProvider($mimeTypeRegex, \Closure $callable) { + if (!isset($this->providers[$mimeTypeRegex])) { + $this->providers[$mimeTypeRegex] = []; + } + $this->providers[$mimeTypeRegex][] = $callable; + } + /** * return a preview of a file * @@ -33,16 +53,45 @@ class PreviewManager implements IPreview { * @return boolean */ function isMimeSupported($mimeType = '*') { - return \OC\Preview::isMimeSupported($mimeType); + if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + return false; + } + + $providerMimeTypes = array_keys($this->providers); + foreach ($providerMimeTypes as $supportedMimeType) { + if (preg_match($supportedMimeType, $mimeType)) { + return true; + } + } + return false; } /** * Check if a preview can be generated for a file * - * @param \OC\Files\FileInfo $file + * @param \OCP\Files\FileInfo $file * @return bool */ function isAvailable($file) { - return \OC\Preview::isAvailable($file); + if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + return false; + } + + $mount = $file->getMountPoint(); + if ($mount and !$mount->getOption('previews', true)){ + return false; + } + + foreach ($this->providers as $supportedMimeType => $providers) { + if (preg_match($supportedMimeType, $file->getMimetype())) { + foreach ($providers as $provider) { + /** @var $provider \OC\Preview\Provider */ + if ($provider->isAvailable($file)) { + return true; + } + } + } + } + return false; } } -- cgit v1.2.3 From 0b37d5aea3c1bf4a30dece3ab7dfe838f50d36f2 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 12 Mar 2015 10:48:52 +0100 Subject: Move default provider registration to preview manager --- lib/private/preview.php | 205 ++++++----------------------------------- lib/private/previewmanager.php | 170 +++++++++++++++++++++++++++++++++- lib/public/ipreview.php | 12 +++ 3 files changed, 209 insertions(+), 178 deletions(-) (limited to 'lib/private') diff --git a/lib/private/preview.php b/lib/private/preview.php index f55cf280b3e..ced76c14d17 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -50,11 +50,6 @@ class Preview { */ private $preview; - //preview providers - static private $providers = array(); - static private $registeredProviders = array(); - static private $enabledProviders = array(); - /** * @var \OCP\Files\FileInfo */ @@ -95,11 +90,7 @@ class Preview { $this->preview = null; //check if there are preview backends - if (empty(self::$providers)) { - self::initProviders(); - } - - if (empty(self::$providers) && \OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + if (!\OC::$server->getPreviewManager()->hasProviders() && \OC::$server->getConfig()->getSystemValue('enable_previews', true)) { \OC_Log::write('core', 'No preview providers exist', \OC_Log::ERROR); throw new \Exception('No preview providers'); } @@ -510,37 +501,45 @@ class Preview { if (is_null($this->preview)) { $preview = null; - foreach (self::getProviders() as $supportedMimeType => $provider) { + $previewProviders = \OC::$server->getPreviewManager()->getProviders(); + foreach ($previewProviders as $supportedMimeType => $providers) { if (!preg_match($supportedMimeType, $this->mimeType)) { continue; } - \OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG); + foreach ($providers as $closure) { + $provider = $closure(); + if (!($provider instanceof \OC\Preview\Provider)) { + continue; + } - /** @var $provider Provider */ - $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView); + \OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG); - if (!($preview instanceof \OC_Image)) { - continue; - } + /** @var $provider Provider */ + $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView); - $this->preview = $preview; - $this->resizeAndCrop(); + if (!($preview instanceof \OC_Image)) { + continue; + } - $previewPath = $this->getPreviewPath($fileId); - $cachePath = $this->buildCachePath($fileId); + $this->preview = $preview; + $this->resizeAndCrop(); - if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) { - $this->userView->mkdir($this->getThumbnailsFolder() . '/'); - } + $previewPath = $this->getPreviewPath($fileId); + $cachePath = $this->buildCachePath($fileId); - if ($this->userView->is_dir($previewPath) === false) { - $this->userView->mkdir($previewPath); - } + if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) { + $this->userView->mkdir($this->getThumbnailsFolder() . '/'); + } + + if ($this->userView->is_dir($previewPath) === false) { + $this->userView->mkdir($previewPath); + } - $this->userView->file_put_contents($cachePath, $preview->data()); + $this->userView->file_put_contents($cachePath, $preview->data()); - break; + break 2; + } } } @@ -685,154 +684,6 @@ class Preview { } } - /** - * register a new preview provider to be used - * @param string $class - * @param array $options - */ - public static function registerProvider($class, $options = array()) { - /** - * Only register providers that have been explicitly enabled - * - * The following providers are enabled by default: - * - OC\Preview\Image - * - OC\Preview\MP3 - * - OC\Preview\TXT - * - OC\Preview\MarkDown - * - * The following providers are disabled by default due to performance or privacy concerns: - * - OC\Preview\MSOfficeDoc - * - OC\Preview\MSOffice2003 - * - OC\Preview\MSOffice2007 - * - OC\Preview\OpenDocument - * - OC\Preview\StarOffice - * - OC\Preview\SVG - * - OC\Preview\Movie - * - OC\Preview\PDF - * - OC\Preview\TIFF - * - OC\Preview\Illustrator - * - OC\Preview\Postscript - * - OC\Preview\Photoshop - * - OC\Preview\Font - */ - if(empty(self::$enabledProviders)) { - self::$enabledProviders = \OC::$server->getConfig()->getSystemValue('enabledPreviewProviders', array( - 'OC\Preview\Image', - 'OC\Preview\MP3', - 'OC\Preview\TXT', - 'OC\Preview\MarkDown', - )); - } - - if(in_array($class, self::$enabledProviders)) { - self::$registeredProviders[] = array('class' => $class, 'options' => $options); - } - } - - /** - * create instances of all the registered preview providers - * @return void - */ - private static function initProviders() { - if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { - self::$providers = array(); - return; - } - - if (!empty(self::$providers)) { - return; - } - - self::registerCoreProviders(); - foreach (self::$registeredProviders as $provider) { - $class = $provider['class']; - $options = $provider['options']; - - /** @var $object Provider */ - $object = new $class($options); - self::$providers[$object->getMimeType()] = $object; - } - - $keys = array_map('strlen', array_keys(self::$providers)); - array_multisort($keys, SORT_DESC, self::$providers); - } - - protected static function getProviders() { - if (empty(self::$providers)) { - self::initProviders(); - } - - return self::$providers; - } - - protected static function registerCoreProviders() { - self::registerProvider('OC\Preview\TXT'); - self::registerProvider('OC\Preview\MarkDown'); - self::registerProvider('OC\Preview\Image'); - self::registerProvider('OC\Preview\MP3'); - - // SVG, Office and Bitmap require imagick - if (extension_loaded('imagick')) { - $checkImagick = new \Imagick(); - - $imagickProviders = array( - 'SVG' => 'OC\Preview\SVG', - 'TIFF' => 'OC\Preview\TIFF', - 'PDF' => 'OC\Preview\PDF', - 'AI' => 'OC\Preview\Illustrator', - 'PSD' => 'OC\Preview\Photoshop', - 'EPS' => 'OC\Preview\Postscript', - 'TTF' => 'OC\Preview\Font', - ); - - foreach ($imagickProviders as $queryFormat => $provider) { - if (count($checkImagick->queryFormats($queryFormat)) === 1) { - self::registerProvider($provider); - } - } - - if (count($checkImagick->queryFormats('PDF')) === 1) { - // Office previews are currently not supported on Windows - if (!\OC_Util::runningOnWindows() && \OC_Helper::is_function_enabled('shell_exec')) { - $officeFound = is_string(\OC::$server->getConfig()->getSystemValue('preview_libreoffice_path', null)); - - if (!$officeFound) { - //let's see if there is libreoffice or openoffice on this machine - $whichLibreOffice = shell_exec('command -v libreoffice'); - $officeFound = !empty($whichLibreOffice); - if (!$officeFound) { - $whichOpenOffice = shell_exec('command -v openoffice'); - $officeFound = !empty($whichOpenOffice); - } - } - - if ($officeFound) { - self::registerProvider('OC\Preview\MSOfficeDoc'); - self::registerProvider('OC\Preview\MSOffice2003'); - self::registerProvider('OC\Preview\MSOffice2007'); - self::registerProvider('OC\Preview\OpenDocument'); - self::registerProvider('OC\Preview\StarOffice'); - } - } - } - } - - // Video requires avconv or ffmpeg and is therefor - // currently not supported on Windows. - if (!\OC_Util::runningOnWindows()) { - $avconvBinary = \OC_Helper::findBinaryPath('avconv'); - $ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg'); - - if ($avconvBinary || $ffmpegBinary) { - // FIXME // a bit hacky but didn't want to use subclasses - \OC\Preview\Movie::$avconvBinary = $avconvBinary; - \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary; - - self::registerProvider('OC\Preview\Movie'); - } - } - } - /** * @param array $args */ diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 29c205e7309..e0179232978 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -15,6 +15,13 @@ class PreviewManager implements IPreview { /** @var array */ protected $providers = []; + /** + * Constructor + */ + public function __construct() { + $this->registerCoreProviders(); + } + /** * In order to improve lazy loading a closure can be registered which will be * called in case preview providers are actually requested @@ -26,12 +33,35 @@ class PreviewManager implements IPreview { * @return void */ public function registerProvider($mimeTypeRegex, \Closure $callable) { + if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + return; + } + if (!isset($this->providers[$mimeTypeRegex])) { $this->providers[$mimeTypeRegex] = []; } $this->providers[$mimeTypeRegex][] = $callable; } + /** + * Get all providers + * @return array + */ + public function getProviders() { + $keys = array_map('strlen', array_keys($this->providers)); + array_multisort($keys, SORT_DESC, $this->providers); + + return $this->providers; + } + + /** + * Does the manager have any providers + * @return bool + */ + public function hasProviders() { + return !empty($this->providers); + } + /** * return a preview of a file * @@ -84,7 +114,12 @@ class PreviewManager implements IPreview { foreach ($this->providers as $supportedMimeType => $providers) { if (preg_match($supportedMimeType, $file->getMimetype())) { - foreach ($providers as $provider) { + foreach ($providers as $closure) { + $provider = $closure(); + if (!($provider instanceof \OC\Preview\Provider)) { + continue; + } + /** @var $provider \OC\Preview\Provider */ if ($provider->isAvailable($file)) { return true; @@ -94,4 +129,137 @@ class PreviewManager implements IPreview { } return false; } + + /** @var array */ + protected $defaultProviders; + + /** + * List of enabled default providers + * + * The following providers are enabled by default: + * - OC\Preview\Image + * - OC\Preview\MP3 + * - OC\Preview\TXT + * - OC\Preview\MarkDown + * + * The following providers are disabled by default due to performance or privacy concerns: + * - OC\Preview\MSOfficeDoc + * - OC\Preview\MSOffice2003 + * - OC\Preview\MSOffice2007 + * - OC\Preview\OpenDocument + * - OC\Preview\StarOffice + * - OC\Preview\SVG + * - OC\Preview\Movie + * - OC\Preview\PDF + * - OC\Preview\TIFF + * - OC\Preview\Illustrator + * - OC\Preview\Postscript + * - OC\Preview\Photoshop + * - OC\Preview\Font + * + * @return array + */ + protected function getEnabledDefaultProvider() { + if ($this->defaultProviders !== null) { + return $this->defaultProviders; + } + + $this->defaultProviders = \OC::$server->getConfig()->getSystemValue('enabledPreviewProviders', [ + 'OC\Preview\Image', + 'OC\Preview\MP3', + 'OC\Preview\TXT', + 'OC\Preview\MarkDown', + ]); + return $this->defaultProviders; + } + + /** + * Register the default providers (if enabled) + * + * @param string $class + * @param string $mimeType + */ + protected function registerCoreProvider($class, $mimeType) { + if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) { + $this->registerProvider($mimeType, function () use ($class) { + return new $class([]); + }); + } + } + + /** + * Register the default providers (if enabled) + */ + protected function registerCoreProviders() { + $this->registerCoreProvider('OC\Preview\TXT', '/text\/plain/'); + $this->registerCoreProvider('OC\Preview\MarkDown', '/text\/(x-)?markdown/'); + $this->registerCoreProvider('OC\Preview\Image', '/image\/(?!tiff$)(?!svg.*).*/'); + $this->registerCoreProvider('OC\Preview\MP3', '/audio\/mpeg/'); + + // SVG, Office and Bitmap require imagick + if (extension_loaded('imagick')) { + $checkImagick = new \Imagick(); + + $imagickProviders = [ + 'SVG' => ['mimetype' => '/image\/svg\+xml/', 'class' => '\OC\Preview\SVG'], + 'TIFF' => ['mimetype' => '/image\/tiff/', 'class' => '\OC\Preview\TIFF'], + 'PDF' => ['mimetype' => '/application\/pdf/', 'class' => '\OC\Preview\PDF'], + 'AI' => ['mimetype' => '/application\/illustrator/', 'class' => '\OC\Preview\Illustrator'], + 'PSD' => ['mimetype' => '/application\/x-photoshop/', 'class' => '\OC\Preview\Photoshop'], + 'EPS' => ['mimetype' => '/application\/postscript/', 'class' => '\OC\Preview\Postscript'], + 'TTF' => ['mimetype' => '/application\/(?:font-sfnt|x-font$)/', 'class' => '\OC\Preview\Font'], + ]; + + foreach ($imagickProviders as $queryFormat => $provider) { + $class = $provider['class']; + if (!in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) { + continue; + } + + if (count($checkImagick->queryFormats($queryFormat)) === 1) { + $this->registerCoreProvider($class, $provider['mimetype']); + } + } + + if (count($checkImagick->queryFormats('PDF')) === 1) { + // Office previews are currently not supported on Windows + if (!\OC_Util::runningOnWindows() && \OC_Helper::is_function_enabled('shell_exec')) { + $officeFound = is_string(\OC::$server->getConfig()->getSystemValue('preview_libreoffice_path', null)); + + if (!$officeFound) { + //let's see if there is libreoffice or openoffice on this machine + $whichLibreOffice = shell_exec('command -v libreoffice'); + $officeFound = !empty($whichLibreOffice); + if (!$officeFound) { + $whichOpenOffice = shell_exec('command -v openoffice'); + $officeFound = !empty($whichOpenOffice); + } + } + + if ($officeFound) { + $this->registerCoreProvider('\OC\Preview\MSOfficeDoc', '/application\/msword/'); + $this->registerCoreProvider('\OC\Preview\MSOffice2003', '/application\/vnd.ms-.*/'); + $this->registerCoreProvider('\OC\Preview\MSOffice2007', '/application\/vnd.openxmlformats-officedocument.*/'); + $this->registerCoreProvider('\OC\Preview\OpenDocument', '/application\/vnd.oasis.opendocument.*/'); + $this->registerCoreProvider('\OC\Preview\StarOffice', '/application\/vnd.sun.xml.*/'); + } + } + } + } + + // Video requires avconv or ffmpeg and is therefor + // currently not supported on Windows. + if (in_array('OC\Preview\Movie', $this->getEnabledDefaultProvider()) && !\OC_Util::runningOnWindows()) { + $avconvBinary = \OC_Helper::findBinaryPath('avconv'); + $ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg'); + + if ($avconvBinary || $ffmpegBinary) { + // FIXME // a bit hacky but didn't want to use subclasses + \OC\Preview\Movie::$avconvBinary = $avconvBinary; + \OC\Preview\Movie::$ffmpegBinary = $ffmpegBinary; + + $this->registerCoreProvider('\OC\Preview\Movie', '/video\/.*/'); + } + } + } } diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php index 9ebe2e2d1cf..4a45fa29085 100644 --- a/lib/public/ipreview.php +++ b/lib/public/ipreview.php @@ -49,6 +49,18 @@ interface IPreview { */ public function registerProvider($mimeTypeRegex, \Closure $callable); + /** + * Get all providers + * @return array + */ + public function getProviders(); + + /** + * Does the manager have any providers + * @return bool + */ + public function hasProviders(); + /** * Return a preview of a file * @param string $file The path to the file where you want a thumbnail from -- cgit v1.2.3 From 227ff0a9e3a3106e58a352fe1fb1d5c7e01d3c28 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 12 Mar 2015 11:57:56 +0100 Subject: Clean up some docs --- lib/private/previewmanager.php | 12 ++++++------ lib/public/ipreview.php | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index e0179232978..fca1000c938 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -15,6 +15,9 @@ class PreviewManager implements IPreview { /** @var array */ protected $providers = []; + /** @var array */ + protected $defaultProviders; + /** * Constructor */ @@ -71,7 +74,7 @@ class PreviewManager implements IPreview { * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly * @return \OCP\Image */ - function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) { + public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) { $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp); return $preview->getPreview(); } @@ -82,7 +85,7 @@ class PreviewManager implements IPreview { * @param string $mimeType * @return boolean */ - function isMimeSupported($mimeType = '*') { + public function isMimeSupported($mimeType = '*') { if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { return false; } @@ -102,7 +105,7 @@ class PreviewManager implements IPreview { * @param \OCP\Files\FileInfo $file * @return bool */ - function isAvailable($file) { + public function isAvailable(\OCP\Files\FileInfo $file) { if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { return false; } @@ -130,9 +133,6 @@ class PreviewManager implements IPreview { return false; } - /** @var array */ - protected $defaultProviders; - /** * List of enabled default providers * diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php index 4a45fa29085..e1562bce58f 100644 --- a/lib/public/ipreview.php +++ b/lib/public/ipreview.php @@ -69,7 +69,7 @@ interface IPreview { * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly * @return \OCP\Image */ - function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false); + public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false); /** @@ -77,7 +77,7 @@ interface IPreview { * @param string $mimeType * @return boolean */ - function isMimeSupported($mimeType = '*'); + public function isMimeSupported($mimeType = '*'); /** * Check if a preview can be generated for a file @@ -85,5 +85,5 @@ interface IPreview { * @param \OCP\Files\FileInfo $file * @return bool */ - function isAvailable($file); + public function isAvailable(\OCP\Files\FileInfo $file); } -- cgit v1.2.3 From c1f266db886cb6ff87e81af1b47da7f5f70966f9 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 12 Mar 2015 11:59:45 +0100 Subject: Add an interface for the preview providers --- lib/private/preview.php | 2 +- lib/private/preview/provider.php | 4 +++- lib/private/previewmanager.php | 9 +++++---- lib/public/preview/iprovider.php | 41 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 lib/public/preview/iprovider.php (limited to 'lib/private') diff --git a/lib/private/preview.php b/lib/private/preview.php index ced76c14d17..cb3554fa1e9 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -509,7 +509,7 @@ class Preview { foreach ($providers as $closure) { $provider = $closure(); - if (!($provider instanceof \OC\Preview\Provider)) { + if (!($provider instanceof \OCP\Preview\IProvider)) { continue; } diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index 34c61307238..bfabc7ad4b3 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -1,7 +1,9 @@ getMimetype())) { foreach ($providers as $closure) { $provider = $closure(); - if (!($provider instanceof \OC\Preview\Provider)) { + if (!($provider instanceof IProvider)) { continue; } - /** @var $provider \OC\Preview\Provider */ + /** @var $provider IProvider */ if ($provider->isAvailable($file)) { return true; } diff --git a/lib/public/preview/iprovider.php b/lib/public/preview/iprovider.php new file mode 100644 index 00000000000..96bde3d5a26 --- /dev/null +++ b/lib/public/preview/iprovider.php @@ -0,0 +1,41 @@ + Date: Thu, 12 Mar 2015 12:08:31 +0100 Subject: Use DI for the config --- lib/private/preview/provider.php | 7 ++++++- lib/private/previewmanager.php | 25 +++++++++++++++---------- lib/private/server.php | 4 ++-- 3 files changed, 23 insertions(+), 13 deletions(-) (limited to 'lib/private') diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index bfabc7ad4b3..caf71fd2219 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -6,7 +6,12 @@ use OCP\Preview\IProvider; abstract class Provider implements IProvider { private $options; - public function __construct($options) { + /** + * Constructor + * + * @param array $options + */ + public function __construct(array $options = []) { $this->options = $options; } diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 732681c78e7..c940307084d 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -8,11 +8,13 @@ */ namespace OC; -use OCP\Image; use OCP\IPreview; use OCP\Preview\IProvider; class PreviewManager implements IPreview { + /** @var \OCP\IConfig */ + protected $config; + /** @var array */ protected $providers = []; @@ -21,8 +23,11 @@ class PreviewManager implements IPreview { /** * Constructor + * + * @param \OCP\IConfig $config */ - public function __construct() { + public function __construct(\OCP\IConfig $config) { + $this->config = $config; $this->registerCoreProviders(); } @@ -37,7 +42,7 @@ class PreviewManager implements IPreview { * @return void */ public function registerProvider($mimeTypeRegex, \Closure $callable) { - if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + if (!$this->config->getSystemValue('enable_previews', true)) { return; } @@ -87,7 +92,7 @@ class PreviewManager implements IPreview { * @return boolean */ public function isMimeSupported($mimeType = '*') { - if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + if (!$this->config->getSystemValue('enable_previews', true)) { return false; } @@ -107,7 +112,7 @@ class PreviewManager implements IPreview { * @return bool */ public function isAvailable(\OCP\Files\FileInfo $file) { - if (!\OC::$server->getConfig()->getSystemValue('enable_previews', true)) { + if (!$this->config->getSystemValue('enable_previews', true)) { return false; } @@ -165,7 +170,7 @@ class PreviewManager implements IPreview { return $this->defaultProviders; } - $this->defaultProviders = \OC::$server->getConfig()->getSystemValue('enabledPreviewProviders', [ + $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', [ 'OC\Preview\Image', 'OC\Preview\MP3', 'OC\Preview\TXT', @@ -180,10 +185,10 @@ class PreviewManager implements IPreview { * @param string $class * @param string $mimeType */ - protected function registerCoreProvider($class, $mimeType) { + protected function registerCoreProvider($class, $mimeType, $options = []) { if (in_array(trim($class, '\\'), $this->getEnabledDefaultProvider())) { - $this->registerProvider($mimeType, function () use ($class) { - return new $class([]); + $this->registerProvider($mimeType, function () use ($class, $options) { + return new $class($options); }); } } @@ -225,7 +230,7 @@ class PreviewManager implements IPreview { if (count($checkImagick->queryFormats('PDF')) === 1) { // Office previews are currently not supported on Windows if (!\OC_Util::runningOnWindows() && \OC_Helper::is_function_enabled('shell_exec')) { - $officeFound = is_string(\OC::$server->getConfig()->getSystemValue('preview_libreoffice_path', null)); + $officeFound = is_string($this->config->getSystemValue('preview_libreoffice_path', null)); if (!$officeFound) { //let's see if there is libreoffice or openoffice on this machine diff --git a/lib/private/server.php b/lib/private/server.php index 896abf04a40..8c78549d06e 100644 --- a/lib/private/server.php +++ b/lib/private/server.php @@ -43,8 +43,8 @@ class Server extends SimpleContainer implements IServerContainer { $this->registerService('ContactsManager', function ($c) { return new ContactsManager(); }); - $this->registerService('PreviewManager', function ($c) { - return new PreviewManager(); + $this->registerService('PreviewManager', function (Server $c) { + return new PreviewManager($c->getConfig()); }); $this->registerService('TagMapper', function(Server $c) { return new TagMapper($c->getDatabaseConnection()); -- cgit v1.2.3 From e518eacba6837a059381e1ffa2af4a10eba0e8ae Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 12 Mar 2015 12:20:39 +0100 Subject: Add more type hinting --- lib/private/preview/provider.php | 2 +- lib/private/preview/txt.php | 2 +- lib/public/ipreview.php | 2 +- lib/public/preview/iprovider.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) (limited to 'lib/private') diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index caf71fd2219..3cce8c2ab85 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -26,7 +26,7 @@ abstract class Provider implements IProvider { * @param \OCP\Files\FileInfo $file * @return bool */ - public function isAvailable($file) { + public function isAvailable(\OCP\Files\FileInfo $file) { return true; } diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php index 8b414dc5726..772b56c72cc 100644 --- a/lib/private/preview/txt.php +++ b/lib/private/preview/txt.php @@ -18,7 +18,7 @@ class TXT extends Provider { /** * {@inheritDoc} */ - public function isAvailable($file) { + public function isAvailable(\OCP\Files\FileInfo $file) { return $file->getSize() > 5; } diff --git a/lib/public/ipreview.php b/lib/public/ipreview.php index e1562bce58f..c1bc4cb680c 100644 --- a/lib/public/ipreview.php +++ b/lib/public/ipreview.php @@ -41,7 +41,7 @@ interface IPreview { * In order to improve lazy loading a closure can be registered which will be * called in case preview providers are actually requested * - * $callable has to return an instance of \OC\Preview\Provider + * $callable has to return an instance of \OCP\Preview\IProvider * * @param string $mimeTypeRegex Regex with the mime types that are supported by this provider * @param \Closure $callable diff --git a/lib/public/preview/iprovider.php b/lib/public/preview/iprovider.php index 96bde3d5a26..74e5cca05d9 100644 --- a/lib/public/preview/iprovider.php +++ b/lib/public/preview/iprovider.php @@ -23,7 +23,7 @@ interface IProvider { * @param \OCP\Files\FileInfo $file * @return bool */ - public function isAvailable($file); + public function isAvailable(\OCP\Files\FileInfo $file); /** * get thumbnail for file at path $path -- cgit v1.2.3 From e38dea3542ee48c6ad51808fc28d9d098cc804b2 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Mar 2015 09:39:16 +0100 Subject: Cache result for isMimeTypeSupported() --- lib/private/previewmanager.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index c940307084d..9f83d88a1fe 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -18,6 +18,9 @@ class PreviewManager implements IPreview { /** @var array */ protected $providers = []; + /** @var array mime type => support status */ + protected $mimeTypeSupportMap = []; + /** @var array */ protected $defaultProviders; @@ -96,12 +99,18 @@ class PreviewManager implements IPreview { return false; } + if (isset($this->mimeTypeSupportMap[$mimeType])) { + return $this->mimeTypeSupportMap[$mimeType]; + } + $providerMimeTypes = array_keys($this->providers); foreach ($providerMimeTypes as $supportedMimeType) { if (preg_match($supportedMimeType, $mimeType)) { + $this->mimeTypeSupportMap[$mimeType] = true; return true; } } + $this->mimeTypeSupportMap[$mimeType] = false; return false; } @@ -116,6 +125,10 @@ class PreviewManager implements IPreview { return false; } + if (!$this->isMimeSupported($file->getMimetype())) { + return false; + } + $mount = $file->getMountPoint(); if ($mount and !$mount->getOption('previews', true)){ return false; -- cgit v1.2.3 From 9c86574acfc3bd893e65572bdcbb831bf0a1530a Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Mar 2015 09:45:53 +0100 Subject: Only do all the "find path" magic when we need to register them --- lib/private/previewmanager.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 9f83d88a1fe..59d832cfbd7 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -31,7 +31,11 @@ class PreviewManager implements IPreview { */ public function __construct(\OCP\IConfig $config) { $this->config = $config; - $this->registerCoreProviders(); + + if ($this->config->getSystemValue('enable_previews', true)) { + // Register the default providers like txt, image, ... + $this->registerCoreProviders(); + } } /** -- cgit v1.2.3 From 37b827f0b2139ce668a4e394188f24283c14d643 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Mar 2015 09:51:42 +0100 Subject: Order the providers alphabetically --- lib/private/previewmanager.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 59d832cfbd7..81fa1baad61 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -161,24 +161,24 @@ class PreviewManager implements IPreview { * * The following providers are enabled by default: * - OC\Preview\Image + * - OC\Preview\MarkDown * - OC\Preview\MP3 * - OC\Preview\TXT - * - OC\Preview\MarkDown * * The following providers are disabled by default due to performance or privacy concerns: + * - OC\Preview\Font + * - OC\Preview\Illustrator + * - OC\Preview\Movie * - OC\Preview\MSOfficeDoc * - OC\Preview\MSOffice2003 * - OC\Preview\MSOffice2007 * - OC\Preview\OpenDocument + * - OC\Preview\PDF + * - OC\Preview\Photoshop + * - OC\Preview\Postscript * - OC\Preview\StarOffice * - OC\Preview\SVG - * - OC\Preview\Movie - * - OC\Preview\PDF * - OC\Preview\TIFF - * - OC\Preview\Illustrator - * - OC\Preview\Postscript - * - OC\Preview\Photoshop - * - OC\Preview\Font * * @return array */ @@ -189,9 +189,9 @@ class PreviewManager implements IPreview { $this->defaultProviders = $this->config->getSystemValue('enabledPreviewProviders', [ 'OC\Preview\Image', + 'OC\Preview\MarkDown', 'OC\Preview\MP3', 'OC\Preview\TXT', - 'OC\Preview\MarkDown', ]); return $this->defaultProviders; } -- cgit v1.2.3 From 3b7aec1b7d4e2e3a1ff6c1f7888189c67aa09b75 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Mar 2015 09:55:13 +0100 Subject: Only sort the list when required --- lib/private/previewmanager.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 81fa1baad61..0d3ec40c06b 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -15,6 +15,9 @@ class PreviewManager implements IPreview { /** @var \OCP\IConfig */ protected $config; + /** @var array */ + protected $providerListDirty = false; + /** @var array */ protected $providers = []; @@ -57,6 +60,7 @@ class PreviewManager implements IPreview { $this->providers[$mimeTypeRegex] = []; } $this->providers[$mimeTypeRegex][] = $callable; + $this->providerListDirty = true; } /** @@ -64,8 +68,15 @@ class PreviewManager implements IPreview { * @return array */ public function getProviders() { - $keys = array_map('strlen', array_keys($this->providers)); - array_multisort($keys, SORT_DESC, $this->providers); + if (!$this->config->getSystemValue('enable_previews', true)) { + return []; + } + + if ($this->providerListDirty) { + $keys = array_map('strlen', array_keys($this->providers)); + array_multisort($keys, SORT_DESC, $this->providers); + $this->providerListDirty = false; + } return $this->providers; } -- cgit v1.2.3 From 8ed27d2ce0477f40a27cdc335361b0d5654a7e09 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 13 Mar 2015 10:10:11 +0100 Subject: Create an interface for OC_Image and OCP\Image for the public API --- core/avatar/avatarcontroller.php | 2 +- lib/private/avatar.php | 6 +- lib/private/image.php | 7 +- lib/private/preview.php | 12 +-- lib/private/preview/movie.php | 2 +- lib/private/preview/mp3.php | 3 +- lib/private/preview/provider.php | 4 +- lib/private/previewmanager.php | 2 +- lib/public/iavatar.php | 4 +- lib/public/iimage.php | 193 +++++++++++++++++++++++++++++++++++++++ lib/public/ipreview.php | 2 +- lib/public/preview/iprovider.php | 4 +- tests/lib/image.php | 4 + 13 files changed, 220 insertions(+), 25 deletions(-) create mode 100644 lib/public/iimage.php (limited to 'lib/private') diff --git a/core/avatar/avatarcontroller.php b/core/avatar/avatarcontroller.php index f63e02b7761..b63c8ad53b5 100644 --- a/core/avatar/avatarcontroller.php +++ b/core/avatar/avatarcontroller.php @@ -95,7 +95,7 @@ class AvatarController extends Controller { $avatar = $this->avatarManager->getAvatar($userId); $image = $avatar->get($size); - if ($image instanceof \OC_Image) { + if ($image instanceof \OCP\IImage) { $resp = new DataDisplayResponse($image->data(), Http::STATUS_OK, ['Content-Type' => $image->mimeType()]); diff --git a/lib/private/avatar.php b/lib/private/avatar.php index 23b3c82771a..da9c84d84a4 100644 --- a/lib/private/avatar.php +++ b/lib/private/avatar.php @@ -29,7 +29,7 @@ class Avatar implements \OCP\IAvatar { /** * get the users avatar * @param int $size size in px of the avatar, avatars are square, defaults to 64 - * @return boolean|\OC_Image containing the avatar or false if there's no image + * @return boolean|\OCP\IImage containing the avatar or false if there's no image */ public function get ($size = 64) { if ($this->view->file_exists('avatar.jpg')) { @@ -57,14 +57,14 @@ class Avatar implements \OCP\IAvatar { /** * sets the users avatar - * @param \OC_Image|resource|string $data OC_Image, imagedata or path to set a new avatar + * @param \OCP\IImage|resource|string $data An image object, imagedata or path to set a new avatar * @throws \Exception if the provided file is not a jpg or png image * @throws \Exception if the provided image is not valid * @throws \OC\NotSquareException if the image is not square * @return void */ public function set ($data) { - if($data instanceOf OC_Image) { + if($data instanceOf \OCP\IImage) { $img = $data; $data = $img->data(); } else { diff --git a/lib/private/image.php b/lib/private/image.php index 2484aeecc63..c8509c61286 100644 --- a/lib/private/image.php +++ b/lib/private/image.php @@ -15,7 +15,7 @@ /** * Class for basic image manipulation */ -class OC_Image { +class OC_Image implements \OCP\IImage { protected $resource = false; // tmp resource. protected $imageType = IMAGETYPE_PNG; // Default to png if file type isn't evident. protected $mimeType = "image/png"; // Default to png @@ -285,7 +285,7 @@ class OC_Image { /** * @return null|string Returns the raw image data. */ - function data() { + public function data() { if (!$this->valid()) { return null; } @@ -949,6 +949,9 @@ class OC_Image { return true; } + /** + * Destroys the current image and resets the object + */ public function destroy() { if ($this->valid()) { imagedestroy($this->resource); diff --git a/lib/private/preview.php b/lib/private/preview.php index cb3554fa1e9..f69b0d6c971 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -46,7 +46,7 @@ class Preview { /** * preview images object * - * @var \OC_Image + * @var \OCP\IImage */ private $preview; @@ -465,7 +465,7 @@ class Preview { /** * return a preview of a file - * @return \OC_Image + * @return \OCP\IImage */ public function getPreview() { if (!is_null($this->preview) && $this->preview->valid()) { @@ -518,7 +518,7 @@ class Preview { /** @var $provider Provider */ $preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView); - if (!($preview instanceof \OC_Image)) { + if (!($preview instanceof \OCP\IImage)) { continue; } @@ -564,7 +564,7 @@ class Preview { if (is_null($this->preview)) { $this->getPreview(); } - if ($this->preview instanceof \OC_Image) { + if ($this->preview instanceof \OCP\IImage) { $this->preview->show($mimeType); } } @@ -580,8 +580,8 @@ class Preview { $scalingUp = $this->getScalingUp(); $maxScaleFactor = $this->getMaxScaleFactor(); - if (!($image instanceof \OC_Image)) { - \OC_Log::write('core', '$this->preview is not an instance of OC_Image', \OC_Log::DEBUG); + if (!($image instanceof \OCP\IImage)) { + \OC_Log::write('core', '$this->preview is not an instance of \OCP\IImage', \OC_Log::DEBUG); return; } diff --git a/lib/private/preview/movie.php b/lib/private/preview/movie.php index 06353ddebb7..85151f5dbaa 100644 --- a/lib/private/preview/movie.php +++ b/lib/private/preview/movie.php @@ -61,7 +61,7 @@ class Movie extends Provider { * @param int $maxY * @param string $absPath * @param int $second - * @return bool|\OC_Image + * @return bool|\OCP\IImage */ private function generateThumbNail($maxX, $maxY, $absPath, $second) { $tmpPath = \OC_Helper::tmpFile(); diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php index f1a50d99e13..19360f4f036 100644 --- a/lib/private/preview/mp3.php +++ b/lib/private/preview/mp3.php @@ -39,8 +39,7 @@ class MP3 extends Provider { /** * Generates a default image when the file has no cover * - * @return false|\OC_Image False if the default image is missing or invalid, - * otherwise the image is returned as \OC_Image + * @return bool|\OCP\IImage false if the default image is missing or invalid */ private function getNoCoverThumbnail() { $icon = \OC::$SERVERROOT . '/core/img/filetypes/audio.png'; diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index 3cce8c2ab85..1d6fac13965 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -37,9 +37,7 @@ abstract class Provider implements IProvider { * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image * @param bool $scalingup Disable/Enable upscaling of previews * @param \OC\Files\View $fileview fileview object of user folder - * @return mixed - * false if no preview was generated - * OC_Image object of the preview + * @return bool|\OCP\IImage false if no preview was generated */ abstract public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview); } diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 0d3ec40c06b..0a0c47df28f 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -96,7 +96,7 @@ class PreviewManager implements IPreview { * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image * @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly - * @return \OCP\Image + * @return \OCP\IImage */ public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) { $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp); diff --git a/lib/public/iavatar.php b/lib/public/iavatar.php index 8f432c23fb8..984fe1075b4 100644 --- a/lib/public/iavatar.php +++ b/lib/public/iavatar.php @@ -16,7 +16,7 @@ interface IAvatar { /** * get the users avatar * @param int $size size in px of the avatar, avatars are square, defaults to 64 - * @return boolean|\OC_Image containing the avatar or false if there's no image + * @return boolean|\OCP\IImage containing the avatar or false if there's no image */ function get($size = 64); @@ -29,7 +29,7 @@ interface IAvatar { /** * sets the users avatar - * @param \OC_Image|resource|string $data OC_Image, imagedata or path to set a new avatar + * @param \OCP\IImage|resource|string $data An image object, imagedata or path to set a new avatar * @throws \Exception if the provided file is not a jpg or png image * @throws \Exception if the provided image is not valid * @throws \OC\NotSquareException if the image is not square diff --git a/lib/public/iimage.php b/lib/public/iimage.php new file mode 100644 index 00000000000..6ba7a501eb8 --- /dev/null +++ b/lib/public/iimage.php @@ -0,0 +1,193 @@ +assertInstanceOf('\OC_Image', $img); + $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $imgcreate = imagecreatefromjpeg(OC::$SERVERROOT.'/tests/data/testimage.jpg'); $img = new \OC_Image($imgcreate); $this->assertInstanceOf('\OC_Image', $img); + $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $base64 = base64_encode(file_get_contents(OC::$SERVERROOT.'/tests/data/testimage.gif')); $img = new \OC_Image($base64); $this->assertInstanceOf('\OC_Image', $img); + $this->assertInstanceOf('\OCP\IImage', $img); unset($img); $img = new \OC_Image(null); $this->assertInstanceOf('\OC_Image', $img); + $this->assertInstanceOf('\OCP\IImage', $img); unset($img); } -- cgit v1.2.3 From 2731b80f747786860d247255ff2a849b5249e87b Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Mon, 16 Mar 2015 11:25:41 +0100 Subject: Only register the core providers when necessary --- lib/private/previewmanager.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'lib/private') diff --git a/lib/private/previewmanager.php b/lib/private/previewmanager.php index 0a0c47df28f..9f78379ba0f 100644 --- a/lib/private/previewmanager.php +++ b/lib/private/previewmanager.php @@ -15,9 +15,12 @@ class PreviewManager implements IPreview { /** @var \OCP\IConfig */ protected $config; - /** @var array */ + /** @var bool */ protected $providerListDirty = false; + /** @var bool */ + protected $registeredCoreProviders = false; + /** @var array */ protected $providers = []; @@ -34,11 +37,6 @@ class PreviewManager implements IPreview { */ public function __construct(\OCP\IConfig $config) { $this->config = $config; - - if ($this->config->getSystemValue('enable_previews', true)) { - // Register the default providers like txt, image, ... - $this->registerCoreProviders(); - } } /** @@ -72,6 +70,7 @@ class PreviewManager implements IPreview { return []; } + $this->registerCoreProviders(); if ($this->providerListDirty) { $keys = array_map('strlen', array_keys($this->providers)); array_multisort($keys, SORT_DESC, $this->providers); @@ -86,6 +85,7 @@ class PreviewManager implements IPreview { * @return bool */ public function hasProviders() { + $this->registerCoreProviders(); return !empty($this->providers); } @@ -118,6 +118,7 @@ class PreviewManager implements IPreview { return $this->mimeTypeSupportMap[$mimeType]; } + $this->registerCoreProviders(); $providerMimeTypes = array_keys($this->providers); foreach ($providerMimeTypes as $supportedMimeType) { if (preg_match($supportedMimeType, $mimeType)) { @@ -140,6 +141,7 @@ class PreviewManager implements IPreview { return false; } + $this->registerCoreProviders(); if (!$this->isMimeSupported($file->getMimetype())) { return false; } @@ -225,6 +227,11 @@ class PreviewManager implements IPreview { * Register the default providers (if enabled) */ protected function registerCoreProviders() { + if ($this->registeredCoreProviders) { + return; + } + $this->registeredCoreProviders = true; + $this->registerCoreProvider('OC\Preview\TXT', '/text\/plain/'); $this->registerCoreProvider('OC\Preview\MarkDown', '/text\/(x-)?markdown/'); $this->registerCoreProvider('OC\Preview\Image', '/image\/(?!tiff$)(?!svg.*).*/'); -- cgit v1.2.3