4 $cfgFile = __DIR__ . '/data/surrogator.config.php';
5 if (!file_exists($cfgFile)) {
6 $cfgFile = '/etc/surrogator.config.php';
7 if (!file_exists($cfgFile)) {
9 "Configuration file does not exist.\n"
10 . "Copy data/surrogator.config.php.dist to data/surrogator.config.php"
19 foreach ($argv as $arg) {
20 if ($arg == '-v' || $arg == '--verbose') {
22 } else if ($arg == '-vv') {
24 } else if ($arg == '-q' || $arg == '--quiet') {
26 } else if ($arg == '-f' || $arg == '--force') {
28 } else if ($arg == '-h' || $arg == '--help') {
31 } else if ($arg == '--version') {
32 echo "surrogator 0.0.1\n";
34 } else if (file_exists($arg)) {
37 logErr('Unknown argument: ' . $arg);
45 Usage: php surrogator.php [options] [filename(s)]
47 surrogator - a simple libravatar server
48 Put files in raw/ dir and run surrogator.php to generate different sizes
53 -v, --verbose Be verbose (more log messages, also -vv)
54 -q, --quiet Be quiet (no log messages)
55 -f, --force Force update of all files
56 --version Show program version
58 filenames One or several files whose small images shall get generated.
59 If none given, all will be checked
64 if (!isset($rawDir)) {
65 logErr('$rawDir not set');
68 if (!isset($varDir)) {
69 logErr('$varDir not set');
73 logErr('$sizes not set');
76 if (!isset($maxSize)) {
77 logErr('$maxSize not set');
80 if (!isset($logLevel)) {
81 logErr('$logLevel not set');
86 if (!is_dir($varDir . '/square')) {
87 log('creating square dir: ' . $varDir . '/square');
88 if (!mkdir($varDir . '/square', 0755, true)) {
89 logErr('cannot create square dir');
93 log('sizes: ' . implode(', ', $sizes), 2);
94 foreach ($sizes as $size) {
95 if (!is_dir($varDir . '/' . $size)) {
96 log('creating size dir: ' . $varDir . '/' . $size);
97 mkdir($varDir . '/' . $size, 0755);
102 $fileInfos = array();
103 foreach ($files as $file) {
104 $fileInfos[] = new \SplFileInfo($file);
107 $fileInfos = new \RegexIterator(
108 new \DirectoryIterator($rawDir),
112 foreach ($fileInfos as $fileInfo) {
113 $origPath = $fileInfo->getPathname();
114 $fileName = $fileInfo->getFilename();
115 $ext = strtolower(substr($fileName, strrpos($fileName, '.') + 1));
116 $squarePath = $varDir . '/square/'
117 . substr($fileName, 0, -strlen($ext)) . 'png';
119 log('processing ' . $fileName, 1);
120 if (image_uptodate($origPath, $squarePath)) {
121 log(' image up to date', 2);
125 if (!createSquare($origPath, $ext, $squarePath, $maxSize)) {
129 if ($fileName == 'default.png') {
130 $md5 = $sha256 = 'default';
132 list($md5, $sha256) = getHashes($fileName);
135 log(' creating sizes for ' . $fileName, 2);
136 log(' md5: ' . $md5, 3);
137 log(' sha256: ' . $sha256, 3);
138 $imgSquare = imagecreatefrompng($squarePath);
139 foreach ($sizes as $size) {
140 log(' size ' . $size, 3);
141 $sizePathMd5 = $varDir . '/' . $size . '/' . $md5 . '.png';
142 $sizePathSha256 = $varDir . '/' . $size . '/' . $sha256 . '.png';
144 $imgSize = imagecreatetruecolor($size, $size);
145 imagealphablending($imgSize, false);
146 imagefilledrectangle(
147 $imgSize, 0, 0, $size - 1, $size - 1,
148 imagecolorallocatealpha($imgSize, 0, 0, 0, 127)
151 $imgSize, $imgSquare,
153 $size, $size, $maxSize, $maxSize
155 imagesavealpha($imgSize, true);
156 imagepng($imgSize, $sizePathMd5);
157 imagepng($imgSize, $sizePathSha256);
158 imagedestroy($imgSize);
161 imagedestroy($imgSquare);
164 function getHashes($fileName)
166 $fileNameNoExt = substr($fileName, 0, -strlen(strrpos($fileName, '.')) - 2);
167 $emailAddress = trim(strtolower($fileNameNoExt));
170 md5($emailAddress), hash('sha256', $emailAddress)
175 function createSquare($origPath, $ext, $targetPath, $maxSize)
178 $imgOrig = imagecreatefrompng($origPath);
179 } else if ($ext == 'jpg' || $ext == 'jpeg') {
180 $imgOrig = imagecreatefromjpeg($origPath);
186 if ($imgOrig === false) {
187 logErr('Error loading image file: ' . $origPath);
191 $imgSquare = imagecreatetruecolor($maxSize, $maxSize);
192 imagealphablending($imgSquare, false);
193 imagefilledrectangle(
194 $imgSquare, 0, 0, $maxSize - 1, $maxSize - 1,
195 imagecolorallocatealpha($imgSquare, 0, 0, 0, 127)
197 imagealphablending($imgSquare, true);
199 $oWidth = imagesx($imgOrig);
200 $oHeight = imagesy($imgOrig);
201 if ($oWidth > $oHeight) {
202 $flScale = $maxSize / $oWidth;
204 $flScale = $maxSize / $oHeight;
206 $nWidth = (int)($oWidth * $flScale);
207 $nHeight = (int)($oHeight * $flScale);
210 $imgSquare, $imgOrig,
211 ($maxSize - $nWidth) / 2, ($maxSize - $nHeight) / 2,
217 imagesavealpha($imgSquare, true);
218 imagepng($imgSquare, $targetPath);
220 imagedestroy($imgSquare);
221 imagedestroy($imgOrig);
225 function image_uptodate($sourcePath, $targetPath)
231 if (!file_exists($targetPath)) {
234 if (filemtime($sourcePath) > filemtime($targetPath)) {
242 function log($msg, $level = 1)
245 if ($level <= $logLevel) {
250 function logErr($msg)
252 file_put_contents('php://stderr', $msg . "\n");