diff --git a/youtube_dl/extractor/frontendmaster.py b/youtube_dl/extractor/frontendmaster.py index 671c357e0..b228b3da9 100644 --- a/youtube_dl/extractor/frontendmaster.py +++ b/youtube_dl/extractor/frontendmaster.py @@ -54,10 +54,13 @@ class FrontEndMasterBaseIE(InfoExtractor): headers={'Content-Type': 'application/x-www-form-urlencoded'} ) - logout_link = self._search_regex('(Logout .*)', - response, 'logout-link') - if not logout_link: - raise ExtractorError('Unable to login', expected=True) + error = self._search_regex( + r']+class=["\']Message MessageAlert["\'][^>]*>([^<]+)', + response, 'error message', default=None) + + if error: + raise ExtractorError('Unable to login: check username and password', + expected=True) def _match_course_id(self, url): if '_VALID_URL_RE' not in self.__dict__: @@ -81,9 +84,13 @@ class FrontEndMasterBaseIE(InfoExtractor): current_section = None current_section_number = 0 for elem in lesson_elements: - if isinstance(elem, unicode): + if not isinstance(elem, int): + elem_name = elem + if not isinstance(elem_name, str): + # convert unicode to str + elem_name = elem.encode('utf-8') (current_section, current_section_number) = \ - (elem.encode('utf-8'), current_section_number + 1) + (elem_name, current_section_number + 1) else: if current_section: sections[elem] = (current_section, current_section_number) @@ -120,7 +127,8 @@ class FrontEndMasterIE(FrontEndMasterBaseIE): lesson_section_elements = course_json_content.get('lessonElements') lesson_data = course_json_content.get('lessonData')[lesson_hash] lesson_source_base = lesson_data.get('sourceBase') - course_sections_pairing = self._pair_section_with_video_elemen_index(lesson_section_elements) + course_sections_pairing = self._pair_section_with_video_elemen_index( + lesson_section_elements) lesson_title = lesson_data.get('title') lesson_description = lesson_data.get('description') @@ -130,7 +138,6 @@ class FrontEndMasterIE(FrontEndMasterBaseIE): lesson_section = course_sections_pairing.get(lesson_index)[0] lesson_section_number = course_sections_pairing.get(lesson_index)[1] - QUALITIES_PREFERENCE = ('low', 'medium', 'high') quality_key = qualities(QUALITIES_PREFERENCE) QUALITIES = { @@ -139,7 +146,8 @@ class FrontEndMasterIE(FrontEndMasterBaseIE): 'high': {'width': 1920, 'height': 1080} } - AllowedQuality = collections.namedtuple('AllowedQuality', ['ext', 'qualities']) + AllowedQuality = collections.namedtuple('AllowedQuality', + ['ext', 'qualities']) ALLOWED_QUALITIES = [ AllowedQuality('webm', ['low', 'medium', 'high']), AllowedQuality('mp4', ['low', 'medium', 'high']) @@ -169,9 +177,11 @@ class FrontEndMasterIE(FrontEndMasterBaseIE): req_quality = '-'.join(req_quality.split('-')[:2]) for allowed_quality in ALLOWED_QUALITIES: if req_ext == allowed_quality.ext and req_quality in allowed_quality.qualities: - return (AllowedQuality(req_ext, (req_quality, )), ) - req_ext = 'webm' if self._downloader.params.get('prefer_free_formats') else 'mp4' - return (AllowedQuality(req_ext, ('high', )), ) + return (AllowedQuality(req_ext, (req_quality,)),) + req_ext = 'webm' if self._downloader.params.get( + 'prefer_free_formats') else 'mp4' + return (AllowedQuality(req_ext, ('high',)),) + allowed_qualities = guess_allowed_qualities() formats = [] @@ -182,8 +192,9 @@ class FrontEndMasterIE(FrontEndMasterBaseIE): 'r': f['height'], 'f': ext } - video_response = self._download_json(video_request_url % lesson_source_base, video_id, - query=video_request_params, headers=video_request_headers) + video_response = self._download_json( + video_request_url % lesson_source_base, video_id, + query=video_request_params, headers=video_request_headers) # To avoid the possibility of problems with multiple sequential calls to ViewClip API and start # to return 429 HTTP errors after some time (see the problem Pluralsight has on @@ -261,7 +272,8 @@ class FrontEndMasterCourseIE(FrontEndMasterBaseIE): entries = [] for video in videos_data: video_slug = video.get('slug') - clip_url = "%s/%s/%s" % (self._VIDEO_BASE, course_display_id, video_slug) + clip_url = "%s/%s/%s" % ( + self._VIDEO_BASE, course_display_id, video_slug) entries.append({ '_type': 'url_transparent', 'url': clip_url,