diff options
| -rw-r--r-- | youtube_dl/extractor/dplay.py | 66 | 
1 files changed, 42 insertions, 24 deletions
| diff --git a/youtube_dl/extractor/dplay.py b/youtube_dl/extractor/dplay.py index 1a41760f8..76e784105 100644 --- a/youtube_dl/extractor/dplay.py +++ b/youtube_dl/extractor/dplay.py @@ -7,16 +7,18 @@ import time  from .common import InfoExtractor  from ..compat import ( -    compat_urlparse,      compat_HTTPError, +    compat_str, +    compat_urlparse,  )  from ..utils import ( -    USER_AGENTS,      ExtractorError,      int_or_none, -    unified_strdate,      remove_end, +    try_get, +    unified_strdate,      update_url_query, +    USER_AGENTS,  ) @@ -183,28 +185,44 @@ class DPlayItIE(InfoExtractor):          webpage = self._download_webpage(url, display_id) -        info_url = self._search_regex( -            r'url\s*[:=]\s*["\']((?:https?:)?//[^/]+/playback/videoPlaybackInfo/\d+)', -            webpage, 'video id') -          title = remove_end(self._og_search_title(webpage), ' | Dplay') -        try: -            info = self._download_json( -                info_url, display_id, headers={ -                    'Authorization': 'Bearer %s' % self._get_cookies(url).get( -                        'dplayit_token').value, -                    'Referer': url, -                }) -        except ExtractorError as e: -            if isinstance(e.cause, compat_HTTPError) and e.cause.code in (400, 403): -                info = self._parse_json(e.cause.read().decode('utf-8'), display_id) -                error = info['errors'][0] -                if error.get('code') == 'access.denied.geoblocked': -                    self.raise_geo_restricted( -                        msg=error.get('detail'), countries=self._GEO_COUNTRIES) -                raise ExtractorError(info['errors'][0]['detail'], expected=True) -            raise +        video_id = None + +        info = self._search_regex( +            r'playback_json\s*:\s*JSON\.parse\s*\(\s*("(?:\\.|[^"\\])+?")', +            webpage, 'playback JSON', default=None) +        if info: +            for _ in range(2): +                info = self._parse_json(info, display_id, fatal=False) +                if not info: +                    break +            else: +                video_id = try_get(info, lambda x: x['data']['id']) + +        if not info: +            info_url = self._search_regex( +                r'url\s*[:=]\s*["\']((?:https?:)?//[^/]+/playback/videoPlaybackInfo/\d+)', +                webpage, 'info url') + +            video_id = info_url.rpartition('/')[-1] + +            try: +                info = self._download_json( +                    info_url, display_id, headers={ +                        'Authorization': 'Bearer %s' % self._get_cookies(url).get( +                            'dplayit_token').value, +                        'Referer': url, +                    }) +            except ExtractorError as e: +                if isinstance(e.cause, compat_HTTPError) and e.cause.code in (400, 403): +                    info = self._parse_json(e.cause.read().decode('utf-8'), display_id) +                    error = info['errors'][0] +                    if error.get('code') == 'access.denied.geoblocked': +                        self.raise_geo_restricted( +                            msg=error.get('detail'), countries=self._GEO_COUNTRIES) +                    raise ExtractorError(info['errors'][0]['detail'], expected=True) +                raise          hls_url = info['data']['attributes']['streaming']['hls']['url'] @@ -230,7 +248,7 @@ class DPlayItIE(InfoExtractor):              season_number = episode_number = upload_date = None          return { -            'id': info_url.rpartition('/')[-1], +            'id': compat_str(video_id or display_id),              'display_id': display_id,              'title': title,              'description': self._og_search_description(webpage), | 
