Compare commits

...

9 Commits

4 changed files with 71 additions and 18 deletions
+1
View File
@@ -3,3 +3,4 @@ php/psalm.xml
php/vendor php/vendor
php.log php.log
config.json
+6
View File
@@ -0,0 +1,6 @@
{
"ROOT_URL": "http://localhost/",
"ROOT_DIR": "/var/www/html/",
"IMG_DIR": "img/",
"THUMBNAIL_DIR": "thumbnails/"
}
+53 -11
View File
@@ -3,10 +3,11 @@ include_once __DIR__ . "/logging.php";
include_once __DIR__ . "/cors.php"; include_once __DIR__ . "/cors.php";
cors(); cors();
define("ROOT_URL", "http://localhost/"); $config_data = get_config();
define("ROOT_DIR", "/var/www/localhost/"); define("ROOT_URL", $config_data["ROOT_URL"]);
define("IMG_DIR", "img/"); define("ROOT_DIR", $config_data["ROOT_DIR"]);
define("THUMBNAIL_DIR", "thumbnails/"); define("IMG_DIR", $config_data["IMG_DIR"]);
define("THUMBNAIL_DIR", $config_data["THUMBNAIL_DIR"]);
define("THUMBNAIL_SCRIPT", __DIR__ . "/../scripts/resize-img"); define("THUMBNAIL_SCRIPT", __DIR__ . "/../scripts/resize-img");
define("IMAGE_EXTENSIONS", [ define("IMAGE_EXTENSIONS", [
@@ -37,6 +38,7 @@ function main(): void {
foreach (scandir($directory) as $file) { foreach (scandir($directory) as $file) {
if ($file === ".") continue; if ($file === ".") continue;
if ($category === "" && $file === "..") continue; if ($category === "" && $file === "..") continue;
if (substr($file, 0, 1) === "." && $file !== "..") continue;
$path = add_seperator_ab("/", $category, $file); $path = add_seperator_ab("/", $category, $file);
$is_dir = is_dir(ROOT_DIR.IMG_DIR.$path); $is_dir = is_dir(ROOT_DIR.IMG_DIR.$path);
@@ -65,11 +67,15 @@ function create_thumbnail(string $category, string $file): string | null {
$path = add_seperator_ab("/", $category, $file); $path = add_seperator_ab("/", $category, $file);
$original_file = ROOT_DIR.IMG_DIR.$path; $original_file = ROOT_DIR.IMG_DIR.$path;
$thumbnail_directory = ROOT_DIR.THUMBNAIL_DIR.IMG_DIR.add_seperator_ab("/", $category, ""); # use fast hashing algo, see: https://github.com/Cyan4973/xxHash
$thumbnail_file = $thumbnail_directory.$file; $hash = hash_file("xxh3", $original_file);
$thumbnail_directory = ROOT_DIR.THUMBNAIL_DIR;
$thumbnail_name = "$hash.jpg";
$thumbnail_file = $thumbnail_directory.$thumbnail_name;
if (file_exists($thumbnail_file)) { if (file_exists($thumbnail_file)) {
log_print("$thumbnail_file exists, skipping generation"); log_print("thumbnail for $original_file exists, skipping generation");
goto return_thumbnail; goto return_thumbnail;
} }
@@ -80,16 +86,17 @@ function create_thumbnail(string $category, string $file): string | null {
log_error($e->getMessage()); log_error($e->getMessage());
} }
log_print(THUMBNAIL_SCRIPT." '$original_file' '$thumbnail_file'"); log_print("generating thumbnail for $original_file");
$output = shell_exec(THUMBNAIL_SCRIPT." '$original_file' '$thumbnail_file' 2>&1"); $output = shell_exec(THUMBNAIL_SCRIPT." '$original_file' '$thumbnail_file' 2>&1");
log_print($output); if ($output) log_print($output);
if ($output === false) { if (substr_count(strtolower((string) $output), "error")) {
log_error("Thumbnail failed"); log_error("Thumbnail failed");
log_print(ROOT_URL.IMG_DIR.$path);
return ROOT_URL.IMG_DIR.$path; return ROOT_URL.IMG_DIR.$path;
} }
return_thumbnail: return_thumbnail:
return ROOT_URL.THUMBNAIL_DIR.IMG_DIR.$path; return ROOT_URL.THUMBNAIL_DIR.$thumbnail_name;
} }
function add_seperator_ab(string $separator, string $a, string $b): string { function add_seperator_ab(string $separator, string $a, string $b): string {
@@ -111,5 +118,40 @@ function is_image_file_type(string $filename): bool {
return false; return false;
} }
function get_config(): array {
$config_data = file_exists(__DIR__ . "/../config.json") ?
json_decode(file_get_contents(__DIR__ . "/../config.json"), true) : null;
if (!is_valid_config_data($config_data)) {
log_error("Config invalid, falling back to default. Please check config.json");
$config_data = json_decode(file_get_contents(__DIR__ . "/../config.default.json"), true);
if (!is_valid_config_data($config_data))
log_error("Default config invalid. Please check or create config.json");
}
return $config_data;
}
function is_valid_config_data(?array $data): bool {
if (!$data) return false;
$keys = ["ROOT_URL", "ROOT_DIR", "IMG_DIR", "THUMBNAIL_DIR"];
foreach ($keys as $key) {
if (!isset($data[$key])) return false;
switch ($key) {
case "ROOT_URL":
case "THUMBNAIL_DIR":
break;
case "ROOT_DIR":
if (!is_dir($data[$key])) return false;
break;
case "IMG_DIR":
if (!is_dir($data["ROOT_DIR"].$data[$key])) return false;
break;
}
}
return true;
}
main(); main();
?> ?>
+11 -7
View File
@@ -4,15 +4,12 @@ import sys
def main(): def main():
target_width = 2048
argn = len(sys.argv) argn = len(sys.argv)
if argn == 1: if argn == 1:
print("You must specify an input file") print_error("You must specify an input file")
exit(1) exit(1)
elif argn == 2: elif argn == 2:
print("You must specify an output file") print_error("You must specify an output file")
exit(1) exit(1)
input_image_path = sys.argv[1] input_image_path = sys.argv[1]
@@ -21,10 +18,12 @@ def main():
try: try:
image = Image.open(input_image_path) image = Image.open(input_image_path)
except IOError: except IOError:
print(f"Cannot open image file {input_image_path}") print_error(f"Cannot open image file {input_image_path}")
image.close()
exit(1) exit(1)
width, height = image.size width, height = image.size
target_width = int(max(width/2, 1280))
new_height = int(target_width * height / width) new_height = int(target_width * height / width)
image = image.resize((target_width, new_height), Image.Resampling.BICUBIC) image = image.resize((target_width, new_height), Image.Resampling.BICUBIC)
@@ -37,10 +36,15 @@ def main():
try: try:
image.save(output_image_path, **kwargs) image.save(output_image_path, **kwargs)
except IOError: except IOError:
print(f"Cannot save file {output_image_path}") print_error(f"Cannot save file {output_image_path}")
image.close()
exit(1) exit(1)
def print_error(string):
print(f"resize-img Error: {string}")
def rotate_image(image): def rotate_image(image):
exif = image.getexif() exif = image.getexif()
if exif is None: if exif is None: