handle default=mm requests
[surrogator.git] / surrogator.php
index 07556bb622025af0bad08216476d8be28f336258..dd907e0b41274589827c0ee4200bb4fe14a58235 100755 (executable)
@@ -1,5 +1,18 @@
 #!/usr/bin/env php
 <?php
+/**
+ * Tool to create avatar images in different sizes.
+ *
+ * Part of Surrogator - a simple libravatar avatar image server
+ *
+ * PHP version 5
+ *
+ * @category Tools
+ * @package  Surrogator
+ * @author   Christian Weiske <cweiske@cweiske.de>
+ * @license  http://www.gnu.org/licenses/agpl.html AGPLv3 or later
+ * @link     http://git.cweiske.de/?p=surrogator.git
+ */
 namespace surrogator;
 $cfgFile = __DIR__ . '/data/surrogator.config.php';
 if (!file_exists($cfgFile)) {
@@ -39,6 +52,11 @@ foreach ($argv as $arg) {
     }
 }
 
+/**
+ * Echos the --help screen.
+ *
+ * @return void
+ */
 function showHelp()
 {
     echo <<<HLP
@@ -85,7 +103,10 @@ if (!isset($logLevel)) {
 
 if (!is_dir($varDir . '/square')) {
     log('creating square dir: ' . $varDir . '/square');
-    mkdir($varDir . '/square', 0755, true);
+    if (!mkdir($varDir . '/square', 0755, true)) {
+        logErr('cannot create square dir');
+        exit(5);
+    }
 }
 log('sizes: ' . implode(', ', $sizes), 2);
 foreach ($sizes as $size) {
@@ -94,12 +115,23 @@ foreach ($sizes as $size) {
         mkdir($varDir . '/' . $size, 0755);
     }
 }
+if (!file_exists($rawDir . '/mm.png')) {
+    log('mm.png missing, copying it from res/', 2);
+    copy(__DIR__ . '/res/mm.png', $rawDir . '/mm.png');
+}
 
-$dir = new \RegexIterator(
-    new \DirectoryIterator($rawDir),
-    '#^.+\.(png|jpg)$#'
-);
-foreach ($dir as $fileInfo) {
+if (count($files)) {
+    $fileInfos = array();
+    foreach ($files as $file) {
+        $fileInfos[] = new \SplFileInfo($file);
+    }
+} else {
+    $fileInfos = new \RegexIterator(
+        new \DirectoryIterator($rawDir),
+        '#^.+\.(png|jpg)$#'
+    );
+}
+foreach ($fileInfos as $fileInfo) {
     $origPath   = $fileInfo->getPathname();
     $fileName   = $fileInfo->getFilename();
     $ext        = strtolower(substr($fileName, strrpos($fileName, '.') + 1));
@@ -107,7 +139,7 @@ foreach ($dir as $fileInfo) {
         . substr($fileName, 0, -strlen($ext)) . 'png';
 
     log('processing ' . $fileName, 1);
-    if (image_uptodate($origPath, $squarePath)) {
+    if (imageUptodate($origPath, $squarePath)) {
         log(' image up to date', 2);
         continue;
     }
@@ -118,6 +150,8 @@ foreach ($dir as $fileInfo) {
 
     if ($fileName == 'default.png') {
         $md5 = $sha256 = 'default';
+    } else if ($fileName == 'mm.png') {
+        $md5 = $sha256 = 'mm';
     } else {
         list($md5, $sha256) = getHashes($fileName);
     }
@@ -127,6 +161,7 @@ foreach ($dir as $fileInfo) {
     log(' sha256: ' . $sha256, 3);
     $imgSquare = imagecreatefrompng($squarePath);
     foreach ($sizes as $size) {
+        log(' size ' . $size, 3);
         $sizePathMd5    = $varDir . '/' . $size . '/' . $md5 . '.png';
         $sizePathSha256 = $varDir . '/' . $size . '/' . $sha256 . '.png';
 
@@ -137,7 +172,7 @@ foreach ($dir as $fileInfo) {
             imagecolorallocatealpha($imgSize, 0, 0, 0, 127)
         );
         imagecopyresampled(
-            $imgSize, $imgSquare, 
+            $imgSize, $imgSquare,
             0, 0, 0, 0,
             $size, $size, $maxSize, $maxSize
         );
@@ -145,11 +180,18 @@ foreach ($dir as $fileInfo) {
         imagepng($imgSize, $sizePathMd5);
         imagepng($imgSize, $sizePathSha256);
         imagedestroy($imgSize);
-        
+
     }
     imagedestroy($imgSquare);
 }
 
+/**
+ * Create and return md5 and sha256 hashes from a filename.
+ *
+ * @param string $fileName filename without path, e.g. "foo@example.org.png"
+ *
+ * @return array Array with 2 values: md5 and sha256 hash
+ */
 function getHashes($fileName)
 {
     $fileNameNoExt = substr($fileName, 0, -strlen(strrpos($fileName, '.')) - 2);
@@ -160,7 +202,17 @@ function getHashes($fileName)
     );
 }
 
-
+/**
+ * Creates the square image from the given image in maximum size.
+ * Scales the image up or down and makes the non-covered parts transparent.
+ *
+ * @param string  $origPath   Full path to original image
+ * @param string  $ext        File extension ("jpg" or "png")
+ * @param string  $targetPath Full path to target image file
+ * @param integer $maxSize    Maxium image size the server supports
+ *
+ * @return boolean True if all went well, false if there was an error
+ */
 function createSquare($origPath, $ext, $targetPath, $maxSize)
 {
     if ($ext == 'png') {
@@ -196,7 +248,7 @@ function createSquare($origPath, $ext, $targetPath, $maxSize)
     $nHeight = (int)($oHeight * $flScale);
 
     imagecopyresampled(
-        $imgSquare, $imgOrig, 
+        $imgSquare, $imgOrig,
         ($maxSize - $nWidth) / 2, ($maxSize - $nHeight) / 2,
         0, 0,
         $nWidth, $nHeight,
@@ -211,7 +263,15 @@ function createSquare($origPath, $ext, $targetPath, $maxSize)
     return true;
 }
 
-function image_uptodate($sourcePath, $targetPath)
+/**
+ * Check if the target file is newer than the source file.
+ *
+ * @param string $sourcePath Full source file path
+ * @param string $targetPath Full target file path
+ *
+ * @return boolean True if target file is newer than the source file
+ */
+function imageUptodate($sourcePath, $targetPath)
 {
     global $forceUpdate;
     if ($forceUpdate) {
@@ -228,6 +288,14 @@ function image_uptodate($sourcePath, $targetPath)
     return true;
 }
 
+/**
+ * Write a log message to stdout
+ *
+ * @param string  $msg   Message to write
+ * @param integer $level Log level - 1 is important, 3 is unimportant
+ *
+ * @return void
+ */
 function log($msg, $level = 1)
 {
     global $logLevel;
@@ -236,6 +304,13 @@ function log($msg, $level = 1)
     }
 }
 
+/**
+ * Write an error message to stderr
+ *
+ * @param string $msg Message to write
+ *
+ * @return void
+ */
 function logErr($msg)
 {
     file_put_contents('php://stderr', $msg . "\n");