summary refs log tree commit diff
diff options
context:
space:
mode:
authorSergey M․ <dstftw@gmail.com>2016-11-02 02:14:01 +0700
committerSergey M․ <dstftw@gmail.com>2016-11-02 02:30:18 +0700
commit02dc0a36b72b7312996d59b9ec96768f925cb4a4 (patch)
tree9131cde2d8f6ed7463b1254a33fada2ed8530d73
parent639e3b5c9985aacf7c0dc018c211a78161bbafd2 (diff)
downloadyoutube-dl-02dc0a36b72b7312996d59b9ec96768f925cb4a4.tar.gz
youtube-dl-02dc0a36b72b7312996d59b9ec96768f925cb4a4.tar.xz
youtube-dl-02dc0a36b72b7312996d59b9ec96768f925cb4a4.zip
[utils] Introduce base_url
-rw-r--r--test/test_utils.py8
-rw-r--r--youtube_dl/extractor/common.py5
-rw-r--r--youtube_dl/utils.py4
3 files changed, 15 insertions, 2 deletions
diff --git a/test/test_utils.py b/test/test_utils.py
index b1b2effca..cb75ca53e 100644
--- a/test/test_utils.py
+++ b/test/test_utils.py
@@ -69,6 +69,7 @@ from youtube_dl.utils import (
     uppercase_escape,
     lowercase_escape,
     url_basename,
+    base_url,
     urlencode_postdata,
     urshift,
     update_url_query,
@@ -437,6 +438,13 @@ class TestUtil(unittest.TestCase):
             url_basename('http://media.w3.org/2010/05/sintel/trailer.mp4'),
             'trailer.mp4')
 
+    def test_base_url(self):
+        self.assertEqual(base_url('http://foo.de/'), 'http://foo.de/')
+        self.assertEqual(base_url('http://foo.de/bar'), 'http://foo.de/')
+        self.assertEqual(base_url('http://foo.de/bar/'), 'http://foo.de/bar/')
+        self.assertEqual(base_url('http://foo.de/bar/baz'), 'http://foo.de/bar/')
+        self.assertEqual(base_url('http://foo.de/bar/baz?x=z/x/c'), 'http://foo.de/bar/')
+
     def test_parse_age_limit(self):
         self.assertEqual(parse_age_limit(None), None)
         self.assertEqual(parse_age_limit(False), None)
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py
index 2e9f05ae3..140ccf234 100644
--- a/youtube_dl/extractor/common.py
+++ b/youtube_dl/extractor/common.py
@@ -30,6 +30,7 @@ from ..downloader.f4m import remove_encrypted_media
 from ..utils import (
     NO_DEFAULT,
     age_restricted,
+    base_url,
     bug_reports_message,
     clean_html,
     compiled_regex_type,
@@ -1539,7 +1540,7 @@ class InfoExtractor(object):
         if res is False:
             return []
         mpd, urlh = res
-        mpd_base_url = re.match(r'https?://[^?#&]+/', urlh.geturl()).group()
+        mpd_base_url = base_url(urlh.geturl())
 
         return self._parse_mpd_formats(
             compat_etree_fromstring(mpd.encode('utf-8')), mpd_id, mpd_base_url,
@@ -1797,7 +1798,7 @@ class InfoExtractor(object):
         if ism_doc.get('IsLive') == 'TRUE' or ism_doc.find('Protection') is not None:
             return []
 
-        ism_base_url = re.match(r'https?://.+/', ism_url).group()
+        ism_base_url = base_url(ism_url)
 
         duration = int(ism_doc.attrib['Duration'])
         timescale = int_or_none(ism_doc.get('TimeScale')) or 10000000
diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py
index 1a5ce8688..9595bcf9f 100644
--- a/youtube_dl/utils.py
+++ b/youtube_dl/utils.py
@@ -1691,6 +1691,10 @@ def url_basename(url):
     return path.strip('/').split('/')[-1]
 
 
+def base_url(url):
+    return re.match(r'https?://[^?#&]+/', url).group()
+
+
 class HEADRequest(compat_urllib_request.Request):
     def get_method(self):
         return 'HEAD'