diff --git a/scripts/py/image_script.py b/scripts/py/image_script.py new file mode 100755 index 0000000..43dbaa7 --- /dev/null +++ b/scripts/py/image_script.py @@ -0,0 +1,157 @@ +#! /usr/bin/env nix-shell +#! nix-shell /etc/nixos/scripts/nix/python.nix -i python + +import argparse +import os +import re +from pathlib import Path + +from PIL import Image # type: ignore + +image_path = Path("/home/cswimr/galaxypedia-image-export/consolidated/images") +target_path = Path("/home/cswimr/Projects/Galaxypedia/assets/images/ships") +name_separator_regex = r"[-|_|\s]?" + + +def copy_images(ship_name: str, fuzzy: bool = False) -> None: + ship_target_path = target_path / ship_name.replace(name_separator_regex, " ") + ship_target_path.mkdir(parents=True, exist_ok=True) + + potential_image_tags: dict[str, str] = { + "icon": "icon", + "overview": "overview", + "trails": "trails", + "trails2": "trails2", + "trails3": "trails3", + "trails4": "trails4", + "trails5": "trails5", + "side": "side", + f"side{name_separator_regex}profile": "side", + "left": "left", + f"left{name_separator_regex}side": "left", + "right": "right", + f"right{name_separator_regex}side": "right", + "front": "front", + "back": "back", + "rear": "back", + "top": "top", + "topview": "top", + f"top{name_separator_regex}profile": "top", + "bottom": "bottom", + f"bottom{name_separator_regex}profile": "bottom", + "bott": "bottom", + f"under{name_separator_regex}profile": "bottom", + "warp": "warp", + "interior": "interior", + "int": "interior", + f"interior{name_separator_regex}alt": "interior-alt", + "interioralt": "interior-alt", + "interior1": "interior1", + "interior01": "interior1", + "interior2": "interior2", + "interior02": "interior2", + "interior3": "interior3", + "interior03": "interior3", + "interior4": "interior4", + "interior04": "interior4", + "interior5": "interior5", + "interior05": "interior5", + f"interior{name_separator_regex}left": "interior-left", + "interiorleft": "interior-left", + f"interior{name_separator_regex}right": "interior-right", + "interiorright": "interior-right", + f"interior{name_separator_regex}side1": "interior-side1", + f"interior{name_separator_regex}side2": "interior-side2", + f"interior{name_separator_regex}side3": "interior-side3", + f"interior{name_separator_regex}side4": "interior-side4", + f"interior{name_separator_regex}side5": "interior-side5", + f"bridge{name_separator_regex}side": "bridge-side", + "bridgeside": "bridge-side", + f"bridge{name_separator_regex}side1": "bridge-side1", + f"bridge{name_separator_regex}side2": "bridge-side2", + f"bridge{name_separator_regex}side3": "bridge-side3", + f"bridge{name_separator_regex}side4": "bridge-side4", + f"bridge{name_separator_regex}side5": "bridge-side5", + "hangaralt": "bay-alt", + "hangar": "bay", + "recolored": "recolored", + f"fighter{name_separator_regex}bay": "bay", + "bay1": "bay1", + "bay2": "bay2", + "bay3": "bay3", + "bay4": "bay4", + "bay5": "bay5", + "pilot": "pilot", + "pilotseat": "pilot", + "cockpit": "pilot", + "pilotroom": "pilotroom", + "hall": "hallway", + "hallway": "hallway", + "spinals": "spinals", + "torpedos": "spinals", + "torpedeos": "spinals", + } + + pattern = re.compile( + rf"{'^' if not fuzzy else ''}(galaxy_)?{ship_name.lower()}{name_separator_regex}(?P{'|'.join(potential_image_tags.keys())})\.(png|webp|jpg|jpeg)$" + ) + for image in image_path.glob("*"): + match = pattern.search(image.name.lower()) + if match: + tag = potential_image_tags[ + match.group("tag") + .lower() + .replace("-", "_") + .replace(" ", "_") + .replace("_", name_separator_regex) + ] + with Image.open(image) as img: + if image.suffix.lower() in (".jpg", ".jpeg"): + print(f"{image.name} is lossy, skipping conversion!") + resulting_filename = f"{tag}.jpg" + img.save(ship_target_path / resulting_filename) + elif not image.suffix == ".webp": + resulting_filename = f"{tag}.webp" + img.save( + ship_target_path / resulting_filename, + format="WEBP", + lossless=True, + ) + else: + resulting_filename = f"{tag}.webp" + img.save(ship_target_path / resulting_filename) + print( + f"Copied {image.name} to {ship_name.replace(name_separator_regex, ' ')}/{resulting_filename}" + ) + dir_length = len(os.listdir(ship_target_path)) + if dir_length == 0: + print( + f"No images found for {ship_name.replace(name_separator_regex, ' ')}, removing directory" + ) + ship_target_path.rmdir() + else: + print(f"Copied {dir_length} images to {ship_target_path}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog=os.path.basename(__file__), + description="Copy images from the galaxypedia image export to the hugopedia assets directory.", + epilog=f"Example usage: {os.path.basename(__file__)} Deity", + ) + parser.add_argument( + "ship_name", + help="The ship name to grab images for.", + ) + parser.add_argument( + "--fuzzy", + "-f", + help="The path to the image directory to copy from.", + action="store_true", + ) + + args = parser.parse_args() + + copy_images( + ship_name=args.ship_name.replace(" ", name_separator_regex), fuzzy=args.fuzzy + )