You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

63 lines
2.8 KiB

  1. import re
  2. import json
  3. from .common import InfoExtractor
  4. from ..utils import unescapeHTML
  5. class OoyalaIE(InfoExtractor):
  6. _VALID_URL = r'https?://.+?\.ooyala\.com/.*?(?:embedCode|ec)=(?P<id>.+?)(&|$)'
  7. _TEST = {
  8. # From http://it.slashdot.org/story/13/04/25/178216/recovering-data-from-broken-hard-drives-and-ssds-video
  9. u'url': u'http://player.ooyala.com/player.js?embedCode=pxczE2YjpfHfn1f3M-ykG_AmJRRn0PD8',
  10. u'file': u'pxczE2YjpfHfn1f3M-ykG_AmJRRn0PD8.mp4',
  11. u'md5': u'3f5cceb3a7bf461d6c29dc466cf8033c',
  12. u'info_dict': {
  13. u'title': u'Explaining Data Recovery from Hard Drives and SSDs',
  14. u'description': u'How badly damaged does a drive have to be to defeat Russell and his crew? Apparently, smashed to bits.',
  15. },
  16. }
  17. @staticmethod
  18. def _url_for_embed_code(embed_code):
  19. return 'http://player.ooyala.com/player.js?embedCode=%s' % embed_code
  20. @classmethod
  21. def _build_url_result(cls, embed_code):
  22. return cls.url_result(cls._url_for_embed_code(embed_code),
  23. ie=cls.ie_key())
  24. def _extract_result(self, info, more_info):
  25. return {'id': info['embedCode'],
  26. 'ext': 'mp4',
  27. 'title': unescapeHTML(info['title']),
  28. 'url': info.get('ipad_url') or info['url'],
  29. 'description': unescapeHTML(more_info['description']),
  30. 'thumbnail': more_info['promo'],
  31. }
  32. def _real_extract(self, url):
  33. mobj = re.match(self._VALID_URL, url)
  34. embedCode = mobj.group('id')
  35. player_url = 'http://player.ooyala.com/player.js?embedCode=%s' % embedCode
  36. player = self._download_webpage(player_url, embedCode)
  37. mobile_url = self._search_regex(r'mobile_player_url="(.+?)&device="',
  38. player, u'mobile player url')
  39. mobile_player = self._download_webpage(mobile_url, embedCode)
  40. videos_info = self._search_regex(
  41. r'var streams=window.oo_testEnv\?\[\]:eval\("\((\[{.*?}\])\)"\);',
  42. mobile_player, u'info').replace('\\"','"')
  43. videos_more_info = self._search_regex(r'eval\("\(({.*?\\"promo\\".*?})\)"', mobile_player, u'more info').replace('\\"','"')
  44. videos_info = json.loads(videos_info)
  45. videos_more_info =json.loads(videos_more_info)
  46. if videos_more_info.get('lineup'):
  47. videos = [self._extract_result(info, more_info) for (info, more_info) in zip(videos_info, videos_more_info['lineup'])]
  48. return {'_type': 'playlist',
  49. 'id': embedCode,
  50. 'title': unescapeHTML(videos_more_info['title']),
  51. 'entries': videos,
  52. }
  53. else:
  54. return self._extract_result(videos_info[0], videos_more_info)