[postprocessor:metadata] implement 'mode: delete' (#2640)

This commit is contained in:
Mike Fährmann
2022-07-19 00:57:29 +02:00
parent eb68d45544
commit f3de6b7a87
3 changed files with 50 additions and 0 deletions

View File

@@ -3319,6 +3319,7 @@ Description
* ``"tags"``: ``tags`` separated by newlines
* ``"custom"``: result of applying `metadata.content-format`_
to a file's metadata dictionary
* ``"delete"``: remove metadata entries specified in `metadata.fields`_
metadata.filename
@@ -3407,6 +3408,16 @@ Description
e.g. a Tweet on Twitter or a post on Patreon.
metadata.fields
---------------
Type
``list`` of ``strings``
Example
``["blocked", "watching", "status[creator][name]"]``
Description
List of metadata field names to remove for ``"mode": "delete"``.
metadata.content-format
-----------------------
Type

View File

@@ -30,6 +30,10 @@ class MetadataPP(PostProcessor):
elif mode == "tags":
self.write = self._write_tags
ext = "txt"
elif mode == "delete":
self.run = self._run_delete
self.fields = options.get("fields")
ext = None
else:
self.write = self._write_json
self.indent = options.get("indent", 4)
@@ -114,6 +118,19 @@ class MetadataPP(PostProcessor):
def _run_stdout(self, pathfmt):
self.write(sys.stdout, pathfmt.kwdict)
def _run_delete(self, pathfmt):
kwdict = pathfmt.kwdict
for key in self.fields:
obj = kwdict
try:
while "[" in key:
name, _, key = key.partition("[")
obj = obj[name]
key = key.rstrip("]")
del obj[key]
except Exception:
pass
def _directory(self, pathfmt):
return pathfmt.realdirectory

View File

@@ -339,6 +339,28 @@ class MetadataTest(BasePostprocessorTest):
{"category": "test", "extension": "ext", "filename": "file"}
""")
def test_metadata_delete(self):
kwdict = {"foo": 0, "bar": {"bax": 1, "bay": 2, "baz": 3}}
self._create({"mode": "delete", "fields": ["foo", "bar[baz]"]}, kwdict)
pdict = self.pathfmt.kwdict
self.assertEqual(pdict["foo"], kwdict["foo"])
self.assertEqual(pdict["bar"], kwdict["bar"])
self.assertIsNot(kwdict, pdict)
del kwdict["foo"]
del kwdict["bar"]["baz"]
self._trigger()
self.assertNotIn("foo", pdict)
self.assertNotIn("baz", pdict["bar"])
self.assertEqual(kwdict["bar"], pdict["bar"])
self._trigger()
self.assertNotIn("foo", pdict)
self.assertNotIn("baz", pdict["bar"])
self.assertEqual(kwdict["bar"], pdict["bar"])
@staticmethod
def _output(mock):
return "".join(