|
@@ -18,6 +18,7 @@ from ..utils import (
|
|
parse_duration,
|
|
parse_duration,
|
|
qualities,
|
|
qualities,
|
|
srt_subtitles_timecode,
|
|
srt_subtitles_timecode,
|
|
|
|
+ try_get,
|
|
update_url_query,
|
|
update_url_query,
|
|
urlencode_postdata,
|
|
urlencode_postdata,
|
|
)
|
|
)
|
|
@@ -26,6 +27,39 @@ from ..utils import (
|
|
class PluralsightBaseIE(InfoExtractor):
|
|
class PluralsightBaseIE(InfoExtractor):
|
|
_API_BASE = 'https://app.pluralsight.com'
|
|
_API_BASE = 'https://app.pluralsight.com'
|
|
|
|
|
|
|
|
+ def _download_course(self, course_id, url, display_id):
|
|
|
|
+ try:
|
|
|
|
+ return self._download_course_rpc(course_id, url, display_id)
|
|
|
|
+ except ExtractorError:
|
|
|
|
+ # Old API fallback
|
|
|
|
+ return self._download_json(
|
|
|
|
+ 'https://app.pluralsight.com/player/user/api/v1/player/payload',
|
|
|
|
+ display_id, data=urlencode_postdata({'courseId': course_id}),
|
|
|
|
+ headers={'Referer': url})
|
|
|
|
+
|
|
|
|
+ def _download_course_rpc(self, course_id, url, display_id):
|
|
|
|
+ response = self._download_json(
|
|
|
|
+ '%s/player/functions/rpc' % self._API_BASE, display_id,
|
|
|
|
+ 'Downloading course JSON',
|
|
|
|
+ data=json.dumps({
|
|
|
|
+ 'fn': 'bootstrapPlayer',
|
|
|
|
+ 'payload': {
|
|
|
|
+ 'courseId': course_id,
|
|
|
|
+ },
|
|
|
|
+ }).encode('utf-8'),
|
|
|
|
+ headers={
|
|
|
|
+ 'Content-Type': 'application/json;charset=utf-8',
|
|
|
|
+ 'Referer': url,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ course = try_get(response, lambda x: x['payload']['course'], dict)
|
|
|
|
+ if course:
|
|
|
|
+ return course
|
|
|
|
+
|
|
|
|
+ raise ExtractorError(
|
|
|
|
+ '%s said: %s' % (self.IE_NAME, response['error']['message']),
|
|
|
|
+ expected=True)
|
|
|
|
+
|
|
|
|
|
|
class PluralsightIE(PluralsightBaseIE):
|
|
class PluralsightIE(PluralsightBaseIE):
|
|
IE_NAME = 'pluralsight'
|
|
IE_NAME = 'pluralsight'
|
|
@@ -162,10 +196,7 @@ class PluralsightIE(PluralsightBaseIE):
|
|
|
|
|
|
display_id = '%s-%s' % (name, clip_id)
|
|
display_id = '%s-%s' % (name, clip_id)
|
|
|
|
|
|
- course = self._download_json(
|
|
|
|
- 'https://app.pluralsight.com/player/user/api/v1/player/payload',
|
|
|
|
- display_id, data=urlencode_postdata({'courseId': course_name}),
|
|
|
|
- headers={'Referer': url})
|
|
|
|
|
|
+ course = self._download_course(course_name, url, display_id)
|
|
|
|
|
|
collection = course['modules']
|
|
collection = course['modules']
|
|
|
|
|
|
@@ -331,18 +362,7 @@ class PluralsightCourseIE(PluralsightBaseIE):
|
|
|
|
|
|
# TODO: PSM cookie
|
|
# TODO: PSM cookie
|
|
|
|
|
|
- course = self._download_json(
|
|
|
|
- '%s/player/functions/rpc' % self._API_BASE, course_id,
|
|
|
|
- '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']
|
|
|
|
|
|
+ course = self._download_course(course_id, url, course_id)
|
|
|
|
|
|
title = course['title']
|
|
title = course['title']
|
|
course_name = course['name']
|
|
course_name = course['name']
|