X-Git-Url: https://git.cweiske.de/surrogator.git/blobdiff_plain/8f42911c4e62de7191e2aac151fcbfe9e7bf80b1..4d4fcf96ca2bf5b3826ca0395b031293adef9b0b:/surrogator.php diff --git a/surrogator.php b/surrogator.php old mode 100644 new mode 100755 index e48190e..8d387d5 --- a/surrogator.php +++ b/surrogator.php @@ -1,27 +1,148 @@ +#!/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; +$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'; - if (image_uptodate($origPath, $squarePath)) { + log('processing ' . $fileName, 1); + if (imageUptodate($origPath, $squarePath)) { + log(' image up to date', 2); continue; } @@ -29,10 +150,20 @@ foreach ($dir as $fileInfo) { continue; } - list($md5, $sha256) = getHashes($fileName); + 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, 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'; @@ -43,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 ); @@ -51,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); @@ -67,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') { @@ -80,10 +227,7 @@ function createSquare($origPath, $ext, $targetPath, $maxSize) } if ($imgOrig === false) { - file_put_contents( - 'php://stderr', - 'Error loading image file: ' . $origPath - ); + logErr('Error loading image file: ' . $origPath); return false; } @@ -106,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, @@ -121,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; @@ -135,4 +290,32 @@ 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; + 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"); +} + ?>