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 mkdir($varDir . '/square', 0755, true);
90 log('sizes: ' . implode(', ', $sizes), 2);
91 foreach ($sizes as $size) {
92 if (!is_dir($varDir . '/' . $size)) {
93 log('creating size dir: ' . $varDir . '/' . $size);
94 mkdir($varDir . '/' . $size, 0755);
98 $dir = new \RegexIterator(
99 new \DirectoryIterator($rawDir),
102 foreach ($dir as $fileInfo) {
103 $origPath = $fileInfo->getPathname();
104 $fileName = $fileInfo->getFilename();
105 $ext = strtolower(substr($fileName, strrpos($fileName, '.') + 1));
106 $squarePath = $varDir . '/square/'
107 . substr($fileName, 0, -strlen($ext)) . 'png';
109 log('processing ' . $fileName, 1);
110 if (image_uptodate($origPath, $squarePath)) {
111 log(' image up to date', 2);
115 if (!createSquare($origPath, $ext, $squarePath, $maxSize)) {
119 if ($fileName == 'default.png') {
120 $md5 = $sha256 = 'default';
122 list($md5, $sha256) = getHashes($fileName);
125 log(' creating sizes for ' . $fileName, 2);
126 log(' md5: ' . $md5, 3);
127 log(' sha256: ' . $sha256, 3);
128 $imgSquare = imagecreatefrompng($squarePath);
129 foreach ($sizes as $size) {
130 $sizePathMd5 = $varDir . '/' . $size . '/' . $md5 . '.png';
131 $sizePathSha256 = $varDir . '/' . $size . '/' . $sha256 . '.png';
133 $imgSize = imagecreatetruecolor($size, $size);
134 imagealphablending($imgSize, false);
135 imagefilledrectangle(
136 $imgSize, 0, 0, $size - 1, $size - 1,
137 imagecolorallocatealpha($imgSize, 0, 0, 0, 127)
140 $imgSize, $imgSquare,
142 $size, $size, $maxSize, $maxSize
144 imagesavealpha($imgSize, true);
145 imagepng($imgSize, $sizePathMd5);
146 imagepng($imgSize, $sizePathSha256);
147 imagedestroy($imgSize);
150 imagedestroy($imgSquare);
153 function getHashes($fileName)
155 $fileNameNoExt = substr($fileName, 0, -strlen(strrpos($fileName, '.')) - 2);
156 $emailAddress = trim(strtolower($fileNameNoExt));
159 md5($emailAddress), hash('sha256', $emailAddress)
164 function createSquare($origPath, $ext, $targetPath, $maxSize)
167 $imgOrig = imagecreatefrompng($origPath);
168 } else if ($ext == 'jpg' || $ext == 'jpeg') {
169 $imgOrig = imagecreatefromjpeg($origPath);
175 if ($imgOrig === false) {
176 logErr('Error loading image file: ' . $origPath);
180 $imgSquare = imagecreatetruecolor($maxSize, $maxSize);
181 imagealphablending($imgSquare, false);
182 imagefilledrectangle(
183 $imgSquare, 0, 0, $maxSize - 1, $maxSize - 1,
184 imagecolorallocatealpha($imgSquare, 0, 0, 0, 127)
186 imagealphablending($imgSquare, true);
188 $oWidth = imagesx($imgOrig);
189 $oHeight = imagesy($imgOrig);
190 if ($oWidth > $oHeight) {
191 $flScale = $maxSize / $oWidth;
193 $flScale = $maxSize / $oHeight;
195 $nWidth = (int)($oWidth * $flScale);
196 $nHeight = (int)($oHeight * $flScale);
199 $imgSquare, $imgOrig,
200 ($maxSize - $nWidth) / 2, ($maxSize - $nHeight) / 2,
206 imagesavealpha($imgSquare, true);
207 imagepng($imgSquare, $targetPath);
209 imagedestroy($imgSquare);
210 imagedestroy($imgOrig);
214 function image_uptodate($sourcePath, $targetPath)
220 if (!file_exists($targetPath)) {
223 if (filemtime($sourcePath) > filemtime($targetPath)) {
231 function log($msg, $level = 1)
234 if ($level <= $logLevel) {
239 function logErr($msg)
241 file_put_contents('php://stderr', $msg . "\n");