diff --git a/libs/__Thumbnail.php b/libs/__Thumbnail.php new file mode 100644 index 0000000..bcef53a --- /dev/null +++ b/libs/__Thumbnail.php @@ -0,0 +1,78 @@ + + + + '; + } +} + +?> \ No newline at end of file diff --git a/libs/thumb.php b/libs/thumb.php new file mode 100644 index 0000000..fa31557 --- /dev/null +++ b/libs/thumb.php @@ -0,0 +1,211 @@ + $v) { + if ($v == $path[$k]) { + array_shift($temp); + } else { + if ($part - $k > 1) { + $temp = array_pad($temp, 0 - (count($temp) + ($part - $k) - 1), '..'); + break; + } else { + $temp[0] = './' . $temp[0]; + } + } + } + $src = implode('/', $temp); + } +} + + +if (!extension_loaded('gd')) { + die('GD extension is not installed'); +} +if (!is_writable(THUMB_CACHE)) { + die('Cache not writable'); +} +if (isset($path['scheme']) || !file_exists($src)) { + die('File cannot be found'); +} +if (!in_array(strtolower(substr(strrchr($src, '.'), 1)), array('gif', 'jpg', 'jpeg', 'png'))) { + die('File is not an image'); +} + + +$file_salt = 'v1.0.5'; +$file_size = filesize($src); +$file_time = filemtime($src); +$file_date = gmdate('D, d M Y H:i:s T', $file_time); +$file_type = strtolower(substr(strrchr($src, '.'), 1)); +$file_hash = md5($file_salt . ($src.$size.$crop.$trim.$zoom.$align.$sharpen.$gray.$ignore) . $file_time); +$file_temp = THUMB_CACHE . $file_hash . '.img.txt'; +$file_name = basename(substr($src, 0, strrpos($src, '.')) . strtolower(strrchr($src, '.'))); + + +if (!file_exists(THUMB_CACHE . 'index.html')) { + touch(THUMB_CACHE . 'index.html'); +} +if (($fp = fopen(THUMB_CACHE . 'index.html', 'r')) !== false) { + if (flock($fp, LOCK_EX)) { + if (time() - THUMB_CACHE_AGE > filemtime(THUMB_CACHE . 'index.html')) { + $files = glob(THUMB_CACHE . '*.img.txt'); + if (is_array($files) && count($files) > 0) { + foreach ($files as $file) { + if (time() - THUMB_CACHE_AGE > filemtime($file)) { + unlink($file); + } + } + } + touch(THUMB_CACHE . 'index.html'); + } + flock($fp, LOCK_UN); + } + fclose($fp); +} + + +if (THUMB_BROWSER_CACHE && (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH']))) { + if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $file_date && $_SERVER['HTTP_IF_NONE_MATCH'] == $file_hash) { + header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified'); + die(); + } +} + + +if (!file_exists($file_temp)) { + list($w0, $h0, $type) = getimagesize($src); + $data = file_get_contents($src); + if ($ignore && $type == 1) { + if (preg_match('/\x00\x21\xF9\x04.{4}\x00(\x2C|\x21)/s', $data)) { + header('Content-Type: image/gif'); + header('Content-Length: ' . $file_size); + header('Content-Disposition: inline; filename="' . $file_name . '"'); + header('Last-Modified: ' . $file_date); + header('ETag: ' . $file_hash); + header('Accept-Ranges: none'); + if (THUMB_BROWSER_CACHE) { + header('Cache-Control: max-age=604800, must-revalidate'); + header('Expires: ' . gmdate('D, d M Y H:i:s T', strtotime('+7 days'))); + } else { + header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + header('Expires: ' . gmdate('D, d M Y H:i:s T')); + header('Pragma: no-cache'); + } + die($data); + } + } + $oi = imagecreatefromstring($data); + + list($w,$h) = explode('x', str_replace('<', '', $size) . 'x'); + $w = ($w != '') ? floor(max(8, min(1500, $w))) : ''; + $h = ($h != '') ? floor(max(8, min(1500, $h))) : ''; + if (strstr($size, '<')) { + $h = $w; + $crop = 0; + $trim = 1; + } elseif (!strstr($size, 'x')) { + $h = $w; + } elseif ($w == '' || $h == '') { + $w = ($w == '') ? ($w0 * $h) / $h0 : $w; + $h = ($h == '') ? ($h0 * $w) / $w0 : $h; + $crop = 0; + $trim = 1; + } + $trim_w = ($trim) ? 1 : ($w == '') ? 1 : 0; + $trim_h = ($trim) ? 1 : ($h == '') ? 1 : 0; + if ($crop) { + $w1 = (($w0 / $h0) > ($w / $h)) ? floor($w0 * $h / $h0) : $w; + $h1 = (($w0 / $h0) < ($w / $h)) ? floor($h0 * $w / $w0) : $h; + if (!$zoom) { + if ($h0 < $h || $w0 < $w) { + $w1 = $w0; + $h1 = $h0; + } + } + } else { + $w1 = (($w0 / $h0) < ($w / $h)) ? floor($w0 * $h / $h0) : floor($w); + $h1 = (($w0 / $h0) > ($w / $h)) ? floor($h0 * $w / $w0) : floor($h); + $w = floor($w); + $h = floor($h); + if (!$zoom) { + if ($h0 < $h && $w0 < $w) { + $w1 = $w0; + $h1 = $h0; + } + } + } + $w = ($trim_w) ? (($w0 / $h0) > ($w / $h)) ? min($w, $w1) : $w1 : $w; + $h = ($trim_h) ? (($w0 / $h0) < ($w / $h)) ? min($h, $h1) : $h1 : $h; + + $x = strpos($align, 'l') !== false ? 0 : (strpos($align, 'r') !== false ? $w - $w1 : ($w - $w1) / 2); + $y = strpos($align, 't') !== false ? 0 : (strpos($align, 'b') !== false ? $h - $h1 : ($h - $h1) / 2); + $im = imagecreatetruecolor($w, $h); + $bg = imagecolorallocate($im, 255, 255, 255); + imagefill($im, 0, 0, $bg); + switch ($type) { + case 1: + imagecopyresampled($im, $oi, $x, $y, 0, 0, $w1, $h1, $w0, $h0); + imagegif($im, $file_temp); + break; + case 2: + imagecopyresampled($im, $oi, $x, $y, 0, 0, $w1, $h1, $w0, $h0); + imagejpeg($im, $file_temp, JPEG_QUALITY); + break; + case 3: + imagefill($im, 0, 0, imagecolorallocatealpha($im, 0, 0, 0, 127)); + imagesavealpha($im, true); + imagealphablending($im, false); + imagecopyresampled($im, $oi, $x, $y, 0, 0, $w1, $h1, $w0, $h0); + imagepng($im, $file_temp); + break; + } + imagedestroy($im); + imagedestroy($oi); +} + + +header('Content-Type: image/' . $file_type); +header('Content-Length: ' . filesize($file_temp)); +header('Content-Disposition: inline; filename="' . $file_name . '"'); +header('Last-Modified: ' . $file_date); +header('ETag: ' . $file_hash); +header('Accept-Ranges: none'); +if (THUMB_BROWSER_CACHE) { + header('Cache-Control: max-age=604800, must-revalidate'); + header('Expires: ' . gmdate('D, d M Y H:i:s T', strtotime('+7 days'))); +} else { + header('Cache-Control: no-store, no-cache, must-revalidate, max-age=0'); + header('Expires: ' . gmdate('D, d M Y H:i:s T')); + header('Pragma: no-cache'); +} + + +readfile($file_temp); diff --git a/partials/header.php b/partials/header.php index 3e6b887..fd1bcba 100644 --- a/partials/header.php +++ b/partials/header.php @@ -17,9 +17,13 @@ $profile = getTwtsFromTwtxtString($config['public_txt_url']);

- + - nick ?>@mainURL, PHP_URL_HOST); ?> + mainURL, PHP_URL_HOST); ?> + +