command: allow accessing metadata entries as list

Not sure about these deep path-names. Maybe "metadata/0" should work
instead of "metadata/list/0". I'm so unsure about it, that I'm leaving
it open.
This commit is contained in:
wm4 2014-02-19 16:29:04 +01:00
parent 844efa5431
commit bda0e7da13
2 changed files with 31 additions and 0 deletions

View File

@ -654,10 +654,22 @@ an option at runtime.
``metadata/by-key/<key>``
Value of metadata entry ``<key>``.
``metadata/list/count``
Number of metadata entries.
``metadata/list/N/name``
Key name of the Nth metadata entry. (The first entry is ``0``).
``metadata/list/N/value``
Value of the Nth metadata entry.
``metadata/<key>``
Old version of ``metadata/by-key/<key>``. Use is discouraged, because
the metadata key string could conflict with other sub-properties.
The layout of this property might be subject to change. Suggestions are
welcome how exactly this property should work.
``chapter-metadata``
Metadata of current chapter. Works similar to ``metadata`` property. This
also allows referring to a key directly.

View File

@ -770,6 +770,19 @@ static int mp_property_angle(m_option_t *prop, int action, void *arg,
return M_PROPERTY_NOT_IMPLEMENTED;
}
static int get_tag_entry(int item, int action, void *arg, void *ctx)
{
struct mp_tags *tags = ctx;
struct m_sub_property props[] = {
{"key", SUB_PROP_STR(tags->keys[item])},
{"value", SUB_PROP_STR(tags->values[item])},
{0}
};
return m_property_read_sub(props, action, arg);
}
static int tag_property(m_option_t *prop, int action, void *arg,
struct mp_tags *tags)
{
@ -802,6 +815,12 @@ static int tag_property(m_option_t *prop, int action, void *arg,
case M_PROPERTY_KEY_ACTION: {
struct m_property_action_arg *ka = arg;
bstr key = bstr0(ka->key);
if (bstr_eatstart0(&key, "list/")) {
struct m_property_action_arg nka = *ka;
nka.key = key.start; // ok because slice ends with \0
return m_property_read_list(action, &nka, tags->num_keys,
get_tag_entry, tags);
}
// Direct access without this prefix is allowed for compatibility.
bstr_eatstart0(&key, "by-key/");
char *meta = mp_tags_get_bstr(tags, key);