|
@@ -243,8 +243,17 @@ def remove_encrypted_media(media):
|
|
|
media))
|
|
|
|
|
|
|
|
|
-def _add_ns(prop):
|
|
|
- return '{http://ns.adobe.com/f4m/1.0}%s' % prop
|
|
|
+def _add_ns(prop, ver=1):
|
|
|
+ return '{http://ns.adobe.com/f4m/%d.0}%s' % (ver, prop)
|
|
|
+
|
|
|
+
|
|
|
+def get_base_url(manifest):
|
|
|
+ base_url = xpath_text(
|
|
|
+ manifest, [_add_ns('baseURL'), _add_ns('baseURL', 2)],
|
|
|
+ 'base URL', default=None)
|
|
|
+ if base_url:
|
|
|
+ base_url = base_url.strip()
|
|
|
+ return base_url
|
|
|
|
|
|
|
|
|
class F4mFD(FragmentFD):
|
|
@@ -330,13 +339,13 @@ class F4mFD(FragmentFD):
|
|
|
rate, media = list(filter(
|
|
|
lambda f: int(f[0]) == requested_bitrate, formats))[0]
|
|
|
|
|
|
- base_url = compat_urlparse.urljoin(man_url, media.attrib['url'])
|
|
|
+ # Prefer baseURL for relative URLs as per 11.2 of F4M 3.0 spec.
|
|
|
+ man_base_url = get_base_url(doc) or man_url
|
|
|
+
|
|
|
+ base_url = compat_urlparse.urljoin(man_base_url, media.attrib['url'])
|
|
|
bootstrap_node = doc.find(_add_ns('bootstrapInfo'))
|
|
|
- # From Adobe F4M 3.0 spec:
|
|
|
- # The <baseURL> element SHALL be the base URL for all relative
|
|
|
- # (HTTP-based) URLs in the manifest. If <baseURL> is not present, said
|
|
|
- # URLs should be relative to the location of the containing document.
|
|
|
- boot_info, bootstrap_url = self._parse_bootstrap_node(bootstrap_node, man_url)
|
|
|
+ boot_info, bootstrap_url = self._parse_bootstrap_node(
|
|
|
+ bootstrap_node, man_base_url)
|
|
|
live = boot_info['live']
|
|
|
metadata_node = media.find(_add_ns('metadata'))
|
|
|
if metadata_node is not None:
|