Index: action.py ================================================================== --- action.py +++ action.py @@ -162,14 +162,18 @@ # OS shell command escaping # def quote(ins): + if conf.windows: + Q = '"%s%"' + else: + Q = "%r" if type(ins) is list: - return " ".join(["%r" % str(s) for s in ins]) + return " ".join([Q % str(s) for s in ins]) else: - return "%r" % str(ins) + return Q % str(ins) # Convert e.g. "text/x-scpls" MIME types to just "pls" monikers # def listfmt(t = "pls"): @@ -196,11 +200,11 @@ def interpol(cmd, source="pls", row={}, add_default=True): row = copy.copy(row) # Inject other meta fields (%title, %genre, %playing, %format, etc.) rx_keys = "[\$\%](" + "|".join(row.keys()) + ")\\b" - cmd = re.sub(rx_keys, lambda m: "%r" % str(row.get(m.group(1))), cmd) + cmd = re.sub(rx_keys, lambda m: quote(str(row.get(m.group(1)))), cmd) # Add default %pls if cmd has no %url placeholder if add_default and cmd.find("%") < 0: cmd = cmd + " %pls" # "pls" as default requires no conversion for most channels, and seems broadly supported by players