[egghead:course] Add support for egghead.io course playlists
Individual egghead videos are already handled by the generic/Wistia extractors.
This commit is contained in:
parent
e7ea724cb9
commit
8084951b7f
@ -1,3 +1,7 @@
|
|||||||
|
version <unreleased>
|
||||||
|
|
||||||
|
+ [egghead:course] Add support for egghead.io courses
|
||||||
|
|
||||||
version 2017.01.08
|
version 2017.01.08
|
||||||
|
|
||||||
Core
|
Core
|
||||||
@ -14,7 +18,6 @@ Extractors
|
|||||||
* [comedycentral/mtv] Add support for HLS videos (#11600)
|
* [comedycentral/mtv] Add support for HLS videos (#11600)
|
||||||
* [discoverygo] Fix JSON data parsing (#11219, #11522)
|
* [discoverygo] Fix JSON data parsing (#11219, #11522)
|
||||||
|
|
||||||
|
|
||||||
version 2017.01.05
|
version 2017.01.05
|
||||||
|
|
||||||
Extractors
|
Extractors
|
||||||
|
39
youtube_dl/extractor/egghead.py
Normal file
39
youtube_dl/extractor/egghead.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
from .common import InfoExtractor
|
||||||
|
|
||||||
|
|
||||||
|
class EggheadCourseIE(InfoExtractor):
|
||||||
|
IE_DESC = 'egghead.io course'
|
||||||
|
IE_NAME = 'egghead:course'
|
||||||
|
_VALID_URL = r'https://egghead\.io/courses/(?P<id>[a-zA-Z_0-9-]+)'
|
||||||
|
_TEST = {
|
||||||
|
'url': 'https://egghead.io/courses/professor-frisby-introduces-composable-functional-javascript',
|
||||||
|
'playlist_count': 29,
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'professor-frisby-introduces-composable-functional-javascript',
|
||||||
|
'title': 'Professor Frisby Introduces Composable Functional JavaScript',
|
||||||
|
'description': 're:(?s)^This course teaches the ubiquitous.*You\'ll start composing functionality before you know it.$',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
playlist_id = self._match_id(url)
|
||||||
|
webpage = self._download_webpage(url, playlist_id)
|
||||||
|
|
||||||
|
title = self._html_search_regex(r'<h1 class="title">([^<]+)</h1>', webpage, 'title')
|
||||||
|
ul = self._search_regex(r'(?s)<ul class="series-lessons-list">(.*?)</ul>', webpage, 'session list')
|
||||||
|
|
||||||
|
found = re.findall(r'(?s)<a class="[^"]*"\s*href="([^"]+)">\s*<li class="item', ul)
|
||||||
|
entries = [self.url_result(m) for m in found]
|
||||||
|
|
||||||
|
return {
|
||||||
|
'_type': 'playlist',
|
||||||
|
'id': playlist_id,
|
||||||
|
'title': title,
|
||||||
|
'description': self._og_search_description(webpage),
|
||||||
|
'entries': entries,
|
||||||
|
}
|
@ -252,6 +252,7 @@ from .dw import (
|
|||||||
from .eagleplatform import EaglePlatformIE
|
from .eagleplatform import EaglePlatformIE
|
||||||
from .ebaumsworld import EbaumsWorldIE
|
from .ebaumsworld import EbaumsWorldIE
|
||||||
from .echomsk import EchoMskIE
|
from .echomsk import EchoMskIE
|
||||||
|
from .egghead import EggheadCourseIE
|
||||||
from .ehow import EHowIE
|
from .ehow import EHowIE
|
||||||
from .eighttracks import EightTracksIE
|
from .eighttracks import EightTracksIE
|
||||||
from .einthusan import EinthusanIE
|
from .einthusan import EinthusanIE
|
||||||
|
Loading…
Reference in New Issue
Block a user