magentamusik.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from .common import InfoExtractor
  2. from ..utils import ExtractorError, int_or_none, join_nonempty, url_or_none
  3. from ..utils.traversal import traverse_obj
  4. class MagentaMusikIE(InfoExtractor):
  5. _VALID_URL = r'https?://(?:www\.)?magentamusik\.de/(?P<id>[^/?#]+)'
  6. _TESTS = [{
  7. 'url': 'https://www.magentamusik.de/marty-friedman-woa-2023-9208205928595409235',
  8. 'md5': 'd82dd4748f55fc91957094546aaf8584',
  9. 'info_dict': {
  10. 'id': '9208205928595409235',
  11. 'display_id': 'marty-friedman-woa-2023-9208205928595409235',
  12. 'ext': 'mp4',
  13. 'title': 'Marty Friedman: W:O:A 2023',
  14. 'alt_title': 'Konzert vom: 05.08.2023 13:00',
  15. 'duration': 2760,
  16. 'categories': ['Musikkonzert'],
  17. 'release_year': 2023,
  18. 'location': 'Deutschland',
  19. },
  20. }]
  21. def _real_extract(self, url):
  22. display_id = self._match_id(url)
  23. webpage = self._download_webpage(url, display_id)
  24. player_config = self._search_json(
  25. r'data-js-element="o-video-player__config">', webpage, 'player config', display_id, fatal=False)
  26. if not player_config:
  27. raise ExtractorError('No video found', expected=True)
  28. asset_id = player_config['assetId']
  29. asset_details = self._download_json(
  30. f'https://wcps.t-online.de/cvss/magentamusic/vodclient/v2/assetdetails/58938/{asset_id}',
  31. display_id, note='Downloading asset details')
  32. video_id = traverse_obj(
  33. asset_details, ('content', 'partnerInformation', ..., 'reference', {str}), get_all=False)
  34. if not video_id:
  35. raise ExtractorError('Unable to extract video id')
  36. vod_data = self._download_json(
  37. f'https://wcps.t-online.de/cvss/magentamusic/vodclient/v2/player/58935/{video_id}/Main%20Movie', video_id)
  38. smil_url = traverse_obj(
  39. vod_data, ('content', 'feature', 'representations', ...,
  40. 'contentPackages', ..., 'media', 'href', {url_or_none}), get_all=False)
  41. return {
  42. 'id': video_id,
  43. 'display_id': display_id,
  44. 'formats': self._extract_smil_formats(smil_url, video_id),
  45. **traverse_obj(vod_data, ('content', 'feature', 'metadata', {
  46. 'title': 'title',
  47. 'alt_title': 'originalTitle',
  48. 'description': 'longDescription',
  49. 'duration': ('runtimeInSeconds', {int_or_none}),
  50. 'location': ('countriesOfProduction', {list}, {lambda x: join_nonempty(*x, delim=', ')}),
  51. 'release_year': ('yearOfProduction', {int_or_none}),
  52. 'categories': ('mainGenre', {str}, {lambda x: x and [x]}),
  53. })),
  54. }