|
@@ -113,51 +113,47 @@ class LyndaIE(LyndaBaseIE):
|
|
def _real_extract(self, url):
|
|
def _real_extract(self, url):
|
|
video_id = self._match_id(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,
|
|
'http://www.lynda.com/ajax/player?videoId=%s&type=video' % video_id,
|
|
video_id, 'Downloading video JSON')
|
|
video_id, 'Downloading video JSON')
|
|
- video_json = json.loads(page)
|
|
|
|
|
|
|
|
- if 'Status' in video_json:
|
|
|
|
|
|
+ if 'Status' in video:
|
|
raise ExtractorError(
|
|
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)
|
|
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 = []
|
|
formats = []
|
|
|
|
|
|
- fmts = video_json.get('Formats')
|
|
|
|
|
|
+ fmts = video.get('Formats')
|
|
if fmts:
|
|
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:
|
|
if prioritized_streams:
|
|
for prioritized_stream_id, prioritized_stream in prioritized_streams.items():
|
|
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._check_formats(formats, video_id)
|
|
self._sort_formats(formats)
|
|
self._sort_formats(formats)
|
|
|
|
|
|
- subtitles = self.extract_subtitles(video_id, page)
|
|
|
|
|
|
+ subtitles = self.extract_subtitles(video_id)
|
|
|
|
|
|
return {
|
|
return {
|
|
'id': video_id,
|
|
'id': video_id,
|
|
@@ -188,7 +184,7 @@ class LyndaIE(LyndaBaseIE):
|
|
if srt:
|
|
if srt:
|
|
return 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
|
|
url = 'http://www.lynda.com/ajax/player?videoId=%s&type=transcript' % video_id
|
|
subs = self._download_json(url, None, False)
|
|
subs = self._download_json(url, None, False)
|
|
if subs:
|
|
if subs:
|