|
|
@ -113,51 +113,47 @@ class LyndaIE(LyndaBaseIE): |
|
|
|
def _real_extract(self, url): |
|
|
|
video_id = self._match_id(url) |
|
|
|
|
|
|
|
page = self._download_webpage( |
|
|
|
video = self._download_json( |
|
|
|
'http://www.lynda.com/ajax/player?videoId=%s&type=video' % video_id, |
|
|
|
video_id, 'Downloading video JSON') |
|
|
|
video_json = json.loads(page) |
|
|
|
|
|
|
|
if 'Status' in video_json: |
|
|
|
if 'Status' in video: |
|
|
|
raise ExtractorError( |
|
|
|
'lynda returned error: %s' % video_json['Message'], expected=True) |
|
|
|
'lynda returned error: %s' % video['Message'], expected=True) |
|
|
|
|
|
|
|
if video_json['HasAccess'] is False: |
|
|
|
if video.get('HasAccess') is False: |
|
|
|
self.raise_login_required('Video %s is only available for members' % video_id) |
|
|
|
|
|
|
|
video_id = compat_str(video_json['ID']) |
|
|
|
duration = video_json['DurationInSeconds'] |
|
|
|
title = video_json['Title'] |
|
|
|
video_id = compat_str(video.get('ID') or video_id) |
|
|
|
duration = int_or_none(video.get('DurationInSeconds')) |
|
|
|
title = video['Title'] |
|
|
|
|
|
|
|
formats = [] |
|
|
|
|
|
|
|
fmts = video_json.get('Formats') |
|
|
|
fmts = video.get('Formats') |
|
|
|
if fmts: |
|
|
|
formats.extend([ |
|
|
|
{ |
|
|
|
'url': fmt['Url'], |
|
|
|
'ext': fmt['Extension'], |
|
|
|
'width': fmt['Width'], |
|
|
|
'height': fmt['Height'], |
|
|
|
'filesize': fmt['FileSize'], |
|
|
|
'format_id': str(fmt['Resolution']) |
|
|
|
} for fmt in fmts]) |
|
|
|
|
|
|
|
prioritized_streams = video_json.get('PrioritizedStreams') |
|
|
|
formats.extend([{ |
|
|
|
'url': f['Url'], |
|
|
|
'ext': f.get('Extension'), |
|
|
|
'width': int_or_none(f.get('Width')), |
|
|
|
'height': int_or_none(f.get('Height')), |
|
|
|
'filesize': int_or_none(f.get('FileSize')), |
|
|
|
'format_id': compat_str(f.get('Resolution')) if f.get('Resolution') else None, |
|
|
|
} for f in fmts if f.get('Url')]) |
|
|
|
|
|
|
|
prioritized_streams = video.get('PrioritizedStreams') |
|
|
|
if prioritized_streams: |
|
|
|
for prioritized_stream_id, prioritized_stream in prioritized_streams.items(): |
|
|
|
formats.extend([ |
|
|
|
{ |
|
|
|
'url': video_url, |
|
|
|
'width': int_or_none(format_id), |
|
|
|
'format_id': '%s-%s' % (prioritized_stream_id, format_id), |
|
|
|
} for format_id, video_url in prioritized_stream.items() |
|
|
|
]) |
|
|
|
formats.extend([{ |
|
|
|
'url': video_url, |
|
|
|
'width': int_or_none(format_id), |
|
|
|
'format_id': '%s-%s' % (prioritized_stream_id, format_id), |
|
|
|
} for format_id, video_url in prioritized_stream.items()]) |
|
|
|
|
|
|
|
self._check_formats(formats, video_id) |
|
|
|
self._sort_formats(formats) |
|
|
|
|
|
|
|
subtitles = self.extract_subtitles(video_id, page) |
|
|
|
subtitles = self.extract_subtitles(video_id) |
|
|
|
|
|
|
|
return { |
|
|
|
'id': video_id, |
|
|
@ -188,7 +184,7 @@ class LyndaIE(LyndaBaseIE): |
|
|
|
if srt: |
|
|
|
return srt |
|
|
|
|
|
|
|
def _get_subtitles(self, video_id, webpage): |
|
|
|
def _get_subtitles(self, video_id): |
|
|
|
url = 'http://www.lynda.com/ajax/player?videoId=%s&type=transcript' % video_id |
|
|
|
subs = self._download_json(url, None, False) |
|
|
|
if subs: |
|
|
|