This commit is contained in:
Conner 2024-05-06 04:04:16 -07:00 committed by GitHub
commit c94356b699
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1 changed files with 37 additions and 40 deletions

View File

@ -19,11 +19,20 @@ class FrontendMastersBaseIE(InfoExtractor):
_NETRC_MACHINE = 'frontendmasters'
_QUALITIES = {
'low': {'width': 480, 'height': 360},
'mid': {'width': 1280, 'height': 720},
'high': {'width': 1920, 'height': 1080}
}
def _get_subtitles(self, lesson_data, course_data):
captions_base = "https://captions.frontendmasters.com/assets/courses/"
lesson_slug = lesson_data.get('slug')
lesson_index = lesson_data.get('index')
date_published = course_data.get('datePublished')
course_slug = course_data.get('slug')
subtitles_url = f'{captions_base}{date_published}-{course_slug}/{lesson_index}-{lesson_slug}.vtt'
return {
'en': [{
'url': subtitles_url
}]
}
def _perform_login(self, username, password):
login_page = self._download_webpage(
@ -75,7 +84,7 @@ class FrontendMastersPageBaseIE(FrontendMastersBaseIE):
return chapters
@staticmethod
def _extract_lesson(chapters, lesson_id, lesson):
def _extract_lesson(chapters, lesson_id, lesson, subtitles):
title = lesson.get('title') or lesson_id
display_id = lesson.get('slug')
description = lesson.get('description')
@ -112,6 +121,7 @@ class FrontendMastersPageBaseIE(FrontendMastersBaseIE):
'duration': duration,
'chapter': chapter,
'chapter_number': chapter_number,
'subtitles': subtitles
}
@ -134,44 +144,29 @@ class FrontendMastersIE(FrontendMastersBaseIE):
def _real_extract(self, url):
lesson_id = self._match_id(url)
source_url = '%s/video/%s/source' % (self._API_BASE, lesson_id)
formats = []
for ext in ('webm', 'mp4'):
for quality in ('low', 'mid', 'high'):
resolution = self._QUALITIES[quality].copy()
format_id = '%s-%s' % (ext, quality)
format_url = self._download_json(
source_url, lesson_id,
'Downloading %s source JSON' % format_id, query={
'f': ext,
'r': resolution['height'],
}, headers={
'Referer': url,
}, fatal=False)['url']
if not format_url:
continue
f = resolution.copy()
f.update({
'url': format_url,
'ext': ext,
'format_id': format_id,
})
formats.append(f)
subtitles = {
'en': [{
'url': '%s/transcripts/%s.vtt' % (self._API_BASE, lesson_id),
}]
source_url = f'{self._API_BASE}/video/{lesson_id}/source'
headers = {
'Referer': 'https://frontendmasters.com/',
}
cookies = self._get_cookies("https://frontendmasters.com/")
fem_auth_mod = cookies.get('fem_auth_mod')
if fem_auth_mod:
headers['Cookie'] = f'fem_auth_mod={fem_auth_mod.value}'
json_response = self._download_json(
source_url,
'Downloading source JSON', query={
'f': 'm3u8'
}, headers=headers)
m3u8_url = json_response.get('url')
formats = self._extract_m3u8_formats(m3u8_url, lesson_id)
return {
'id': lesson_id,
'title': lesson_id,
'formats': formats,
'subtitles': subtitles
}
@ -206,8 +201,9 @@ class FrontendMastersLessonIE(FrontendMastersPageBaseIE):
for video_id, data in course['lessonData'].items()
if data.get('slug') == lesson_name)
subtitles = self.extract_subtitles(lesson, course)
chapters = self._extract_chapters(course)
return self._extract_lesson(chapters, lesson_id, lesson)
return self._extract_lesson(chapters, lesson_id, lesson, subtitles)
class FrontendMastersCourseIE(FrontendMastersPageBaseIE):
@ -242,9 +238,10 @@ class FrontendMastersCourseIE(FrontendMastersPageBaseIE):
for lesson in lessons:
lesson_name = lesson.get('slug')
lesson_id = lesson.get('hash') or lesson.get('statsId')
subtitles = self.extract_subtitles(lesson, course)
if not lesson_id or not lesson_name:
continue
entries.append(self._extract_lesson(chapters, lesson_id, lesson))
entries.append(self._extract_lesson(chapters, lesson_id, lesson, subtitles))
title = course.get('title')
description = course.get('description')