[postprocessor:metadata] add 'tags' and 'custom' modes (#135)
This commit is contained in:
@@ -1083,6 +1083,44 @@ Description The command to run.
|
|||||||
=========== =====
|
=========== =====
|
||||||
|
|
||||||
|
|
||||||
|
metadata
|
||||||
|
--------
|
||||||
|
|
||||||
|
Write image metadata to separate files
|
||||||
|
|
||||||
|
metadata.mode
|
||||||
|
-------------
|
||||||
|
=========== =====
|
||||||
|
Type ``string``
|
||||||
|
Default ``"json"``
|
||||||
|
Description Select how to write metadata.
|
||||||
|
|
||||||
|
- ``"json"``: all metadata using `json.dump()
|
||||||
|
<https://docs.python.org/3/library/json.html#json.dump>`_
|
||||||
|
- ``"tags"``: ``tags`` separated by newlines
|
||||||
|
- ``"custom"``: result of applying `metadata.format`_ to a file's
|
||||||
|
metadata dictionary
|
||||||
|
=========== =====
|
||||||
|
|
||||||
|
metadata.extension
|
||||||
|
------------------
|
||||||
|
=========== =====
|
||||||
|
Type ``string``
|
||||||
|
Default ``"json"`` or ``"txt"``
|
||||||
|
Description Filename extension for metadata files.
|
||||||
|
=========== =====
|
||||||
|
|
||||||
|
metadata.format
|
||||||
|
---------------
|
||||||
|
=========== =====
|
||||||
|
Type ``string``
|
||||||
|
Example ``"tags:\n\n{tags:J\n}\n"``
|
||||||
|
Description Custom format string to build content of metadata files.
|
||||||
|
|
||||||
|
Note: Only applies for ``"mode": "custom"``.
|
||||||
|
=========== =====
|
||||||
|
|
||||||
|
|
||||||
ugoira
|
ugoira
|
||||||
------
|
------
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
"""Write metadata to JSON files"""
|
"""Write metadata to JSON files"""
|
||||||
|
|
||||||
from .common import PostProcessor
|
from .common import PostProcessor
|
||||||
|
from .. import util
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
|
||||||
@@ -16,18 +17,57 @@ class MetadataPP(PostProcessor):
|
|||||||
|
|
||||||
def __init__(self, pathfmt, options):
|
def __init__(self, pathfmt, options):
|
||||||
PostProcessor.__init__(self)
|
PostProcessor.__init__(self)
|
||||||
self.indent = options.get("indent", 4)
|
|
||||||
self.ascii = options.get("ascii", False)
|
mode = options.get("mode", "json")
|
||||||
|
ext = "txt"
|
||||||
|
|
||||||
|
if mode == "custom":
|
||||||
|
self.write = self._write_custom
|
||||||
|
self.formatter = util.Formatter(options.get("format"))
|
||||||
|
elif mode == "tags":
|
||||||
|
self.write = self._write_tags
|
||||||
|
else:
|
||||||
|
self.write = self._write_json
|
||||||
|
self.indent = options.get("indent", 4)
|
||||||
|
self.ascii = options.get("ascii", False)
|
||||||
|
ext = "json"
|
||||||
|
|
||||||
|
self.extension = options.get("extension", ext)
|
||||||
|
|
||||||
def run(self, pathfmt):
|
def run(self, pathfmt):
|
||||||
with open(pathfmt.realpath + ".json", "w") as file:
|
path = "{}.{}".format(pathfmt.realpath, self.extension)
|
||||||
json.dump(
|
with open(path, "w", encoding="utf-8") as file:
|
||||||
pathfmt.keywords,
|
self.write(file, pathfmt)
|
||||||
file,
|
|
||||||
sort_keys=True,
|
def _write_custom(self, file, pathfmt):
|
||||||
indent=self.indent,
|
output = self.formatter.format_map(pathfmt.keywords)
|
||||||
ensure_ascii=self.ascii,
|
file.write(output)
|
||||||
)
|
|
||||||
|
def _write_tags(self, file, pathfmt):
|
||||||
|
kwds = pathfmt.keywords
|
||||||
|
tags = kwds.get("tags") or kwds.get("tag_string")
|
||||||
|
|
||||||
|
if not tags:
|
||||||
|
return
|
||||||
|
|
||||||
|
if not isinstance(tags, list):
|
||||||
|
for separator in (" :: ", ", ", " "):
|
||||||
|
taglist = tags.split(separator)
|
||||||
|
if len(taglist) >= len(tags) / 16:
|
||||||
|
break
|
||||||
|
tags = taglist
|
||||||
|
|
||||||
|
file.write("\n".join(tags))
|
||||||
|
file.write("\n")
|
||||||
|
|
||||||
|
def _write_json(self, file, pathfmt):
|
||||||
|
json.dump(
|
||||||
|
pathfmt.keywords,
|
||||||
|
file,
|
||||||
|
sort_keys=True,
|
||||||
|
indent=self.indent,
|
||||||
|
ensure_ascii=self.ascii,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
__postprocessor__ = MetadataPP
|
__postprocessor__ = MetadataPP
|
||||||
|
|||||||
Reference in New Issue
Block a user