X-Git-Url: https://git.cweiske.de/surrogator.git/blobdiff_plain/357fbe1a455c504b32005c052cea725e8d2dca16..4d4fcf96ca2bf5b3826ca0395b031293adef9b0b:/surrogator.php diff --git a/surrogator.php b/surrogator.php old mode 100644 new mode 100755 index a78de08..8d387d5 --- a/surrogator.php +++ b/surrogator.php @@ -1,6 +1,83 @@ +#!/usr/bin/env php + * @license http://www.gnu.org/licenses/agpl.html AGPLv3 or later + * @link http://git.cweiske.de/?p=surrogator.git + */ namespace surrogator; -require __DIR__ . '/data/surrogator.config.php'; +$cfgFile = __DIR__ . '/data/surrogator.config.php'; +if (!file_exists($cfgFile)) { + $cfgFile = '/etc/surrogator.config.php'; + if (!file_exists($cfgFile)) { + logErr( + "Configuration file does not exist.\n" + . "Copy data/surrogator.config.php.dist to data/surrogator.config.php" + ); + exit(2); + } +} +require $cfgFile; + +array_shift($argv); +$files = array(); +foreach ($argv as $arg) { + if ($arg == '-v' || $arg == '--verbose') { + ++$logLevel; + } else if ($arg == '-vv') { + $logLevel += 2; + } else if ($arg == '-q' || $arg == '--quiet') { + $logLevel = 0; + } else if ($arg == '-f' || $arg == '--force') { + $forceUpdate = true; + } else if ($arg == '-h' || $arg == '--help') { + showHelp(); + exit(4); + } else if ($arg == '--version') { + echo "surrogator 0.0.1\n"; + exit(); + } else if (file_exists($arg)) { + $files[] = $arg; + } else { + logErr('Unknown argument: ' . $arg); + exit(3); + } +} + +/** + * Echos the --help screen. + * + * @return void + */ +function showHelp() +{ + echo <<getPathname(); $fileName = $fileInfo->getFilename(); $ext = strtolower(substr($fileName, strrpos($fileName, '.') + 1)); $squarePath = $varDir . '/square/' . substr($fileName, 0, -strlen($ext)) . 'png'; - log('processing ' . $fileName); - if (image_uptodate($origPath, $squarePath)) { - log(' image up to date'); + log('processing ' . $fileName, 1); + if (imageUptodate($origPath, $squarePath)) { + log(' image up to date', 2); continue; } @@ -55,15 +152,18 @@ 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); } - log(' Creating sizes for ' . $fileName); - log(' md5: ' . $md5); - log(' sha256: ' . $sha256); + log(' creating sizes for ' . $fileName, 2); + log(' md5: ' . $md5, 3); + 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'; @@ -74,7 +174,7 @@ foreach ($dir as $fileInfo) { imagecolorallocatealpha($imgSize, 0, 0, 0, 127) ); imagecopyresampled( - $imgSize, $imgSquare, + $imgSize, $imgSquare, 0, 0, 0, 0, $size, $size, $maxSize, $maxSize ); @@ -82,12 +182,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); @@ -98,7 +204,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') { @@ -134,7 +250,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, @@ -149,12 +265,23 @@ 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) { + return false; + } if (!file_exists($targetPath)) { return false; } - if (filemtime($sourcePath) > filemtime($targetPath)) { //source newer return false; @@ -163,11 +290,29 @@ function image_uptodate($sourcePath, $targetPath) return true; } -function log($msg) +/** + * 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) { - echo $msg . "\n"; + global $logLevel; + if ($level <= $logLevel) { + echo $msg . "\n"; + } } +/** + * Write an error message to stderr + * + * @param string $msg Message to write + * + * @return void + */ function logErr($msg) { file_put_contents('php://stderr', $msg . "\n");