|
|
@ -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') |
|
|
|