amadeustv.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. from .common import InfoExtractor
  2. from ..utils import (
  3. ExtractorError,
  4. float_or_none,
  5. int_or_none,
  6. parse_iso8601,
  7. url_or_none,
  8. )
  9. from ..utils.traversal import traverse_obj
  10. class AmadeusTVIE(InfoExtractor):
  11. _VALID_URL = r'https?://(?:www\.)?amadeus\.tv/library/(?P<id>[\da-f]+)'
  12. _TESTS = [{
  13. 'url': 'http://www.amadeus.tv/library/65091a87ff85af59d9fc54c3',
  14. 'info_dict': {
  15. 'id': '5576678021301411311',
  16. 'ext': 'mp4',
  17. 'title': 'Jieon Park - 第五届珠海莫扎特国际青少年音乐周小提琴C组第三轮',
  18. 'thumbnail': 'http://1253584441.vod2.myqcloud.com/a0046a27vodtransbj1253584441/7db4af535576678021301411311/coverBySnapshot_10_0.jpg',
  19. 'duration': 1264.8,
  20. 'upload_date': '20230918',
  21. 'timestamp': 1695034800,
  22. 'display_id': '65091a87ff85af59d9fc54c3',
  23. 'view_count': int,
  24. 'description': 'md5:a0357b9c215489e2067cbae0b777bb95',
  25. },
  26. }]
  27. def _real_extract(self, url):
  28. display_id = self._match_id(url)
  29. webpage = self._download_webpage(url, display_id)
  30. nuxt_data = self._search_nuxt_data(webpage, display_id, traverse=('fetch', '0'))
  31. video_id = traverse_obj(nuxt_data, ('item', 'video', {str}))
  32. if not video_id:
  33. raise ExtractorError('Unable to extract actual video ID')
  34. video_data = self._download_json(
  35. f'http://playvideo.qcloud.com/getplayinfo/v2/1253584441/{video_id}',
  36. video_id, headers={'Referer': 'http://www.amadeus.tv/'})
  37. formats = []
  38. for video in traverse_obj(video_data, ('videoInfo', ('sourceVideo', ('transcodeList', ...)), {dict})):
  39. if not url_or_none(video.get('url')):
  40. continue
  41. formats.append({
  42. **traverse_obj(video, {
  43. 'url': 'url',
  44. 'format_id': ('definition', {lambda x: f'http-{x or "0"}'}),
  45. 'width': ('width', {int_or_none}),
  46. 'height': ('height', {int_or_none}),
  47. 'filesize': (('totalSize', 'size'), {int_or_none}),
  48. 'vcodec': ('videoStreamList', 0, 'codec'),
  49. 'acodec': ('audioStreamList', 0, 'codec'),
  50. 'fps': ('videoStreamList', 0, 'fps', {float_or_none}),
  51. }, get_all=False),
  52. 'http_headers': {'Referer': 'http://www.amadeus.tv/'},
  53. })
  54. return {
  55. 'id': video_id,
  56. 'display_id': display_id,
  57. 'formats': formats,
  58. **traverse_obj(video_data, {
  59. 'title': ('videoInfo', 'basicInfo', 'name', {str}),
  60. 'thumbnail': ('coverInfo', 'coverUrl', {url_or_none}),
  61. 'duration': ('videoInfo', 'sourceVideo', ('floatDuration', 'duration'), {float_or_none}),
  62. }, get_all=False),
  63. **traverse_obj(nuxt_data, ('item', {
  64. 'title': (('title', 'title_en', 'title_cn'), {str}),
  65. 'description': (('description', 'description_en', 'description_cn'), {str}),
  66. 'timestamp': ('date', {parse_iso8601}),
  67. 'view_count': ('view', {int_or_none}),
  68. }), get_all=False),
  69. }