|
|
@ -18,6 +18,7 @@ from ..utils import (
|
|
|
|
parse_duration,
|
|
|
|
parse_duration,
|
|
|
|
qualities,
|
|
|
|
qualities,
|
|
|
|
srt_subtitles_timecode,
|
|
|
|
srt_subtitles_timecode,
|
|
|
|
|
|
|
|
update_url_query,
|
|
|
|
urlencode_postdata,
|
|
|
|
urlencode_postdata,
|
|
|
|
)
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
@ -331,25 +332,44 @@ class PluralsightCourseIE(PluralsightBaseIE):
|
|
|
|
# TODO: PSM cookie
|
|
|
|
# TODO: PSM cookie
|
|
|
|
|
|
|
|
|
|
|
|
course = self._download_json(
|
|
|
|
course = self._download_json(
|
|
|
|
'%s/data/course/%s' % (self._API_BASE, course_id),
|
|
|
|
'%s/player/functions/rpc' % self._API_BASE, course_id,
|
|
|
|
course_id, 'Downloading course JSON')
|
|
|
|
'Downloading course JSON',
|
|
|
|
|
|
|
|
data=json.dumps({
|
|
|
|
|
|
|
|
'fn': 'bootstrapPlayer',
|
|
|
|
|
|
|
|
'payload': {
|
|
|
|
|
|
|
|
'courseId': course_id,
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}).encode('utf-8'),
|
|
|
|
|
|
|
|
headers={
|
|
|
|
|
|
|
|
'Content-Type': 'application/json;charset=utf-8'
|
|
|
|
|
|
|
|
})['payload']['course']
|
|
|
|
|
|
|
|
|
|
|
|
title = course['title']
|
|
|
|
title = course['title']
|
|
|
|
|
|
|
|
course_name = course['name']
|
|
|
|
|
|
|
|
course_data = course['modules']
|
|
|
|
description = course.get('description') or course.get('shortDescription')
|
|
|
|
description = course.get('description') or course.get('shortDescription')
|
|
|
|
|
|
|
|
|
|
|
|
course_data = self._download_json(
|
|
|
|
|
|
|
|
'%s/data/course/content/%s' % (self._API_BASE, course_id),
|
|
|
|
|
|
|
|
course_id, 'Downloading course data JSON')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
entries = []
|
|
|
|
entries = []
|
|
|
|
for num, module in enumerate(course_data, 1):
|
|
|
|
for num, module in enumerate(course_data, 1):
|
|
|
|
|
|
|
|
author = module.get('author')
|
|
|
|
|
|
|
|
module_name = module.get('name')
|
|
|
|
|
|
|
|
if not author or not module_name:
|
|
|
|
|
|
|
|
continue
|
|
|
|
for clip in module.get('clips', []):
|
|
|
|
for clip in module.get('clips', []):
|
|
|
|
player_parameters = clip.get('playerParameters')
|
|
|
|
clip_index = int_or_none(clip.get('index'))
|
|
|
|
if not player_parameters:
|
|
|
|
if clip_index is None:
|
|
|
|
continue
|
|
|
|
continue
|
|
|
|
|
|
|
|
clip_url = update_url_query(
|
|
|
|
|
|
|
|
'%s/player' % self._API_BASE, query={
|
|
|
|
|
|
|
|
'mode': 'live',
|
|
|
|
|
|
|
|
'course': course_name,
|
|
|
|
|
|
|
|
'author': author,
|
|
|
|
|
|
|
|
'name': module_name,
|
|
|
|
|
|
|
|
'clip': clip_index,
|
|
|
|
|
|
|
|
})
|
|
|
|
entries.append({
|
|
|
|
entries.append({
|
|
|
|
'_type': 'url_transparent',
|
|
|
|
'_type': 'url_transparent',
|
|
|
|
'url': '%s/training/player?%s' % (self._API_BASE, player_parameters),
|
|
|
|
'url': clip_url,
|
|
|
|
'ie_key': PluralsightIE.ie_key(),
|
|
|
|
'ie_key': PluralsightIE.ie_key(),
|
|
|
|
'chapter': module.get('title'),
|
|
|
|
'chapter': module.get('title'),
|
|
|
|
'chapter_number': num,
|
|
|
|
'chapter_number': num,
|
|
|
|