diff --git a/docs/configuration.rst b/docs/configuration.rst index 9fd15638..30ec61b5 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -5442,11 +5442,13 @@ Description metadata.directory ------------------ Type - ``string`` + * ``string`` + * ``list`` of ``strings`` Default ``"."`` Example - ``"metadata"`` + * ``"metadata"`` + * ``["..", "metadata", "\fF {id // 500 * 500}"]`` Description Directory where metadata files are stored in relative to the current target location for file downloads. diff --git a/gallery_dl/postprocessor/metadata.py b/gallery_dl/postprocessor/metadata.py index 18d00e13..57bebd03 100644 --- a/gallery_dl/postprocessor/metadata.py +++ b/gallery_dl/postprocessor/metadata.py @@ -56,7 +56,13 @@ class MetadataPP(PostProcessor): ext = "json" directory = options.get("directory") - if directory: + if isinstance(directory, list): + self._directory = self._directory_format + self._directory_formatters = [ + formatter.parse(dirfmt, util.NONE).format_map + for dirfmt in directory + ] + elif directory: self._directory = self._directory_custom sep = os.sep + (os.altsep or "") self._metadir = util.expand_path(directory).rstrip(sep) + os.sep @@ -147,6 +153,16 @@ class MetadataPP(PostProcessor): def _directory_custom(self, pathfmt): return os.path.join(pathfmt.realdirectory, self._metadir) + def _directory_format(self, pathfmt): + formatters = pathfmt.directory_formatters + try: + pathfmt.directory_formatters = self._directory_formatters + segments = pathfmt.build_directory(pathfmt.kwdict) + directory = pathfmt.clean_path(os.sep.join(segments) + os.sep) + return os.path.join(pathfmt.realdirectory, directory) + finally: + pathfmt.directory_formatters = formatters + def _filename(self, pathfmt): return (pathfmt.filename or "metadata") + "." + self.extension diff --git a/test/test_postprocessor.py b/test/test_postprocessor.py index d509052c..25645a52 100644 --- a/test/test_postprocessor.py +++ b/test/test_postprocessor.py @@ -440,6 +440,18 @@ class MetadataTest(BasePostprocessorTest): path = self.pathfmt.realdirectory + "metadata/file.json" m.assert_called_once_with(path, "w", encoding="utf-8") + def test_metadata_directory_format(self): + self._create( + {"directory": ["..", "json", "\fF {id // 500 * 500 + 500}"]}, + {"id": 12345}, + ) + + with patch("builtins.open", mock_open()) as m: + self._trigger() + + path = self.pathfmt.realdirectory + "../json/12500/file.ext.json" + m.assert_called_once_with(path, "w", encoding="utf-8") + def test_metadata_filename(self): self._create({ "filename" : "{category}_{filename}_/meta/\n\r.data",