From 139116d76ff8f1a08af11b8e26944581ba21cbee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1vid=20Danyi?= Date: Thu, 25 Jan 2018 15:44:39 +0100 Subject: [PATCH] * camera images ordered by mtime * display image by camera is now second to last, not the last one * indent changes in javascript code * js code should now be more roboust if there are camera folders getting deleted --- public/scripts/camera-image-handler.js | 60 +++++++++--------- .../Service/CameraPictureManagerService.php | 17 ++++- .../CameraPictureManagerServiceTest.php | 2 +- test/data/cam1/img9.png | Bin 0 -> 5562 bytes test/data/cam2/img9.png | Bin 0 -> 1202 bytes test/data/cam3/img9.jpeg | Bin 0 -> 1202 bytes test/data/cam5/img1.png | Bin 0 -> 5562 bytes test/data/cam5/overlay.txt | 1 + 8 files changed, 46 insertions(+), 34 deletions(-) create mode 100644 test/data/cam1/img9.png create mode 100644 test/data/cam2/img9.png create mode 100644 test/data/cam3/img9.jpeg create mode 100644 test/data/cam5/img1.png create mode 100644 test/data/cam5/overlay.txt diff --git a/public/scripts/camera-image-handler.js b/public/scripts/camera-image-handler.js index d63a11d..6955e80 100644 --- a/public/scripts/camera-image-handler.js +++ b/public/scripts/camera-image-handler.js @@ -1,37 +1,37 @@ jQuery(document).ready(function () { - var cameraImages = []; - var cameraPointer = 0; + var cameraImages = []; + var cameraPointer = 0; - function changeImage(pointer) { - $('#cameraImage').css( - 'background-image', - 'url(' + cameraImageBaseUrl + cameraImages[pointer].camera + '/' + cameraImages[pointer].imageName + ')' - ); - $('#cameraText').text(cameraImages[pointer].text); - } + function changeImage(pointer) { + $('#cameraImage').css( + 'background-image', + 'url(' + cameraImageBaseUrl + cameraImages[pointer].camera + '/' + cameraImages[pointer].imageName + ')' + ); + $('#cameraText').text(cameraImages[pointer].text); + } - function refreshCameraImages() { + function refreshCameraImages() { + jQuery.get(cameraImageApiUrl, function (data) { + cameraImages = data; + }).always(function () { + window.setTimeout(refreshCameraImages, refreshInterval); + }); + } + + // initial image load jQuery.get(cameraImageApiUrl, function (data) { - cameraImages = data; - }).always(function() { - window.setTimeout(refreshCameraImages, refreshInterval); + cameraImages = data; + + changeImage(0); + window.setTimeout(refreshCameraImages, refreshInterval); + + // change displayed image + window.setInterval(function () { + cameraPointer = cameraPointer >= cameraImages.length - 1 + ? 0 + : cameraPointer + 1; + changeImage(cameraPointer); + }, changeDelay); }); - } - - // initial image load - jQuery.get(cameraImageApiUrl, function (data) { - cameraImages = data; - - changeImage(0); - window.setTimeout(refreshCameraImages, refreshInterval); - - // change displayed image - window.setInterval(function () { - cameraPointer = cameraPointer === cameraImages.length - 1 - ? 0 - : cameraPointer + 1; - changeImage(cameraPointer); - }, changeDelay); - }); }); diff --git a/src/App/Service/CameraPictureManagerService.php b/src/App/Service/CameraPictureManagerService.php index a4529f8..0a9b076 100644 --- a/src/App/Service/CameraPictureManagerService.php +++ b/src/App/Service/CameraPictureManagerService.php @@ -31,7 +31,10 @@ class CameraPictureManagerService $cameraImageFolders = array_diff(scandir($cameraImageBaseFolder), ['.', '..']); foreach ($cameraImageFolders as $cameraImageFolder) { - $cameraImages[] = $this->getLatestImageInDirectory("{$cameraImageBaseFolder}/{$cameraImageFolder}"); + $theImage = $this->getLatestCompleteImageInDirectory("{$cameraImageBaseFolder}/{$cameraImageFolder}"); + if (null != $theImage) { + $cameraImages[] = $theImage; + } } return $cameraImages; @@ -66,13 +69,21 @@ class CameraPictureManagerService * @param string $directory * @return CameraImage */ - private function getLatestImageInDirectory(string $directory): CameraImage + private function getLatestCompleteImageInDirectory(string $directory): ?CameraImage { $cameraImage = new CameraImage(); $cameraImage->setCamera(basename($directory)); $allImages = glob("{$directory}/*.{png,jpeg,jpg}", GLOB_NOSORT | GLOB_BRACE); - $latestImage = array_pop($allImages); + if (count($allImages) < 2) { + return null; + } + + $imageModificationTimes = array_map('filemtime', $allImages); + array_multisort($imageModificationTimes, SORT_DESC, $allImages); + + $latestImage = $allImages[1]; + unset($allImages); $cameraImage->setImageName(pathinfo($latestImage, PATHINFO_BASENAME)) ->setCreatedAt(new \DateTime(sprintf("@%s", filemtime($latestImage)))); diff --git a/test/AppTest/Service/CameraPictureManagerServiceTest.php b/test/AppTest/Service/CameraPictureManagerServiceTest.php index d235183..78d95af 100644 --- a/test/AppTest/Service/CameraPictureManagerServiceTest.php +++ b/test/AppTest/Service/CameraPictureManagerServiceTest.php @@ -12,7 +12,7 @@ class CameraPictureManagerServiceTest extends TestCase { const EXISTING_CAM_DIR = 'cam1'; const EXISTING_IMAGE = 'img1.png'; - const MISSING_IMAGE = 'img9.png'; + const MISSING_IMAGE = 'imgXX.png'; const TEST_DATA_DIR = 'test/data'; /** @var Config */ diff --git a/test/data/cam1/img9.png b/test/data/cam1/img9.png new file mode 100644 index 0000000000000000000000000000000000000000..a3618bd2ffe90dba935677d18a6cda22bbaa6973 GIT binary patch literal 5562 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 IM6N<$f{^g0f&c&j literal 0 HcmV?d00001 diff --git a/test/data/cam2/img9.png b/test/data/cam2/img9.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3d22582868d5bb9806a1d607d9b2b116374b9a GIT binary patch literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^H9$O#gAGW^9DEZ6q}Y|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sfLmn|+Wka`z$!8fDSnNGr978H@y}h$PU%FJ{_{a0b z+kPMREArJ|sFgeUTXnd{`(-O!Vy#jbu53~AxjS>$Cgng*&W#`WKg3UI=weZJatgaD z$+>ZB&Vox8U7qLoon;>G=<{6QS@ZF?>fJ~3&hP%(-Y*t^sRFbd0VE=i>1nM0@on$R zv%ak-v=2Tx80+{+A#&ffn7NW)=4$O;D-(EDcY1VMkU?a@&##NtuJoAnUq3jWb}^4y1mTth3O;e#hj(r^?0qwSyN; zd&ZUdV1fysxvH1+pFeA#uIybj&1GUxv44!0&#JvS>*{X&zv)qT-1mLqA*qiK4!14Y zZ?#Ko=IlT7<>RN04A|1SLgLd=IGRY@RMxcHvO!-{kQ#b z_0_2d&*=38-w6AB@jLshOTKg8pZexrCO^Uc{{O0@e~PEyf0*#hs^*Qr9Aa!nxPueP zkrqK$_ul{H?=x+e=0xqOB@^$KHZ`v|-TyD=I`_*@FDtBeZCRSt@#Nssolj<_I9{5w zglqTaEAAEZk5&H6%sv~c z{KM|cIo?S{JJauKcZCG`d@zjVVQxF&@ZqCX=$x4uzG_CN*>u`gTRr+8E%3+UDKv8w zH!r!f#OKnRM4pK(@}YNv6>n(F=)DK rk^h+~yQZu$4cFh$j>yG8)|4~%)s3nxeq^NufW$pr{an^LB{Ts5$D=Na literal 0 HcmV?d00001 diff --git a/test/data/cam3/img9.jpeg b/test/data/cam3/img9.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..dc3d22582868d5bb9806a1d607d9b2b116374b9a GIT binary patch literal 1202 zcmeAS@N?(olHy`uVBq!ia0vp^H9$O#gAGW^9DEZ6q}Y|gW!U_%O?XxI14-? ziy0XBj({-ZRBb+KpdfpRr>`sfLmn|+Wka`z$!8fDSnNGr978H@y}h$PU%FJ{_{a0b z+kPMREArJ|sFgeUTXnd{`(-O!Vy#jbu53~AxjS>$Cgng*&W#`WKg3UI=weZJatgaD z$+>ZB&Vox8U7qLoon;>G=<{6QS@ZF?>fJ~3&hP%(-Y*t^sRFbd0VE=i>1nM0@on$R zv%ak-v=2Tx80+{+A#&ffn7NW)=4$O;D-(EDcY1VMkU?a@&##NtuJoAnUq3jWb}^4y1mTth3O;e#hj(r^?0qwSyN; zd&ZUdV1fysxvH1+pFeA#uIybj&1GUxv44!0&#JvS>*{X&zv)qT-1mLqA*qiK4!14Y zZ?#Ko=IlT7<>RN04A|1SLgLd=IGRY@RMxcHvO!-{kQ#b z_0_2d&*=38-w6AB@jLshOTKg8pZexrCO^Uc{{O0@e~PEyf0*#hs^*Qr9Aa!nxPueP zkrqK$_ul{H?=x+e=0xqOB@^$KHZ`v|-TyD=I`_*@FDtBeZCRSt@#Nssolj<_I9{5w zglqTaEAAEZk5&H6%sv~c z{KM|cIo?S{JJauKcZCG`d@zjVVQxF&@ZqCX=$x4uzG_CN*>u`gTRr+8E%3+UDKv8w zH!r!f#OKnRM4pK(@}YNv6>n(F=)DK rk^h+~yQZu$4cFh$j>yG8)|4~%)s3nxeq^NufW$pr{an^LB{Ts5$D=Na literal 0 HcmV?d00001 diff --git a/test/data/cam5/img1.png b/test/data/cam5/img1.png new file mode 100644 index 0000000000000000000000000000000000000000..a3618bd2ffe90dba935677d18a6cda22bbaa6973 GIT binary patch literal 5562 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 IM6N<$f{^g0f&c&j literal 0 HcmV?d00001 diff --git a/test/data/cam5/overlay.txt b/test/data/cam5/overlay.txt new file mode 100644 index 0000000..2b38c47 --- /dev/null +++ b/test/data/cam5/overlay.txt @@ -0,0 +1 @@ +img1 \ No newline at end of file