diff --git a/builder.py b/builder.py index 5d707ac..b6fe209 100755 --- a/builder.py +++ b/builder.py @@ -212,7 +212,6 @@ def main() -> None: icons(args) if args.generate_webmanifest: - logger.info("generating webmanifest") print("Generating webmanifest...") webmanifest(args) diff --git a/modules/generate_html.py b/modules/generate_html.py index 9d69b21..611fbd1 100644 --- a/modules/generate_html.py +++ b/modules/generate_html.py @@ -89,11 +89,13 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]: Returns: Dict[str, Any]: A dictionary containing image width, height, and EXIF data. """ - with Image.open(os.path.join(folder, item)) as img: - logger.info("extracting image information", extra={"file": item}) + file = os.path.join(folder, item) + with Image.open(file) as img: + logger.info("extracting image information", extra={"file": file}) exif = img.getexif() width, height = img.size if exif: + logger.info("extracting EXIF data", extra={"file": file}) ifd = exif.get_ifd(ExifTags.IFD.Exif) exifdatas = dict(exif.items()) | ifd exifdata = {} @@ -113,6 +115,7 @@ def get_image_info(item: str, folder: str) -> Dict[str, Any]: content = newtuple exifdata[tag] = content if "Orientation" in exifdata and exifdata["Orientation"] in [6, 8]: + logger.info("image is rotated", extra={"file": file}) width, height = height, width for key in ["PrintImageMatching", "UserComment", "MakerNote"]: if key in exifdata: @@ -155,12 +158,15 @@ def process_image(item: str, folder: str, _args: Args, baseurl: str, sizelist: D thumbnails.append((folder, item, _args.root_directory)) for _raw in raw: - if os.path.exists(os.path.join(folder, extsplit[0] + _raw)): - url = urllib.parse.quote(extsplit[0]) + _raw + file = os.path.join(folder, extsplit[0] + _raw) + if os.path.exists(file): + url = f"{_args.web_root_url}{baseurl}{urllib.parse.quote(extsplit[0])}{_raw}" if _raw in (".tif", ".tiff"): - image["tiff"] = f"{_args.web_root_url}{baseurl}{url}" + logger.info("tiff file found", extra={"file": file}) + image["tiff"] = url else: - image["raw"] = f"{_args.web_root_url}{baseurl}{url}" + logger.info("raw file found", extra={"file": file, "extension": _raw}) + image["raw"] = url return image diff --git a/modules/logger.py b/modules/logger.py index a720217..28554cf 100644 --- a/modules/logger.py +++ b/modules/logger.py @@ -48,14 +48,14 @@ def log_format(keys): def rotate_log_file(compress=False): """ - Renames the existing 'latest.jsonl' file to a timestamped file based on the first log entry's asctime. - Optionally compresses the old log file using gzip. + Truncates the 'latest.jsonl' file after optionally compressing its contents to a timestamped file. + The 'latest.jsonl' file is not deleted or moved, just emptied. Args: compress (bool): If True, compress the old log file using gzip. """ if os.path.exists(LATEST_LOG_FILE): - with open(LATEST_LOG_FILE, "r", encoding="utf-8") as f: + with open(LATEST_LOG_FILE, "r+", encoding="utf-8") as f: first_line = f.readline() try: first_log = json.loads(first_line) @@ -64,16 +64,23 @@ def rotate_log_file(compress=False): except (json.JSONDecodeError, KeyError): first_timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") - safe_timestamp = first_timestamp.replace(":", "-").replace(" ", "_") - old_log_filename = os.path.join(LOG_DIR, f"{safe_timestamp}.jsonl") + safe_timestamp = first_timestamp.replace(":", "-").replace(" ", "_") + old_log_filename = os.path.join(LOG_DIR, f"{safe_timestamp}.jsonl") - os.rename(LATEST_LOG_FILE, old_log_filename) + # Write contents to the new file + with open(old_log_filename, "w", encoding="utf-8") as old_log_file: + f.seek(0) # Go back to the beginning of the file + shutil.copyfileobj(f, old_log_file) - if compress: - with open(old_log_filename, "rb") as f_in: - with gzip.open(f"{old_log_filename}.gz", "wb") as f_out: - shutil.copyfileobj(f_in, f_out) - os.remove(old_log_filename) + if compress: + with open(old_log_filename, "rb") as f_in: + with gzip.open(f"{old_log_filename}.gz", "wb") as f_out: + shutil.copyfileobj(f_in, f_out) + os.remove(old_log_filename) + + # Truncate the original file + f.seek(0) + f.truncate() def setup_logger(level=logging.INFO): diff --git a/modules/svg_handling.py b/modules/svg_handling.py index c207507..3aa289a 100644 --- a/modules/svg_handling.py +++ b/modules/svg_handling.py @@ -178,8 +178,8 @@ def create_icons_from_svg(files: List[str], iconspath: str, _args: Args) -> List List[Icon] List of icons created from the SVG file. """ - logger.info("creating icons for web application", extra={"iconspath": iconspath}) svg = [file for file in files if file.endswith(".svg")][0] + logger.info("creating icons for web application", extra={"iconspath": iconspath, "svg": svg}) icon_list = [ {"src": f"{_args.web_root_url}.static/icons/{svg}", "type": "image/svg+xml", "sizes": "512x512", "purpose": "maskable"}, {"src": f"{_args.web_root_url}.static/icons/{svg}", "type": "image/svg+xml", "sizes": "512x512", "purpose": "any"}, @@ -188,7 +188,7 @@ def create_icons_from_svg(files: List[str], iconspath: str, _args: Args) -> List tmpimg = BytesIO() sizes = size.split("x") iconpath = os.path.join(iconspath, os.path.splitext(svg)[0] + "-" + size + ".png") - logger.info("converting svg to png", extra={"iconpath": iconpath, "size": size}) + logger.info("converting svg to png", extra={"svg": svg, "size": size}) cairosvg.svg2png( url=os.path.join(iconspath, svg), write_to=tmpimg, @@ -240,7 +240,7 @@ def create_icons_from_png(iconspath: str, web_root_url: str) -> List[Icon]: continue with Image.open(os.path.join(iconspath, icon)) as iconfile: iconsize = f"{iconfile.size[0]}x{iconfile.size[1]}" - logger.info("using icon", extra={"icon": icon, "size": iconsize}) + logger.info("using icon", extra={"iconspath": iconspath, "icon": icon, "size": iconsize}) icon_list.append({"src": f"{web_root_url}.static/icons/{icon}", "sizes": iconsize, "type": "image/png", "purpose": "maskable"}) icon_list.append({"src": f"{web_root_url}.static/icons/{icon}", "sizes": iconsize, "type": "image/png", "purpose": "any"}) return icon_list @@ -255,6 +255,8 @@ def webmanifest(_args: Args) -> None: _args : Args Parsed command-line arguments. """ + logger.info("generating webmanifest") + iconspath = os.path.join(_args.root_directory, ".static", "icons") files = os.listdir(iconspath) icon_list = create_icons_from_svg(files, iconspath, _args) if SVGSUPPORT and any(file.endswith(".svg") for file in files) else create_icons_from_png(iconspath, _args.web_root_url) diff --git a/test/example/DSC03508.ARW b/test/example/DSC03508.ARW new file mode 100755 index 0000000..c745618 Binary files /dev/null and b/test/example/DSC03508.ARW differ