mpv-player / mpv

🎥 Command line video player
https://mpv.io
Other
28.65k stars 2.92k forks source link

Error parsing watch later files #13016

Open debugzxcv opened 11 months ago

debugzxcv commented 11 months ago

Important Information

Provide following Information:

Reproduction steps

  1. use this script
    mp.msg = require("mp.msg")
    mp.utils = require("mp.utils")
    mp.add_hook("on_preloaded", 50, function()
    local stream_opts = mp.get_property_native("file-local-options/stream-lavf-o")
    mp.msg.warn(mp.utils.to_string(stream_opts))
    stream_opts["cookies"] = "test1=123; path=/; domain=.example.com;\r\ntest2=aaa; path=/; domain=.example.com;\r\n"
    mp.set_property_native("file-local-options/stream-lavf-o", stream_opts)
    end)
  2. mpv --save-position-on-quit --watch-later-options-append=stream-lavf-o <FILE>
  3. quit mpv
  4. reopen file on Step 2

    Expected behavior

    no errors

Actual behavior

watch_later/<MD5>:3: fixed-length quoting expected - put "quotes" around the option value if you did not intend to use this, but your option value starts with '%'
Error parsing option test2 (option not found)
watch_later/<MD5>:4: setting option test2='aaa; path=/; domain=.example.com;' failed.
guidocella commented 11 months ago

Config files don't support multi-line option values, and that is unlikely to change.

debugzxcv commented 11 months ago

Config files don't support multi-line option values, and that is unlikely to change.

Is it possible to escape line breaks for multi-line options when saving a watch_later file?

guidocella commented 11 months ago

If you save \\n that seems to be interpreted as a literal \n in stream-lavf-o. From mpv.conf's documentation: C-style escapes are currently not interpreted on this level, although some options do this manually (this is a mess and should probably be changed at some point)

debugzxcv commented 9 months ago

This patch works:

diff --git a/options/parse_configfile.c b/options/parse_configfile.c
index edd6be91..a4cc0904 100644
--- a/options/parse_configfile.c
+++ b/options/parse_configfile.c
@@ -105,12 +105,21 @@ int m_config_parse(m_config_t *config, const char *location, bstr data,
                 if (rest.len == line.len || !bstr_eatstart0(&rest, "%") ||
                     len > rest.len)
                 {
+                    if (rest.len && len > rest.len) {
+                        line.len = len + (rest.start - line.start);
+                        rest.len = len;
+                        unsigned char *start = line.start + line.len; 
+                        data.len -= start - data.start;
+                        data.start = start;
+                        goto ok;
+                    }
                     MP_ERR(config, "%s fixed-length quoting expected - put "
                            "\"quotes\" around the option value if you did not "
                            "intend to use this, but your option value starts "
                            "with '%%'\n", loc);
                     goto error;
                 }
+                ok:
                 value = bstr_splice(rest, 0, len);
                 line = bstr_cut(rest, len);
             } else {