mediaklikk.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import urllib.parse
  2. from .common import InfoExtractor
  3. from ..utils import (
  4. ExtractorError,
  5. traverse_obj,
  6. unified_strdate,
  7. url_or_none,
  8. )
  9. class MediaKlikkIE(InfoExtractor):
  10. _VALID_URL = r'''(?x)https?://(?:www\.)?
  11. (?:mediaklikk|m4sport|hirado|petofilive)\.hu/.*?(?:videok?|cikk)/
  12. (?:(?P<year>[0-9]{4})/(?P<month>[0-9]{1,2})/(?P<day>[0-9]{1,2})/)?
  13. (?P<id>[^/#?_]+)'''
  14. _TESTS = [{
  15. # (old) mediaklikk. date in html.
  16. 'url': 'https://mediaklikk.hu/video/hazajaro-delnyugat-bacska-a-duna-menten-palankatol-doroszloig/',
  17. 'info_dict': {
  18. 'id': '4754129',
  19. 'title': 'Hazajáró, DÉLNYUGAT-BÁCSKA – A Duna mentén Palánkától Doroszlóig',
  20. 'ext': 'mp4',
  21. 'upload_date': '20210901',
  22. 'thumbnail': 'http://mediaklikk.hu/wp-content/uploads/sites/4/2014/02/hazajarouj_JO.jpg',
  23. },
  24. 'skip': 'Webpage redirects to 404 page',
  25. }, {
  26. # mediaklikk. date in html.
  27. 'url': 'https://mediaklikk.hu/video/hazajaro-fabova-hegyseg-kishont-koronaja/',
  28. 'info_dict': {
  29. 'id': '6696133',
  30. 'title': 'Hazajáró, Fabova-hegység - Kishont koronája',
  31. 'display_id': 'hazajaro-fabova-hegyseg-kishont-koronaja',
  32. 'ext': 'mp4',
  33. 'upload_date': '20230903',
  34. 'thumbnail': 'https://mediaklikk.hu/wp-content/uploads/sites/4/2014/02/hazajarouj_JO.jpg',
  35. },
  36. }, {
  37. # (old) m4sport
  38. 'url': 'https://m4sport.hu/video/2021/08/30/gyemant-liga-parizs/',
  39. 'info_dict': {
  40. 'id': '4754999',
  41. 'title': 'Gyémánt Liga, Párizs',
  42. 'ext': 'mp4',
  43. 'upload_date': '20210830',
  44. 'thumbnail': 'http://m4sport.hu/wp-content/uploads/sites/4/2021/08/vlcsnap-2021-08-30-18h21m20s10-1024x576.jpg',
  45. },
  46. 'skip': 'Webpage redirects to 404 page',
  47. }, {
  48. # m4sport
  49. 'url': 'https://m4sport.hu/sportkozvetitesek/video/2023/09/08/atletika-gyemant-liga-brusszel/',
  50. 'info_dict': {
  51. 'id': '6711136',
  52. 'title': 'Atlétika – Gyémánt Liga, Brüsszel',
  53. 'display_id': 'atletika-gyemant-liga-brusszel',
  54. 'ext': 'mp4',
  55. 'upload_date': '20230908',
  56. 'thumbnail': 'https://m4sport.hu/wp-content/uploads/sites/4/2023/09/vlcsnap-2023-09-08-22h43m18s691.jpg',
  57. },
  58. }, {
  59. # m4sport with *video/ url and no date
  60. 'url': 'https://m4sport.hu/bl-video/real-madrid-chelsea-1-1/',
  61. 'info_dict': {
  62. 'id': '4492099',
  63. 'title': 'Real Madrid - Chelsea 1-1',
  64. 'display_id': 'real-madrid-chelsea-1-1',
  65. 'ext': 'mp4',
  66. 'thumbnail': 'https://m4sport.hu/wp-content/uploads/sites/4/2021/04/Sequence-01.Still001-1024x576.png',
  67. },
  68. }, {
  69. # (old) hirado
  70. 'url': 'https://hirado.hu/videok/felteteleket-szabott-a-fovaros/',
  71. 'info_dict': {
  72. 'id': '4760120',
  73. 'title': 'Feltételeket szabott a főváros',
  74. 'ext': 'mp4',
  75. 'thumbnail': 'http://hirado.hu/wp-content/uploads/sites/4/2021/09/vlcsnap-2021-09-01-20h20m37s165.jpg',
  76. },
  77. 'skip': 'Webpage redirects to video list page',
  78. }, {
  79. # hirado
  80. 'url': 'https://hirado.hu/belfold/video/2023/09/11/marad-az-eves-elszamolas-a-napelemekre-beruhazo-csaladoknal',
  81. 'info_dict': {
  82. 'id': '6716068',
  83. 'title': 'Marad az éves elszámolás a napelemekre beruházó családoknál',
  84. 'display_id': 'marad-az-eves-elszamolas-a-napelemekre-beruhazo-csaladoknal',
  85. 'ext': 'mp4',
  86. 'upload_date': '20230911',
  87. 'thumbnail': 'https://hirado.hu/wp-content/uploads/sites/4/2023/09/vlcsnap-2023-09-11-09h16m09s882.jpg',
  88. },
  89. }, {
  90. # (old) petofilive
  91. 'url': 'https://petofilive.hu/video/2021/06/07/tha-shudras-az-akusztikban/',
  92. 'info_dict': {
  93. 'id': '4571948',
  94. 'title': 'Tha Shudras az Akusztikban',
  95. 'ext': 'mp4',
  96. 'upload_date': '20210607',
  97. 'thumbnail': 'http://petofilive.hu/wp-content/uploads/sites/4/2021/06/vlcsnap-2021-06-07-22h14m23s915-1024x576.jpg',
  98. },
  99. 'skip': 'Webpage redirects to empty page',
  100. }, {
  101. # petofilive
  102. 'url': 'https://petofilive.hu/video/2023/09/09/futball-fesztival-a-margitszigeten/',
  103. 'info_dict': {
  104. 'id': '6713233',
  105. 'title': 'Futball Fesztivál a Margitszigeten',
  106. 'display_id': 'futball-fesztival-a-margitszigeten',
  107. 'ext': 'mp4',
  108. 'upload_date': '20230909',
  109. 'thumbnail': 'https://petofilive.hu/wp-content/uploads/sites/4/2023/09/Clipboard11-2.jpg',
  110. },
  111. }]
  112. def _real_extract(self, url):
  113. mobj = self._match_valid_url(url)
  114. display_id = mobj.group('id')
  115. webpage = self._download_webpage(url, display_id)
  116. player_data_str = self._html_search_regex(
  117. r'mtva_player_manager\.player\(document.getElementById\(.*\),\s?(\{.*\}).*\);', webpage, 'player data')
  118. player_data = self._parse_json(player_data_str, display_id, urllib.parse.unquote)
  119. video_id = str(player_data['contentId'])
  120. title = player_data.get('title') or self._og_search_title(webpage, fatal=False) or \
  121. self._html_search_regex(r'<h\d+\b[^>]+\bclass="article_title">([^<]+)<', webpage, 'title')
  122. upload_date = unified_strdate(
  123. '{}-{}-{}'.format(mobj.group('year'), mobj.group('month'), mobj.group('day')))
  124. if not upload_date:
  125. upload_date = unified_strdate(self._html_search_regex(
  126. r'<p+\b[^>]+\bclass="article_date">([^<]+)<', webpage, 'upload date', default=None))
  127. player_data['video'] = player_data.pop('token')
  128. player_page = self._download_webpage('https://player.mediaklikk.hu/playernew/player.php', video_id, query=player_data)
  129. player_json = self._search_json(
  130. r'\bpl\.setup\s*\(', player_page, 'player json', video_id, end_pattern=r'\);')
  131. playlist_url = traverse_obj(
  132. player_json, ('playlist', lambda _, v: v['type'] == 'hls', 'file', {url_or_none}), get_all=False)
  133. if not playlist_url:
  134. raise ExtractorError('Unable to extract playlist url')
  135. formats = self._extract_wowza_formats(
  136. playlist_url, video_id, skip_protocols=['f4m', 'smil', 'dash'])
  137. return {
  138. 'id': video_id,
  139. 'title': title,
  140. 'display_id': display_id,
  141. 'formats': formats,
  142. 'upload_date': upload_date,
  143. 'thumbnail': player_data.get('bgImage') or self._og_search_thumbnail(webpage),
  144. }