I said I’d put up the script I’m using so here it is. Couple of notes first.
I know PHP isn’t particularly the best language to use for scripts, but I’ve been using it for work within a website and since my head was already in PHP mode it seemed easier to just keep going and get the idea down and running than be typing stuff wrong all the time and have to keep correcting it to get each bit working.
I call this script to start running as zoneminder loads from the init.d/zoneminder file, exactly the same way I started the last one. Something I did hit though is if PHP tries to output and there’s no console it crashes out. So the diagnostic setting should be off if it’s live and only used if your running it from command line for testing. For some reason running it from command line with & to background it starts it off but on trying to continue in the terminal it stops the process. I’m sure there’s a perfectly good explanation for this like it’s passing the input into the php script which isn’t to output and falls over, but I don’t need to run it from command line unless testing so this bit doesn’t bother me.
Requirements:-
New folder, /var/cache/zoneminder/webcams, /var/cache/zoneminder/webcams/originals, /var/cache/zoneminder/webcams/resized
This also requires the ‘convert’ command (same as the previous but I forgot to note that). if you try to run convert under unbuntu it’ll tell you what to do to install it if you dont have it.
edit a new file ~/webcams2.php and paste the following:-
#!/usr/bin/php
<?php
$DIAG = 2;
$LOGPATH = "/tmp/webcams.log";
$host = "127.0.0.1";
$user = "root";
$pass = "";
$db = "zm";
$directory = "/var/cache/zoneminder/webcams/";
$dblastid = "0";
$mainpull = "0";
$nextrotate = "10";
$nextpull = "60";
$autoadjustrefresh = FALSE;
$ms = mysql_pconnect($host, $user, $pass);
if ( !$ms )
{ echo ""; }
mysql_select_db($db);
//connection complete.
chdir ( $directory );
if ($DIAG > 0) { $LogFile = fopen($LOGPATH, 'a') or die("can't open file"); };
if ($DIAG > 0) { fwrite($LogFile, "Starting Logfile at : " . time(). " ...n"); };
function RefreshAllImages() {
global $directory, $dblastid, $nextpull,$DIAG,$LogFile;
$q = "SELECT * from WebCams where Enabled='1'";
$r = mysql_query($q);
if (!$r) { echo ("Problemsr"); } else {
for ($rows = 0; $rows < mysql_num_rows($r); $rows++) {
$filenamepath = $directory . "originals/" . mysql_result($r,$rows,'Monitor') . mysql_result($r,$rows,'ID') . ".jpg";
$filename = str_replace($directory."originals/","",$filenamepath);
$filetime = filemtime($filenamepath);
if ($DIAG >= 2) { fwrite($LogFile, "Pulling File : " . $filenamepath . "n"); };
// old command $cmd = "wget -q -t 2 -T 5 "" . mysql_result($r,$rows,'URL') . "" -O "" . $filenamepath . """;
$cmd = "curl -q -m 10 -R --retry 1 -s -f --url "" . mysql_result($r,$rows,'URL') . "" -o "" . $filenamepath . """;
if ($DIAG >= 2) { fwrite($LogFile, "Using Command : " . $cmd . "n"); };
exec($cmd);
clearstatcache(TRUE, $filenamepath);
if ( (filesize($filenamepath)!="0") && ($filetime != filemtime($filenamepath)) ) {
if ($DIAG >= 2) { fwrite($LogFile, "Converting File : " . filectime($filenamepath) . $filenamepath . "n"); };
$cmd = "convert " . $filenamepath . " -resize 640x480! -pointsize 20 -fill yellow -draw 'text 10, 20 "" . mysql_result($r,$rows,'Name') . ""' " . $directory . "resized/" . $filename;
exec($cmd);
touch ( $directory . "resized/" . $filename, filemtime($filenamepath) );
};
};
$dblastid = mysql_result($r,$rows-1,'ID');
};
if ($DIAG >= 2) { fwrite($LogFile, "Finished Pulling All Files!n"); };
$nextpull = (time() + 60);
};
function RefreshImages() {
global $directory, $dblastid, $nextpull, $autoadjustrefresh, $DIAG, $LogFile;
clearstatcache();
if ($DIAG >= 2) { fwrite($LogFile, "Refreshing Images...n"); };
$q = "SELECT * from WebCams where Enabled='1'";
$r = mysql_query($q);
for ($rows = 0; $rows < mysql_num_rows($r); $rows++) {
$start = mysql_result($r,$rows,'Start');
$stop = mysql_result($r,$rows,'Stop');
if ($DIAG >= 2) { fwrite($LogFile, "Start : $start. Stop : $stop. Time : " . date("H:i:s") . ".n"); };
if ( ( ($start < $stop) && ($start < date("H:i:s")) && ($stop > date("H:i:s")) ) || ( ($start > $stop) && ( (($start < date("H:i:s")) && ($stop < date("H:i:s"))) || (($start > date("H:i:s")) && ($stop > date("H:i:s"))) ) ) ) {
if ($DIAG >= 2) { fwrite($LogFile, "In timeframe running checks...n"); };
$row_filename = mysql_result($r,$rows,'Monitor').mysql_result($r,$rows,'ID').".jpg";
$row_id = mysql_result($r,$rows,'ID');
$row_refresh = time() - mysql_result($r,$rows,'Refresh');
$filenamepath = $directory."originals/".$row_filename;
$filectime = filectime($filenamepath);
$filemtime = filemtime($filenamepath);
if ( (($filemtime > time() - 3600) && ($filectime < $row_refresh)) || (!file_exists($filenamepath)) ) {
if ($DIAG >= 2) { fwrite($LogFile, "Pulling New File : " . filectime($filenamepath) . $filenamepath . "n"); };
// old command $cmd = "wget -q -t 2 -T 5 "" . mysql_result($r,$rows,'URL') . "" -O "" . $filenamepath . """;
$cmd = "curl -q -m 10 -R --retry 1 -s -f --url "" . mysql_result($r,$rows,'URL') . "" -o "" . $filenamepath . """;
if ($DIAG >= 2) { fwrite($LogFile, "Using Command : " . $cmd . "n"); };
exec($cmd);
clearstatcache(TRUE, $filenamepath);
if (( filemtime($filenamepath) > $filemtime ) && (filesize($filenamepath)!="0") ) {
if ( $autoadjustrefresh == TRUE ) {
if ($DIAG >= 2) { fwrite($LogFile, "Adjusting refresh time.n Calculating difference...n"); };
$timedifference = filemtime($filenamepath) - $filemtime;
if ($DIAG >= 2) { fwrite($LogFile, "Difference : " . $timedifference . "n"); };
if ( ($timedifference > (mysql_result($r,$rows,'Refresh')+30) || $timedifference < (mysql_result($r,$rows,'Refresh')-30)) && ($timedifference < 900)) {
if ($DIAG >= 2) { fwrite($LogFile, "Updating Database Refresh timer.n"); };
$q2="UPDATE WebCams set Refresh='" . ($timedifference) . "' WHERE ID='$row_id'";
$r2 = mysql_query($q2);
};
};
if ($DIAG >= 2) { fwrite($LogFile, "Attempting resize : " . filemtime($filenamepath) . $filenamepath . "n"); };
$cmd = "convert $filenamepath -resize 640x480! -pointsize 20 -fill yellow -draw 'text 10, 20 "" . mysql_result($r,$rows,'Name') . ""' " . $directory . "resized/" . $row_filename;
exec($cmd);
touch ( $directory . "resized/" . $row_filename, filemtime($filenamepath) );
} else {
if ($DIAG >= 2){ fwrite($LogFile, "$row_filename Not Newer : " . filemtime($filenamepath) . " <= " . $filemtime . " Ignoringn"); };
};
};
};
};
$nextpull = (time() + 60);
};
function RotateImages() {
global $directory, $nextrotate,$DIAG,$LogFile;
$newimageset = FALSE;
$imagefound = FALSE;
clearstatcache();
$q = "SELECT distinct(Monitor) from WebCams";
$r = mysql_query($q);
for ($rows = 0; $rows < mysql_num_rows($r); $rows++) {
if ($DIAG >= 1){ fwrite($LogFile, "Rotating Monitor " . mysql_result($r,$rows,'Monitor') . "n"); };
if ($DIAG >= 1){ fwrite($LogFile, "Checking for New Files ...n"); };
$newimageset = FALSE;
$imagefound = FALSE;
if (mysql_result($r,$rows,'Monitor') != 'C'){
foreach (glob($directory."resized/".mysql_result($r,$rows,'Monitor')."*.jpg") as $filenamepath) {
if ($DIAG >= 1){ fwrite($LogFile, " " . $filenamepath ); };
if (filectime($filenamepath) > (time()-15) ) {
if ($DIAG >= 1){ fwrite($LogFile, "n New file Found linking ... n"); };
exec( "ln -sf " . $filenamepath . " " . $directory . "rotate" . mysql_result($r,$rows,'Monitor') . ".jpg" );
$newimageset = TRUE;
};
};
};
if ($DIAG >= 1){ fwrite($LogFile, "Finished lookin for newer files.n"); };
if ( $newimageset == FALSE) {
$rotatefile = $directory."rotate".mysql_result($r,$rows,'Monitor').".jpg";
if (file_exists($rotatefile) ) {
if ($DIAG >= 1){ fwrite($LogFile, "nLooking for Link File : $rotatefile ...n"); };
$currentfile = readlink($rotatefile);
if ($DIAG >= 1){ fwrite($LogFile, "Current : " . $currentfile . "n"); };
foreach (glob($directory."resized/".mysql_result($r,$rows,'Monitor')."*.jpg") as $filenamepath) {
if ( $filenamepath == $currentfile ) {
if($DIAG >= 1){ fwrite($LogFile, "Found Correct entry.n"); };
$imagefound = TRUE;
} elseif (($imagefound) && (!$newimageset)) {
if ($DIAG >= 1){ fwrite($LogFile, "Checking next Image...n"); };
if (filectime($filenamepath) > (time() - 1800) ) {
if ($DIAG >= 1){ fwrite($LogFile, "Next Suitable Image " . $filenamepath . " Linking...n"); };
exec( "ln -sf " . $filenamepath . " " . $directory . "rotate" . mysql_result($r,$rows,'Monitor') . ".jpg" );
$newimageset = TRUE;
};
};
};
};
};
if ($newimageset == FALSE) {
if ($DIAG >= 1){ fwrite($LogFile, "Image still not set, Falling back to load first suitablen"); };
foreach (glob($directory."resized/".mysql_result($r,$rows,'Monitor')."*.jpg") as $filenamepath) {
if ($DIAG >= 1){ fwrite($LogFile, "Checking File " . $filenamepath . "n"); };
if (filectime($filenamepath) > (time() - 1800) && ($newimageset == FALSE) ) {
exec( "ln -sf " . $filenamepath . " " . $directory . "rotate" . mysql_result($r,$rows,'Monitor') . ".jpg" );
$newimageset = TRUE;
};
};
};
};
$nextrotate = (time() + 10);
};
$pulled = 0;
for (;;) {
if (time() > $nextpull) {
if ($pulled == 0 or $pulled == 60) {
RefreshAllImages();
$pulled = 1;
} else {
RefreshImages();
$pulled++;
};
};
if (time() > $nextrotate) {
RotateImages();
};
sleep(2);
};
?>
Save the file then chmod +x ~/webcams2.php