dctp.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from .common import InfoExtractor
  2. from ..utils import (
  3. float_or_none,
  4. int_or_none,
  5. unified_timestamp,
  6. url_or_none,
  7. )
  8. class DctpTvIE(InfoExtractor):
  9. _VALID_URL = r'https?://(?:www\.)?dctp\.tv/(?:#/)?filme/(?P<id>[^/?#&]+)'
  10. _TESTS = [{
  11. # 4x3
  12. 'url': 'http://www.dctp.tv/filme/videoinstallation-fuer-eine-kaufhausfassade/',
  13. 'md5': '3ffbd1556c3fe210724d7088fad723e3',
  14. 'info_dict': {
  15. 'id': '95eaa4f33dad413aa17b4ee613cccc6c',
  16. 'display_id': 'videoinstallation-fuer-eine-kaufhausfassade',
  17. 'ext': 'm4v',
  18. 'title': 'Videoinstallation für eine Kaufhausfassade',
  19. 'description': 'Kurzfilm',
  20. 'thumbnail': r're:^https?://.*\.jpg$',
  21. 'duration': 71.24,
  22. 'timestamp': 1302172322,
  23. 'upload_date': '20110407',
  24. },
  25. }, {
  26. # 16x9
  27. 'url': 'http://www.dctp.tv/filme/sind-youtuber-die-besseren-lehrer/',
  28. 'only_matching': True,
  29. }]
  30. _BASE_URL = 'http://dctp-ivms2-restapi.s3.amazonaws.com'
  31. def _real_extract(self, url):
  32. display_id = self._match_id(url)
  33. version = self._download_json(
  34. f'{self._BASE_URL}/version.json', display_id,
  35. 'Downloading version JSON')
  36. restapi_base = '{}/{}/restapi'.format(
  37. self._BASE_URL, version['version_name'])
  38. info = self._download_json(
  39. f'{restapi_base}/slugs/{display_id}.json', display_id,
  40. 'Downloading video info JSON')
  41. media = self._download_json(
  42. '{}/media/{}.json'.format(restapi_base, str(info['object_id'])),
  43. display_id, 'Downloading media JSON')
  44. uuid = media['uuid']
  45. title = media['title']
  46. is_wide = media.get('is_wide')
  47. formats = []
  48. def add_formats(suffix):
  49. templ = f'https://%s/{uuid}_dctp_{suffix}.m4v'
  50. formats.extend([{
  51. 'format_id': 'hls-' + suffix,
  52. 'url': templ % 'cdn-segments.dctp.tv' + '/playlist.m3u8',
  53. 'protocol': 'm3u8_native',
  54. }, {
  55. 'format_id': 's3-' + suffix,
  56. 'url': templ % 'completed-media.s3.amazonaws.com',
  57. }, {
  58. 'format_id': 'http-' + suffix,
  59. 'url': templ % 'cdn-media.dctp.tv',
  60. }])
  61. add_formats('0500_' + ('16x9' if is_wide else '4x3'))
  62. if is_wide:
  63. add_formats('720p')
  64. thumbnails = []
  65. images = media.get('images')
  66. if isinstance(images, list):
  67. for image in images:
  68. if not isinstance(image, dict):
  69. continue
  70. image_url = url_or_none(image.get('url'))
  71. if not image_url:
  72. continue
  73. thumbnails.append({
  74. 'url': image_url,
  75. 'width': int_or_none(image.get('width')),
  76. 'height': int_or_none(image.get('height')),
  77. })
  78. return {
  79. 'id': uuid,
  80. 'display_id': display_id,
  81. 'title': title,
  82. 'alt_title': media.get('subtitle'),
  83. 'description': media.get('description') or media.get('teaser'),
  84. 'timestamp': unified_timestamp(media.get('created')),
  85. 'duration': float_or_none(media.get('duration_in_ms'), scale=1000),
  86. 'thumbnails': thumbnails,
  87. 'formats': formats,
  88. }