2008-07-14 21:54:50 +08:00
< ? php
//
// ZoneMinder web video view file, $Date$, $Revision$
2008-07-25 17:48:16 +08:00
// Copyright (C) 2001-2008 Philip Coombes
2008-07-14 21:54:50 +08:00
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program 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 General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
if ( ! canView ( 'Events' ) )
{
2008-09-26 17:47:20 +08:00
$view = " error " ;
2008-07-14 21:54:50 +08:00
return ;
}
2016-02-02 03:59:06 +08:00
require_once ( 'includes/Event.php' );
2015-02-24 03:31:15 +08:00
$eid = validInt ( $_REQUEST [ 'eid' ]);
$sql = 'SELECT E.*,M.Name AS MonitorName,M.DefaultRate,M.DefaultScale FROM Events AS E INNER JOIN Monitors AS M ON E.MonitorId = M.Id WHERE E.Id = ?' ;
$sql_values = array ( $eid );
2008-07-14 21:54:50 +08:00
2015-02-24 03:31:15 +08:00
if ( $user [ 'MonitorIds' ] ) {
$monitor_ids = explode ( ',' , $user [ 'MonitorIds' ] );
$sql .= ' AND MonitorId IN (' . implode ( ',' , array_fill ( 0 , count ( $monitor_ids ), '?' ) ) . ')' ;
$sql_values = array_merge ( $sql_values , $monitor_ids );
}
$event = dbFetchOne ( $sql , NULL , $sql_values );
2008-07-14 21:54:50 +08:00
2008-09-26 17:47:20 +08:00
if ( isset ( $_REQUEST [ 'rate' ] ) )
$rate = validInt ( $_REQUEST [ 'rate' ]);
else
$rate = reScale ( RATE_BASE , $event [ 'DefaultRate' ], ZM_WEB_DEFAULT_RATE );
if ( isset ( $_REQUEST [ 'scale' ] ) )
$scale = validInt ( $_REQUEST [ 'scale' ]);
else
$scale = reScale ( SCALE_BASE , $event [ 'DefaultScale' ], ZM_WEB_DEFAULT_SCALE );
2008-07-14 21:54:50 +08:00
2016-02-02 02:41:57 +08:00
$Event = new Event ( $event [ 'Id' ] );
$eventPath = $Event -> Path ();
2008-07-14 21:54:50 +08:00
$videoFormats = array ();
$ffmpegFormats = preg_split ( '/\s+/' , ZM_FFMPEG_FORMATS );
foreach ( $ffmpegFormats as $ffmpegFormat )
{
if ( preg_match ( '/^([^*]+)(\*\*?)$/' , $ffmpegFormat , $matches ) )
{
$videoFormats [ $matches [ 1 ]] = $matches [ 1 ];
if ( ! isset ( $videoFormat ) && $matches [ 2 ] == " * " )
{
$videoFormat = $matches [ 1 ];
}
}
else
{
$videoFormats [ $ffmpegFormat ] = $ffmpegFormat ;
}
}
$videoFiles = array ();
if ( $dir = opendir ( $eventPath ) )
{
while ( ( $file = readdir ( $dir )) !== false )
{
$file = $eventPath . '/' . $file ;
if ( is_file ( $file ) )
{
if ( preg_match ( '/\.(?:' . join ( '|' , $videoFormats ) . ')$/' , $file ) )
{
$videoFiles [] = $file ;
}
}
}
closedir ( $dir );
}
if ( isset ( $_REQUEST [ 'deleteIndex' ]) )
{
2008-09-26 17:47:20 +08:00
$deleteIndex = validInt ( $_REQUEST [ 'deleteIndex' ]);
unlink ( $videoFiles [ $deleteIndex ] );
unset ( $videoFiles [ $deleteIndex ] );
2008-07-14 21:54:50 +08:00
}
if ( isset ( $_REQUEST [ 'downloadIndex' ]) )
{
2008-09-26 17:47:20 +08:00
$downloadIndex = validInt ( $_REQUEST [ 'downloadIndex' ]);
2011-02-07 00:52:10 +08:00
header ( " Pragma: public " );
header ( " Expires: 0 " );
header ( " Cache-Control: must-revalidate, post-check=0, pre-check=0 " );
header ( " Cache-Control: private " , false ); // required by certain browsers
header ( " Content-Description: File Transfer " );
header ( 'Content-disposition: attachment; filename="' . basename ( $videoFiles [ $downloadIndex ]) . '"' ); // basename is required because the video index contains the path and firefox doesn't strip the path but simply replaces the slashes with an underscore.
header ( " Content-Transfer-Encoding: binary " );
header ( " Content-Type: application/force-download " );
header ( " Content-Length: " . filesize ( $videoFiles [ $downloadIndex ]) );
2008-09-26 17:47:20 +08:00
readfile ( $videoFiles [ $downloadIndex ] );
2008-07-14 21:54:50 +08:00
exit ;
}
$focusWindow = true ;
2015-05-10 21:10:30 +08:00
xhtmlHeaders ( __FILE__ , translate ( 'Video' ) );
2008-07-14 21:54:50 +08:00
?>
< body >
< div id = " page " >
< div id = " header " >
< div id = " headerButtons " >
2015-05-10 21:10:30 +08:00
< a href = " # " onclick = " closeWindow() " >< ? php echo translate ( 'Close' ) ?> </a>
2008-07-14 21:54:50 +08:00
</ div >
2015-05-10 21:10:30 +08:00
< h2 >< ? php echo translate ( 'Video' ) ?> </h2>
2008-07-14 21:54:50 +08:00
</ div >
< div id = " content " >
< ? php
if ( isset ( $_REQUEST [ 'showIndex' ]) )
{
2008-09-26 17:47:20 +08:00
$showIndex = validInt ( $_REQUEST [ 'showIndex' ]);
preg_match ( '/([^\/]+)\.([^.]+)$/' , $videoFiles [ $showIndex ], $matches );
2008-07-14 21:54:50 +08:00
$name = $matches [ 1 ];
$videoFormat = $matches [ 2 ];
?>
2014-12-05 07:44:23 +08:00
< h3 id = " videoFile " >< ? php echo substr ( $videoFiles [ $showIndex ], strlen ( ZM_DIR_EVENTS ) + 1 ) ?> </h3>
2008-09-26 17:47:20 +08:00
< div id = " imageFeed " >< ? php outputVideoStream ( 'videoStream' , $videoFiles [ $showIndex ], validInt ( $_REQUEST [ 'width' ]), validInt ( $_REQUEST [ 'height' ]), $videoFormat , $name ) ?> </div>
2008-07-14 21:54:50 +08:00
< ? php
}
else
{
?>
2014-12-05 07:44:23 +08:00
< form name = " contentForm " id = " contentForm " method = " post " action = " <?php echo $_SERVER['PHP_SELF'] ?> " >
< input type = " hidden " name = " id " value = " <?php echo $event['Id'] ?> " />
2008-07-14 21:54:50 +08:00
< table id = " contentTable " class = " minor " cellspacing = " 0 " >
< tbody >
< tr >
2015-05-10 21:10:30 +08:00
< th scope = " row " >< ? php echo translate ( 'VideoFormat' ) ?> </th>
2014-12-05 07:44:23 +08:00
< td >< ? php echo buildSelect ( " videoFormat " , $videoFormats ) ?> </td>
2008-07-14 21:54:50 +08:00
</ tr >
< tr >
2015-05-10 21:10:30 +08:00
< th scope = " row " >< ? php echo translate ( 'FrameRate' ) ?> </th>
2014-12-05 07:44:23 +08:00
< td >< ? php echo buildSelect ( " rate " , $rates ) ?> </td>
2008-07-14 21:54:50 +08:00
</ tr >
< tr >
2015-05-10 21:10:30 +08:00
< th scope = " row " >< ? php echo translate ( 'VideoSize' ) ?> </th>
2014-12-05 07:44:23 +08:00
< td >< ? php echo buildSelect ( " scale " , $scales ) ?> </td>
2008-07-14 21:54:50 +08:00
</ tr >
< tr >
2015-05-10 21:10:30 +08:00
< th scope = " row " >< ? php echo translate ( 'OverwriteExisting' ) ?> </th>
2008-07-14 21:54:50 +08:00
< td >< input type = " checkbox " name = " overwrite " value = " 1 " < ? php if ( ! empty ( $_REQUEST [ 'overwrite' ]) ) { ?> checked="checked"<?php } ?>/></td>
</ tr >
</ tbody >
</ table >
2015-05-10 21:10:30 +08:00
< input type = " button " value = " <?php echo translate('GenerateVideo') ?> " onclick = " generateVideo( this.form ); " < ? php if ( ! ZM_OPT_FFMPEG ) { ?> disabled="disabled"<?php } ?>/>
2008-07-14 21:54:50 +08:00
</ form >
< ? php
if ( isset ( $_REQUEST [ 'generated' ]) )
{
?>
2015-05-10 21:10:30 +08:00
< h2 id = " videoProgress " class = " <?php echo $_REQUEST['generated'] ?'infoText':'errorText' ?> " >< span id = " videoProgressText " >< ? php echo $_REQUEST [ 'generated' ] ? translate ( 'VideoGenSucceeded' ) : translate ( 'VideoGenFailed' ) ?> </span><span id="videoProgressTicker"></span></h2>
2008-07-14 21:54:50 +08:00
< ? php
}
else
{
?>
2015-05-10 21:10:30 +08:00
< h2 id = " videoProgress " class = " hidden warnText " >< span id = " videoProgressText " >< ? php echo translate ( 'GeneratingVideo' ) ?> </span><span id="videoProgressTicker"></span></h2>
2008-07-14 21:54:50 +08:00
< ? php
}
?>
2015-05-10 21:10:30 +08:00
< h2 id = " videoFilesHeader " >< ? php echo translate ( 'VideoGenFiles' ) ?> </h2>
2008-07-14 21:54:50 +08:00
< ? php
if ( count ( $videoFiles ) == 0 )
{
?>
2015-05-10 21:10:30 +08:00
< h3 id = " videoNoFiles " >< ? php echo translate ( 'VideoGenNoFiles' ) ?> </h3>
2008-07-14 21:54:50 +08:00
< ? php
}
else
{
?>
< table id = " videoTable " class = " major " cellspacing = " 0 " >
< thead >
< tr >
2015-05-10 21:10:30 +08:00
< th scope = " row " >< ? php echo translate ( 'Format' ) ?> </th>
< th scope = " row " >< ? php echo translate ( 'Size' ) ?> </th>
< th scope = " row " >< ? php echo translate ( 'Rate' ) ?> </th>
< th scope = " row " >< ? php echo translate ( 'Scale' ) ?> </th>
< th scope = " row " >< ? php echo translate ( 'Action' ) ?> </th>
2008-07-14 21:54:50 +08:00
</ tr >
</ thead >
< tbody >
< ? php
$index = 0 ;
foreach ( $videoFiles as $file )
{
if ( filesize ( $file ) > 0 )
{
preg_match ( '/^(.+)-((?:r[_\d]+)|(?:F[_\d]+))-((?:s[_\d]+)|(?:S[0-9a-z]+))\.([^.]+)$/' , $file , $matches );
if ( preg_match ( '/^r(.+)$/' , $matches [ 2 ], $temp_matches ) )
{
$rate = ( int )( 100 * preg_replace ( '/_/' , '.' , $temp_matches [ 1 ] ) );
$rateText = isset ( $rates [ $rate ]) ? $rates [ $rate ] : ( $rate . " x " );
}
elseif ( preg_match ( '/^F(.+)$/' , $matches [ 2 ], $temp_matches ) )
{
$rateText = $temp_matches [ 1 ] . " fps " ;
}
if ( preg_match ( '/^s(.+)$/' , $matches [ 3 ], $temp_matches ) )
{
$scale = ( int )( 100 * preg_replace ( '/_/' , '.' , $temp_matches [ 1 ] ) );
$scaleText = isset ( $scales [ $scale ]) ? $scales [ $scale ] : ( $scale . " x " );
}
elseif ( preg_match ( '/^S(.+)$/' , $matches [ 3 ], $temp_matches ) )
{
$scaleText = $temp_matches [ 1 ];
}
$width = $scale ? reScale ( $event [ 'Width' ], $scale ) : $event [ 'Width' ];
$height = $scale ? reScale ( $event [ 'Height' ], $scale ) : $event [ 'Height' ];
?>
< tr >
2014-12-05 07:44:23 +08:00
< td >< ? php echo $matches [ 4 ] ?> </td>
< td >< ? php echo filesize ( $file ) ?> </td>
< td >< ? php echo $rateText ?> </td>
< td >< ? php echo $scaleText ?> </td>
2015-05-10 21:10:30 +08:00
< td >< ? php echo makePopupLink ( '?view=' . $view . '&eid=' . $event [ 'Id' ] . '&width=' . $width . '&height=' . $height . '&showIndex=' . $index , 'zmVideo' . $event [ 'Id' ] . '-' . $scale , array ( 'videoview' , $width , $height ), translate ( 'View' ) ); ?> / <a href="<?php echo substr( $file, strlen(ZM_DIR_EVENTS)+1 ) ?>" onclick="downloadVideo( <?php echo $index ?> ); return( false );"><?php echo translate('Download') ?></a> / <a href="#" onclick="deleteVideo( <?php echo $index ?> ); return( false );"><?php echo translate('Delete') ?></a></td>
2008-07-14 21:54:50 +08:00
</ tr >
< ? php
$index ++ ;
}
}
?>
</ tbody >
</ table >
< ? php
}
}
?>
</ div >
</ div >
</ body >
</ html >