From a19196cee506556ed06ce2963bbcfa0004469e74 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Mon, 24 May 2021 22:22:07 +0200 Subject: add an optional detail page. more EXIF to come. --- bin/pyggle | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 14 deletions(-) (limited to 'bin') diff --git a/bin/pyggle b/bin/pyggle index 51993b0..58319f1 100755 --- a/bin/pyggle +++ b/bin/pyggle @@ -52,7 +52,7 @@ class GPSData: self.location = location -class ThumbnailHTML: +class ImageHTML: def __init__(self): self.gps = None self.datetime = None @@ -60,36 +60,55 @@ class ThumbnailHTML: self.make = None self.focus = None + self.f_num = None + self.exposure = None + self.exposure_mode = None + self.exposure_program = None + self.focal_length = None + self.iso = None + def set_datetime(self, dt): self.datetime = dt.strftime("""%d.%m.%Y %H:%M""") + def set_exposure_mode(self, exposure_mode): + self.exposure_mode = f"""{exposure_mode}""" + + def set_exposure_program(self, exposure_program): + self.exposure_program = ( + f"""{exposure_program}""" + ) + def set_focus(self, f_num, exposure, focal_length, focal_length35, iso): entries = list() if f_num is not None: - entries.append(f"""f/{format_f(f_num)}""") + self.f_num = f"""f/{format_f(f_num)}""" + entries.append(self.f_num) if exposure is not None: if exposure >= 1: - entries.append( + self.exposure = ( f"""{format_f(exposure)}s""" ) elif exposure >= 1e-3: - entries.append( + self.exposure = ( f"""{format_f(exposure * 1e3)}ms""" ) else: - entries.append( + self.exposure = ( f"""{format_f(exposure * 1e6)}µs""" ) + entries.append(self.exposure) if focal_length is not None: entry = f"{format_f(focal_length)}mm" if focal_length35 is not None and focal_length35 != focal_length: entry += f" (≙ {format_f(focal_length35)}mm)" - entries.append(f"""{entry}""") + self.focal_length = f"""{entry}""" + entries.append(self.focal_length) if iso is not None: - entries.append(f"""ISO{iso}""") + self.iso = f"""ISO{iso}""" + entries.append(self.iso) self.focus = " ".join(entries) @@ -99,7 +118,11 @@ class ThumbnailHTML: def set_makemodel(self, make, model): self.make = f"""{make} {model}""" - def to_html(self, index, filename, thumbname): + def to_thumbnail_html(self, index, filename, thumbname, with_detail_page=False): + + if with_detail_page: + self.focus = f"""{self.focus}""" + exif_lines = (self.datetime, self.gps, self.make, self.focus) exif_html = """ """.join(filter(bool, exif_lines)) @@ -117,6 +140,37 @@ class ThumbnailHTML: return buf + def to_detail_html(self, filename): + buf = """
""" + buf += f"""""" + buf += "
\n" + buf += """
\n""" + buf += "

\n" + + if self.datetime: + buf += f"\n" + if self.gps: + buf += f"\n" + if self.make: + buf += f"\n" + buf += "\n" + if self.f_num: + buf += f"\n" + if self.exposure: + buf += f"\n" + if self.iso: + buf += f"\n" + if self.focal_length: + buf += f"\n" + buf += "\n" + if self.exposure_program: + buf += f"\n" + if self.exposure_mode: + buf += f"\n" + buf += "
Zeit{self.datetime}
Ort{self.gps}
Kamera{self.make}
 
Blende{self.f_num}
Belichtung{self.exposure}
Verstärkung{self.iso}
Brennweite{self.focal_length}
 
Modus{self.exposure_program}
Belichtung{self.exposure_mode}

\n" + + return buf + class Thumbnail: def __init__(self, filename, im, size=250, with_gps=False): @@ -136,7 +190,7 @@ class Thumbnail: im.thumbnail((self.size * 2, self.size * 2)) im.convert("RGB").save(self.thumbname, "JPEG") - self.html = ThumbnailHTML() + self.html = ImageHTML() self._get_datetime() self._get_focus() @@ -203,6 +257,16 @@ class Thumbnail: self.html.set_focus(f_num, exposure, focal_length, focal_length35, iso) + try: + self.html.set_exposure_mode(self.exif_tag["EXIF ExposureMode"]) + except KeyError: + pass + + try: + self.html.set_exposure_program(self.exif_tag["EXIF ExposureProgram"]) + except KeyError: + pass + def _get_gps(self): try: lat = self.exif_tag["GPS GPSLatitude"] @@ -283,8 +347,16 @@ class Thumbnail: self.html.set_makemodel(make, model) - def to_html(self, index): - return self.html.to_html(i, self.filename, self.thumbname) + def to_html(self, index, with_detail_page=False): + return self.html.to_thumbnail_html( + i, self.filename, self.thumbname, with_detail_page + ) + + def to_detail_html(self, html_prefix, html_postfix): + with open(f"{self.filename}.html", "w") as f: + f.write(html_prefix.replace("", self.filename)) + f.write(self.html.to_detail_html(self.filename)) + f.write(html_postfix) def copy_files(base_dir): @@ -334,13 +406,20 @@ if __name__ == "__main__": default=16, help="Zoom Level for reverse geocoding", ) - parser.add_argument("--reverse", action="store_true") + parser.add_argument("--reverse", action="store_true", help="Reverse sort order") parser.add_argument("--size", type=int, default=250, help="Thumbnail size [px]") - parser.add_argument("--sort", type=str, default="none", help="sort images") + parser.add_argument( + "--sort", + metavar="MODE", + choices=["none", "time"], + default="none", + help="Sort images", + ) parser.add_argument( "--spacing", type=float, default=1.1, help="Thumbnail spacing ratio" ) parser.add_argument("--title", type=str, help="HTML title", default="") + parser.add_argument("--with-detail-page", action="store_true") parser.add_argument("--with-nominatim", action="store_true") parser.add_argument("images", type=str, nargs="+") @@ -374,7 +453,15 @@ if __name__ == "__main__": thumbnails = sorted(thumbnails, key=lambda t: t.exif_dt, reverse=args.reverse) for i, thumbnail in enumerate(thumbnails): - html_buf += thumbnail.to_html(i) + html_buf += thumbnail.to_html(i, args.with_detail_page) + + if args.with_detail_page: + with open(f"{base_dir}/share/html_detail_start", "r") as f: + detail_html_start = f.read() + with open(f"{base_dir}/share/html_detail_end", "r") as f: + detail_html_end = f.read() + for thumbnail in thumbnails: + thumbnail.to_detail_html(detail_html_start, detail_html_end) with open(f"{base_dir}/share/html_end", "r") as f: html_buf += f.read() -- cgit v1.2.3