webcaster.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. import re
  2. from .common import InfoExtractor
  3. from ..utils import (
  4. determine_ext,
  5. join_nonempty,
  6. xpath_text,
  7. )
  8. class WebcasterIE(InfoExtractor):
  9. _VALID_URL = r'https?://bl\.webcaster\.pro/(?:quote|media)/start/free_(?P<id>[^/]+)'
  10. _TESTS = [{
  11. # http://video.khl.ru/quotes/393859
  12. 'url': 'http://bl.webcaster.pro/quote/start/free_c8cefd240aa593681c8d068cff59f407_hd/q393859/eb173f99dd5f558674dae55f4ba6806d/1480289104?sr%3D105%26fa%3D1%26type_id%3D18',
  13. 'md5': '0c162f67443f30916ff1c89425dcd4cd',
  14. 'info_dict': {
  15. 'id': 'c8cefd240aa593681c8d068cff59f407_hd',
  16. 'ext': 'mp4',
  17. 'title': 'Сибирь - Нефтехимик. Лучшие моменты первого периода',
  18. 'thumbnail': r're:^https?://.*\.jpg$',
  19. },
  20. }, {
  21. 'url': 'http://bl.webcaster.pro/media/start/free_6246c7a4453ac4c42b4398f840d13100_hd/2_2991109016/e8d0d82587ef435480118f9f9c41db41/4635726126',
  22. 'only_matching': True,
  23. }]
  24. def _real_extract(self, url):
  25. video_id = self._match_id(url)
  26. video = self._download_xml(url, video_id)
  27. title = xpath_text(video, './/event_name', 'event name', fatal=True)
  28. formats = []
  29. for format_id in (None, 'noise'):
  30. track_tag = join_nonempty('track', format_id, delim='_')
  31. for track in video.findall(f'.//iphone/{track_tag}'):
  32. track_url = track.text
  33. if not track_url:
  34. continue
  35. if determine_ext(track_url) == 'm3u8':
  36. m3u8_formats = self._extract_m3u8_formats(
  37. track_url, video_id, 'mp4',
  38. entry_protocol='m3u8_native',
  39. m3u8_id=join_nonempty('hls', format_id, delim='-'), fatal=False)
  40. for f in m3u8_formats:
  41. f.update({
  42. 'source_preference': 0 if format_id == 'noise' else 1,
  43. 'format_note': track.get('title'),
  44. })
  45. formats.extend(m3u8_formats)
  46. thumbnail = xpath_text(video, './/image', 'thumbnail')
  47. return {
  48. 'id': video_id,
  49. 'title': title,
  50. 'thumbnail': thumbnail,
  51. 'formats': formats,
  52. }
  53. class WebcasterFeedIE(InfoExtractor):
  54. _VALID_URL = r'https?://bl\.webcaster\.pro/feed/start/free_(?P<id>[^/]+)'
  55. _EMBED_REGEX = [r'<(?:object|a[^>]+class=["\']webcaster-player["\'])[^>]+data(?:-config)?=(["\']).*?config=(?P<url>https?://bl\.webcaster\.pro/feed/start/free_.*?)(?:[?&]|\1)']
  56. _TEST = {
  57. 'url': 'http://bl.webcaster.pro/feed/start/free_c8cefd240aa593681c8d068cff59f407_hd/q393859/eb173f99dd5f558674dae55f4ba6806d/1480289104',
  58. 'only_matching': True,
  59. }
  60. def _extract_from_webpage(self, url, webpage):
  61. yield from super()._extract_from_webpage(url, webpage)
  62. for secure in (True, False):
  63. video_url = self._og_search_video_url(webpage, secure=secure, default=None)
  64. if video_url:
  65. mobj = re.search(
  66. r'config=(?P<url>https?://bl\.webcaster\.pro/feed/start/free_[^?&=]+)',
  67. video_url)
  68. if mobj:
  69. yield self.url_result(mobj.group('url'), self)
  70. def _real_extract(self, url):
  71. video_id = self._match_id(url)
  72. feed = self._download_xml(url, video_id)
  73. video_url = xpath_text(
  74. feed, ('video_hd', 'video'), 'video url', fatal=True)
  75. return self.url_result(video_url, WebcasterIE.ie_key())