toggo.py 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. from .common import InfoExtractor
  2. from ..utils import int_or_none, parse_qs
  3. class ToggoIE(InfoExtractor):
  4. IE_NAME = 'toggo'
  5. _VALID_URL = r'https?://(?:www\.)?toggo\.de/(?:toggolino/)?[^/?#]+/(?:folge|video)/(?P<id>[^/?#]+)'
  6. _TESTS = [{
  7. 'url': 'https://www.toggo.de/weihnachtsmann--co-kg/folge/ein-geschenk-fuer-zwei',
  8. 'info_dict': {
  9. 'id': 'VEP2977',
  10. 'ext': 'mp4',
  11. 'title': 'Ein Geschenk für zwei',
  12. 'display_id': 'ein-geschenk-fuer-zwei',
  13. 'thumbnail': r're:^https?://.*\.(?:jpg|png)',
  14. 'description': 'md5:b7715915bfa47824b4e4ad33fb5962f8',
  15. 'release_timestamp': 1637259179,
  16. 'series': 'Weihnachtsmann & Co. KG',
  17. 'season': 'Weihnachtsmann & Co. KG',
  18. 'season_number': 1,
  19. 'season_id': 'VST118',
  20. 'episode': 'Ein Geschenk für zwei',
  21. 'episode_number': 7,
  22. 'episode_id': 'VEP2977',
  23. 'timestamp': 1581935960,
  24. 'uploader_id': '6057955896001',
  25. 'upload_date': '20200217',
  26. },
  27. 'params': {'skip_download': True},
  28. }, {
  29. 'url': 'https://www.toggo.de/grizzy--die-lemminge/folge/ab-durch-die-wand-vogelfrei-rock\'n\'lemming',
  30. 'only_matching': True,
  31. }, {
  32. 'url': 'https://www.toggo.de/toggolino/paw-patrol/folge/der-wetter-zeppelin-der-chili-kochwettbewerb',
  33. 'only_matching': True,
  34. }, {
  35. 'url': 'https://www.toggo.de/toggolino/paw-patrol/video/paw-patrol-rettung-im-anflug',
  36. 'only_matching': True,
  37. }]
  38. def _real_extract(self, url):
  39. display_id = self._match_id(url)
  40. data = self._download_json(
  41. f'https://production-n.toggo.de/api/assetstore/vod/asset/{display_id}', display_id)['data']
  42. brightcove_id = next(
  43. x['value'] for x in data['custom_fields'] if x.get('key') == 'video-cloud-id')
  44. info = self._downloader.get_info_extractor('BrightcoveNew').extract(
  45. f'http://players.brightcove.net/6057955896001/default_default/index.html?videoId={brightcove_id}')
  46. for f in info['formats']:
  47. if '/dash/live/cenc/' in f.get('fragment_base_url', ''):
  48. # Get hidden non-DRM format
  49. f['fragment_base_url'] = f['fragment_base_url'].replace('/cenc/', '/clear/')
  50. f['has_drm'] = False
  51. if '/fairplay/' in f.get('manifest_url', ''):
  52. f['has_drm'] = True
  53. thumbnails = [{
  54. 'id': name,
  55. 'url': url,
  56. 'width': int_or_none(next(iter(parse_qs(url).get('width', [])), None)),
  57. } for name, url in (data.get('images') or {}).items()]
  58. return {
  59. **info,
  60. 'id': data.get('id'),
  61. 'display_id': display_id,
  62. 'title': data.get('title'),
  63. 'language': data.get('language'),
  64. 'thumbnails': thumbnails,
  65. 'description': data.get('description'),
  66. 'release_timestamp': data.get('earliest_start_date'),
  67. 'series': data.get('series_title'),
  68. 'season': data.get('season_title'),
  69. 'season_number': data.get('season_no'),
  70. 'season_id': data.get('season_id'),
  71. 'episode': data.get('title'),
  72. 'episode_number': data.get('episode_no'),
  73. 'episode_id': data.get('id'),
  74. }