mirror of
https://github.com/yt-dlp/yt-dlp.git
synced 2024-11-23 02:25:11 +00:00
[pluralsight] Use RPC API for course extraction (closes #13937)
This commit is contained in:
parent
5d28169747
commit
93d0583e34
1 changed files with 36 additions and 16 deletions
|
@ -18,6 +18,7 @@
|
||||||
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 @@
|
||||||
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 @@ def _real_extract(self, url):
|
||||||
|
|
||||||
display_id = '%s-%s' % (name, clip_id)
|
display_id = '%s-%s' % (name, clip_id)
|
||||||
|
|
||||||
course = self._download_json(
|
course = self._download_course(course_name, url, display_id)
|
||||||
'https://app.pluralsight.com/player/user/api/v1/player/payload',
|
|
||||||
display_id, data=urlencode_postdata({'courseId': course_name}),
|
|
||||||
headers={'Referer': url})
|
|
||||||
|
|
||||||
collection = course['modules']
|
collection = course['modules']
|
||||||
|
|
||||||
|
@ -331,18 +362,7 @@ def _real_extract(self, url):
|
||||||
|
|
||||||
# TODO: PSM cookie
|
# TODO: PSM cookie
|
||||||
|
|
||||||
course = self._download_json(
|
course = self._download_course(course_id, url, course_id)
|
||||||
'%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']
|
|
||||||
|
|
||||||
title = course['title']
|
title = course['title']
|
||||||
course_name = course['name']
|
course_name = course['name']
|
||||||
|
|
Loading…
Reference in a new issue