bizou/functions.php
Théophile Bastian 02479196c6 Handle absolute paths for images and data dirs
Bizou now handles correctly data and images directories. One can now
configure

* `MEDIA_BASE_DIR`: base directory for `images` and `data` and
* `{IMAGES,DATA}_URL`: the base url that should be used to point to a
  file in `IMAGES_DIR` (resp. `DATA_DIR`).

Assuming the web server itself can correctly serve those files at the
given URL and Bizou has the correct permissions for those locations,
Bizou should be able to work as well as using relative paths.
2017-11-28 18:59:23 +01:00

153 lines
4.2 KiB
PHP

<?php
// load plugins
$plugins = array();
if (is_dir("plugins")) {
$plugins = scandir("plugins");
array_shift($plugins); array_shift($plugins); // remove . and ..
foreach ($plugins as $p) if (is_file("plugins/$p/functions.php"))
require "plugins/$p/functions.php";
}
function plugins_include($phpFile)
{
foreach ($GLOBALS['plugins'] as $p) if (is_file("plugins/$p/$phpFile"))
require "plugins/$p/$phpFile";
}
function getPathInfo()
{
$simplePath = $_SERVER["PATH_INFO"];
if ($simplePath == '/') $simplePath = '';
// extra security check to avoid /photos/index/../.. like urls, maybe useless but..
if (strpos($simplePath, '..') !== false) die(".. found in url");
return $simplePath;
}
if (! function_exists('getImageLink')) {
function getImageLink($imageSimplePath)
{
return $GLOBALS['rootUrl'].IMAGES_URL.$imageSimplePath;
}
}
if (! function_exists('getPreview')) {
function getPreview($imgFile, $maxSize = THUMB_SIZE)
{
# example: data/myalbum/100.mypic.jpg
$origImgFile = IMAGES_DIR . $imgFile;
$basePath = dirname($imgFile)."/".$maxSize.".".basename($imgFile);
$newImgFile = DATA_DIR . "/" . $basePath;
# if the preview is a symlink, image is already good sized
if (is_link($newImgFile)) return $imgFile;
if (! is_file($newImgFile))
{
# this tels the template to flush output after displaying previews
$GLOBALS["generating"] = true;
# reset script time limit to 20s (wont work in safe mode)
set_time_limit(20);
$ext = strtolower(substr($imgFile, -4));
if ($ext == ".jpg") {
$img = imagecreatefromjpeg($origImgFile);
$exif = exif_read_data($origImgFile);
} else {
$img = imagecreatefrompng($origImgFile);
}
if ($img === false) return ""; #read error (wrong permission...)
$w = imagesx($img);
$h = imagesy($img);
# if the image is already small, make a symlink, and return it
if ($w <= $maxSize and $h <= $maxSize) {
imagedestroy($img);
symlink($imgFile, $newImgFile);
return $imgFile;
}
# config to allow group writable files
umask(DATA_UMASK);
# create the thumbs directory recursively
if (! is_dir(dirname($newImgFile))) @mkdir(dirname($newImgFile), 0777, true)
or die("Could not write in data dir. Please fix permissions.");
if ($w > $h) {
$newW = $maxSize;
$newH = $h/($w/$maxSize);
} else {
$newW = $w/($h/$maxSize);
$newH = $maxSize;
}
$newImg = imagecreatetruecolor($newW, $newH);
imagecopyresampled($newImg, $img, 0, 0, 0, 0, $newW, $newH, $w, $h);
if ($ext == ".jpg") {
if (!empty($exif['Orientation'])) {
$orientation = $exif['Orientation'];
if ($orientation === 3) $newImg = imagerotate($newImg, 180, 0);
elseif ($orientation === 6) $newImg = imagerotate($newImg, -90, 0);
elseif ($orientation === 8) $newImg = imagerotate($newImg, 90, 0);
}
imagejpeg($newImg, $newImgFile, JPEG_QUALITY);
} else {
imagepng($newImg, $newImgFile);
}
imagedestroy($img);
imagedestroy($newImg);
}
return $basePath;
}
}
function getAlbumPreview($dir)
{
$previewBase = "/$dir/albumpreview";
$previewFile = DATA_DIR . $previewBase;
$dirPath = IMAGES_DIR . "/$dir/";
if (is_file("$previewFile.jpg")) {
return "$previewBase.jpg";
} else if (is_file("$previewFile.empty")) {
return "";
} else if (is_file("$previewFile.png")) {
return "$previewBase.png";
} else {
# config to allow group writable files
umask(DATA_UMASK);
# create the thumbs directory recursively
if (! is_dir(dirname($previewFile))) @mkdir(dirname($previewFile), 0777, true)
or die("Could not write in data dir. Please fix permissions.");
// no preview: look for a preview in current dir, write it, return it
foreach (scandir($dirPath) as $file) if ($file[0] != '.') {
$ext = strtolower(substr($file, -4));
if ($ext == ".jpg" or $ext == ".png") {
$thumbUrl = getPreview("$dir/$file");
$thumb = DATA_DIR . $thumbUrl;
copy($thumb, $previewFile.$ext);
return $previewBase.$ext;
} else if (is_dir("$dirPath/$file")) {
$subPreview = getAlbumPreview("$dir/$file");
if ($subPreview) {
$myPreview = dirname($previewBase)."/".basename($subPreview);
copy(DATA_DIR . $subPreview, DATA_DIR . $myPreview);
return $myPreview;
}
}
}
// nothing found. create empty file
touch("$previewFile.empty");
return "";
}
}
?>