diff --git a/gallery_dl/formatter.py b/gallery_dl/formatter.py index 654e5d0d..be6ed9e3 100644 --- a/gallery_dl/formatter.py +++ b/gallery_dl/formatter.py @@ -8,6 +8,7 @@ """String formatters""" +import os import json import string import _string @@ -15,6 +16,7 @@ import operator from . import text, util _CACHE = {} +_GLOBALS = {"_env": os.environ} _CONVERSIONS = None @@ -125,6 +127,8 @@ class StringFormatter(): ], fmt) else: key, funcs = parse_field_name(field_name) + if key in _GLOBALS: + return self._apply_globals(_GLOBALS[key], funcs, fmt) if funcs: return self._apply(key, funcs, fmt) return self._apply_simple(key, fmt) @@ -140,6 +144,17 @@ class StringFormatter(): return fmt(obj) return wrap + def _apply_globals(self, gobj, funcs, fmt): + def wrap(_): + try: + obj = gobj + for func in funcs: + obj = func(obj) + except Exception: + obj = self.default + return fmt(obj) + return wrap + def _apply_simple(self, key, fmt): def wrap(kwdict): return fmt(kwdict[key] if key in kwdict else self.default) @@ -149,7 +164,7 @@ class StringFormatter(): def wrap(kwdict): for key, funcs in lst: try: - obj = kwdict[key] + obj = _GLOBALS[key] if key in _GLOBALS else kwdict[key] for func in funcs: obj = func(obj) if obj: diff --git a/test/test_formatter.py b/test/test_formatter.py index 70201f32..3d3ee4af 100644 --- a/test/test_formatter.py +++ b/test/test_formatter.py @@ -173,6 +173,13 @@ class TestFormatter(unittest.TestCase): self._run_test("{d[a]:?/L1/too long/}", "") self._run_test("{d[c]:?/L5/too long/}", "") + def test_environ(self): + os.environ["FORMATTER_TEST"] = value = self.kwdict["a"] + + self._run_test("{_env[FORMATTER_TEST]}" , value) + self._run_test("{_env[FORMATTER_TEST]!l}", value.lower()) + self._run_test("{z|_env[FORMATTER_TEST]}", value) + def _run_test(self, format_string, result, default=None): fmt = formatter.parse(format_string, default) output = fmt.format_map(self.kwdict)