From 8a123180c5b69e23f7f3ea1f18df5595ea6ad9c3 Mon Sep 17 00:00:00 2001 From: starnakin Date: Mon, 14 Apr 2025 19:29:54 +0200 Subject: [PATCH] core: use class based code --- src/main.py | 108 +++++++++------------------------------ src/page.py | 65 +++++++++++++++++++++++ src/path.py | 42 +++++++++++++++ src/picture.py | 28 ++++++++++ src/templates/page.jinja | 7 +-- 5 files changed, 163 insertions(+), 87 deletions(-) create mode 100644 src/page.py create mode 100644 src/path.py create mode 100644 src/picture.py diff --git a/src/main.py b/src/main.py index 8163231..2905607 100644 --- a/src/main.py +++ b/src/main.py @@ -1,13 +1,10 @@ import sys import os from progress.bar import Bar -from jinja2 import Environment, FileSystemLoader -import subprocess -import time -import markdown -env = Environment(loader=FileSystemLoader('src/templates')) -page_template = env.get_template('page.jinja') +from path import Path +from picture import Picture +from page import Page def argument_parsing(): if (len(sys.argv) < 2): @@ -15,94 +12,37 @@ def argument_parsing(): exit(1) return sys.argv[1] -def get_exif(folder: str, raw: str): - absolut_path = os.path.join(folder, "exif.txt") - if os.path.exists(absolut_path): - return absolut_path - if os.system(f"exiftool {raw} > {absolut_path} 2>/dev/null") == 0: - return absolut_path - os.remove(absolut_path) - return None - -def get_images(folder: str, files: list[str]): - length: int = len(folder) + 1 - images_datas: list[str] = [] - images: list[str] = [file for file in files if os.path.isfile(file) and file.endswith(".png")] - for image in images: - export_data_file: str = image + ".out.pp3" - if (os.path.exists(export_data_file) and os.path.isfile(export_data_file)): - images_datas.append((image[length:], export_data_file[length:])) - else: - images_datas.append((image[length:],)) - return images_datas - -def get_updated_folders(path: str): - updated_folders: list[str] = [] - for element_name in os.listdir(path): - absolut_path: str = os.path.join(path, element_name) - if not os.path.isdir(absolut_path): - continue - (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(absolut_path) - folder_modified_date = time.ctime(mtime) - html_path: str = os.path.join(absolut_path, f"{element_name}.html") - if not os.path.exists(html_path): - updated_folders.append(absolut_path) - continue - (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime) = os.stat(absolut_path) - html_modified_date = time.ctime(mtime) - if (html_modified_date < folder_modified_date): - updated_folders.append(absolut_path) - continue - - return updated_folders - -def get_readme(folder): - absolut_path: str = os.path.join(folder, "readme.md") - if (os.path.exists(absolut_path)): - return absolut_path - return None - -def get_raw(folder, files: list[str]): - raws: list[str] = [file for file in files if file.endswith(".NEF")] - raw: str = raws[0] if len(raws) > 0 else None - return raw[len(folder) + 1:] - -def get_html_readme(readme_path: str): - if readme_path is None: - return None - with open(readme_path, 'r') as f: - text = f.read() - html = markdown.markdown(text) - return html - -def gen_pages(folders: list[str]): - with Bar("generating...", max=len(folders)) as bar: +def scan_pages(folders: list[Path]) -> list[Page]: + pages: list[Page] = [] + prev: Page = None + with Bar("scaning...", max=len(folders)) as bar: for folder in folders: + files: list[Path] = folder.get_files() - files: list[str] = [os.path.join(folder, file) for file in os.listdir(folder)] - images: list[str] = get_images(folder, files) - raw: str = get_raw(folder, files) + prev: Page = Page(folder.get_absolute_path(), folder.get_name(), None, None, None) + + raw: Path = Path(folder.get_absolute_path(), folder.get_name() + ".NEF") + images: list[Path] = [Picture(file, page=prev, raw=raw) for file in files if file.get_name().endswith(".png")] + + prev.images = images if len(images) == 0: bar.next() continue + pages.append(prev) + bar.next() + return pages - exif: str = get_exif(folder, raw) - readme: str = get_readme(folder) - readme_html: str = get_html_readme(readme) - - html_rendered = page_template.render(exif=exif, raw=raw, images=images, readme=readme_html) - - with open(os.path.join(folder, "page.html"), "w") as f: - f.write(html_rendered) - +def create_pages(pages: list[Page]) -> None: + with Bar("generating...", max=len(pages)) as bar: + for page in pages: + page.create() bar.next() def main(): - site_path: str = argument_parsing() - folders = get_updated_folders(site_path) - gen_pages(folders) - + site_path: Path = Path(argument_parsing()) + pages: list[Page] = scan_pages(site_path.get_dirs()) + create_pages(pages) if __name__ == "__main__": main() \ No newline at end of file diff --git a/src/page.py b/src/page.py new file mode 100644 index 0000000..39518e7 --- /dev/null +++ b/src/page.py @@ -0,0 +1,65 @@ +from __future__ import annotations + +from jinja2 import Environment, FileSystemLoader +import markdown +import os + +from path import Path + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from page import Page + from picture import Picture + +env = Environment(loader=FileSystemLoader('src/templates')) +page_template = env.get_template('page.jinja') + +class Page(): + + def __init__(self, path: Path, name: str, images: list[Picture], prev: Page|None, next: Page|None): + self.name: str = name + self.path: Path = path + self.images: list[Picture] = images + self._exif: Path = Path(self.path, "exif.txt") + self._readme: Path = Path(self.path, "readme.md") + self._raw: Path = Path(self.path, name + ".NEF") + self._html: Path = Path(self.path, "page.html") + + def _render_raw(self): + if not self._raw.exist(): + return None + return self._raw.get_name() + + def _to_html(self) -> str|None: + html_rendered = page_template.render(exif=self._render_exif(), raw=self._render_raw(), images=self._render_images(), readme=self._render_readme()) + return html_rendered + + def create(self) -> Path: + with open(self._html.get_absolute_path(), "w") as f: + f.write(self._to_html()) + self.created = True + + def _render_readme(self) -> str|None: + if not self._readme.exist(): + return None + with open(self._readme.get_absolute_path(), 'r') as f: + text = f.read() + html = markdown.markdown(text) + return html + + def _render_images(self): + return [image.render() for image in self.images] + + def _gen_exif(self): + if self._raw.exist(): + if os.system(f"exiftool {self._raw.get_absolute_path()} > {self._exif.get_absolute_path()} 2>/dev/null") == 0: + return 0 + os.remove(self._raw.get_absolute_path()) + return 1 + + def _render_exif(self) -> Path | None: + if not self._exif.exist(): + if (self._gen_exif()): + return None + return self._exif.get_name() diff --git a/src/path.py b/src/path.py new file mode 100644 index 0000000..a4f3c5a --- /dev/null +++ b/src/path.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +import os + +class Path(): + + def __init__(self, *paths: str | Path): + self._absolute_path: str = "" + for path in paths: + self._absolute_path = os.path.join(self._absolute_path, path._absolute_path if isinstance(path, Path) else path) + self._name: str = os.path.basename(self._absolute_path) + self._dirpath: str = os.path.dirname(self._absolute_path) + + def get_dirpath(self): + return self._dirpath + + def get_absolute_path(self): + return self._absolute_path + + def get_name(self): + if not self.exist(): + return None + return self._name + + def exist(self) -> bool: + return os.path.exists(self.get_absolute_path()) + + def get_dirs(self) -> list[Path]: + dirs: list[Path] = [] + for element in os.listdir(self.get_absolute_path()): + path: Path = Path(self._absolute_path, element) + if (os.path.isdir(path.get_absolute_path())): + dirs.append(path) + return dirs + + def get_files(self) -> list[Path]: + files: list[Path] = [] + for element in os.listdir(self.get_absolute_path()): + path: Path = Path(self._absolute_path, element) + if (os.path.isfile(path.get_absolute_path())): + files.append(path) + return files \ No newline at end of file diff --git a/src/picture.py b/src/picture.py new file mode 100644 index 0000000..1a414e0 --- /dev/null +++ b/src/picture.py @@ -0,0 +1,28 @@ +from PIL import Image +import os + +from path import Path + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from page import Page + +class Picture(): + def __init__(self, picture_path: Path, page = None, raw: Path|None = None): + self.large: Path = picture_path + self.small: Path = Path(picture_path.get_dirpath(), picture_path.get_name()[:-4] + "_small.jpg") + self.export_file: Path = Path(picture_path, ".out.pp3") + self.raw: Path|None = raw + self.page: Page = page + + def render(self) -> tuple[str, str, str]: + if not self.small.exist(): + self.gen_small() + return self.large.get_name(), self.small.get_name(), self.export_file.get_name() if self.export_file.exist() else None + + def gen_small(self): + im = Image.open(self.large.get_absolute_path()).convert("RGB") + im.save(self.small.get_absolute_path(), quality=95, optimize=True) + + \ No newline at end of file diff --git a/src/templates/page.jinja b/src/templates/page.jinja index 173af7f..36bac00 100644 --- a/src/templates/page.jinja +++ b/src/templates/page.jinja @@ -14,9 +14,10 @@ {% for image in images %}
- - {% if image | length > 1 %} - export file + + Large + {% if image|length > 2 %} + export file {% endif %}