diff options
| -rw-r--r-- | youtube_dl/extractor/hotstar.py | 46 | 
1 files changed, 32 insertions, 14 deletions
| diff --git a/youtube_dl/extractor/hotstar.py b/youtube_dl/extractor/hotstar.py index f05d765d6..3a7a66a34 100644 --- a/youtube_dl/extractor/hotstar.py +++ b/youtube_dl/extractor/hotstar.py @@ -34,11 +34,9 @@ class HotStarIE(InfoExtractor):          'only_matching': True,      }] -    _GET_CONTENT_TEMPLATE = 'http://account.hotstar.com/AVS/besc?action=GetAggregatedContentDetails&channel=PCTV&contentId=%s' -    _GET_CDN_TEMPLATE = 'http://getcdn.hotstar.com/AVS/besc?action=GetCDN&asJson=Y&channel=%s&id=%s&type=%s' - -    def _download_json(self, url_or_request, video_id, note='Downloading JSON metadata', fatal=True): -        json_data = super(HotStarIE, self)._download_json(url_or_request, video_id, note, fatal=fatal) +    def _download_json(self, url_or_request, video_id, note='Downloading JSON metadata', fatal=True, query=None): +        json_data = super(HotStarIE, self)._download_json( +            url_or_request, video_id, note, fatal=fatal, query=query)          if json_data['resultCode'] != 'OK':              if fatal:                  raise ExtractorError(json_data['errorDescription']) @@ -48,20 +46,37 @@ class HotStarIE(InfoExtractor):      def _real_extract(self, url):          video_id = self._match_id(url)          video_data = self._download_json( -            self._GET_CONTENT_TEMPLATE % video_id, -            video_id)['contentInfo'][0] +            'http://account.hotstar.com/AVS/besc', video_id, query={ +                'action': 'GetAggregatedContentDetails', +                'channel': 'PCTV', +                'contentId': video_id, +            })['contentInfo'][0] +        title = video_data['episodeTitle'] + +        if video_data.get('encrypted') == 'Y': +            raise ExtractorError('This video is DRM protected.', expected=True)          formats = [] -        # PCTV for extracting f4m manifest -        for f in ('TABLET',): +        for f in ('JIO',):              format_data = self._download_json( -                self._GET_CDN_TEMPLATE % (f, video_id, 'VOD'), -                video_id, 'Downloading %s JSON metadata' % f, fatal=False) +                'http://getcdn.hotstar.com/AVS/besc', +                video_id, 'Downloading %s JSON metadata' % f, +                fatal=False, query={ +                    'action': 'GetCDN', +                    'asJson': 'Y', +                    'channel': f, +                    'id': video_id, +                    'type': 'VOD', +                })              if format_data: -                format_url = format_data['src'] +                format_url = format_data.get('src') +                if not format_url: +                    continue                  ext = determine_ext(format_url)                  if ext == 'm3u8': -                    formats.extend(self._extract_m3u8_formats(format_url, video_id, 'mp4', m3u8_id='hls', fatal=False)) +                    formats.extend(self._extract_m3u8_formats( +                        format_url, video_id, 'mp4', +                        m3u8_id='hls', fatal=False))                  elif ext == 'f4m':                      # produce broken files                      continue @@ -75,9 +90,12 @@ class HotStarIE(InfoExtractor):          return {              'id': video_id, -            'title': video_data['episodeTitle'], +            'title': title,              'description': video_data.get('description'),              'duration': int_or_none(video_data.get('duration')),              'timestamp': int_or_none(video_data.get('broadcastDate')),              'formats': formats, +            'episode': title, +            'episode_number': int_or_none(video_data.get('episodeNumber')), +            'series': video_data.get('contentTitle'),          } | 
