rtvs.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import re
  2. from .common import InfoExtractor
  3. from ..utils import (
  4. parse_duration,
  5. traverse_obj,
  6. unified_timestamp,
  7. )
  8. class RTVSIE(InfoExtractor):
  9. _VALID_URL = r'https?://(?:www\.)?rtvs\.sk/(?:radio|televizia)/archiv(?:/\d+)?/(?P<id>\d+)/?(?:[#?]|$)'
  10. _TESTS = [{
  11. # radio archive
  12. 'url': 'http://www.rtvs.sk/radio/archiv/11224/414872',
  13. 'md5': '134d5d6debdeddf8a5d761cbc9edacb8',
  14. 'info_dict': {
  15. 'id': '414872',
  16. 'ext': 'mp3',
  17. 'title': 'Ostrov pokladov 1 časť.mp3',
  18. 'duration': 2854,
  19. 'thumbnail': 'https://www.rtvs.sk/media/a501/image/file/2/0000/b1R8.rtvs.jpg',
  20. 'display_id': '135331',
  21. },
  22. }, {
  23. # tv archive
  24. 'url': 'http://www.rtvs.sk/televizia/archiv/8249/63118',
  25. 'info_dict': {
  26. 'id': '63118',
  27. 'ext': 'mp4',
  28. 'title': 'Amaro Džives - Náš deň',
  29. 'description': 'Galavečer pri príležitosti Medzinárodného dňa Rómov.',
  30. 'thumbnail': 'https://www.rtvs.sk/media/a501/image/file/2/0031/L7Qm.amaro_dzives_png.jpg',
  31. 'timestamp': 1428555900,
  32. 'upload_date': '20150409',
  33. 'duration': 4986,
  34. },
  35. }, {
  36. # tv archive
  37. 'url': 'https://www.rtvs.sk/televizia/archiv/18083?utm_source=web&utm_medium=rozcestnik&utm_campaign=Robin',
  38. 'info_dict': {
  39. 'id': '18083',
  40. 'ext': 'mp4',
  41. 'title': 'Robin',
  42. 'description': 'md5:2f70505a7b8364491003d65ff7a0940a',
  43. 'timestamp': 1636652760,
  44. 'display_id': '307655',
  45. 'duration': 831,
  46. 'upload_date': '20211111',
  47. 'thumbnail': 'https://www.rtvs.sk/media/a501/image/file/2/0916/robin.jpg',
  48. },
  49. }]
  50. def _real_extract(self, url):
  51. video_id = self._match_id(url)
  52. webpage = self._download_webpage(url, video_id)
  53. iframe_id = self._search_regex(
  54. r'<iframe[^>]+id\s*=\s*"player_[^_]+_([0-9]+)"', webpage, 'Iframe ID')
  55. iframe_url = self._search_regex(
  56. fr'<iframe[^>]+id\s*=\s*"player_[^_]+_{re.escape(iframe_id)}"[^>]+src\s*=\s*"([^"]+)"', webpage, 'Iframe URL')
  57. webpage = self._download_webpage(iframe_url, video_id, 'Downloading iframe')
  58. json_url = self._search_regex(r'var\s+url\s*=\s*"([^"]+)"\s*\+\s*ruurl', webpage, 'json URL')
  59. data = self._download_json(f'https:{json_url}b=mozilla&p=win&v=97&f=0&d=1', video_id)
  60. if data.get('clip'):
  61. data['playlist'] = [data['clip']]
  62. if traverse_obj(data, ('playlist', 0, 'sources', 0, 'type')) == 'audio/mp3':
  63. formats = [{'url': traverse_obj(data, ('playlist', 0, 'sources', 0, 'src'))}]
  64. else:
  65. formats = self._extract_m3u8_formats(traverse_obj(data, ('playlist', 0, 'sources', 0, 'src')), video_id)
  66. return {
  67. 'id': video_id,
  68. 'display_id': iframe_id,
  69. 'title': traverse_obj(data, ('playlist', 0, 'title')),
  70. 'description': traverse_obj(data, ('playlist', 0, 'description')),
  71. 'duration': parse_duration(traverse_obj(data, ('playlist', 0, 'length'))),
  72. 'thumbnail': traverse_obj(data, ('playlist', 0, 'image')),
  73. 'timestamp': unified_timestamp(traverse_obj(data, ('playlist', 0, 'datetime_create'))),
  74. 'formats': formats,
  75. }