Compare commits
7 Commits
3c1f996342
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 5e0bb59907 | |||
| abec1c242f | |||
| 1f52134bd7 | |||
| 982565bd95 | |||
| 11c3faddb0 | |||
| c5b4dda950 | |||
| 22a70bd4de |
@@ -3,3 +3,4 @@ php/psalm.xml
|
|||||||
php/vendor
|
php/vendor
|
||||||
|
|
||||||
php.log
|
php.log
|
||||||
|
config.json
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"ROOT_URL": "http://localhost/",
|
||||||
|
"ROOT_DIR": "/var/www/html/",
|
||||||
|
"IMG_DIR": "img/",
|
||||||
|
"THUMBNAIL_DIR": "thumbnails/"
|
||||||
|
}
|
||||||
+45
-6
@@ -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,7 +67,8 @@ 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;
|
||||||
$hash = hash_file("sha1", $original_file);
|
# use fast hashing algo, see: https://github.com/Cyan4973/xxHash
|
||||||
|
$hash = hash_file("xxh3", $original_file);
|
||||||
|
|
||||||
$thumbnail_directory = ROOT_DIR.THUMBNAIL_DIR;
|
$thumbnail_directory = ROOT_DIR.THUMBNAIL_DIR;
|
||||||
$thumbnail_name = "$hash.jpg";
|
$thumbnail_name = "$hash.jpg";
|
||||||
@@ -86,8 +89,9 @@ function create_thumbnail(string $category, string $file): string | null {
|
|||||||
log_print("generating thumbnail for $original_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");
|
||||||
if ($output) 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,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();
|
||||||
?>
|
?>
|
||||||
|
|||||||
+9
-6
@@ -5,12 +5,11 @@ import sys
|
|||||||
|
|
||||||
def main():
|
def main():
|
||||||
argn = len(sys.argv)
|
argn = len(sys.argv)
|
||||||
|
|
||||||
if argn == 1:
|
if argn == 1:
|
||||||
print("Error: 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("Error: 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]
|
||||||
@@ -19,12 +18,12 @@ def main():
|
|||||||
try:
|
try:
|
||||||
image = Image.open(input_image_path)
|
image = Image.open(input_image_path)
|
||||||
except IOError:
|
except IOError:
|
||||||
print(f"Error: Cannot open image file {input_image_path}")
|
print_error(f"Cannot open image file {input_image_path}")
|
||||||
image.close()
|
image.close()
|
||||||
exit(1)
|
exit(1)
|
||||||
|
|
||||||
width, height = image.size
|
width, height = image.size
|
||||||
target_width = int(max(width/4, 1280))
|
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,11 +36,15 @@ def main():
|
|||||||
try:
|
try:
|
||||||
image.save(output_image_path, **kwargs)
|
image.save(output_image_path, **kwargs)
|
||||||
except IOError:
|
except IOError:
|
||||||
print(f"Error: Cannot save file {output_image_path}")
|
print_error(f"Cannot save file {output_image_path}")
|
||||||
image.close()
|
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:
|
||||||
|
|||||||
Reference in New Issue
Block a user