Raspberry Pi Trail Camera Code

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);
?>