diff options
author | Sergey M․ <dstftw@gmail.com> | 2018-07-01 02:00:16 +0700 |
---|---|---|
committer | Sergey M․ <dstftw@gmail.com> | 2018-07-01 02:11:36 +0700 |
commit | eca1f0d115e6a2712ff0d5f6b25e3ded5e52db71 (patch) | |
tree | de22ef177c5dec09bc2503c4c98d4f4c97a9a251 /youtube_dl | |
parent | 2160768a215849e82a167912cb8f0aa054e87d8c (diff) |
[extractor/common] Properly escape % in MPD templates (closes #16867)
Diffstat (limited to 'youtube_dl')
-rw-r--r-- | youtube_dl/extractor/common.py | 16 |
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) |