diff options
| author | Sergey M․ <dstftw@gmail.com> | 2017-08-17 22:45:40 +0700 | 
|---|---|---|
| committer | Sergey M․ <dstftw@gmail.com> | 2017-08-17 22:45:40 +0700 | 
| commit | 93d0583e34b0cd826f081a766b00381bb5fed52d (patch) | |
| tree | cb72741efbc7484ef7ff50825ad8bf3036e1c6ab | |
| parent | 5d28169747e34850fcb53760c77eccb7f3195ef2 (diff) | |
[pluralsight] Use RPC API for course extraction (closes #13937)
| -rw-r--r-- | youtube_dl/extractor/pluralsight.py | 52 | 
1 files changed, 36 insertions, 16 deletions
| diff --git a/youtube_dl/extractor/pluralsight.py b/youtube_dl/extractor/pluralsight.py index d35f54ce8..f6a9131b1 100644 --- a/youtube_dl/extractor/pluralsight.py +++ b/youtube_dl/extractor/pluralsight.py @@ -18,6 +18,7 @@ from ..utils import (      parse_duration,      qualities,      srt_subtitles_timecode, +    try_get,      update_url_query,      urlencode_postdata,  ) @@ -26,6 +27,39 @@ from ..utils import (  class PluralsightBaseIE(InfoExtractor):      _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):      IE_NAME = 'pluralsight' @@ -162,10 +196,7 @@ class PluralsightIE(PluralsightBaseIE):          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'] @@ -331,18 +362,7 @@ class PluralsightCourseIE(PluralsightBaseIE):          # 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']          course_name = course['name'] | 
