mirror of
https://github.com/ytdl-org/youtube-dl
synced 2024-12-21 17:07:28 +00:00
72 lines
2.2 KiB
Python
72 lines
2.2 KiB
Python
from __future__ import unicode_literals
|
|
|
|
import re
|
|
|
|
from .common import InfoExtractor
|
|
from ..utils import (
|
|
unified_strdate,
|
|
)
|
|
|
|
|
|
class KhanAcademyIE(InfoExtractor):
|
|
_VALID_URL = r'^https?://(?:www\.)?khanacademy\.org/(?P<key>[^/]+)/(?:[^/]+/){,2}(?P<id>[^?#/]+)(?:$|[?#])'
|
|
IE_NAME = 'KhanAcademy'
|
|
|
|
_TEST = {
|
|
'url': 'http://www.khanacademy.org/video/one-time-pad',
|
|
'file': 'one-time-pad.mp4',
|
|
'md5': '7021db7f2d47d4fff89b13177cb1e8f4',
|
|
'info_dict': {
|
|
'title': 'The one-time pad',
|
|
'description': 'The perfect cipher',
|
|
'duration': 176,
|
|
'uploader': 'Brit Cruise',
|
|
'upload_date': '20120411',
|
|
}
|
|
}
|
|
|
|
def _real_extract(self, url):
|
|
m = re.match(self._VALID_URL, url)
|
|
video_id = m.group('id')
|
|
|
|
if m.group('key') == 'video':
|
|
data = self._download_json(
|
|
'http://api.khanacademy.org/api/v1/videos/' + video_id,
|
|
video_id, 'Downloading video info')
|
|
|
|
upload_date = unified_strdate(data['date_added'])
|
|
uploader = ', '.join(data['author_names'])
|
|
return {
|
|
'_type': 'url_transparent',
|
|
'url': data['url'],
|
|
'id': video_id,
|
|
'title': data['title'],
|
|
'thumbnail': data['image_url'],
|
|
'duration': data['duration'],
|
|
'description': data['description'],
|
|
'uploader': uploader,
|
|
'upload_date': upload_date,
|
|
}
|
|
else:
|
|
# topic
|
|
data = self._download_json(
|
|
'http://api.khanacademy.org/api/v1/topic/' + video_id,
|
|
video_id, 'Downloading topic info')
|
|
|
|
entries = [
|
|
{
|
|
'_type': 'url',
|
|
'url': c['url'],
|
|
'id': c['id'],
|
|
'title': c['title'],
|
|
}
|
|
for c in data['children'] if c['kind'] in ('Video', 'Topic')]
|
|
|
|
return {
|
|
'_type': 'playlist',
|
|
'id': video_id,
|
|
'title': data['title'],
|
|
'description': data['description'],
|
|
'entries': entries,
|
|
}
|