nextcloud/lib/private/preview.php

644 lines
15 KiB
PHP
Raw Normal View History

<?php
/**
2013-04-25 13:18:45 +04:00
* Copyright (c) 2013 Frank Karlitschek frank@owncloud.org
* 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.
2013-05-10 01:59:16 +04:00
*
2013-04-25 13:18:45 +04:00
* Thumbnails:
* structure of filename:
* /data/user/thumbnails/pathhash/x-y.png
*
2013-04-25 13:18:45 +04:00
*/
2013-05-29 14:33:24 +04:00
namespace OC;
2013-08-19 14:16:55 +04:00
require_once 'preview/image.php';
require_once 'preview/movies.php';
require_once 'preview/mp3.php';
require_once 'preview/pdf.php';
require_once 'preview/svg.php';
require_once 'preview/txt.php';
require_once 'preview/unknown.php';
require_once 'preview/office.php';
2013-05-29 14:33:24 +04:00
class Preview {
2013-07-10 19:57:04 +04:00
//the thumbnail folder
2013-04-25 13:18:45 +04:00
const THUMBNAILS_FOLDER = 'thumbnails';
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
//config
2013-07-11 21:03:21 +04:00
private $maxScaleFactor;
private $configMaxX;
private $configMaxY;
2013-04-25 13:18:45 +04:00
//fileview object
2013-08-19 14:16:55 +04:00
private $fileView = null;
private $userView = null;
2013-05-10 01:59:16 +04:00
//vars
private $file;
private $maxX;
private $maxY;
private $scalingup;
private $mimetype;
2013-05-17 21:08:16 +04:00
2013-06-13 11:52:39 +04:00
//preview images object
2013-09-05 01:45:11 +04:00
/**
* @var \OC_Image
*/
2013-05-10 01:59:16 +04:00
private $preview;
//preview providers
static private $providers = array();
static private $registeredProviders = array();
2013-04-25 13:18:45 +04:00
/**
* @brief check if thumbnail or bigger version of thumbnail of file is cached
2013-07-11 21:21:37 +04:00
* @param string $user userid - if no user is given, OC_User::getUser will be used
* @param string $root path of root
* @param string $file The path to the file where you want a thumbnail from
* @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
2013-07-30 14:29:12 +04:00
* @param bool $scalingUp Disable/Enable upscaling of previews
* @return mixed (bool / string)
2013-04-25 13:18:45 +04:00
* false if thumbnail does not exist
* path to thumbnail if thumbnail exists
*/
2013-07-30 14:29:12 +04:00
public function __construct($user='', $root='/', $file='', $maxX=1, $maxY=1, $scalingUp=true) {
//init fileviews
if($user === ''){
$user = \OC_User::getUser();
}
$this->fileView = new \OC\Files\View('/' . $user . '/' . $root);
$this->userView = new \OC\Files\View('/' . $user);
2013-05-10 01:59:16 +04:00
//set config
2013-07-11 21:03:21 +04:00
$this->configMaxX = \OC_Config::getValue('preview_max_x', null);
$this->configMaxY = \OC_Config::getValue('preview_max_y', null);
$this->maxScaleFactor = \OC_Config::getValue('preview_max_scale_factor', 2);
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
//save parameters
2013-07-10 19:57:04 +04:00
$this->setFile($file);
$this->setMaxX($maxX);
$this->setMaxY($maxY);
2013-07-30 14:29:12 +04:00
$this->setScalingUp($scalingUp);
2013-05-10 01:59:16 +04:00
2013-07-10 19:57:04 +04:00
$this->preview = null;
2013-05-10 01:59:16 +04:00
2013-07-10 19:57:04 +04:00
//check if there are preview backends
if(empty(self::$providers)) {
self::initProviders();
2013-07-10 19:57:04 +04:00
}
2013-06-13 11:52:39 +04:00
if(empty(self::$providers)) {
2013-07-10 19:57:04 +04:00
\OC_Log::write('core', 'No preview providers exist', \OC_Log::ERROR);
throw new \Exception('No preview providers');
2013-05-10 01:59:16 +04:00
}
}
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
/**
* @brief returns the path of the file you want a thumbnail from
* @return string
*/
2013-05-29 15:03:33 +04:00
public function getFile() {
2013-05-10 01:59:16 +04:00
return $this->file;
}
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
/**
* @brief returns the max width of the preview
* @return integer
*/
2013-05-29 15:03:33 +04:00
public function getMaxX() {
2013-05-10 01:59:16 +04:00
return $this->maxX;
}
/**
* @brief returns the max height of the preview
* @return integer
*/
2013-05-29 15:03:33 +04:00
public function getMaxY() {
2013-05-10 01:59:16 +04:00
return $this->maxY;
}
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
/**
* @brief returns whether or not scalingup is enabled
* @return bool
*/
2013-07-30 14:29:12 +04:00
public function getScalingUp() {
2013-05-10 01:59:16 +04:00
return $this->scalingup;
}
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
/**
* @brief returns the name of the thumbnailfolder
* @return string
*/
2013-07-10 19:57:04 +04:00
public function getThumbnailsFolder() {
2013-05-10 01:59:16 +04:00
return self::THUMBNAILS_FOLDER;
}
/**
* @brief returns the max scale factor
* @return string
2013-05-10 01:59:16 +04:00
*/
2013-05-29 15:03:33 +04:00
public function getMaxScaleFactor() {
2013-07-11 21:03:21 +04:00
return $this->maxScaleFactor;
2013-05-10 01:59:16 +04:00
}
/**
* @brief returns the max width set in ownCloud's config
* @return string
2013-05-10 01:59:16 +04:00
*/
2013-05-29 15:03:33 +04:00
public function getConfigMaxX() {
2013-07-11 21:03:21 +04:00
return $this->configMaxX;
2013-05-10 01:59:16 +04:00
}
/**
* @brief returns the max height set in ownCloud's config
* @return string
2013-05-10 01:59:16 +04:00
*/
2013-05-29 15:03:33 +04:00
public function getConfigMaxY() {
2013-07-11 21:03:21 +04:00
return $this->configMaxY;
2013-05-10 01:59:16 +04:00
}
2013-05-17 21:08:16 +04:00
2013-07-10 19:57:04 +04:00
/**
* @brief set the path of the file you want a thumbnail from
2013-07-11 21:21:37 +04:00
* @param string $file
2013-07-10 19:57:04 +04:00
* @return $this
*/
public function setFile($file) {
$this->file = $file;
if ($file !== '') {
$this->mimetype = $this->fileView->getMimeType($this->file);
}
2013-07-10 19:57:04 +04:00
return $this;
}
2013-11-28 22:05:43 +04:00
/**
* @brief set mimetype explicitely
* @param string $mimetype
*/
public function setMimetype($mimetype) {
$this->mimetype = $mimetype;
}
2013-07-10 19:57:04 +04:00
/**
* @brief set the the max width of the preview
2013-07-11 21:21:37 +04:00
* @param int $maxX
2013-07-10 19:57:04 +04:00
* @return $this
*/
public function setMaxX($maxX=1) {
2013-07-30 14:29:12 +04:00
if($maxX <= 0) {
throw new \Exception('Cannot set width of 0 or smaller!');
2013-07-10 19:57:04 +04:00
}
$configMaxX = $this->getConfigMaxX();
if(!is_null($configMaxX)) {
if($maxX > $configMaxX) {
\OC_Log::write('core', 'maxX reduced from ' . $maxX . ' to ' . $configMaxX, \OC_Log::DEBUG);
$maxX = $configMaxX;
}
}
$this->maxX = $maxX;
return $this;
}
/**
* @brief set the the max height of the preview
2013-07-11 21:21:37 +04:00
* @param int $maxY
2013-07-10 19:57:04 +04:00
* @return $this
*/
public function setMaxY($maxY=1) {
2013-07-30 14:29:12 +04:00
if($maxY <= 0) {
throw new \Exception('Cannot set height of 0 or smaller!');
2013-07-10 19:57:04 +04:00
}
$configMaxY = $this->getConfigMaxY();
if(!is_null($configMaxY)) {
if($maxY > $configMaxY) {
\OC_Log::write('core', 'maxX reduced from ' . $maxY . ' to ' . $configMaxY, \OC_Log::DEBUG);
$maxY = $configMaxY;
}
}
$this->maxY = $maxY;
return $this;
}
/**
* @brief set whether or not scalingup is enabled
2013-07-30 14:29:12 +04:00
* @param bool $scalingUp
2013-07-10 19:57:04 +04:00
* @return $this
*/
2013-07-30 14:29:12 +04:00
public function setScalingup($scalingUp) {
2013-07-10 19:57:04 +04:00
if($this->getMaxScaleFactor() === 1) {
2013-07-30 14:29:12 +04:00
$scalingUp = false;
2013-07-10 19:57:04 +04:00
}
2013-07-30 14:29:12 +04:00
$this->scalingup = $scalingUp;
2013-07-10 19:57:04 +04:00
return $this;
}
/**
* @brief check if all parameters are valid
2013-07-11 21:21:37 +04:00
* @return bool
2013-07-10 19:57:04 +04:00
*/
public function isFileValid() {
$file = $this->getFile();
if($file === '') {
2013-08-19 14:16:55 +04:00
\OC_Log::write('core', 'No filename passed', \OC_Log::DEBUG);
2013-07-10 19:57:04 +04:00
return false;
}
2013-08-19 14:16:55 +04:00
if(!$this->fileView->file_exists($file)) {
\OC_Log::write('core', 'File:"' . $file . '" not found', \OC_Log::DEBUG);
2013-07-10 19:57:04 +04:00
return false;
}
return true;
}
2013-05-10 01:59:16 +04:00
/**
* @brief deletes previews of a file with specific x and y
* @return bool
*/
2013-05-29 15:03:33 +04:00
public function deletePreview() {
2013-07-10 19:57:04 +04:00
$file = $this->getFile();
2013-08-19 14:16:55 +04:00
$fileInfo = $this->fileView->getFileInfo($file);
2013-07-30 14:29:12 +04:00
$fileId = $fileInfo['fileid'];
2013-07-30 14:29:12 +04:00
$previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/' . $this->getMaxX() . '-' . $this->getMaxY() . '.png';
2013-08-19 14:16:55 +04:00
$this->userView->unlink($previewPath);
return !$this->userView->file_exists($previewPath);
2013-05-10 01:59:16 +04:00
}
/**
* @brief deletes all previews of a file
* @return bool
*/
2013-05-29 15:03:33 +04:00
public function deleteAllPreviews() {
2013-07-10 19:57:04 +04:00
$file = $this->getFile();
2013-05-10 01:59:16 +04:00
2013-08-19 14:16:55 +04:00
$fileInfo = $this->fileView->getFileInfo($file);
2013-07-30 14:29:12 +04:00
$fileId = $fileInfo['fileid'];
2013-07-30 14:29:12 +04:00
$previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/';
2013-08-19 14:16:55 +04:00
$this->userView->deleteAll($previewPath);
$this->userView->rmdir($previewPath);
return !$this->userView->is_dir($previewPath);
2013-05-10 01:59:16 +04:00
}
/**
* @brief check if thumbnail or bigger version of thumbnail of file is cached
* @return mixed (bool / string)
2013-05-10 01:59:16 +04:00
* false if thumbnail does not exist
* path to thumbnail if thumbnail exists
*/
2013-05-29 15:03:33 +04:00
private function isCached() {
2013-07-10 19:57:04 +04:00
$file = $this->getFile();
$maxX = $this->getMaxX();
$maxY = $this->getMaxY();
2013-07-30 14:29:12 +04:00
$scalingUp = $this->getScalingUp();
2013-08-19 14:16:55 +04:00
$maxScaleFactor = $this->getMaxScaleFactor();
2013-05-10 01:59:16 +04:00
2013-08-19 14:16:55 +04:00
$fileInfo = $this->fileView->getFileInfo($file);
2013-07-30 14:29:12 +04:00
$fileId = $fileInfo['fileid'];
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
if(is_null($fileId)) {
return false;
}
2013-07-30 14:29:12 +04:00
$previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/';
2013-08-19 14:16:55 +04:00
if(!$this->userView->is_dir($previewPath)) {
2013-05-10 01:59:16 +04:00
return false;
}
2013-04-25 13:18:45 +04:00
//does a preview with the wanted height and width already exist?
2013-08-19 14:16:55 +04:00
if($this->userView->file_exists($previewPath . $maxX . '-' . $maxY . '.png')) {
2013-07-30 14:29:12 +04:00
return $previewPath . $maxX . '-' . $maxY . '.png';
2013-04-25 13:18:45 +04:00
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
$wantedAspectRatio = (float) ($maxX / $maxY);
2013-05-10 01:59:16 +04:00
2013-04-25 13:18:45 +04:00
//array for usable cached thumbnails
2013-07-30 14:29:12 +04:00
$possibleThumbnails = array();
2013-05-10 01:59:16 +04:00
2013-08-19 14:16:55 +04:00
$allThumbnails = $this->userView->getDirectoryContent($previewPath);
2013-07-30 14:29:12 +04:00
foreach($allThumbnails as $thumbnail) {
$name = rtrim($thumbnail['name'], '.png');
$size = explode('-', $name);
$x = (int) $size[0];
$y = (int) $size[1];
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
$aspectRatio = (float) ($x / $y);
if($aspectRatio !== $wantedAspectRatio) {
2013-04-25 13:18:45 +04:00
continue;
}
2013-05-10 01:59:16 +04:00
2013-05-29 15:03:33 +04:00
if($x < $maxX || $y < $maxY) {
2013-07-30 14:29:12 +04:00
if($scalingUp) {
2013-04-25 13:18:45 +04:00
$scalefactor = $maxX / $x;
2013-08-19 14:16:55 +04:00
if($scalefactor > $maxScaleFactor) {
2013-04-25 13:18:45 +04:00
continue;
}
}else{
continue;
}
}
2013-07-30 14:29:12 +04:00
$possibleThumbnails[$x] = $thumbnail['path'];
2013-04-25 13:18:45 +04:00
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
if(count($possibleThumbnails) === 0) {
2013-04-25 13:18:45 +04:00
return false;
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
if(count($possibleThumbnails) === 1) {
return current($possibleThumbnails);
2013-04-25 13:18:45 +04:00
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
ksort($possibleThumbnails);
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
if(key(reset($possibleThumbnails)) > $maxX) {
return current(reset($possibleThumbnails));
2013-04-25 13:18:45 +04:00
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
if(key(end($possibleThumbnails)) < $maxX) {
return current(end($possibleThumbnails));
2013-04-25 13:18:45 +04:00
}
2013-05-10 01:59:16 +04:00
2013-07-30 14:29:12 +04:00
foreach($possibleThumbnails as $width => $path) {
2013-05-29 15:03:33 +04:00
if($width < $maxX) {
2013-04-25 13:18:45 +04:00
continue;
}else{
return $path;
}
}
}
2013-04-25 13:18:45 +04:00
/**
2013-05-10 01:59:16 +04:00
* @brief return a preview of a file
2013-07-30 14:29:12 +04:00
* @return \OC_Image
2013-04-25 13:18:45 +04:00
*/
2013-05-29 15:03:33 +04:00
public function getPreview() {
2013-07-10 19:57:04 +04:00
if(!is_null($this->preview) && $this->preview->valid()){
return $this->preview;
}
$this->preview = null;
$file = $this->getFile();
$maxX = $this->getMaxX();
$maxY = $this->getMaxY();
2013-07-30 14:29:12 +04:00
$scalingUp = $this->getScalingUp();
2013-04-25 13:18:45 +04:00
2013-08-19 14:16:55 +04:00
$fileInfo = $this->fileView->getFileInfo($file);
2013-07-30 14:29:12 +04:00
$fileId = $fileInfo['fileid'];
2013-05-10 01:59:16 +04:00
2013-07-10 19:57:04 +04:00
$cached = $this->isCached();
2013-05-10 01:59:16 +04:00
2013-05-29 15:03:33 +04:00
if($cached) {
2013-08-19 14:16:55 +04:00
$image = new \OC_Image($this->userView->file_get_contents($cached, 'r'));
2013-07-10 19:57:04 +04:00
$this->preview = $image->valid() ? $image : null;
$this->resizeAndCrop();
2013-07-10 19:57:04 +04:00
}
2013-05-17 21:08:16 +04:00
2013-07-10 19:57:04 +04:00
if(is_null($this->preview)) {
2013-06-26 12:57:37 +04:00
$preview = null;
2013-05-17 21:08:16 +04:00
2013-07-30 14:29:12 +04:00
foreach(self::$providers as $supportedMimetype => $provider) {
if(!preg_match($supportedMimetype, $this->mimetype)) {
2013-05-10 01:59:16 +04:00
continue;
}
2013-05-17 21:08:16 +04:00
2013-08-15 15:21:35 +04:00
\OC_Log::write('core', 'Generating preview for "' . $file . '" with "' . get_class($provider) . '"', \OC_Log::DEBUG);
2013-08-19 14:16:55 +04:00
$preview = $provider->getThumbnail($file, $maxX, $maxY, $scalingUp, $this->fileView);
2013-07-10 15:38:42 +04:00
if(!($preview instanceof \OC_Image)) {
2013-05-10 01:59:16 +04:00
continue;
}
2013-05-17 21:08:16 +04:00
2013-07-10 19:57:04 +04:00
$this->preview = $preview;
$this->resizeAndCrop();
2013-07-30 14:29:12 +04:00
$previewPath = $this->getThumbnailsFolder() . '/' . $fileId . '/';
$cachePath = $previewPath . $maxX . '-' . $maxY . '.png';
2013-07-10 19:57:04 +04:00
2013-08-19 14:16:55 +04:00
if($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
$this->userView->mkdir($this->getThumbnailsFolder() . '/');
2013-05-10 01:59:16 +04:00
}
2013-05-17 21:08:16 +04:00
2013-08-19 14:16:55 +04:00
if($this->userView->is_dir($previewPath) === false) {
$this->userView->mkdir($previewPath);
}
2013-07-10 15:38:42 +04:00
2013-08-19 14:16:55 +04:00
$this->userView->file_put_contents($cachePath, $preview->data());
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
break;
}
2013-07-10 19:57:04 +04:00
}
2013-06-26 12:57:37 +04:00
2013-07-10 19:57:04 +04:00
if(is_null($this->preview)) {
$this->preview = new \OC_Image();
2013-05-10 01:59:16 +04:00
}
2013-07-10 19:57:04 +04:00
2013-05-10 01:59:16 +04:00
return $this->preview;
2013-04-25 13:18:45 +04:00
}
/**
2013-07-10 19:57:04 +04:00
* @brief show preview
2013-05-10 01:59:16 +04:00
* @return void
*/
2013-05-29 15:03:33 +04:00
public function showPreview() {
2013-07-10 19:57:04 +04:00
\OCP\Response::enableCaching(3600 * 24); // 24 hours
if(is_null($this->preview)) {
$this->getPreview();
2013-05-10 01:59:16 +04:00
}
2013-07-10 19:57:04 +04:00
$this->preview->show();
2013-07-10 20:01:04 +04:00
return;
2013-05-10 01:59:16 +04:00
}
/**
* @brief show preview
* @return void
*/
public function show() {
2013-08-24 01:27:36 +04:00
$this->showPreview();
return;
}
2013-05-10 01:59:16 +04:00
/**
* @brief resize, crop and fix orientation
2013-07-30 14:29:12 +04:00
* @return void
*/
2013-07-10 19:57:04 +04:00
private function resizeAndCrop() {
2013-05-10 01:59:16 +04:00
$image = $this->preview;
2013-07-10 19:57:04 +04:00
$x = $this->getMaxX();
$y = $this->getMaxY();
2013-07-30 14:29:12 +04:00
$scalingUp = $this->getScalingUp();
2013-07-10 19:57:04 +04:00
$maxscalefactor = $this->getMaxScaleFactor();
2013-05-10 01:59:16 +04:00
2013-05-29 15:03:33 +04:00
if(!($image instanceof \OC_Image)) {
2013-07-10 19:57:04 +04:00
\OC_Log::write('core', '$this->preview is not an instance of OC_Image', \OC_Log::DEBUG);
2013-05-10 01:59:16 +04:00
return;
}
2013-07-10 19:57:04 +04:00
$image->fixOrientation();
2013-05-10 01:59:16 +04:00
$realx = (int) $image->width();
$realy = (int) $image->height();
2013-05-29 15:03:33 +04:00
if($x === $realx && $y === $realy) {
2013-07-10 19:57:04 +04:00
$this->preview = $image;
2013-08-19 14:16:55 +04:00
return;
2013-05-10 01:59:16 +04:00
}
$factorX = $x / $realx;
$factorY = $y / $realy;
2013-07-10 19:57:04 +04:00
2013-05-29 15:03:33 +04:00
if($factorX >= $factorY) {
2013-05-10 01:59:16 +04:00
$factor = $factorX;
}else{
$factor = $factorY;
}
2013-07-10 19:57:04 +04:00
2013-07-30 14:29:12 +04:00
if($scalingUp === false) {
2013-07-10 19:57:04 +04:00
if($factor > 1) {
$factor = 1;
}
2013-05-10 01:59:16 +04:00
}
2013-07-10 19:57:04 +04:00
if(!is_null($maxscalefactor)) {
if($factor > $maxscalefactor) {
\OC_Log::write('core', 'scalefactor reduced from ' . $factor . ' to ' . $maxscalefactor, \OC_Log::DEBUG);
$factor = $maxscalefactor;
2013-04-25 13:18:45 +04:00
}
}
2013-05-10 01:59:16 +04:00
2013-07-10 19:57:04 +04:00
$newXsize = (int) ($realx * $factor);
$newYsize = (int) ($realy * $factor);
2013-05-10 01:59:16 +04:00
$image->preciseResize($newXsize, $newYsize);
2013-05-17 21:08:16 +04:00
2013-07-10 20:01:04 +04:00
if($newXsize === $x && $newYsize === $y) {
2013-05-10 01:59:16 +04:00
$this->preview = $image;
return;
}
2013-05-17 21:08:16 +04:00
2013-05-29 15:03:33 +04:00
if($newXsize >= $x && $newYsize >= $y) {
2013-05-10 01:59:16 +04:00
$cropX = floor(abs($x - $newXsize) * 0.5);
2013-07-10 19:57:04 +04:00
//don't crop previews on the Y axis, this sucks if it's a document.
2013-06-11 12:45:50 +04:00
//$cropY = floor(abs($y - $newYsize) * 0.5);
$cropY = 0;
2013-05-10 01:59:16 +04:00
$image->crop($cropX, $cropY, $x, $y);
2013-05-10 01:59:16 +04:00
$this->preview = $image;
return;
}
2013-05-17 21:08:16 +04:00
2013-05-29 15:03:33 +04:00
if($newXsize < $x || $newYsize < $y) {
if($newXsize > $x) {
2013-05-10 01:59:16 +04:00
$cropX = floor(($newXsize - $x) * 0.5);
$image->crop($cropX, 0, $x, $newYsize);
2013-04-25 13:18:45 +04:00
}
2013-05-17 21:08:16 +04:00
2013-05-29 15:03:33 +04:00
if($newYsize > $y) {
2013-05-10 01:59:16 +04:00
$cropY = floor(($newYsize - $y) * 0.5);
$image->crop(0, $cropY, $newXsize, $y);
2013-04-25 13:18:45 +04:00
}
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
$newXsize = (int) $image->width();
$newYsize = (int) $image->height();
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
//create transparent background layer
$backgroundlayer = imagecreatetruecolor($x, $y);
$white = imagecolorallocate($backgroundlayer, 255, 255, 255);
imagefill($backgroundlayer, 0, 0, $white);
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
$image = $image->resource();
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
$mergeX = floor(abs($x - $newXsize) * 0.5);
$mergeY = floor(abs($y - $newYsize) * 0.5);
2013-05-17 21:08:16 +04:00
imagecopy($backgroundlayer, $image, $mergeX, $mergeY, 0, 0, $newXsize, $newYsize);
2013-05-17 21:08:16 +04:00
//$black = imagecolorallocate(0,0,0);
//imagecolortransparent($transparentlayer, $black);
2013-05-17 21:08:16 +04:00
$image = new \OC_Image($backgroundlayer);
2013-05-17 21:08:16 +04:00
2013-05-10 01:59:16 +04:00
$this->preview = $image;
return;
2013-04-25 13:18:45 +04:00
}
}
2013-04-25 13:18:45 +04:00
/**
* @brief register a new preview provider to be used
2013-07-11 21:21:37 +04:00
* @param array $options
2013-04-25 13:18:45 +04:00
* @return void
*/
2013-05-29 15:03:33 +04:00
public static function registerProvider($class, $options=array()) {
2013-04-25 13:18:45 +04:00
self::$registeredProviders[]=array('class'=>$class, 'options'=>$options);
}
2013-04-25 13:18:45 +04:00
/**
* @brief create instances of all the registered preview providers
* @return void
*/
private static function initProviders() {
2013-08-29 12:08:53 +04:00
if(!\OC_Config::getValue('enable_previews', true)) {
2013-08-29 18:13:16 +04:00
$provider = new Preview\Unknown(array());
2013-08-29 12:08:53 +04:00
self::$providers = array($provider->getMimeType() => $provider);
2013-08-24 01:05:44 +04:00
return;
}
2013-04-25 13:18:45 +04:00
if(count(self::$providers)>0) {
return;
}
2013-05-17 21:08:16 +04:00
2013-04-25 13:18:45 +04:00
foreach(self::$registeredProviders as $provider) {
$class=$provider['class'];
$options=$provider['options'];
2013-05-17 21:08:16 +04:00
2013-04-25 13:18:45 +04:00
$object = new $class($options);
2013-05-17 21:08:16 +04:00
2013-04-25 13:18:45 +04:00
self::$providers[$object->getMimeType()] = $object;
}
2013-05-17 21:08:16 +04:00
2013-04-25 13:18:45 +04:00
$keys = array_map('strlen', array_keys(self::$providers));
array_multisort($keys, SORT_DESC, self::$providers);
}
2013-05-17 21:08:16 +04:00
2013-05-29 15:03:33 +04:00
public static function post_write($args) {
self::post_delete($args);
}
2013-05-29 15:03:33 +04:00
public static function post_delete($args) {
$path = $args['path'];
if(substr($path, 0, 1) === '/') {
$path = substr($path, 1);
}
$preview = new Preview(\OC_User::getUser(), 'files/', $path);
$preview->deleteAllPreviews();
}
/**
* @param string $mimetype
*/
public static function isMimeSupported($mimetype) {
2013-08-29 12:08:53 +04:00
if(!\OC_Config::getValue('enable_previews', true)) {
2013-08-24 01:05:44 +04:00
return false;
}
//check if there are preview backends
if(empty(self::$providers)) {
self::initProviders();
}
//remove last element because it has the mimetype *
$providers = array_slice(self::$providers, 0, -1);
2013-07-30 14:29:12 +04:00
foreach($providers as $supportedMimetype => $provider) {
if(preg_match($supportedMimetype, $mimetype)) {
return true;
}
}
return false;
}
2013-09-05 01:45:11 +04:00
}