summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/man/en/input.rst18
-rw-r--r--mpvcore/m_property.c12
2 files changed, 24 insertions, 6 deletions
diff --git a/DOCS/man/en/input.rst b/DOCS/man/en/input.rst
index e40457e099..362e8a4cf8 100644
--- a/DOCS/man/en/input.rst
+++ b/DOCS/man/en/input.rst
@@ -509,15 +509,27 @@ The following expansions are supported:
fails, expand to an error string. (Use ``${NAME:}`` with a trailing
``:`` to expand to an empty string instead.)
If ``NAME`` is prefixed with ``=``, expand to the raw value of the property
- (see below).
+ (see section below).
``${NAME:STR}``
Expands to the value of the property ``NAME``, or ``STR`` if the
property cannot be retrieved. ``STR`` is expanded recursively.
+``${?NAME:STR}``
+ Expands to ``STR`` (recursively) if the property ``NAME`` is available.
``${!NAME:STR}``
Expands to ``STR`` (recursively) if the property ``NAME`` cannot be
retrieved.
-``${?NAME:STR}``
- Expands to ``STR`` (recursively) if the property ``NAME`` is available.
+``${?NAME==VALUE:STR}``
+ Expands to ``STR`` (recursively) if the property ``NAME`` expands to a
+ string equal to ``VALUE``. You can prefix ``NAME`` with ``=`` in order to
+ compare the raw value of a property (see section below). If the property
+ is unavailable, or other errors happen when retrieving it, the value is
+ never considered equal.
+ Note that ``VALUE`` can't contain any of the characters ``:`` or ``}``.
+ Also, it is possible that escaping with ``"`` or ``%`` might be added in
+ the future, should the need arise.
+``${!NAME==VALUE:STR}``
+ Same as with the ``?`` variant, but ``STR`` is expanded if the value is
+ not equal. (Using the same semantics as with ``?``.)
``$$``
Expands to ``$``.
``$}``
diff --git a/mpvcore/m_property.c b/mpvcore/m_property.c
index 83c6ea1018..6e25bf4e43 100644
--- a/mpvcore/m_property.c
+++ b/mpvcore/m_property.c
@@ -219,14 +219,20 @@ static int expand_property(const m_option_t *prop_list, char **ret, int *ret_len
{
bool cond_yes = bstr_eatstart0(&prop, "?");
bool cond_no = !cond_yes && bstr_eatstart0(&prop, "!");
+ bool test = cond_yes || cond_no;
bool raw = bstr_eatstart0(&prop, "=");
- int method =
- (raw || cond_yes || cond_no) ? M_PROPERTY_GET_STRING : M_PROPERTY_PRINT;
+ bstr comp_with = {0};
+ bool comp = test && bstr_split_tok(prop, "==", &prop, &comp_with);
+ if (test && !comp)
+ raw = true;
+ int method = raw ? M_PROPERTY_GET_STRING : M_PROPERTY_PRINT;
char *s = NULL;
int r = m_property_do_bstr(prop_list, prop, method, &s, ctx);
bool skip;
- if (cond_yes || cond_no) {
+ if (comp) {
+ skip = ((s && bstr_equals0(comp_with, s)) != cond_yes);
+ } else if (test) {
skip = (!!s != cond_yes);
} else {
skip = !!s;