mit.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import re
  2. import json
  3. from .common import InfoExtractor
  4. from ..utils import (
  5. compat_urlparse,
  6. clean_html,
  7. get_element_by_id,
  8. )
  9. class TechTVMITIE(InfoExtractor):
  10. IE_NAME = u'techtv.mit.edu'
  11. _VALID_URL = r'https?://techtv\.mit\.edu/(videos|embeds)/(?P<id>\d+)'
  12. _TEST = {
  13. u'url': u'http://techtv.mit.edu/videos/25418-mit-dna-learning-center-set',
  14. u'file': u'25418.mp4',
  15. u'md5': u'1f8cb3e170d41fd74add04d3c9330e5f',
  16. u'info_dict': {
  17. u'title': u'MIT DNA Learning Center Set',
  18. u'description': u'md5:82313335e8a8a3f243351ba55bc1b474',
  19. },
  20. }
  21. def _real_extract(self, url):
  22. mobj = re.match(self._VALID_URL, url)
  23. video_id = mobj.group('id')
  24. raw_page = self._download_webpage(
  25. 'http://techtv.mit.edu/videos/%s' % video_id, video_id)
  26. clean_page = re.compile(u'<!--.*?-->', re.S).sub(u'', raw_page)
  27. base_url = self._search_regex(r'ipadUrl: \'(.+?cloudfront.net/)',
  28. raw_page, u'base url')
  29. formats_json = self._search_regex(r'bitrates: (\[.+?\])', raw_page,
  30. u'video formats')
  31. formats_mit = json.loads(formats_json)
  32. formats = [
  33. {
  34. 'format_id': f['label'],
  35. 'url': base_url + f['url'].partition(':')[2],
  36. 'ext': f['url'].partition(':')[0],
  37. 'format': f['label'],
  38. 'width': f['width'],
  39. 'vbr': f['bitrate'],
  40. }
  41. for f in formats_mit
  42. ]
  43. title = get_element_by_id('edit-title', clean_page)
  44. description = clean_html(get_element_by_id('edit-description', clean_page))
  45. thumbnail = self._search_regex(r'playlist:.*?url: \'(.+?)\'',
  46. raw_page, u'thumbnail', flags=re.DOTALL)
  47. return {'id': video_id,
  48. 'title': title,
  49. 'formats': formats,
  50. 'description': description,
  51. 'thumbnail': thumbnail,
  52. }
  53. class MITIE(TechTVMITIE):
  54. IE_NAME = u'video.mit.edu'
  55. _VALID_URL = r'https?://video\.mit\.edu/watch/(?P<title>[^/]+)'
  56. _TEST = {
  57. u'url': u'http://video.mit.edu/watch/the-government-is-profiling-you-13222/',
  58. u'file': u'21783.mp4',
  59. u'md5': u'7db01d5ccc1895fc5010e9c9e13648da',
  60. u'info_dict': {
  61. u'title': u'The Government is Profiling You',
  62. u'description': u'md5:ad5795fe1e1623b73620dbfd47df9afd',
  63. },
  64. }
  65. def _real_extract(self, url):
  66. mobj = re.match(self._VALID_URL, url)
  67. page_title = mobj.group('title')
  68. webpage = self._download_webpage(url, page_title)
  69. self.to_screen('%s: Extracting %s url' % (page_title, TechTVMITIE.IE_NAME))
  70. embed_url = self._search_regex(r'<iframe .*?src="(.+?)"', webpage,
  71. u'embed url')
  72. return self.url_result(embed_url, ie='TechTVMIT')
  73. class OCWMITIE(InfoExtractor):
  74. IE_NAME = u'ocw.mit.edu'
  75. _VALID_URL = r'^http://ocw\.mit\.edu/courses/(?P<topic>[a-z0-9\-]+)'
  76. _BASE_URL = u'http://ocw.mit.edu/'
  77. _TESTS = [
  78. {
  79. u'url': u'http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-fall-2010/video-lectures/lecture-7-multiple-variables-expectations-independence/',
  80. u'md5': u'348bef727b573c0bd9ad8a7c08c89ebd',
  81. u'info_dict': {
  82. u'title': u'7. Discrete Random Variables III',
  83. u'description': u'In this lecture, the professor discussed multiple random variables, expectations, and binomial distribution.',
  84. u'subtitles': u'http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-041-probabilistic-systems-analysis-and-applied-probability-fall-2010/video-lectures/lecture-7-multiple-variables-expectations-independence/MIT6_041F11_lec07_300k.mp4.srt'
  85. }
  86. },
  87. {
  88. u'url': u'http://ocw.mit.edu/courses/mathematics/18-01sc-single-variable-calculus-fall-2010/1.-differentiation/part-a-definition-and-basic-rules/session-1-introduction-to-derivatives/',
  89. u'md5': u'f4a434f08f15e581eb67cec0b57bcf6f',
  90. u'info_dict': {
  91. u'title': u'Lec 1 _ MIT 18.01 Single Variable Calculus, Fall 2007',
  92. u'subtitles': u'http://ocw.mit.edu//courses/mathematics/18-01sc-single-variable-calculus-fall-2010/ocw-18.01-f07-lec01_300k.SRT'
  93. }
  94. }
  95. ]
  96. def _real_extract(self, url):
  97. webpage = self._download_webpage(url, self.IE_NAME)
  98. title = self._html_search_meta(u'WT.cg_s', webpage)
  99. description = self._html_search_meta(u'Description', webpage)
  100. # search for call to ocw_embed_chapter_media(container_id, media_url, provider, page_url, image_url, start, stop, captions_file)
  101. embed_chapter_media = re.search(r'ocw_embed_chapter_media\((.+?)\)', webpage)
  102. if embed_chapter_media:
  103. metadata = re.sub(r'[\'"]', u'', embed_chapter_media.group(1))
  104. metadata = re.split(r', ?', metadata)
  105. yt = metadata[1]
  106. subs = compat_urlparse.urljoin(self._BASE_URL, metadata[7])
  107. else:
  108. # search for call to ocw_embed_chapter_media(container_id, media_url, provider, page_url, image_url, captions_file)
  109. embed_media = re.search(r'ocw_embed_media\((.+?)\)', webpage)
  110. if embed_media:
  111. metadata = re.sub(r'[\'"]', u'', embed_media.group(1))
  112. metadata = re.split(r', ?', metadata)
  113. yt = metadata[1]
  114. subs = compat_urlparse.urljoin(self._BASE_URL, metadata[5])
  115. else:
  116. raise ExtractorError('Unable to find embedded YouTube video.')
  117. data = self.url_result(yt, 'Youtube')
  118. data['subtitles'] = subs
  119. return data