Merge pull request #12483 from owncloud/issue/6101-preview-providers
Issue/6101 Autoload preview providers
This commit is contained in:
commit
b3afc98f82
21 changed files with 488 additions and 421 deletions
|
@ -16,14 +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.php';
|
||||
require_once 'preview/bitmap.php';
|
||||
|
||||
class Preview {
|
||||
//the thumbnail folder
|
||||
const THUMBNAILS_FOLDER = 'thumbnails';
|
||||
|
@ -744,10 +736,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 +752,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');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -5,20 +5,13 @@
|
|||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
use Imagick;
|
||||
|
||||
if (extension_loaded('imagick')) {
|
||||
|
||||
$checkImagick = new Imagick();
|
||||
|
||||
class Bitmap extends Provider {
|
||||
|
||||
public function getMimeType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
abstract class Bitmap extends Provider {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
$tmpPath = $fileview->toTmpFile($path);
|
||||
|
||||
|
@ -26,7 +19,7 @@ if (extension_loaded('imagick')) {
|
|||
try {
|
||||
// Layer 0 contains either the bitmap or
|
||||
// a flat representation of all vector layers
|
||||
$bp = new Imagick($tmpPath . '[0]');
|
||||
$bp = new \Imagick($tmpPath . '[0]');
|
||||
|
||||
$bp->setImageFormat('png');
|
||||
} catch (\Exception $e) {
|
||||
|
@ -41,77 +34,4 @@ if (extension_loaded('imagick')) {
|
|||
//check if image object is valid
|
||||
return $image->valid() ? $image : false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if(count($checkImagick->queryFormats('PDF')) === 1) {
|
||||
|
||||
//.pdf
|
||||
class PDF extends Bitmap {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/pdf/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\PDF');
|
||||
}
|
||||
|
||||
if(count($checkImagick->queryFormats('TIFF')) === 1) {
|
||||
|
||||
//.tiff
|
||||
class TIFF extends Bitmap {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/image\/tiff/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\TIFF');
|
||||
}
|
||||
|
||||
if(count($checkImagick->queryFormats('AI')) === 1) {
|
||||
|
||||
//.ai
|
||||
class Illustrator extends Bitmap {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/illustrator/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\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 {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/postscript/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\Postscript');
|
||||
}
|
||||
|
||||
if(count($checkImagick->queryFormats('PSD')) === 1) {
|
||||
|
||||
//.psd
|
||||
class Photoshop extends Bitmap {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/x-photoshop/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\Photoshop');
|
||||
}
|
||||
}
|
||||
|
|
19
lib/private/preview/illustrator.php
Normal file
19
lib/private/preview/illustrator.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013-2014 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
//.ai
|
||||
class Illustrator extends Bitmap {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/illustrator/';
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
|
@ -35,5 +40,3 @@ class Image extends Provider {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\Image');
|
||||
|
|
18
lib/private/preview/markdown.php
Normal file
18
lib/private/preview/markdown.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
class MarkDown extends TXT {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/text\/(x-)?markdown/';
|
||||
}
|
||||
|
||||
}
|
|
@ -8,21 +8,20 @@
|
|||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/video\/.*/';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
// TODO: use proc_open() and stream the source file ?
|
||||
|
||||
|
@ -61,12 +60,10 @@ if (!\OC_Util::runningOnWindows()) {
|
|||
* @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)
|
||||
{
|
||||
private function generateThumbNail($maxX, $maxY, $absPath, $second) {
|
||||
$tmpPath = \OC_Helper::tmpFile();
|
||||
|
||||
if (self::$avconvBinary) {
|
||||
|
@ -95,12 +92,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');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
@ -44,5 +55,3 @@ class MP3 extends Provider {
|
|||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\MP3');
|
||||
|
|
18
lib/private/preview/msoffice2003.php
Normal file
18
lib/private/preview/msoffice2003.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
//.docm, .dotm, .xls(m), .xlt(m), .xla(m), .ppt(m), .pot(m), .pps(m), .ppa(m)
|
||||
class MSOffice2003 extends Office {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.ms-.*/';
|
||||
}
|
||||
}
|
18
lib/private/preview/msoffice2007.php
Normal file
18
lib/private/preview/msoffice2007.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
//.docx, .dotx, .xlsx, .xltx, .pptx, .potx, .ppsx
|
||||
class MSOffice2007 extends Office {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.openxmlformats-officedocument.*/';
|
||||
}
|
||||
}
|
18
lib/private/preview/msofficedoc.php
Normal file
18
lib/private/preview/msofficedoc.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
//.doc, .dot
|
||||
class MSOfficeDoc extends Office {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/msword/';
|
||||
}
|
||||
}
|
|
@ -1,138 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
// office preview is currently not supported on Windows
|
||||
if (!\OC_Util::runningOnWindows()) {
|
||||
|
||||
//we need imagick to convert
|
||||
class Office extends Provider {
|
||||
|
||||
private $cmd;
|
||||
|
||||
public function getMimeType() {
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
$this->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/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\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 {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.ms-.*/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\MSOffice2003');
|
||||
|
||||
//.docx, .dotx, .xlsx, .xltx, .pptx, .potx, .ppsx
|
||||
class MSOffice2007 extends Office {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.openxmlformats-officedocument.*/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\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 {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.oasis.opendocument.*/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\OpenDocument');
|
||||
|
||||
//.sxw, .stw, .sxc, .stc, .sxd, .std, .sxi, .sti, .sxg, .sxm
|
||||
class StarOffice extends Office {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.sun.xml.*/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\StarOffice');
|
||||
}
|
|
@ -5,24 +5,72 @@
|
|||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
//both, libreoffice backend and php fallback, need imagick
|
||||
if (extension_loaded('imagick')) {
|
||||
namespace OC\Preview;
|
||||
|
||||
$checkImagick = new Imagick();
|
||||
abstract class Office extends Provider {
|
||||
private $cmd;
|
||||
|
||||
if(count($checkImagick->queryFormats('PDF')) === 1) {
|
||||
$isShellExecEnabled = \OC_Helper::is_function_enabled('shell_exec');
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
$this->initCmd();
|
||||
if(is_null($this->cmd)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 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');
|
||||
}
|
||||
}
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
|
18
lib/private/preview/opendocument.php
Normal file
18
lib/private/preview/opendocument.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
//.odt, .ott, .oth, .odm, .odg, .otg, .odp, .otp, .ods, .ots, .odc, .odf, .odb, .odi, .oxt
|
||||
class OpenDocument extends Office {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.oasis.opendocument.*/';
|
||||
}
|
||||
}
|
19
lib/private/preview/pdf.php
Normal file
19
lib/private/preview/pdf.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013-2014 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
//.pdf
|
||||
class PDF extends Bitmap {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/pdf/';
|
||||
}
|
||||
}
|
19
lib/private/preview/photoshop.php
Normal file
19
lib/private/preview/photoshop.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013-2014 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
//.psd
|
||||
class Photoshop extends Bitmap {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/x-photoshop/';
|
||||
}
|
||||
}
|
19
lib/private/preview/postscript.php
Normal file
19
lib/private/preview/postscript.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013-2014 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
//.eps
|
||||
class Postscript extends Bitmap {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/postscript/';
|
||||
}
|
||||
}
|
|
@ -8,15 +8,18 @@ abstract class Provider {
|
|||
$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;
|
||||
}
|
||||
|
||||
|
@ -26,11 +29,10 @@ 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
|
||||
*/
|
||||
abstract public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview);
|
||||
|
||||
}
|
||||
|
|
18
lib/private/preview/staroffice.php
Normal file
18
lib/private/preview/staroffice.php
Normal file
|
@ -0,0 +1,18 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
//.sxw, .stw, .sxc, .stc, .sxd, .std, .sxi, .sti, .sxg, .sxm
|
||||
class StarOffice extends Office {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/application\/vnd.sun.xml.*/';
|
||||
}
|
||||
}
|
|
@ -7,23 +7,20 @@
|
|||
*/
|
||||
namespace OC\Preview;
|
||||
|
||||
use Imagick;
|
||||
|
||||
if (extension_loaded('imagick')) {
|
||||
|
||||
$checkImagick = new Imagick();
|
||||
|
||||
if(count($checkImagick->queryFormats('SVG')) === 1) {
|
||||
|
||||
class SVG extends Provider {
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/image\/svg\+xml/';
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getThumbnail($path, $maxX, $maxY, $scalingup, $fileview) {
|
||||
try{
|
||||
$svg = new Imagick();
|
||||
$svg = new \Imagick();
|
||||
$svg->setBackgroundColor(new \ImagickPixel('transparent'));
|
||||
|
||||
$content = stream_get_contents($fileview->fopen($path, 'r'));
|
||||
|
@ -43,16 +40,10 @@ if (extension_loaded('imagick')) {
|
|||
return false;
|
||||
}
|
||||
|
||||
|
||||
//new image object
|
||||
$image = new \OC_Image();
|
||||
$image->loadFromData($svg);
|
||||
//check if image object is valid
|
||||
return $image->valid() ? $image : false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\SVG');
|
||||
}
|
||||
}
|
||||
|
|
19
lib/private/preview/tiff.php
Normal file
19
lib/private/preview/tiff.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
/**
|
||||
* Copyright (c) 2013-2014 Georg Ehrke georg@ownCloud.com
|
||||
* This file is licensed under the Affero General Public License version 3 or
|
||||
* later.
|
||||
* See the COPYING-README file.
|
||||
*/
|
||||
|
||||
namespace OC\Preview;
|
||||
|
||||
//.tiff
|
||||
class TIFF extends Bitmap {
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
public function getMimeType() {
|
||||
return '/image\/tiff/';
|
||||
}
|
||||
}
|
|
@ -8,31 +8,24 @@
|
|||
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) {
|
||||
|
||||
$content = $fileview->fopen($path, 'r');
|
||||
$content = stream_get_contents($content,3000);
|
||||
|
||||
|
@ -79,15 +72,3 @@ class TXT extends Provider {
|
|||
return $image->valid() ? $image : false;
|
||||
}
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\TXT');
|
||||
|
||||
class MarkDown extends TXT {
|
||||
|
||||
public function getMimeType() {
|
||||
return '/text\/(x-)?markdown/';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
\OC\Preview::registerProvider('OC\Preview\MarkDown');
|
||||
|
|
Loading…
Reference in a new issue