sixplay.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # coding: utf-8
  2. from __future__ import unicode_literals
  3. import re
  4. from .common import InfoExtractor
  5. from ..compat import (
  6. compat_parse_qs,
  7. compat_str,
  8. compat_urllib_parse_urlparse,
  9. )
  10. from ..utils import (
  11. determine_ext,
  12. int_or_none,
  13. try_get,
  14. qualities,
  15. )
  16. class SixPlayIE(InfoExtractor):
  17. IE_NAME = '6play'
  18. _VALID_URL = r'(?:6play:|https?://(?:www\.)?6play\.fr/.+?-c_)(?P<id>[0-9]+)'
  19. _TEST = {
  20. 'url': 'http://www.6play.fr/le-meilleur-patissier-p_1807/le-meilleur-patissier-special-fetes-mercredi-a-21-00-sur-m6-c_11638450',
  21. 'md5': '42310bffe4ba3982db112b9cd3467328',
  22. 'info_dict': {
  23. 'id': '11638450',
  24. 'ext': 'mp4',
  25. 'title': 'Le Meilleur Pâtissier, spécial fêtes mercredi à 21:00 sur M6',
  26. 'description': 'md5:308853f6a5f9e2d55a30fc0654de415f',
  27. 'duration': 39,
  28. 'series': 'Le meilleur pâtissier',
  29. },
  30. 'params': {
  31. 'skip_download': True,
  32. },
  33. }
  34. def _real_extract(self, url):
  35. video_id = self._match_id(url)
  36. data = self._download_json(
  37. 'https://pc.middleware.6play.fr/6play/v2/platforms/m6group_web/services/6play/videos/clip_%s' % video_id,
  38. video_id, query={
  39. 'csa': 5,
  40. 'with': 'clips',
  41. })
  42. clip_data = data['clips'][0]
  43. title = clip_data['title']
  44. urls = []
  45. quality_key = qualities(['lq', 'sd', 'hq', 'hd'])
  46. formats = []
  47. for asset in clip_data['assets']:
  48. asset_url = asset.get('full_physical_path')
  49. protocol = asset.get('protocol')
  50. if not asset_url or protocol == 'primetime' or asset_url in urls:
  51. continue
  52. urls.append(asset_url)
  53. container = asset.get('video_container')
  54. ext = determine_ext(asset_url)
  55. if container == 'm3u8' or ext == 'm3u8':
  56. if protocol == 'usp' and not compat_parse_qs(compat_urllib_parse_urlparse(asset_url).query).get('token', [None])[0]:
  57. asset_url = re.sub(r'/([^/]+)\.ism/[^/]*\.m3u8', r'/\1.ism/\1.m3u8', asset_url)
  58. formats.extend(self._extract_m3u8_formats(
  59. asset_url, video_id, 'mp4', 'm3u8_native',
  60. m3u8_id='hls', fatal=False))
  61. formats.extend(self._extract_f4m_formats(
  62. asset_url.replace('.m3u8', '.f4m'),
  63. video_id, f4m_id='hds', fatal=False))
  64. formats.extend(self._extract_mpd_formats(
  65. asset_url.replace('.m3u8', '.mpd'),
  66. video_id, mpd_id='dash', fatal=False))
  67. formats.extend(self._extract_ism_formats(
  68. re.sub(r'/[^/]+\.m3u8', '/Manifest', asset_url),
  69. video_id, ism_id='mss', fatal=False))
  70. else:
  71. formats.extend(self._extract_m3u8_formats(
  72. asset_url, video_id, 'mp4', 'm3u8_native',
  73. m3u8_id='hls', fatal=False))
  74. elif container == 'mp4' or ext == 'mp4':
  75. quality = asset.get('video_quality')
  76. formats.append({
  77. 'url': asset_url,
  78. 'format_id': quality,
  79. 'quality': quality_key(quality),
  80. 'ext': ext,
  81. })
  82. self._sort_formats(formats)
  83. def get(getter):
  84. for src in (data, clip_data):
  85. v = try_get(src, getter, compat_str)
  86. if v:
  87. return v
  88. return {
  89. 'id': video_id,
  90. 'title': title,
  91. 'description': get(lambda x: x['description']),
  92. 'duration': int_or_none(clip_data.get('duration')),
  93. 'series': get(lambda x: x['program']['title']),
  94. 'formats': formats,
  95. }