about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2018-07-01 02:00:16 +0700
committerSergey M․ <dstftw@gmail.com>2018-07-01 02:11:36 +0700
commiteca1f0d115e6a2712ff0d5f6b25e3ded5e52db71 (patch)
treede22ef177c5dec09bc2503c4c98d4f4c97a9a251
parent2160768a215849e82a167912cb8f0aa054e87d8c (diff)
downloadyoutube-dl-eca1f0d115e6a2712ff0d5f6b25e3ded5e52db71.tar.gz
youtube-dl-eca1f0d115e6a2712ff0d5f6b25e3ded5e52db71.tar.xz
youtube-dl-eca1f0d115e6a2712ff0d5f6b25e3ded5e52db71.zip
[extractor/common] Properly escape % in MPD templates (closes #16867)
-rw-r--r--youtube_dl/extractor/common.py16
1 files changed, 15 insertions, 1 deletions
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py
index f3fec160d..78f053f18 100644
--- a/youtube_dl/extractor/common.py
+++ b/youtube_dl/extractor/common.py
@@ -2106,7 +2106,21 @@ class InfoExtractor(object):
                         representation_ms_info = extract_multisegment_info(representation, adaption_set_ms_info)
 
                         def prepare_template(template_name, identifiers):
-                            t = representation_ms_info[template_name]
+                            tmpl = representation_ms_info[template_name]
+                            # First of, % characters outside $...$ templates
+                            # must be escaped by doubling for proper processing
+                            # by % operator string formatting used further (see
+                            # https://github.com/rg3/youtube-dl/issues/16867).
+                            t = ''
+                            in_template = False
+                            for c in tmpl:
+                                t += c
+                                if c == '$':
+                                    in_template = not in_template
+                                elif c == '%' and not in_template:
+                                    t += c
+                            # Next, $...$ templates are translated to their
+                            # %(...) counterparts to be used with % operator
                             t = t.replace('$RepresentationID$', representation_id)
                             t = re.sub(r'\$(%s)\$' % '|'.join(identifiers), r'%(\1)d', t)
                             t = re.sub(r'\$(%s)%%([^$]+)\$' % '|'.join(identifiers), r'%(\1)\2', t)