mirror of
https://github.com/HaschekSolutions/pictshare.git
synced 2025-11-11 18:56:21 +00:00
implemented mp4 resizing and added support for custom hashes
This commit is contained in:
@@ -35,7 +35,7 @@ PictShare is a selfhostable, open source image, video and text hosting as well a
|
||||
- [ ] Upload of links to shorten
|
||||
|
||||
### MP4 hosting
|
||||
- [ ] Resizing
|
||||
- [x] Resizing
|
||||
- [x] Preview image generation
|
||||
- [x] Upload of videos
|
||||
- [x] Automatic conversion if not mobile friendly or wrong encoder used
|
||||
|
||||
@@ -15,11 +15,14 @@ require_once(ROOT . DS . 'controllers' . DS. 'text'. DS . 'text.controller.php')
|
||||
require_once(ROOT . DS . 'controllers' . DS. 'url'. DS . 'url.controller.php');
|
||||
require_once(ROOT . DS . 'controllers' . DS. 'video'. DS . 'video.controller.php');
|
||||
|
||||
// check write permissions first
|
||||
if(!isFolderWritable(ROOT.DS.'data'))
|
||||
exit(json_encode(array('status'=>'err','reason'=>'Data directory not writable')));
|
||||
else if(!isFolderWritable(ROOT.DS.'tmp'))
|
||||
exit(json_encode(array('status'=>'err','reason'=>'Temp directory not writable')));
|
||||
|
||||
$hash = sanatizeString(trim($_REQUEST['hash']))?sanatizeString(trim($_REQUEST['hash'])):false;
|
||||
|
||||
// check for POST upload
|
||||
if ($_FILES['file']["error"] == UPLOAD_ERR_OK)
|
||||
{
|
||||
@@ -37,17 +40,17 @@ if ($_FILES['file']["error"] == UPLOAD_ERR_OK)
|
||||
//image?
|
||||
if(in_array($type,(new ImageController)->getRegisteredExtensions()))
|
||||
{
|
||||
$answer = (new ImageController())->handleUpload($_FILES['file']['tmp_name']);
|
||||
$answer = (new ImageController())->handleUpload($_FILES['file']['tmp_name'],$hash);
|
||||
}
|
||||
//or, a text
|
||||
else if($type=='text')
|
||||
{
|
||||
$answer = (new TextController())->handleUpload($_FILES['file']['tmp_name']);
|
||||
$answer = (new TextController())->handleUpload($_FILES['file']['tmp_name'],$hash);
|
||||
}
|
||||
//or, a video
|
||||
else if(in_array($type,(new VideoController)->getRegisteredExtensions()))
|
||||
{
|
||||
$answer = (new VideoController())->handleUpload($_FILES['file']['tmp_name']);
|
||||
$answer = (new VideoController())->handleUpload($_FILES['file']['tmp_name'],$hash);
|
||||
}
|
||||
|
||||
if(!$answer)
|
||||
|
||||
@@ -40,6 +40,12 @@ class ImageController
|
||||
{
|
||||
$hash = getNewHash($ext,6);
|
||||
}
|
||||
else
|
||||
{
|
||||
$hash.='.'.$ext;
|
||||
if(isExistingHash($hash))
|
||||
return array('status'=>'err','reason'=>'Custom hash already exists');
|
||||
}
|
||||
|
||||
if($newsha1)
|
||||
addSha1($hash,$newsha1);
|
||||
|
||||
@@ -38,6 +38,12 @@ class TextController
|
||||
{
|
||||
$hash = getNewHash('txt',6);
|
||||
}
|
||||
else
|
||||
{
|
||||
$hash.='.txt';
|
||||
if(isExistingHash($hash))
|
||||
return array('status'=>'err','reason'=>'Custom hash already exists');
|
||||
}
|
||||
|
||||
mkdir(ROOT.DS.'data'.DS.$hash);
|
||||
$file = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
||||
|
||||
@@ -10,13 +10,26 @@ class VideoController
|
||||
$path = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
||||
|
||||
//@todo: - resize by changing $path
|
||||
// - preview images
|
||||
|
||||
//check if video should be resized
|
||||
foreach($url as $u)
|
||||
if(isSize($u)==true)
|
||||
$size = $u;
|
||||
if($size)
|
||||
{
|
||||
$s = sizeStringToWidthHeight($size);
|
||||
$width = $s['width'];
|
||||
$newpath = ROOT.DS.'data'.DS.$hash.DS.$width.'_'.$hash;
|
||||
$this->resize($path,$newpath,$width);
|
||||
$path = $newpath;
|
||||
}
|
||||
|
||||
|
||||
if(in_array('raw',$url))
|
||||
$this->serveMP4($path,$hash);
|
||||
else if(in_array('preview',$url))
|
||||
{
|
||||
$preview = ROOT.DS.'data'.DS.$hash.DS.'preview.jpg';
|
||||
$preview = $path.'_preview.jpg';
|
||||
if(!file_exists($preview))
|
||||
{
|
||||
$this->saveFirstFrameOfMP4($path,$preview);
|
||||
@@ -51,6 +64,12 @@ class VideoController
|
||||
{
|
||||
if($hash===false)
|
||||
$hash = getNewHash('mp4',6);
|
||||
else
|
||||
{
|
||||
$hash.='.mp4';
|
||||
if(isExistingHash($hash))
|
||||
return array('status'=>'err','reason'=>'Custom hash already exists');
|
||||
}
|
||||
|
||||
mkdir(ROOT.DS.'data'.DS.$hash);
|
||||
$file = ROOT.DS.'data'.DS.$hash.DS.$hash;
|
||||
@@ -194,5 +213,20 @@ class VideoController
|
||||
$cmd = "$bin -y -i $file -vframes 1 -f image2 $target";
|
||||
|
||||
system($cmd);
|
||||
}
|
||||
|
||||
function resize($in,$out,$width)
|
||||
{
|
||||
$file = escapeshellarg($in);
|
||||
$tmp = '/dev/null';
|
||||
$bin = escapeshellcmd(FFMPEG_BINARY);
|
||||
|
||||
$addition = '-c:v libx264 -profile:v baseline -level 3.0 -pix_fmt yuv420p';
|
||||
$height = 'trunc(ow/a/2)*2';
|
||||
|
||||
$cmd = "$bin -i $file -y -vf scale=\"$width:$height\" $addition $out";
|
||||
system($cmd);
|
||||
|
||||
return (file_exists($out) && filesize($out)>0);
|
||||
}
|
||||
}
|
||||
11
inc/core.php
11
inc/core.php
@@ -113,7 +113,7 @@ function getExtensionOfFilename($file)
|
||||
|
||||
function sizeStringToWidthHeight($size)
|
||||
{
|
||||
if(!$size || !$this->isSize($size)) return false;
|
||||
if(!$size || !isSize($size)) return false;
|
||||
if(!is_numeric($size))
|
||||
$size = explode('x',$size);
|
||||
|
||||
@@ -325,3 +325,12 @@ function addSha1($hash,$sha1)
|
||||
fclose($fp);
|
||||
return true;
|
||||
}
|
||||
|
||||
function isSize($var)
|
||||
{
|
||||
if(is_numeric($var)) return true;
|
||||
$a = explode('x',$var);
|
||||
if(count($a)!=2 || !is_numeric($a[0]) || !is_numeric($a[1])) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -38,8 +38,8 @@
|
||||
<body id="body">
|
||||
|
||||
<div id="container">
|
||||
<video id="video" poster="<?php echo URL.'preview/'.$hash; ?>" preload="auto" autoplay="autoplay" controls muted="muted" loop="loop" webkit-playsinline>
|
||||
<source src="<?php echo '/raw/mp4/'.$hash; ?>" type="video/mp4">
|
||||
<video id="video" poster="<?php echo URL.$url.'/preview/'.$hash; ?>" preload="auto" autoplay="autoplay" controls muted="muted" loop="loop" webkit-playsinline>
|
||||
<source src="<?php echo URL.$url.'/raw' ?>" type="video/mp4">
|
||||
<?php
|
||||
if(file_exists(ROOT.DS.'data'.DS.$hash.DS.'webm_1.'.$hash))
|
||||
echo '<source src="'.URL.'raw/webm/'.$hash.'" type="video/webm">'."\n";
|
||||
@@ -48,7 +48,7 @@
|
||||
?>
|
||||
</video>
|
||||
</div>
|
||||
<small><?php echo $filesize; ?> <a href="/<?php echo $url.'/raw' ?>">Raw</a> <a href="/<?php echo $url.'/download' ?>">Download</a></a></small>
|
||||
<small><?php echo $filesize; ?> <a href="/<?php echo URL.$url.'/raw' ?>">Raw</a> <a href="/<?php echo URL.$url.'/download' ?>">Download</a></a></small>
|
||||
|
||||
<script>
|
||||
var hadToResizeW = false;
|
||||
|
||||
Reference in New Issue
Block a user