diff options
author | Frank Karlitschek <frank@owncloud.org> | 2012-11-13 15:11:02 +0100 |
---|---|---|
committer | Frank Karlitschek <frank@owncloud.org> | 2012-11-13 15:11:02 +0100 |
commit | 5b44714f4cbd75138519789f55fd8b6f4b5d4241 (patch) | |
tree | 155cedcb01bd092e7f98c4194f89420db0cb06aa /lib | |
parent | 89f2d4ba07e262a17ede70c25c245b7dfa09e817 (diff) | |
download | nextcloud-server-5b44714f4cbd75138519789f55fd8b6f4b5d4241.tar.gz nextcloud-server-5b44714f4cbd75138519789f55fd8b6f4b5d4241.zip |
first version of the new previewer lib. It currently only created previews/thumbnails for images. It get´s more interesting when we add PDFs, movies, mp3, text files and more...
Diffstat (limited to 'lib')
-rwxr-xr-x | lib/preview.php | 131 | ||||
-rw-r--r-- | lib/public/preview.php | 50 |
2 files changed, 181 insertions, 0 deletions
diff --git a/lib/preview.php b/lib/preview.php new file mode 100755 index 00000000000..8b1a42925a6 --- /dev/null +++ b/lib/preview.php @@ -0,0 +1,131 @@ +<?php +/** + * Copyright (c) 2012 Frank Karlitschek frank@owncloud.org + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +/* +TODO: + - delete thumbnails if files change. + - movies support + - pdf support + - mp3/id3 support + - more file types + +*/ + + + +class OC_Preview { + + + /** + * @brief return a preview of a file + * @param $file The path to the file where you want a thumbnail from + * @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image + * @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image + * @return image + */ + static public function show($file,$maxX,$maxY) { + $mimetype=explode('/',OC_FileSystem::getMimeType($file)); + if($mimetype[0]=='imaage'){ + OCP\Response::enableCaching(3600 * 24); // 24 hour + $image=OC_PreviewImage::getThumbnail($file,$maxX,$maxY,false); + $image->show(); + }else{ + header('Content-type: image/png'); + OC_PreviewUnknown::getThumbnail($maxX,$maxY); + } + } + + +} + + + +class OC_PreviewImage { + + // the thumbnail cache folder + const THUMBNAILS_FOLDER = 'thumbnails'; + + public static function getThumbnail($path,$maxX,$maxY,$scalingup) { + $thumbnails_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/'.self::THUMBNAILS_FOLDER); + + // is a preview already in the cache? + if ($thumbnails_view->file_exists($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup)) { + return new \OC_Image($thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup)); + } + + // does the sourcefile exist? + if (!\OC_Filesystem::file_exists($path)) { + \OC_Log::write('Preview', 'File '.$path.' don\'t exists', \OC_Log::WARN); + return false; + } + + // open the source image + $image = new \OC_Image(); + $image->loadFromFile(\OC_Filesystem::getLocalFile($path)); + if (!$image->valid()) return false; + + // fix the orientation + $image->fixOrientation(); + + // calculate the right preview size + $Xsize=$image->width(); + $Ysize=$image->height(); + if (($Xsize/$Ysize)>($maxX/$maxY)) { + $factor=$maxX/$Xsize; + } else { + $factor=$maxY/$Ysize; + } + + // only scale up if requested + if($scalingup==false) { + if($factor>1) $factor=1; + } + $newXsize=$Xsize*$factor; + $newYsize=$Ysize*$factor; + + // resize + $ret = $image->preciseResize($newXsize, $newYsize); + if (!$ret) { + \OC_Log::write('Preview', 'Couldn\'t resize image', \OC_Log::ERROR); + unset($image); + return false; + } + + // store in cache + $l = $thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup); + $image->save($l); + + return $image; + } + + + +} + + +class OC_PreviewUnknown { + public static function getThumbnail($maxX,$maxY) { + + // check if GD is installed + if(!extension_loaded('gd') || !function_exists('gd_info')) { + OC_Log::write('preview', __METHOD__.'(): GD module not installed', OC_Log::ERROR); + return false; + } + + // create a white image + $image = imagecreatetruecolor($maxX, $maxY); + $color = imagecolorallocate($image, 255, 255, 255); + imagefill($image, 0, 0, $color); + + // output the image + imagepng($image); + imagedestroy($image); + } + +} + diff --git a/lib/public/preview.php b/lib/public/preview.php new file mode 100644 index 00000000000..a7487c485f1 --- /dev/null +++ b/lib/public/preview.php @@ -0,0 +1,50 @@ +<?php +/** +* ownCloud +* +* @author Frank Karlitschek +* @copyright 2012 Frank Karlitschek frank@owncloud.org +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +/** + * Public interface of ownCloud for apps to use. + * Preview Class. + * + */ + +// use OCP namespace for all classes that are considered public. +// This means that they should be used by apps instead of the internal ownCloud classes +namespace OCP; + +/** + * This class provides functions to render and show thumbnails and previews of files + */ +class Preview { + + /** + * @brief return a preview of a file + * @param $file The path to the file where you want a thumbnail from + * @param $maxX The maximum X size of the thumbnail. It can be smaller depending on the shape of the image + * @param $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image + * @param $scaleup Scale smaller images up to the thumbnail size or not. Might look ugly + * @return image + */ + public static function show($file,$maxX=100,$maxY=75,$scaleup=false) { + return(\OC_Preview::show($file,$maxX,$maxY,$scaleup)); + } + +} |