index.php
<!DOCTYPE html> <head> <title>Raspberry Pi Trail Camera</title> </head> <body> <h1 style="text-align:center">Live Raspberry Pi Trail Camera</h1> <p align="center"><iframe width=680 height=520 frameborder="0" scrolling="no" src="http://<?php echo $_SERVER['SERVER_ADDR']; ?>:8081""></iframe></p> <?php #error_reporting(E_ALL); #ini_set('display_errors', 1); define('DIR_SORT_NAME', 1); define('DIR_SORT_SIZE', 2); define('DIR_SORT_ATIME', 3); define('DIR_SORT_MTIME', 4); define('DIR_SORT_CTIME', 5); function readdir_sorted_array ($dir, $sortCol = DIR_SORT_NAME, $sortDir = SORT_ASC) { // Validate arguments $dir = rtrim(str_replace('\\', '/', $dir), '/'); $sortCol = (int) ($sortCol >= 1 && $sortCol <= 5) ? $sortCol : 1; $sortDir = ($sortDir == SORT_DESC) ? SORT_DESC : SORT_ASC; $name = $size = $aTime = $mTime = $cTime = $table = array(); // Open the directory, return FALSE if we can't if (!is_dir($dir) || (!$dp = opendir($dir))) return FALSE; // Fetch a list of files in the directory and get stats for ($i = 0; ($file = readdir($dp)) !== FALSE; $i++) { if (!in_array($file, array('.','..'))) { $path = "$dir/$file"; $row = array('name'=>$file,'size'=>filesize($path),'atime'=>fileatime($path),'mtime'=>filemtime($path),'ctime'=>filectime($path)); $name[$i] = $row['name']; $size[$i] = $row['size']; $aTime[$i] = $row['atime']; $mTime[$i] = $row['mtime']; $cTime[$i] = $row['ctime']; $table[$i] = $row; } } // Sort the results switch ($sortCol) { case DIR_SORT_NAME: array_multisort($name, $sortDir, $table); break; case DIR_SORT_SIZE: array_multisort($size, $sortDir, $name, SORT_ASC, $table); break; case DIR_SORT_ATIME: array_multisort($aTime, $sortDir, $name, SORT_ASC, $table); break; case DIR_SORT_MTIME: array_multisort($mTime, $sortDir, $name, SORT_ASC, $table); break; case DIR_SORT_CTIME: array_multisort($cTime, $sortDir, $name, SORT_ASC, $table); break; } // Return the result return $table; } function getDuration($dir, $file) { $movie = $dir . $file; $mov = new ffmpeg_movie($movie); $duration = number_format($mov->getDuration(), 2, '.', ''); return "$duration Seconds"; } $dir = '/home/pi/motion/'; $files = readdir_sorted_array($dir, DIR_SORT_CTIME, SORT_DESC); #$allfiles = glob("$dir/*"); #$files = usort($allfiles, create_function('$a,$b', 'return filemtime($a) - filemtime($b);')); if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = 0; } $fileCount = glob("$dir*.avi"); $pageSize = 20; $endPage = floor(count($fileCount)/$pageSize); echo "<h1><table width='100%' border='0'>\n"; echo " <tr>\n"; echo " <td colspan='2'>\n"; echo "<h1 align='center'>Page " . ($page + 1) . " of " . ($endPage + 1) . "</h1>"; echo " </td>\n"; echo " </tr>\n"; echo " <tr>\n"; echo " <td>\n"; echo " <a href='?page=0' alt='First Page'><<</a>\n"; if (($page - 1) > 0) { echo " <a href='?page=" . ($page - 1) . "' alt='Next Page'><</a>\n"; } echo " </td>\n"; echo " <td align='right'>\n"; if (($page + 1) <= $endPage) { echo " <a href='?page=" . ($page + 1) . "' alt='Previous Page'>></a>\n"; } echo " <a href='?page=$endPage' alt='Last Page'>>></a>\n"; echo " </td>\n"; echo " </tr>\n"; echo "</table></h1>\n"; $i = 0; $j = 0; $k = 0; $start = $page * $pageSize; $stop = ($page+1) * $pageSize; echo " <table width='100%'>\n"; foreach ($files as $file) { if ( strpos($file['name'], 'avi') !== false && $k <= $stop) { if ( $k >= $start && $file['size'] > 0) { if ( $j % 5 == 0) { echo " <tr>\n"; } $avi = "avi.php?name=$file[name]"; echo " "; echo "<td>"; echo "<table border='1'>"; echo "<tr>"; echo "<td colspan='2'>"; echo "<p><a href='$avi'><img src='img.php?name=" . $file['name'] . "&dir=" . $dir . "' alt='" . $file['name'] . "' /></a></p>"; echo "</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<p>Index</p>"; echo "</td>"; echo "<td>"; echo "<p>$j</p>"; echo "</td>"; echo "</tr>"; echo "<tr>"; echo "<tr>"; echo "<td>"; echo "<p>Name</p>"; echo "</td>"; echo "<td>"; echo "<p>$file[name]</p>"; echo "</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<p>Size</p>"; echo "</td>"; echo "<td>"; #echo "<p>$file[size]</p>"; echo "<p>" . getDuration($dir, $file['name']) . "</p>"; echo "</td>"; echo "</tr>"; echo "<tr>"; echo "<td>"; echo "<p>Date</p>"; echo "</td>"; echo "<td>"; echo "<p>" . date('m/d/Y h:i:s A',$file['mtime']) . "</p>"; echo "</td>"; echo "</tr>"; echo "</table>"; echo "</td>"; echo "\n"; $j++; if ( $j % 5 == 0) { echo " </tr>\n"; } } $k++; } if ( $k > $stop) { break; } $i++; } echo "</table>"; echo "\n"; ?> </body>img.php
<?php error_reporting(E_ALL); ini_set('display_errors', 1); $name = $_GET['name']; $dir = $_GET['dir']; $movie = '/home/pi/motion/'.$name; $thumbname = str_replace("avi", "png", $name); $thumbnail = "thumbs/$thumbname"; function resizeImage($image, $newImage) { $thumb = new Imagick($image); $thumb->resizeImage(320,240,Imagick::FILTER_LANCZOS,1); $thumb->writeImage($newImage); $thumb->destroy(); } #echo "<p>thumbnail = $thumbnail</p>"; if (file_exists($thumbnail) == false) { $mov = new ffmpeg_movie($movie); $frameCount = $mov->getFrameCount(); if ($frameCount <= 3) { $frame = $mov->getFrame(1); #Want to get last *.jpg that has the same name as this avi $thumbname = str_replace(".avi", "*.jpg", "$dir$name"); $newImage = glob("$thumbname")[0]; resizeImage($newImage, $thumbnail); } else { $frame = $mov->getFrame(10); if ($frame) { $gd_image = $frame->toGDImage(); if ($gd_image) { imagepng($gd_image, $thumbnail); imagedestroy($gd_image); resizeImage($thumbnail, $thumbnail); } } else { #Need to cache the last jpg image here as well $thumbname = str_replace(".avi", "*.jpg", "$dir$name"); $newImage = glob("$thumbname")[0]; resizeImage($newImage, $thumbnail); } } } header('content-type: image/png'); header('Cache-Control: public, max-age=99936000'); header('content-disposition: inline; filename="'.$thumbnail.'";'); readfile($thumbnail); ?>avi.php
<?php $name = $_GET['name']; $mimes = array ( 'avi' => 'media/specials.avi', ); $ext = strtolower(end(explode('.', $name))); $file = '/home/pi/motion/'.$name; header('content-type: '. $mimes[$ext]); header('content-disposition: inline; filename="'.$name.'";'); readfile($file); ?>