Merge branch 'master' of bitbucket.org:MoonQ/mirva

This commit is contained in:
ville rantanen
2021-09-20 10:41:19 +03:00
4 changed files with 104 additions and 19 deletions

View File

@@ -16,6 +16,9 @@ class Mirva:
)
self.resource_dir = ".mirva"
self.config_file = os.path.join(self.resource_dir, "config.cfg")
self.config_backup = os.path.join(self.resource_dir, "config.cfg.bkp")
self.image_match = re.compile(".*\.jpg$|.*\.jpeg$|.*\.png$|.*\.gif$|.*\.tif$", re.I)
self.video_match = re.compile(".*\.mp4$", re.I)
self.get_options()
os.chdir(self.options.folder)
self.write_resources()
@@ -24,8 +27,9 @@ class Mirva:
self.create_config()
print("Config created: Exiting without gallery creation. Check config first.")
return
self.create_config()
self.get_config()
if self.options.exif:
self.append_exif()
self.create_posts()
self.write_index()
self.write_mediums()
@@ -33,11 +37,11 @@ class Mirva:
def create_config(self):
config = configparser.ConfigParser()
config.read(self.config_file)
self.config = configparser.ConfigParser()
self.config.read(self.config_file)
config_changed = False
if not "SITE" in config:
config["SITE"] = {
if not "SITE" in self.config:
self.config["SITE"] = {
"title": "",
"sub_title": "",
"intro": "",
@@ -46,20 +50,14 @@ class Mirva:
config_changed = True
for f in self.file_list:
if not f in config:
if not f in self.config:
title, _ = os.path.splitext(f)
title = title.replace("_", " ")
config[f] = {"title": title, "description": ""}
self.config[f] = {"title": title, "description": ""}
config_changed = True
if config_changed:
print(
"Modified config: {}".format(
os.path.join(self.options.folder, self.config_file)
)
)
with open(self.config_file, "wt") as fp:
config.write(fp)
self.write_config()
def create_posts(self):
@@ -75,13 +73,28 @@ class Mirva:
self.config = configparser.ConfigParser()
self.config.read(self.config_file)
def write_config(self):
print(
"Modified config: {}".format(
os.path.join(self.options.folder, self.config_file)
)
)
if os.path.exists(self.config_file):
with open(self.config_file, "rt") as reader:
with open(self.config_backup, "wt") as writer:
writer.write(reader.read())
with open(self.config_file, "wt") as fp:
self.config.write(fp)
def get_files(self):
image_match = re.compile(".*\.jpg$|.*\.jpeg$|.*\.png$|.*\.gif$|.*\.tif$", re.I)
files = []
for f in sorted(os.listdir(".")):
if f.startswith("."):
continue
if not image_match.match(f):
if not (self.image_match.match(f) or self.video_match.match(f)):
continue
files.append(f)
return files
@@ -95,7 +108,7 @@ class Mirva:
)
# parser.add_argument("-v", default=False, action="store_true")
parser.add_argument(
"--config", default=False, action="store_true", help="Write config and exit"
"--config", default=False, action="store_true", help="Write config and exit. Required if more images are added."
)
parser.add_argument(
"--force",
@@ -103,6 +116,12 @@ class Mirva:
action="store_true",
help="Force regeneration of middle sized images",
)
parser.add_argument(
"--exif",
default=False,
action="store_true",
help="Append EXIF information to image descriptions",
)
parser.add_argument(
"--version",
action="version",
@@ -218,6 +237,22 @@ function create_button(direction, to) {{
def get_post(self, image, title, content):
if self.video_match.match(image):
return """
<div class="post">
<div class="navigation">&nbsp;</div>
<div class=center><a href="{image}">
<video class=post_image controls >
<source src="{image}" type="video/mp4" >
</video>
</a></div>
<div class="meta"><div class="name">{title}</div></div>
<div style="clear: both;">&nbsp;</div>
<div class="entry">{content}</div>
</div>""".format(
image=image, title=title, content=content
)
return """
<div class="post">
<div class="navigation">&nbsp;</div>
@@ -287,9 +322,11 @@ function create_button(direction, to) {{
if link:
r = 0
res = "{:d}x{:d}>".format(int(r), int(r))
force = self.options.force
for f in self.file_list:
res = "{:d}x{:d}>".format(int(r), int(r))
if self.video_match.match(f):
continue
outfile = os.path.join(".med", "{}.jpg".format(f))
if force:
try:
@@ -319,4 +356,49 @@ function create_button(direction, to) {{
]
sys.stdout.write(".")
sys.stdout.flush()
subprocess.call(convargs)
subprocess.run(convargs)
sys.stdout.write("\n")
def append_exif(self):
exif_format = '''
<ul>
<li>Date: %[EXIF:DateTimeOriginal]
<li>Camera: %[EXIF:Make] %[EXIF:Model]
<li>Parameters: %[EXIF:ExposureTime]s / F%[EXIF:FNumber] / Focal %[EXIF:FocalLength]
<li>Size: %w x %h / {size}
</ul>
'''
for f in self.config:
if f in self.file_list:
sys.stdout.write(".")
sys.stdout.flush()
file_size = human_size(f)
p = subprocess.run(
['identify','-format',exif_format.format(size=file_size),"{}[0]".format(f)],
capture_output = True
)
self.config[f]['description'] += p.stdout.decode('utf-8')
sys.stdout.write("\n")
self.write_config()
def human_size(file_name, precision=1):
size = os.path.getsize(file_name)
if size == None:
return "nan"
sign = ""
if size < 0:
sign = "-"
size = -size
suffixes = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB"]
suffixIndex = 0
defPrecision = 0
while size > 1024:
suffixIndex += 1
size = size / 1024.0
defPrecision = precision
return "%s%.*f%s" % (sign, defPrecision, size, suffixes[suffixIndex])