|
|
|
@ -6,6 +6,7 @@ import xml.etree.ElementTree
|
|
|
|
|
from .common import InfoExtractor
|
|
|
|
|
from ..utils import (
|
|
|
|
|
compat_HTTPError,
|
|
|
|
|
compat_urllib_request,
|
|
|
|
|
ExtractorError,
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -69,6 +70,21 @@ class VevoIE(InfoExtractor):
|
|
|
|
|
}]
|
|
|
|
|
_SMIL_BASE_URL = 'http://smil.lvl3.vevo.com/'
|
|
|
|
|
|
|
|
|
|
def _real_initialize(self):
|
|
|
|
|
req = compat_urllib_request.Request(
|
|
|
|
|
'http://www.vevo.com/auth', data=b'')
|
|
|
|
|
webpage = self._download_webpage(
|
|
|
|
|
req, None,
|
|
|
|
|
note='Retrieving oauth token',
|
|
|
|
|
errnote='Unable to retrieve oauth token',
|
|
|
|
|
fatal=False)
|
|
|
|
|
if webpage is False:
|
|
|
|
|
self._oauth_token = None
|
|
|
|
|
else:
|
|
|
|
|
self._oauth_token = self._search_regex(
|
|
|
|
|
r'access_token":\s*"([^"]+)"',
|
|
|
|
|
webpage, 'access token', fatal=False)
|
|
|
|
|
|
|
|
|
|
def _formats_from_json(self, video_info):
|
|
|
|
|
last_version = {'version': -1}
|
|
|
|
|
for version in video_info['videoVersions']:
|
|
|
|
@ -129,6 +145,26 @@ class VevoIE(InfoExtractor):
|
|
|
|
|
})
|
|
|
|
|
return formats
|
|
|
|
|
|
|
|
|
|
def _download_api_formats(self, video_id):
|
|
|
|
|
if not self._oauth_token:
|
|
|
|
|
self._downloader.report_warning(
|
|
|
|
|
'No oauth token available, skipping API HLS download')
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
api_url = 'https://apiv2.vevo.com/video/%s/streams/hls?token=%s' % (
|
|
|
|
|
video_id, self._oauth_token)
|
|
|
|
|
api_data = self._download_json(
|
|
|
|
|
api_url, video_id,
|
|
|
|
|
note='Downloading HLS formats',
|
|
|
|
|
errnote='Failed to download HLS format list', fatal=False)
|
|
|
|
|
if api_data is None:
|
|
|
|
|
return []
|
|
|
|
|
|
|
|
|
|
m3u8_url = api_data[0]['url']
|
|
|
|
|
return self._extract_m3u8_formats(
|
|
|
|
|
m3u8_url, video_id, entry_protocol='m3u8_native', ext='mp4',
|
|
|
|
|
preference=0)
|
|
|
|
|
|
|
|
|
|
def _real_extract(self, url):
|
|
|
|
|
mobj = re.match(self._VALID_URL, url)
|
|
|
|
|
video_id = mobj.group('id')
|
|
|
|
@ -152,6 +188,9 @@ class VevoIE(InfoExtractor):
|
|
|
|
|
else:
|
|
|
|
|
age_limit = None
|
|
|
|
|
|
|
|
|
|
# Download via HLS API
|
|
|
|
|
formats.extend(self._download_api_formats(video_id))
|
|
|
|
|
|
|
|
|
|
# Download SMIL
|
|
|
|
|
smil_blocks = sorted((
|
|
|
|
|
f for f in video_info['videoVersions']
|
|
|
|
@ -166,7 +205,6 @@ class VevoIE(InfoExtractor):
|
|
|
|
|
fatal=False)
|
|
|
|
|
if smil_url_m is not None:
|
|
|
|
|
smil_url = smil_url_m
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
smil_xml = self._download_webpage(smil_url, video_id,
|
|
|
|
|
'Downloading SMIL info')
|
|
|
|
|