summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorFrank Karlitschek <frank@owncloud.org>2012-11-13 15:11:02 +0100
committerFrank Karlitschek <frank@owncloud.org>2012-11-13 15:11:02 +0100
commit5b44714f4cbd75138519789f55fd8b6f4b5d4241 (patch)
tree155cedcb01bd092e7f98c4194f89420db0cb06aa /lib
parent89f2d4ba07e262a17ede70c25c245b7dfa09e817 (diff)
downloadnextcloud-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-xlib/preview.php131
-rw-r--r--lib/public/preview.php50
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));
+ }
+
+}