added config file - third part
git-svn-id: http://yolanda.mister-muffin.de/svn@302 7eef14d0-6ed0-489d-bf55-20463b2d70db
This commit is contained in:
parent
6b9ccd3223
commit
ced190b5c9
4 changed files with 125 additions and 91 deletions
|
@ -27,10 +27,11 @@
|
||||||
<string id="video_height_min">240</string>
|
<string id="video_height_min">240</string>
|
||||||
<string id="video_width_max">1080</string>
|
<string id="video_width_max">1080</string>
|
||||||
<string id="video_width_min">320</string>
|
<string id="video_width_min">320</string>
|
||||||
<string id="video_filesize_max">204800</string><!-- in bytes -->
|
<string id="video_filesize_max">86388736</string><!-- in bytes -->
|
||||||
<string id="video_filesize_min">512</string>
|
<string id="video_filesize_min">512</string>
|
||||||
<string id="video_bitrate_max">6000</string>
|
<string id="video_bitrate_max">6000</string>
|
||||||
<string id="video_audio_bitrate">64</string>
|
<string id="video_audio_bitrate">64</string>
|
||||||
|
<string id="video_thumbnail_height">120</string>
|
||||||
|
|
||||||
<!-- settings for xml output -->
|
<!-- settings for xml output -->
|
||||||
<!--<string id="xml_namespace">http://feature.yolanda.namespace.tld</string>-->
|
<!--<string id="xml_namespace">http://feature.yolanda.namespace.tld</string>-->
|
||||||
|
|
|
@ -69,6 +69,8 @@
|
||||||
<string id="error_upload_io">Cannot read video file</string>
|
<string id="error_upload_io">Cannot read video file</string>
|
||||||
<string id="error_upload_not_a_video">File is not a video</string>
|
<string id="error_upload_not_a_video">File is not a video</string>
|
||||||
<string id="error_upload_duplicate">Video has already been uploaded</string>
|
<string id="error_upload_duplicate">Video has already been uploaded</string>
|
||||||
|
<string id="error_upload_file_too_small">The filesize of the video you uploaded is too small</string>
|
||||||
|
<string id="error_upload_file_too_big">The filesize of the video you uploaded is too big</string>
|
||||||
<string id=""></string>
|
<string id=""></string>
|
||||||
|
|
||||||
<!-- information -->
|
<!-- information -->
|
||||||
|
|
|
@ -36,7 +36,7 @@ if($userinfo->{'username'})
|
||||||
$subject =~ s/\s*$//;
|
$subject =~ s/\s*$//;
|
||||||
$page->{'uploadform'}->{'DC.Subject'} = $subject;
|
$page->{'uploadform'}->{'DC.Subject'} = $subject;
|
||||||
|
|
||||||
if($query->param('DC.Title')&&$query->param('DC.Subject')&&$query->param('DC.Description'))
|
if($query->param('DC.Title')&&$subject&&$query->param('DC.Description'))
|
||||||
{
|
{
|
||||||
$page->{'results-listing'} = [''];
|
$page->{'results-listing'} = [''];
|
||||||
|
|
||||||
|
|
|
@ -41,135 +41,166 @@ if($userinfo->{'id'} && $query->param("DC.Title") &&
|
||||||
|
|
||||||
#save uploaded file into temppath
|
#save uploaded file into temppath
|
||||||
$upload_filehandle = $query->upload("file");
|
$upload_filehandle = $query->upload("file");
|
||||||
|
|
||||||
open(TEMPFILE, ">/tmp/$id");
|
open(TEMPFILE, ">/tmp/$id");
|
||||||
|
#check that nothing more than max filesize is being uploaded
|
||||||
while ( <$upload_filehandle> )
|
while ( <$upload_filehandle> )
|
||||||
{
|
{
|
||||||
print TEMPFILE;
|
print TEMPFILE;
|
||||||
}
|
}
|
||||||
close TEMPFILE;
|
close TEMPFILE;
|
||||||
|
|
||||||
$info = `export SDL_VIDEODRIVER="dummy"; ffplay -stats -an -vn -nodisp /tmp/$id 2>&1`;
|
#check if file is too small or too big
|
||||||
|
if( -s "/tmp/$id" < $config->{"video_filesize_min"})
|
||||||
if($info =~ /ignoring/)
|
|
||||||
{
|
{
|
||||||
#delete from uploaded table
|
#delete from uploaded table
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
unlink "/tmp/$id";
|
unlink "/tmp/$id";
|
||||||
print $query->redirect("index.pl?error=error_upload_invalid_stream");
|
print $query->redirect("index.pl?error=error_upload_file_too_small&value=".$config->{"video_filesize_min"});
|
||||||
}
|
}
|
||||||
elsif ($info =~ /I\/O error occured/)
|
elsif( -s "/tmp/$id" > $config->{"video_filesize_max"})
|
||||||
{
|
{
|
||||||
#delete from uploaded table
|
#delete from uploaded table
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
unlink "/tmp/$id";
|
unlink "/tmp/$id";
|
||||||
print $query->redirect("index.pl?error=error_upload_io");
|
print $query->redirect("index.pl?error=error_upload_file_too_big&value=".$config->{"video_filesize_max"});
|
||||||
}
|
|
||||||
elsif ($info =~ /Unknown format/ or $info =~ /could not find codec parameters/)
|
|
||||||
{
|
|
||||||
#delete from uploaded table
|
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
|
||||||
unlink "/tmp/$id";
|
|
||||||
print $query->redirect("index.pl?error=error_upload_not_a_video");
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$sha = new Digest::SHA(256);
|
$info = `export SDL_VIDEODRIVER="dummy"; ffplay -stats -an -vn -nodisp /tmp/$id 2>&1`;
|
||||||
$sha->addfile("/tmp/$id");
|
|
||||||
$sha = $sha->hexdigest;
|
|
||||||
|
|
||||||
#check if this hash is already in database
|
if($info =~ /ignoring/)
|
||||||
my $sth = $dbh->prepare(qq{select id from videos where hash = ? limit 1}) or die $dbh->errstr;
|
|
||||||
$sth->execute($sha) or die $dbh->errstr;
|
|
||||||
my ($resultid) = $sth->fetchrow_array();
|
|
||||||
$sth->finish() or die $dbh->errstr;
|
|
||||||
|
|
||||||
#if so, then video is a duplicate (alternatively ALL HAIL QUANTUM COMPUTING)
|
|
||||||
if($resultid)
|
|
||||||
{
|
{
|
||||||
#delete from uploaded table
|
#delete from uploaded table
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
unlink "/tmp/$id";
|
unlink "/tmp/$id";
|
||||||
print $query->redirect("index.pl?error=error_upload_duplicate");
|
print $query->redirect("index.pl?error=error_upload_invalid_stream");
|
||||||
|
}
|
||||||
|
elsif ($info =~ /I\/O error occured/)
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
unlink "/tmp/$id";
|
||||||
|
print $query->redirect("index.pl?error=error_upload_io");
|
||||||
|
}
|
||||||
|
elsif ($info =~ /Unknown format/ or $info =~ /could not find codec parameters/)
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
unlink "/tmp/$id";
|
||||||
|
print $query->redirect("index.pl?error=error_upload_not_a_video");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
($container, $duration) = $info =~ /Input \#0, (\w+),.+?\n.+?Duration: (\d{2}:\d{2}:\d{2}\.\d)/;
|
$sha = new Digest::SHA(256);
|
||||||
|
$sha->addfile("/tmp/$id");
|
||||||
|
$sha = $sha->hexdigest;
|
||||||
|
|
||||||
#these two regexes have to be applied seperately because nobody knows which stream (audio or video) comes first
|
#check if this hash is already in database
|
||||||
($audio) = $info =~ /Audio: (\w+)/;
|
my $sth = $dbh->prepare(qq{select id from videos where hash = ? limit 1}) or die $dbh->errstr;
|
||||||
($video, $width, $height, $fps) = $info =~ /Video: ([\w\d]+),.+?(\d+)x(\d+),.+?(\d+\.\d+) fps/;
|
$sth->execute($sha) or die $dbh->errstr;
|
||||||
|
my ($resultid) = $sth->fetchrow_array();
|
||||||
|
$sth->finish() or die $dbh->errstr;
|
||||||
|
|
||||||
if(!$video or !$duration)
|
#if so, then video is a duplicate (alternatively ALL HAIL QUANTUM COMPUTING)
|
||||||
|
if($resultid)
|
||||||
{
|
{
|
||||||
#delete from uploaded table
|
#delete from uploaded table
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
unlink "/tmp/$id";
|
unlink "/tmp/$id";
|
||||||
print $query->redirect("index.pl?error=error_upload_invalid_stream");
|
print $query->redirect("index.pl?error=error_upload_duplicate");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$filesize = -s "/tmp/$id";
|
($container, $duration) = $info =~ /Input \#0, (\w+),.+?\n.+?Duration: (\d{2}:\d{2}:\d{2}\.\d)/;
|
||||||
|
|
||||||
#convert hh:mm:ss.s duration to full seconds - thanks perl for making this so damn easy!
|
#these two regexes have to be applied seperately because nobody knows which stream (audio or video) comes first
|
||||||
#don't want to know how this would look in python or php... hell I don't even have to create extra variables!
|
($audio) = $info =~ /Audio: (\w+)/;
|
||||||
$duration =~ /^(\d{2}):(\d{2}):(\d{2})\.(\d)$/;
|
($video, $width, $height, $fps) = $info =~ /Video: ([\w\d]+),.+?(\d+)x(\d+),.+?(\d+\.\d+) fps/;
|
||||||
$duration = int($1*3600 + $2*60 + $3 + $4/10 + .5);
|
|
||||||
|
|
||||||
#create thumbnail
|
if(!$video or !$duration)
|
||||||
$thumbnailsec = int(rand($duration));
|
|
||||||
$previewsec = $thumbnailsec;
|
|
||||||
|
|
||||||
#the width/height calculation could of course be much shorter but less readable then
|
|
||||||
#all thumbs have equal height
|
|
||||||
$tnmaxheight = 120;
|
|
||||||
$tnheight = $tnmaxheight;
|
|
||||||
$tnwidth = int($tnheight*($width/$height)/2 + .5)*2;
|
|
||||||
|
|
||||||
$ffthumb = system "ffmpeg -i /tmp/$id -vcodec mjpeg -vframes 1 -an -f rawvideo -ss $thumbnailsec -s ".$tnwidth."x$tnheight $root/video-stills/thumbnails/$id";
|
|
||||||
$ffprev = system "ffmpeg -i /tmp/$id -vcodec mjpeg -vframes 1 -an -f rawvideo -ss $previewsec $root/video-stills/previews/$id";
|
|
||||||
|
|
||||||
#if thumbnail was created successfully
|
|
||||||
if($ffthumb == 0 and $ffprev == 0)
|
|
||||||
{
|
|
||||||
$vmaxheight = 640;
|
|
||||||
|
|
||||||
#check if the upload already is in the right format and smaller/equal max-width/height
|
|
||||||
if ($container eq 'ogg' and $video eq 'theora' and ($audio eq 'vorbis' or not $audio) and $height <= $vmaxheight)
|
|
||||||
{
|
|
||||||
if(move("/tmp/$id", "$root/videos/$id"))
|
|
||||||
{
|
|
||||||
#add video to videos table
|
|
||||||
$dbh->do(qq{insert into videos select id, title, description, userid, timestamp, creator,
|
|
||||||
subject, source, language, coverage, rights, license, ?, ?, ?, ?, ?, ?, 0, 0
|
|
||||||
from uploaded where id = ?}, undef, $filesize, $duration, $width,
|
|
||||||
$height, $fps, $sha, $id) or die $dbh->errstr;
|
|
||||||
|
|
||||||
#delete from uploaded table
|
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#delete from uploaded table
|
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
|
||||||
die "cannot move video to $root/videos/$id - check your permissions!"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#write all valueable information to database so the daemon can fetch it
|
|
||||||
$dbh->do(qq{update uploaded set filesize = ?, duration = ?, width = ?,
|
|
||||||
height = ?, fps = ?, hash = ? where id = ?}, undef, $filesize, $duration, $width,
|
|
||||||
$height, $fps, $sha, $id) or die $dbh->errstr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#print success to the user
|
|
||||||
print $query->redirect("index.pl?information=information_uploaded&value=".$config->{"url_root"}."/video/".urlencode($query->param("DC.Title"))."/$id/");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
#delete from uploaded table
|
#delete from uploaded table
|
||||||
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
die "cannot create thumbnails - check your permissions!";
|
unlink "/tmp/$id";
|
||||||
|
print $query->redirect("index.pl?error=error_upload_invalid_stream");
|
||||||
|
}
|
||||||
|
elsif($width < $config->{"video_width_min"})
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
unlink "/tmp/$id";
|
||||||
|
print $query->redirect("index.pl?error=error_upload_video_width_too_small&value=".$config->{"video_width_min"});
|
||||||
|
}
|
||||||
|
elsif($height < $config->{"video_height_min"})
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
unlink "/tmp/$id";
|
||||||
|
print $query->redirect("index.pl?error=error_upload_video_height_too_small&value=".$config->{"video_height_min"});
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$filesize = -s "/tmp/$id";
|
||||||
|
|
||||||
|
#convert hh:mm:ss.s duration to full seconds - thanks perl for making this so damn easy!
|
||||||
|
#don't want to know how this would look in python or php... hell I don't even have to create extra variables!
|
||||||
|
$duration =~ /^(\d{2}):(\d{2}):(\d{2})\.(\d)$/;
|
||||||
|
$duration = int($1*3600 + $2*60 + $3 + $4/10 + .5);
|
||||||
|
|
||||||
|
#create thumbnail
|
||||||
|
$thumbnailsec = int(rand($duration));
|
||||||
|
$previewsec = $thumbnailsec;
|
||||||
|
|
||||||
|
#the width/height calculation could of course be much shorter but less readable then
|
||||||
|
#all thumbs have equal height
|
||||||
|
$tnheight = $config->{"video_thumbnail_height"};
|
||||||
|
$tnwidth = int($tnheight*($width/$height)/2 + .5)*2;
|
||||||
|
|
||||||
|
$ffthumb = system "ffmpeg -i /tmp/$id -vcodec mjpeg -vframes 1 -an -f rawvideo -ss $thumbnailsec -s ".$tnwidth."x$tnheight $root/video-stills/thumbnails/$id";
|
||||||
|
$ffprev = system "ffmpeg -i /tmp/$id -vcodec mjpeg -vframes 1 -an -f rawvideo -ss $previewsec $root/video-stills/previews/$id";
|
||||||
|
|
||||||
|
#if thumbnail was created successfully
|
||||||
|
if($ffthumb == 0 and $ffprev == 0)
|
||||||
|
{
|
||||||
|
#check if the upload already is in the right format and smaller/equal max-width/height
|
||||||
|
if ($container eq 'ogg' and $video eq 'theora' and ($audio eq 'vorbis' or not $audio) and $height <= $config->{"video_height_max"} and $width <= $config->{"video_width_max"})
|
||||||
|
{
|
||||||
|
if(move("/tmp/$id", "$root/videos/$id"))
|
||||||
|
{
|
||||||
|
#add video to videos table
|
||||||
|
$dbh->do(qq{insert into videos select id, title, description, userid, timestamp, creator,
|
||||||
|
subject, source, language, coverage, rights, license, ?, ?, ?, ?, ?, ?, 0, 0
|
||||||
|
from uploaded where id = ?}, undef, $filesize, $duration, $width,
|
||||||
|
$height, $fps, $sha, $id) or die $dbh->errstr;
|
||||||
|
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
die "cannot move video to $root/videos/$id - check your permissions!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#write all valueable information to database so the daemon can fetch it
|
||||||
|
$dbh->do(qq{update uploaded set filesize = ?, duration = ?, width = ?,
|
||||||
|
height = ?, fps = ?, hash = ? where id = ?}, undef, $filesize, $duration, $width,
|
||||||
|
$height, $fps, $sha, $id) or die $dbh->errstr;
|
||||||
|
}
|
||||||
|
|
||||||
|
#print success to the user
|
||||||
|
print $query->redirect("index.pl?information=information_uploaded&value=".$config->{"url_root"}."/video/".urlencode($query->param("DC.Title"))."/$id/");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#delete from uploaded table
|
||||||
|
$dbh->do(qq{delete from uploaded where id = ?}, undef, $id) or die $dbh->errstr;
|
||||||
|
die "cannot create thumbnails - check your permissions!";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -177,5 +208,5 @@ if($userinfo->{'id'} && $query->param("DC.Title") &&
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print $query->redirect("index.pl?error=error_202c");
|
#print $query->redirect("index.pl?error=error_202c");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue