From fca9d32545c933d3a262c1d49b44a805589de882 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Thu, 27 Nov 2014 19:40:23 +0100 Subject: [PATCH 1/4] Move registration of core preview providers to preview So the class files only have class code and don't execute code --- lib/private/preview.php | 72 ++++++++++++++++++++++++++++++- lib/private/preview/bitmap.php | 42 +++--------------- lib/private/preview/image.php | 2 - lib/private/preview/movie.php | 16 ------- lib/private/preview/mp3.php | 2 - lib/private/preview/office-cl.php | 14 ------ lib/private/preview/office.php | 28 ------------ lib/private/preview/provider.php | 10 +++-- lib/private/preview/svg.php | 11 ----- lib/private/preview/txt.php | 21 +++------ 10 files changed, 86 insertions(+), 132 deletions(-) delete mode 100644 lib/private/preview/office.php diff --git a/lib/private/preview.php b/lib/private/preview.php index c9d8810be6..6547d5b325 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -21,7 +21,7 @@ require_once 'preview/movie.php'; require_once 'preview/mp3.php'; require_once 'preview/svg.php'; require_once 'preview/txt.php'; -require_once 'preview/office.php'; +require_once 'preview/office-cl.php'; require_once 'preview/bitmap.php'; class Preview { @@ -744,10 +744,11 @@ class Preview { return; } - if (count(self::$providers) > 0) { + if (!empty(self::$providers)) { return; } + self::registerCoreProviders(); foreach (self::$registeredProviders as $provider) { $class = $provider['class']; $options = $provider['options']; @@ -759,7 +760,74 @@ class Preview { $keys = array_map('strlen', array_keys(self::$providers)); array_multisort($keys, SORT_DESC, 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', + // Requires adding 'eps' => array('application/postscript', null), to lib/private/mimetypes.list.php + 'EPS' => 'OC\Preview\Postscript', + ); + + 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'); + } + } } /** diff --git a/lib/private/preview/bitmap.php b/lib/private/preview/bitmap.php index 748a63a6af..4632285348 100644 --- a/lib/private/preview/bitmap.php +++ b/lib/private/preview/bitmap.php @@ -9,10 +9,6 @@ namespace OC\Preview; use Imagick; -if (extension_loaded('imagick')) { - - $checkImagick = new Imagick(); - class Bitmap extends Provider { public function getMimeType() { @@ -23,11 +19,11 @@ if (extension_loaded('imagick')) { $tmpPath = $fileview->toTmpFile($path); //create imagick object from bitmap or vector file - try{ + try { // Layer 0 contains either the bitmap or // a flat representation of all vector layers $bp = new Imagick($tmpPath . '[0]'); - + $bp->setImageFormat('png'); } catch (\Exception $e) { \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); @@ -35,17 +31,14 @@ if (extension_loaded('imagick')) { } unlink($tmpPath); - + //new bitmap image object $image = new \OC_Image($bp); //check if image object is valid return $image->valid() ? $image : false; } - } - - if(count($checkImagick->queryFormats('PDF')) === 1) { - + //.pdf class PDF extends Bitmap { @@ -54,12 +47,7 @@ if (extension_loaded('imagick')) { } } - - \OC\Preview::registerProvider('OC\Preview\PDF'); - } - - if(count($checkImagick->queryFormats('TIFF')) === 1) { - + //.tiff class TIFF extends Bitmap { @@ -68,12 +56,7 @@ if (extension_loaded('imagick')) { } } - - \OC\Preview::registerProvider('OC\Preview\TIFF'); - } - if(count($checkImagick->queryFormats('AI')) === 1) { - //.ai class Illustrator extends Bitmap { @@ -82,12 +65,6 @@ if (extension_loaded('imagick')) { } } - - \OC\Preview::registerProvider('OC\Preview\Illustrator'); - } - - // Requires adding 'eps' => array('application/postscript', null), to lib/private/mimetypes.list.php - if(count($checkImagick->queryFormats('EPS')) === 1) { //.eps class Postscript extends Bitmap { @@ -98,11 +75,6 @@ if (extension_loaded('imagick')) { } - \OC\Preview::registerProvider('OC\Preview\Postscript'); - } - - if(count($checkImagick->queryFormats('PSD')) === 1) { - //.psd class Photoshop extends Bitmap { @@ -111,7 +83,3 @@ if (extension_loaded('imagick')) { } } - - \OC\Preview::registerProvider('OC\Preview\Photoshop'); - } -} diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php index 7bcbddc649..511052caf2 100644 --- a/lib/private/preview/image.php +++ b/lib/private/preview/image.php @@ -35,5 +35,3 @@ class Image extends Provider { } } - -\OC\Preview::registerProvider('OC\Preview\Image'); diff --git a/lib/private/preview/movie.php b/lib/private/preview/movie.php index d69266ceb3..850027c1a6 100644 --- a/lib/private/preview/movie.php +++ b/lib/private/preview/movie.php @@ -8,13 +8,6 @@ */ namespace OC\Preview; -// movie preview is currently not supported on Windows -if (!\OC_Util::runningOnWindows()) { - $avconvBinary = \OC_Helper::findBinaryPath('avconv'); - $ffmpegBinary = ($avconvBinary) ? null : \OC_Helper::findBinaryPath('ffmpeg'); - - if ($avconvBinary || $ffmpegBinary) { - class Movie extends Provider { public static $avconvBinary; public static $ffmpegBinary; @@ -95,12 +88,3 @@ if (!\OC_Util::runningOnWindows()) { return false; } } - - // a bit hacky but didn't want to use subclasses - Movie::$avconvBinary = $avconvBinary; - Movie::$ffmpegBinary = $ffmpegBinary; - - \OC\Preview::registerProvider('OC\Preview\Movie'); - } -} - diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php index bb4d3dfce8..661cb92bf6 100644 --- a/lib/private/preview/mp3.php +++ b/lib/private/preview/mp3.php @@ -44,5 +44,3 @@ class MP3 extends Provider { } } - -\OC\Preview::registerProvider('OC\Preview\MP3'); diff --git a/lib/private/preview/office-cl.php b/lib/private/preview/office-cl.php index f5c791e37f..0f175e811d 100644 --- a/lib/private/preview/office-cl.php +++ b/lib/private/preview/office-cl.php @@ -7,9 +7,6 @@ */ namespace OC\Preview; -// office preview is currently not supported on Windows -if (!\OC_Util::runningOnWindows()) { - //we need imagick to convert class Office extends Provider { @@ -90,8 +87,6 @@ if (!\OC_Util::runningOnWindows()) { } - \OC\Preview::registerProvider('OC\Preview\MSOfficeDoc'); - //.docm, .dotm, .xls(m), .xlt(m), .xla(m), .ppt(m), .pot(m), .pps(m), .ppa(m) class MSOffice2003 extends Office { @@ -101,8 +96,6 @@ if (!\OC_Util::runningOnWindows()) { } - \OC\Preview::registerProvider('OC\Preview\MSOffice2003'); - //.docx, .dotx, .xlsx, .xltx, .pptx, .potx, .ppsx class MSOffice2007 extends Office { @@ -112,8 +105,6 @@ if (!\OC_Util::runningOnWindows()) { } - \OC\Preview::registerProvider('OC\Preview\MSOffice2007'); - //.odt, .ott, .oth, .odm, .odg, .otg, .odp, .otp, .ods, .ots, .odc, .odf, .odb, .odi, .oxt class OpenDocument extends Office { @@ -123,8 +114,6 @@ if (!\OC_Util::runningOnWindows()) { } - \OC\Preview::registerProvider('OC\Preview\OpenDocument'); - //.sxw, .stw, .sxc, .stc, .sxd, .std, .sxi, .sti, .sxg, .sxm class StarOffice extends Office { @@ -133,6 +122,3 @@ if (!\OC_Util::runningOnWindows()) { } } - - \OC\Preview::registerProvider('OC\Preview\StarOffice'); -} diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php deleted file mode 100644 index b47cbc6e08..0000000000 --- a/lib/private/preview/office.php +++ /dev/null @@ -1,28 +0,0 @@ -queryFormats('PDF')) === 1) { - $isShellExecEnabled = \OC_Helper::is_function_enabled('shell_exec'); - - // LibreOffice preview is currently not supported on Windows - if (!\OC_Util::runningOnWindows()) { - $whichLibreOffice = ($isShellExecEnabled ? shell_exec('command -v libreoffice') : ''); - $isLibreOfficeAvailable = !empty($whichLibreOffice); - $whichOpenOffice = ($isShellExecEnabled ? shell_exec('command -v openoffice') : ''); - $isOpenOfficeAvailable = !empty($whichOpenOffice); - //let's see if there is libreoffice or openoffice on this machine - if($isShellExecEnabled && ($isLibreOfficeAvailable || $isOpenOfficeAvailable || is_string(\OC_Config::getValue('preview_libreoffice_path', null)))) { - require_once('office-cl.php'); - } - } - } -} diff --git a/lib/private/preview/provider.php b/lib/private/preview/provider.php index f544c2c4b1..10e23efa20 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -5,18 +5,21 @@ abstract class Provider { private $options; public function __construct($options) { - $this->options=$options; + $this->options = $options; } + /** + * @return string Regex with the mimetypes that are supported by this provider + */ abstract public function getMimeType(); /** * Check if a preview can be generated for $path * - * @param string $path + * @param \OC\Files\FileInfo $file * @return bool */ - public function isAvailable($path) { + public function isAvailable($file) { return true; } @@ -32,5 +35,4 @@ abstract class Provider { * OC_Image object of the preview */ abstract public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview); - } diff --git a/lib/private/preview/svg.php b/lib/private/preview/svg.php index 0b5dbc9716..6ddf893966 100644 --- a/lib/private/preview/svg.php +++ b/lib/private/preview/svg.php @@ -9,12 +9,6 @@ namespace OC\Preview; use Imagick; -if (extension_loaded('imagick')) { - - $checkImagick = new Imagick(); - - if(count($checkImagick->queryFormats('SVG')) === 1) { - class SVG extends Provider { public function getMimeType() { @@ -50,9 +44,4 @@ if (extension_loaded('imagick')) { //check if image object is valid return $image->valid() ? $image : false; } - } - - \OC\Preview::registerProvider('OC\Preview\SVG'); - } -} diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php index 7f01b980c0..ff612e2509 100644 --- a/lib/private/preview/txt.php +++ b/lib/private/preview/txt.php @@ -8,28 +8,22 @@ namespace OC\Preview; class TXT extends Provider { - + /** + * {@inheritDoc} + */ public function getMimeType() { return '/text\/plain/'; } /** - * Check if a preview can be generated for $path - * - * @param \OC\Files\FileInfo $file - * @return bool + * {@inheritDoc} */ public function isAvailable($file) { return $file->getSize() > 5; } /** - * @param string $path - * @param int $maxX - * @param int $maxY - * @param boolean $scalingup - * @param \OC\Files\View $fileview - * @return bool|\OC_Image + * {@inheritDoc} */ public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { @@ -80,14 +74,9 @@ class TXT extends Provider { } } -\OC\Preview::registerProvider('OC\Preview\TXT'); - class MarkDown extends TXT { - public function getMimeType() { return '/text\/(x-)?markdown/'; } } - -\OC\Preview::registerProvider('OC\Preview\MarkDown'); From 9cb54e380907f23af4a59e25a7bfdb816844b76c Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 28 Nov 2014 09:16:35 +0100 Subject: [PATCH 2/4] Fix intendation and doc blocks of preview providers --- lib/private/preview.php | 5 -- lib/private/preview/image.php | 7 +- lib/private/preview/markdown.php | 18 ++++ lib/private/preview/movie.php | 146 ++++++++++++++++--------------- lib/private/preview/mp3.php | 13 ++- lib/private/preview/provider.php | 2 +- lib/private/preview/svg.php | 66 +++++++------- lib/private/preview/txt.php | 8 -- 8 files changed, 146 insertions(+), 119 deletions(-) create mode 100644 lib/private/preview/markdown.php diff --git a/lib/private/preview.php b/lib/private/preview.php index 6547d5b325..f08a0ce2c2 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -16,11 +16,6 @@ namespace OC; use OC\Preview\Provider; use OCP\Files\NotFoundException; -require_once 'preview/image.php'; -require_once 'preview/movie.php'; -require_once 'preview/mp3.php'; -require_once 'preview/svg.php'; -require_once 'preview/txt.php'; require_once 'preview/office-cl.php'; require_once 'preview/bitmap.php'; diff --git a/lib/private/preview/image.php b/lib/private/preview/image.php index 511052caf2..986a44b48f 100644 --- a/lib/private/preview/image.php +++ b/lib/private/preview/image.php @@ -9,11 +9,16 @@ namespace OC\Preview; class Image extends Provider { - + /** + * {@inheritDoc} + */ public function getMimeType() { return '/image\/(?!tiff$)(?!svg.*).*/'; } + /** + * {@inheritDoc} + */ public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { //get fileinfo $fileInfo = $fileview->getFileInfo($path); diff --git a/lib/private/preview/markdown.php b/lib/private/preview/markdown.php new file mode 100644 index 0000000000..1be01fcdd4 --- /dev/null +++ b/lib/private/preview/markdown.php @@ -0,0 +1,18 @@ +getFileInfo($path); - $useFileDirectly = (!$fileInfo->isEncrypted() && !$fileInfo->isMounted()); + $fileInfo = $fileview->getFileInfo($path); + $useFileDirectly = (!$fileInfo->isEncrypted() && !$fileInfo->isMounted()); - if ($useFileDirectly) { - $absPath = $fileview->getLocalFile($path); - } else { - $absPath = \OC_Helper::tmpFile(); + if ($useFileDirectly) { + $absPath = $fileview->getLocalFile($path); + } else { + $absPath = \OC_Helper::tmpFile(); - $handle = $fileview->fopen($path, 'rb'); + $handle = $fileview->fopen($path, 'rb'); - // we better use 5MB (1024 * 1024 * 5 = 5242880) instead of 1MB. - // in some cases 1MB was no enough to generate thumbnail - $firstmb = stream_get_contents($handle, 5242880); - file_put_contents($absPath, $firstmb); - } + // we better use 5MB (1024 * 1024 * 5 = 5242880) instead of 1MB. + // in some cases 1MB was no enough to generate thumbnail + $firstmb = stream_get_contents($handle, 5242880); + file_put_contents($absPath, $firstmb); + } - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 5); - if ($result === false) { - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 1); - if ($result === false) { - $result = $this->generateThumbNail($maxX, $maxY, $absPath, 0); - } - } - - if (!$useFileDirectly) { - unlink($absPath); - } - - return $result; - } - - /** - * @param int $maxX - * @param int $maxY - * @param string $absPath - * @param string $tmpPath - * @param int $second - * @return bool|\OC_Image - */ - private function generateThumbNail($maxX, $maxY, $absPath, $second) - { - $tmpPath = \OC_Helper::tmpFile(); - - if (self::$avconvBinary) { - $cmd = self::$avconvBinary . ' -an -y -ss ' . escapeshellarg($second) . - ' -i ' . escapeshellarg($absPath) . - ' -f mjpeg -vframes 1 -vsync 1 ' . escapeshellarg($tmpPath) . - ' > /dev/null 2>&1'; - } else { - $cmd = self::$ffmpegBinary . ' -y -ss ' . escapeshellarg($second) . - ' -i ' . escapeshellarg($absPath) . - ' -f mjpeg -vframes 1' . - ' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) . - ' ' . escapeshellarg($tmpPath) . - ' > /dev/null 2>&1'; - } - - exec($cmd, $output, $returnCode); - - if ($returnCode === 0) { - $image = new \OC_Image(); - $image->loadFromFile($tmpPath); - unlink($tmpPath); - return $image->valid() ? $image : false; - } - unlink($tmpPath); - return false; + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 5); + if ($result === false) { + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 1); + if ($result === false) { + $result = $this->generateThumbNail($maxX, $maxY, $absPath, 0); } } + + if (!$useFileDirectly) { + unlink($absPath); + } + + return $result; + } + + /** + * @param int $maxX + * @param int $maxY + * @param string $absPath + * @param int $second + * @return bool|\OC_Image + */ + private function generateThumbNail($maxX, $maxY, $absPath, $second) { + $tmpPath = \OC_Helper::tmpFile(); + + if (self::$avconvBinary) { + $cmd = self::$avconvBinary . ' -an -y -ss ' . escapeshellarg($second) . + ' -i ' . escapeshellarg($absPath) . + ' -f mjpeg -vframes 1 -vsync 1 ' . escapeshellarg($tmpPath) . + ' > /dev/null 2>&1'; + } else { + $cmd = self::$ffmpegBinary . ' -y -ss ' . escapeshellarg($second) . + ' -i ' . escapeshellarg($absPath) . + ' -f mjpeg -vframes 1' . + ' -s ' . escapeshellarg($maxX) . 'x' . escapeshellarg($maxY) . + ' ' . escapeshellarg($tmpPath) . + ' > /dev/null 2>&1'; + } + + exec($cmd, $output, $returnCode); + + if ($returnCode === 0) { + $image = new \OC_Image(); + $image->loadFromFile($tmpPath); + unlink($tmpPath); + return $image->valid() ? $image : false; + } + unlink($tmpPath); + return false; + } +} diff --git a/lib/private/preview/mp3.php b/lib/private/preview/mp3.php index 661cb92bf6..f1a50d99e1 100644 --- a/lib/private/preview/mp3.php +++ b/lib/private/preview/mp3.php @@ -8,11 +8,16 @@ namespace OC\Preview; class MP3 extends Provider { - + /** + * {@inheritDoc} + */ public function getMimeType() { return '/audio\/mpeg/'; } + /** + * {@inheritDoc} + */ public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { $getID3 = new \getID3(); @@ -31,6 +36,12 @@ class MP3 extends Provider { return $this->getNoCoverThumbnail(); } + /** + * 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 + */ 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 10e23efa20..ead67eaeef 100644 --- a/lib/private/preview/provider.php +++ b/lib/private/preview/provider.php @@ -29,7 +29,7 @@ abstract class Provider { * @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 bool $scalingup Disable/Enable upscaling of previews - * @param object $fileview fileview object of user folder + * @param \OC\Files\View $fileview fileview object of user folder * @return mixed * false if no preview was generated * OC_Image object of the preview diff --git a/lib/private/preview/svg.php b/lib/private/preview/svg.php index 6ddf893966..561e87a650 100644 --- a/lib/private/preview/svg.php +++ b/lib/private/preview/svg.php @@ -7,41 +7,43 @@ */ namespace OC\Preview; -use Imagick; +class SVG extends Provider { + /** + * {@inheritDoc} + */ + public function getMimeType() { + return '/image\/svg\+xml/'; + } - class SVG extends Provider { + /** + * {@inheritDoc} + */ + public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { + try{ + $svg = new \Imagick(); + $svg->setBackgroundColor(new \ImagickPixel('transparent')); - public function getMimeType() { - return '/image\/svg\+xml/'; + $content = stream_get_contents($fileview->fopen($path, 'r')); + if(substr($content, 0, 5) !== '' . $content; } - public function getThumbnail($path,$maxX,$maxY,$scalingup,$fileview) { - try{ - $svg = new Imagick(); - $svg->setBackgroundColor(new \ImagickPixel('transparent')); - - $content = stream_get_contents($fileview->fopen($path, 'r')); - if(substr($content, 0, 5) !== '' . $content; - } - - // Do not parse SVG files with references - if(stripos($content, 'xlink:href') !== false) { - return false; - } - - $svg->readImageBlob($content); - $svg->setImageFormat('png32'); - } catch (\Exception $e) { - \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); - return false; - } - - - //new image object - $image = new \OC_Image(); - $image->loadFromData($svg); - //check if image object is valid - return $image->valid() ? $image : false; + // Do not parse SVG files with references + if(stripos($content, 'xlink:href') !== false) { + return false; } + + $svg->readImageBlob($content); + $svg->setImageFormat('png32'); + } catch (\Exception $e) { + \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); + return false; } + + //new image object + $image = new \OC_Image(); + $image->loadFromData($svg); + //check if image object is valid + return $image->valid() ? $image : false; + } +} diff --git a/lib/private/preview/txt.php b/lib/private/preview/txt.php index ff612e2509..8b414dc572 100644 --- a/lib/private/preview/txt.php +++ b/lib/private/preview/txt.php @@ -26,7 +26,6 @@ class TXT extends Provider { * {@inheritDoc} */ public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { - $content = $fileview->fopen($path, 'r'); $content = stream_get_contents($content,3000); @@ -73,10 +72,3 @@ class TXT extends Provider { return $image->valid() ? $image : false; } } - -class MarkDown extends TXT { - public function getMimeType() { - return '/text\/(x-)?markdown/'; - } - -} From 3ec42ad59887deafd8705a687d3dd0885d4e2bbe Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Fri, 28 Nov 2014 09:20:58 +0100 Subject: [PATCH 3/4] Split office providers into one class per file --- lib/private/preview.php | 1 - lib/private/preview/msoffice2003.php | 18 ++++ lib/private/preview/msoffice2007.php | 18 ++++ lib/private/preview/msofficedoc.php | 18 ++++ lib/private/preview/office-cl.php | 124 --------------------------- lib/private/preview/office.php | 76 ++++++++++++++++ lib/private/preview/opendocument.php | 18 ++++ lib/private/preview/staroffice.php | 18 ++++ 8 files changed, 166 insertions(+), 125 deletions(-) create mode 100644 lib/private/preview/msoffice2003.php create mode 100644 lib/private/preview/msoffice2007.php create mode 100644 lib/private/preview/msofficedoc.php delete mode 100644 lib/private/preview/office-cl.php create mode 100644 lib/private/preview/office.php create mode 100644 lib/private/preview/opendocument.php create mode 100644 lib/private/preview/staroffice.php diff --git a/lib/private/preview.php b/lib/private/preview.php index f08a0ce2c2..696895cd3a 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -16,7 +16,6 @@ namespace OC; use OC\Preview\Provider; use OCP\Files\NotFoundException; -require_once 'preview/office-cl.php'; require_once 'preview/bitmap.php'; class Preview { diff --git a/lib/private/preview/msoffice2003.php b/lib/private/preview/msoffice2003.php new file mode 100644 index 0000000000..55fbe70843 --- /dev/null +++ b/lib/private/preview/msoffice2003.php @@ -0,0 +1,18 @@ +initCmd(); - if(is_null($this->cmd)) { - return false; - } - - $absPath = $fileview->toTmpFile($path); - - $tmpDir = get_temp_dir(); - - $defaultParameters = ' -env:UserInstallation=file://' . escapeshellarg($tmpDir . '/owncloud-' . \OC_Util::getInstanceId().'/') . ' --headless --nologo --nofirststartwizard --invisible --norestore --convert-to pdf --outdir '; - $clParameters = \OCP\Config::getSystemValue('preview_office_cl_parameters', $defaultParameters); - - $exec = $this->cmd . $clParameters . escapeshellarg($tmpDir) . ' ' . escapeshellarg($absPath); - - shell_exec($exec); - - //create imagick object from pdf - try{ - $pdf = new \imagick($absPath . '.pdf' . '[0]'); - $pdf->setImageFormat('jpg'); - } catch (\Exception $e) { - unlink($absPath); - unlink($absPath . '.pdf'); - \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); - return false; - } - - $image = new \OC_Image(); - $image->loadFromData($pdf); - - unlink($absPath); - unlink($absPath . '.pdf'); - - return $image->valid() ? $image : false; - } - - private function initCmd() { - $cmd = ''; - - if(is_string(\OC_Config::getValue('preview_libreoffice_path', null))) { - $cmd = \OC_Config::getValue('preview_libreoffice_path', null); - } - - $whichLibreOffice = shell_exec('command -v libreoffice'); - if($cmd === '' && !empty($whichLibreOffice)) { - $cmd = 'libreoffice'; - } - - $whichOpenOffice = shell_exec('command -v openoffice'); - if($cmd === '' && !empty($whichOpenOffice)) { - $cmd = 'openoffice'; - } - - if($cmd === '') { - $cmd = null; - } - - $this->cmd = $cmd; - } - } - - //.doc, .dot - class MSOfficeDoc extends Office { - - public function getMimeType() { - return '/application\/msword/'; - } - - } - - //.docm, .dotm, .xls(m), .xlt(m), .xla(m), .ppt(m), .pot(m), .pps(m), .ppa(m) - class MSOffice2003 extends Office { - - public function getMimeType() { - return '/application\/vnd.ms-.*/'; - } - - } - - //.docx, .dotx, .xlsx, .xltx, .pptx, .potx, .ppsx - class MSOffice2007 extends Office { - - public function getMimeType() { - return '/application\/vnd.openxmlformats-officedocument.*/'; - } - - } - - //.odt, .ott, .oth, .odm, .odg, .otg, .odp, .otp, .ods, .ots, .odc, .odf, .odb, .odi, .oxt - class OpenDocument extends Office { - - public function getMimeType() { - return '/application\/vnd.oasis.opendocument.*/'; - } - - } - - //.sxw, .stw, .sxc, .stc, .sxd, .std, .sxi, .sti, .sxg, .sxm - class StarOffice extends Office { - - public function getMimeType() { - return '/application\/vnd.sun.xml.*/'; - } - - } diff --git a/lib/private/preview/office.php b/lib/private/preview/office.php new file mode 100644 index 0000000000..5bd61bde3b --- /dev/null +++ b/lib/private/preview/office.php @@ -0,0 +1,76 @@ +initCmd(); + if(is_null($this->cmd)) { + return false; + } + + $absPath = $fileview->toTmpFile($path); + + $tmpDir = get_temp_dir(); + + $defaultParameters = ' -env:UserInstallation=file://' . escapeshellarg($tmpDir . '/owncloud-' . \OC_Util::getInstanceId().'/') . ' --headless --nologo --nofirststartwizard --invisible --norestore --convert-to pdf --outdir '; + $clParameters = \OCP\Config::getSystemValue('preview_office_cl_parameters', $defaultParameters); + + $exec = $this->cmd . $clParameters . escapeshellarg($tmpDir) . ' ' . escapeshellarg($absPath); + + shell_exec($exec); + + //create imagick object from pdf + try{ + $pdf = new \imagick($absPath . '.pdf' . '[0]'); + $pdf->setImageFormat('jpg'); + } catch (\Exception $e) { + unlink($absPath); + unlink($absPath . '.pdf'); + \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); + return false; + } + + $image = new \OC_Image(); + $image->loadFromData($pdf); + + unlink($absPath); + unlink($absPath . '.pdf'); + + return $image->valid() ? $image : false; + } + + private function initCmd() { + $cmd = ''; + + if(is_string(\OC_Config::getValue('preview_libreoffice_path', null))) { + $cmd = \OC_Config::getValue('preview_libreoffice_path', null); + } + + $whichLibreOffice = shell_exec('command -v libreoffice'); + if($cmd === '' && !empty($whichLibreOffice)) { + $cmd = 'libreoffice'; + } + + $whichOpenOffice = shell_exec('command -v openoffice'); + if($cmd === '' && !empty($whichOpenOffice)) { + $cmd = 'openoffice'; + } + + if($cmd === '') { + $cmd = null; + } + + $this->cmd = $cmd; + } +} diff --git a/lib/private/preview/opendocument.php b/lib/private/preview/opendocument.php new file mode 100644 index 0000000000..fe1468ee94 --- /dev/null +++ b/lib/private/preview/opendocument.php @@ -0,0 +1,18 @@ + Date: Fri, 28 Nov 2014 09:25:40 +0100 Subject: [PATCH 4/4] Split bitmap providers into one per file --- lib/private/preview.php | 2 - lib/private/preview/bitmap.php | 92 +++++++---------------------- lib/private/preview/illustrator.php | 19 ++++++ lib/private/preview/pdf.php | 19 ++++++ lib/private/preview/photoshop.php | 19 ++++++ lib/private/preview/postscript.php | 19 ++++++ lib/private/preview/tiff.php | 19 ++++++ 7 files changed, 117 insertions(+), 72 deletions(-) create mode 100644 lib/private/preview/illustrator.php create mode 100644 lib/private/preview/pdf.php create mode 100644 lib/private/preview/photoshop.php create mode 100644 lib/private/preview/postscript.php create mode 100644 lib/private/preview/tiff.php diff --git a/lib/private/preview.php b/lib/private/preview.php index 696895cd3a..f6c8c485d0 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -16,8 +16,6 @@ namespace OC; use OC\Preview\Provider; use OCP\Files\NotFoundException; -require_once 'preview/bitmap.php'; - class Preview { //the thumbnail folder const THUMBNAILS_FOLDER = 'thumbnails'; diff --git a/lib/private/preview/bitmap.php b/lib/private/preview/bitmap.php index 4632285348..25f65cf7fc 100644 --- a/lib/private/preview/bitmap.php +++ b/lib/private/preview/bitmap.php @@ -5,81 +5,33 @@ * later. * See the COPYING-README file. */ + namespace OC\Preview; -use Imagick; +abstract class Bitmap extends Provider { + /** + * {@inheritDoc} + */ + public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { + $tmpPath = $fileview->toTmpFile($path); - class Bitmap extends Provider { + //create imagick object from bitmap or vector file + try { + // Layer 0 contains either the bitmap or + // a flat representation of all vector layers + $bp = new \Imagick($tmpPath . '[0]'); - public function getMimeType() { - return null; + $bp->setImageFormat('png'); + } catch (\Exception $e) { + \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); + return false; } - public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) { - $tmpPath = $fileview->toTmpFile($path); + unlink($tmpPath); - //create imagick object from bitmap or vector file - try { - // Layer 0 contains either the bitmap or - // a flat representation of all vector layers - $bp = new Imagick($tmpPath . '[0]'); - - $bp->setImageFormat('png'); - } catch (\Exception $e) { - \OC_Log::write('core', $e->getmessage(), \OC_Log::ERROR); - return false; - } - - unlink($tmpPath); - - //new bitmap image object - $image = new \OC_Image($bp); - //check if image object is valid - return $image->valid() ? $image : false; - } + //new bitmap image object + $image = new \OC_Image($bp); + //check if image object is valid + return $image->valid() ? $image : false; } - - //.pdf - class PDF extends Bitmap { - - public function getMimeType() { - return '/application\/pdf/'; - } - - } - - //.tiff - class TIFF extends Bitmap { - - public function getMimeType() { - return '/image\/tiff/'; - } - - } - - //.ai - class Illustrator extends Bitmap { - - public function getMimeType() { - return '/application\/illustrator/'; - } - - } - - //.eps - class Postscript extends Bitmap { - - public function getMimeType() { - return '/application\/postscript/'; - } - - } - - //.psd - class Photoshop extends Bitmap { - - public function getMimeType() { - return '/application\/x-photoshop/'; - } - - } +} diff --git a/lib/private/preview/illustrator.php b/lib/private/preview/illustrator.php new file mode 100644 index 0000000000..e88c305f70 --- /dev/null +++ b/lib/private/preview/illustrator.php @@ -0,0 +1,19 @@ +