2012-11-13 18:11:02 +04:00
|
|
|
|
<?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.
|
2013-01-14 18:51:47 +04:00
|
|
|
|
- make it work with external filesystem files.
|
2012-11-13 18:11:02 +04:00
|
|
|
|
- movies support
|
|
|
|
|
- pdf support
|
|
|
|
|
- mp3/id3 support
|
|
|
|
|
- more file types
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OC_Preview {
|
2012-11-13 19:14:16 +04:00
|
|
|
|
|
|
|
|
|
// the thumbnail cache folder
|
|
|
|
|
const THUMBNAILS_FOLDER = 'thumbnails';
|
2012-11-13 18:11:02 +04:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @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
|
2012-11-13 19:14:16 +04:00
|
|
|
|
* @param $scaleup Scale smaller images up to the thumbnail size or not. Might look ugly
|
2012-11-13 18:11:02 +04:00
|
|
|
|
* @return image
|
|
|
|
|
*/
|
2012-11-13 19:14:16 +04:00
|
|
|
|
static public function show($file,$maxX,$maxY,$scalingup) {
|
|
|
|
|
// get the mimetype of the file
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$mimetype=explode('/',OC_FileSystem::getMimeType($file));
|
2012-11-13 19:14:16 +04:00
|
|
|
|
// it´s an image
|
|
|
|
|
if($mimetype[0]=='image'){
|
2012-11-13 18:11:02 +04:00
|
|
|
|
OCP\Response::enableCaching(3600 * 24); // 24 hour
|
2012-11-13 19:14:16 +04:00
|
|
|
|
$image=OC_PreviewImage::getThumbnail($file,$maxX,$maxY,$scalingup);
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$image->show();
|
2013-01-14 18:51:47 +04:00
|
|
|
|
|
|
|
|
|
// it´s a video
|
|
|
|
|
}elseif($mimetype[0]=='video'){
|
|
|
|
|
OCP\Response::enableCaching(3600 * 24); // 24 hour
|
|
|
|
|
OC_PreviewMovie::getThumbnail($file,$maxX,$maxY,$scalingup);
|
|
|
|
|
|
2012-11-13 19:14:16 +04:00
|
|
|
|
// it´s something else. Let´s create a dummy preview
|
2012-11-13 18:11:02 +04:00
|
|
|
|
}else{
|
|
|
|
|
header('Content-type: image/png');
|
|
|
|
|
OC_PreviewUnknown::getThumbnail($maxX,$maxY);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class OC_PreviewImage {
|
|
|
|
|
|
|
|
|
|
public static function getThumbnail($path,$maxX,$maxY,$scalingup) {
|
|
|
|
|
|
2013-01-14 18:51:47 +04:00
|
|
|
|
$thumbnails_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/'.OC_Preview::THUMBNAILS_FOLDER);
|
|
|
|
|
|
|
|
|
|
// is a preview already in the cache?
|
2012-11-13 18:11:02 +04:00
|
|
|
|
if ($thumbnails_view->file_exists($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup)) {
|
|
|
|
|
return new \OC_Image($thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup));
|
|
|
|
|
}
|
2013-01-14 18:51:47 +04:00
|
|
|
|
|
|
|
|
|
// does the sourcefile exist?
|
2012-11-13 18:11:02 +04:00
|
|
|
|
if (!\OC_Filesystem::file_exists($path)) {
|
|
|
|
|
\OC_Log::write('Preview', 'File '.$path.' don\'t exists', \OC_Log::WARN);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-14 18:51:47 +04:00
|
|
|
|
// open the source image
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$image = new \OC_Image();
|
|
|
|
|
$image->loadFromFile(\OC_Filesystem::getLocalFile($path));
|
|
|
|
|
if (!$image->valid()) return false;
|
|
|
|
|
|
2013-01-14 18:51:47 +04:00
|
|
|
|
// fix the orientation
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$image->fixOrientation();
|
|
|
|
|
|
2013-01-14 18:51:47 +04:00
|
|
|
|
// 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
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$ret = $image->preciseResize($newXsize, $newYsize);
|
|
|
|
|
if (!$ret) {
|
|
|
|
|
\OC_Log::write('Preview', 'Couldn\'t resize image', \OC_Log::ERROR);
|
|
|
|
|
unset($image);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2013-01-14 18:51:47 +04:00
|
|
|
|
|
|
|
|
|
// store in cache
|
2012-11-13 18:11:02 +04:00
|
|
|
|
$l = $thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup);
|
|
|
|
|
$image->save($l);
|
|
|
|
|
|
|
|
|
|
return $image;
|
2013-01-14 18:51:47 +04:00
|
|
|
|
|
|
|
|
|
|
2012-11-13 18:11:02 +04:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-01-14 18:51:47 +04:00
|
|
|
|
class OC_PreviewMovie {
|
|
|
|
|
|
|
|
|
|
public static function isAvailable() {
|
|
|
|
|
$check=shell_exec('ffmpeg');
|
|
|
|
|
if($check==NULL) return(false); else return(true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function getThumbnail($path,$maxX,$maxY,$scalingup) {
|
|
|
|
|
$thumbnails_view = new \OC_FilesystemView('/'.\OCP\User::getUser() .'/'.OC_Preview::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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// call ffmpeg to do the screenshot
|
|
|
|
|
shell_exec('ffmpeg -y -i {'.escapeshellarg($path).'} -f mjpeg -vframes 1 -ss 1 -s {'.escapeshellarg($maxX).'}x{'.escapeshellarg($maxY).'} {.'.$thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup).'}');
|
|
|
|
|
|
|
|
|
|
// output the generated Preview
|
|
|
|
|
$thumbnails_view->getLocalFile($path.'-'.$maxX.'-'.$maxY.'-'.$scalingup);
|
|
|
|
|
unset($thumbnails_view);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2012-11-13 18:11:02 +04:00
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|