dailywire.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. from .common import InfoExtractor
  2. from ..utils import (
  3. determine_ext,
  4. float_or_none,
  5. join_nonempty,
  6. traverse_obj,
  7. url_or_none,
  8. )
  9. class DailyWireBaseIE(InfoExtractor):
  10. _JSON_PATH = {
  11. 'episode': ('props', 'pageProps', 'episodeData', 'episode'),
  12. 'videos': ('props', 'pageProps', 'videoData', 'video'),
  13. 'podcasts': ('props', 'pageProps', 'episode'),
  14. }
  15. def _get_json(self, url):
  16. sites_type, slug = self._match_valid_url(url).group('sites_type', 'id')
  17. json_data = self._search_nextjs_data(self._download_webpage(url, slug), slug)
  18. return slug, traverse_obj(json_data, self._JSON_PATH[sites_type])
  19. class DailyWireIE(DailyWireBaseIE):
  20. _VALID_URL = r'https?://(?:www\.)dailywire(?:\.com)/(?P<sites_type>episode|videos)/(?P<id>[\w-]+)'
  21. _TESTS = [{
  22. 'url': 'https://www.dailywire.com/episode/1-fauci',
  23. 'info_dict': {
  24. 'id': 'ckzsl50xnqpy30850in3v4bu7',
  25. 'ext': 'mp4',
  26. 'display_id': '1-fauci',
  27. 'title': '1. Fauci',
  28. 'description': 'md5:9df630347ef85081b7e97dd30bc22853',
  29. 'thumbnail': 'https://daily-wire-production.imgix.net/episodes/ckzsl50xnqpy30850in3v4bu7/ckzsl50xnqpy30850in3v4bu7-1648237399554.jpg',
  30. 'creator': 'Caroline Roberts',
  31. 'series_id': 'ckzplm0a097fn0826r2vc3j7h',
  32. 'series': 'China: The Enemy Within',
  33. },
  34. }, {
  35. 'url': 'https://www.dailywire.com/episode/ep-124-bill-maher',
  36. 'info_dict': {
  37. 'id': 'cl0ngbaalplc80894sfdo9edf',
  38. 'ext': 'mp3',
  39. 'display_id': 'ep-124-bill-maher',
  40. 'title': 'Ep. 124 - Bill Maher',
  41. 'thumbnail': 'https://daily-wire-production.imgix.net/episodes/cl0ngbaalplc80894sfdo9edf/cl0ngbaalplc80894sfdo9edf-1647065568518.jpg',
  42. 'creator': 'Caroline Roberts',
  43. 'description': 'md5:adb0de584bcfa9c41374999d9e324e98',
  44. 'series_id': 'cjzvep7270hp00786l9hwccob',
  45. 'series': 'The Sunday Special',
  46. },
  47. }, {
  48. 'url': 'https://www.dailywire.com/videos/the-hyperions',
  49. 'only_matching': True,
  50. }]
  51. def _real_extract(self, url):
  52. slug, episode_info = self._get_json(url)
  53. urls = traverse_obj(
  54. episode_info, (('segments', 'videoUrl'), ..., ('video', 'audio')), expected_type=url_or_none)
  55. formats, subtitles = [], {}
  56. for url in urls:
  57. if determine_ext(url) != 'm3u8':
  58. formats.append({'url': url})
  59. continue
  60. format_, subs_ = self._extract_m3u8_formats_and_subtitles(url, slug)
  61. formats.extend(format_)
  62. self._merge_subtitles(subs_, target=subtitles)
  63. return {
  64. 'id': episode_info['id'],
  65. 'display_id': slug,
  66. 'title': traverse_obj(episode_info, 'title', 'name'),
  67. 'description': episode_info.get('description'),
  68. 'creator': join_nonempty(('createdBy', 'firstName'), ('createdBy', 'lastName'), from_dict=episode_info, delim=' '),
  69. 'duration': float_or_none(episode_info.get('duration')),
  70. 'is_live': episode_info.get('isLive'),
  71. 'thumbnail': traverse_obj(episode_info, 'thumbnail', 'image', expected_type=url_or_none),
  72. 'formats': formats,
  73. 'subtitles': subtitles,
  74. 'series_id': traverse_obj(episode_info, ('show', 'id')),
  75. 'series': traverse_obj(episode_info, ('show', 'name')),
  76. }
  77. class DailyWirePodcastIE(DailyWireBaseIE):
  78. _VALID_URL = r'https?://(?:www\.)dailywire(?:\.com)/(?P<sites_type>podcasts)/(?P<podcaster>[\w-]+/(?P<id>[\w-]+))'
  79. _TESTS = [{
  80. 'url': 'https://www.dailywire.com/podcasts/morning-wire/get-ready-for-recession-6-15-22',
  81. 'info_dict': {
  82. 'id': 'cl4f01d0w8pbe0a98ydd0cfn1',
  83. 'ext': 'm4a',
  84. 'display_id': 'get-ready-for-recession-6-15-22',
  85. 'title': 'Get Ready for Recession | 6.15.22',
  86. 'description': 'md5:c4afbadda4e1c38a4496f6d62be55634',
  87. 'thumbnail': 'https://daily-wire-production.imgix.net/podcasts/ckx4otgd71jm508699tzb6hf4-1639506575562.jpg',
  88. 'duration': 900.117667,
  89. },
  90. }]
  91. def _real_extract(self, url):
  92. slug, episode_info = self._get_json(url)
  93. audio_id = traverse_obj(episode_info, 'audioMuxPlaybackId', 'VUsAipTrBVSgzw73SpC2DAJD401TYYwEp')
  94. return {
  95. 'id': episode_info['id'],
  96. 'url': f'https://stream.media.dailywire.com/{audio_id}/audio.m4a',
  97. 'display_id': slug,
  98. 'title': episode_info.get('title'),
  99. 'duration': float_or_none(episode_info.get('duration')),
  100. 'thumbnail': episode_info.get('thumbnail'),
  101. 'description': episode_info.get('description'),
  102. }