diff --git a/yt_dlp/extractor/_extractors.py b/yt_dlp/extractor/_extractors.py
index fa7b5313c..2fddcc206 100644
--- a/yt_dlp/extractor/_extractors.py
+++ b/yt_dlp/extractor/_extractors.py
@@ -436,6 +436,7 @@ from .crackle import CrackleIE
from .craftsy import CraftsyIE
from .createacademy import (
CreateAcademyIE,
+ CreateAcademyCourseIE,
)
from .crooksandliars import CrooksAndLiarsIE
from .crowdbunker import (
diff --git a/yt_dlp/extractor/createacademy.py b/yt_dlp/extractor/createacademy.py
index 705837da3..af489b4d8 100644
--- a/yt_dlp/extractor/createacademy.py
+++ b/yt_dlp/extractor/createacademy.py
@@ -18,6 +18,10 @@ class CreateAcademyIE(InfoExtractor):
'ext': 'mp4',
'title': 'Create Academy - s10e01 - Meet Dan',
'description': 'md5:48c8af37219020571a84d5f406e75d86',
+ 'display_id': 'meet-dan',
+ 'chapter': 'Introduction',
+ 'chapter_id': '34',
+ 'chapter_number': 1,
'thumbnail': 'https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6222962662001/22f75006-c49f-4d95-8673-1b60df4223d2/45d953e0-fa58-4cb6-9217-1c7b3c80c932/1280x720/match/image.jpg',
},
},
@@ -70,14 +74,17 @@ class CreateAcademyIE(InfoExtractor):
if 'master.m3u8' in source['src']:
return source['src']
- def _real_extract(self, url):
- video_id = self._match_id(url)
+ def _get_page_data(self, url, video_id):
webpage = self._download_webpage(url, video_id)
- # parse
page_elem = self._search_regex(r'(
]+>)', webpage, 'div')
attributes = extract_attributes(page_elem)
- data = json.loads(attributes['data-page'])
+
+ return json.loads(attributes['data-page'])
+
+ def _real_extract(self, url):
+ video_id = self._match_id(url)
+ data = self._get_page_data(url, video_id)
createacademy_id = data['props']['lesson']['id']
# get media from manifest
@@ -103,3 +110,40 @@ class CreateAcademyIE(InfoExtractor):
'chapter_number': lesson_metadata['section_data']['number'],
'chapter_id': str(lesson_metadata['section_data']['id']),
}
+
+
+class CreateAcademyCourseIE(CreateAcademyIE):
+ _VALID_URL = r'https://www.createacademy.com/courses/(?P[^/?#]+)'
+
+ _TESTS = [
+ {
+ 'url': 'https://www.createacademy.com/courses/dan-pearson',
+ 'info_dict': {
+ 'id': '265',
+ 'ext': 'mp4',
+ 'chapter_id': '34',
+ 'description': 'md5:48c8af37219020571a84d5f406e75d86',
+ 'chapter_number': 1,
+ 'thumbnail': 'https://cf-images.eu-west-1.prod.boltdns.net/v1/static/6222962662001/22f75006-c49f-4d95-8673-1b60df4223d2/45d953e0-fa58-4cb6-9217-1c7b3c80c932/1280x720/match/image.jpg',
+ 'title': 'Create Academy - s10e01 - Meet Dan',
+ 'display_id': 'dan-pearson',
+ 'chapter': 'Introduction',
+ },
+ },
+ ]
+
+ def _real_extract(self, url):
+ video_id = self._match_id(url)
+ data = self._get_page_data(url, video_id)
+
+ # iterate lessons
+ entries = []
+
+ for section in data['props']['curriculum']['sections']:
+ for lesson in section['lessons']:
+ entries.append(super()._real_extract('https://www.createacademy.com' + lesson['lessonPath']))
+
+ return {
+ '_type': 'multi_video',
+ 'entries': entries,
+ }