diff options
Diffstat (limited to 'yt_dlp/utils.py')
-rw-r--r-- | yt_dlp/utils.py | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/yt_dlp/utils.py b/yt_dlp/utils.py index 9eb9495a0..994239897 100644 --- a/yt_dlp/utils.py +++ b/yt_dlp/utils.py @@ -3149,14 +3149,28 @@ def urlencode_postdata(*args, **kargs): return urllib.parse.urlencode(*args, **kargs).encode('ascii') +def update_url(url, *, query_update=None, **kwargs): + """Replace URL components specified by kwargs + @param url str or parse url tuple + @param query_update update query + @returns str + """ + if isinstance(url, str): + if not kwargs and not query_update: + return url + else: + url = urllib.parse.urlparse(url) + if query_update: + assert 'query' not in kwargs, 'query_update and query cannot be specified at the same time' + kwargs['query'] = urllib.parse.urlencode({ + **urllib.parse.parse_qs(url.query), + **query_update + }, True) + return urllib.parse.urlunparse(url._replace(**kwargs)) + + def update_url_query(url, query): - if not query: - return url - parsed_url = urllib.parse.urlparse(url) - qs = urllib.parse.parse_qs(parsed_url.query) - qs.update(query) - return urllib.parse.urlunparse(parsed_url._replace( - query=urllib.parse.urlencode(qs, True))) + return update_url(url, query_update=query) def update_Request(req, url=None, data=None, headers=None, query=None): |