|
|
@ -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: |
|
|
|