| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | 
							- from __future__ import unicode_literals
 
- import random
 
- import re
 
- import string
 
- from .discoverygo import DiscoveryGoBaseIE
 
- from ..compat import compat_str
 
- from ..utils import (
 
-     ExtractorError,
 
-     try_get,
 
- )
 
- from ..compat import compat_HTTPError
 
- class DiscoveryIE(DiscoveryGoBaseIE):
 
-     _VALID_URL = r'''(?x)https?://(?:www\.)?(?P<site>
 
-             discovery|
 
-             investigationdiscovery|
 
-             discoverylife|
 
-             animalplanet|
 
-             ahctv|
 
-             destinationamerica|
 
-             sciencechannel|
 
-             tlc|
 
-             velocity
 
-         )\.com(?P<path>/tv-shows/[^/]+/(?:video|full-episode)s/(?P<id>[^./?#]+))'''
 
-     _TESTS = [{
 
-         'url': 'https://www.discovery.com/tv-shows/cash-cab/videos/dave-foley',
 
-         'info_dict': {
 
-             'id': '5a2d9b4d6b66d17a5026e1fd',
 
-             'ext': 'mp4',
 
-             'title': 'Dave Foley',
 
-             'description': 'md5:4b39bcafccf9167ca42810eb5f28b01f',
 
-             'duration': 608,
 
-         },
 
-         'params': {
 
-             'skip_download': True,  # requires ffmpeg
 
-         }
 
-     }, {
 
-         'url': 'https://www.investigationdiscovery.com/tv-shows/final-vision/full-episodes/final-vision',
 
-         'only_matching': True,
 
-     }]
 
-     _GEO_COUNTRIES = ['US']
 
-     _GEO_BYPASS = False
 
-     def _real_extract(self, url):
 
-         site, path, display_id = re.match(self._VALID_URL, url).groups()
 
-         webpage = self._download_webpage(url, display_id)
 
-         react_data = self._parse_json(self._search_regex(
 
-             r'window\.__reactTransmitPacket\s*=\s*({.+?});',
 
-             webpage, 'react data'), display_id)
 
-         content_blocks = react_data['layout'][path]['contentBlocks']
 
-         video = next(cb for cb in content_blocks if cb.get('type') == 'video')['content']['items'][0]
 
-         video_id = video['id']
 
-         access_token = self._download_json(
 
-             'https://www.%s.com/anonymous' % site, display_id, query={
 
-                 'authRel': 'authorization',
 
-                 'client_id': try_get(
 
-                     react_data, lambda x: x['application']['apiClientId'],
 
-                     compat_str) or '3020a40c2356a645b4b4',
 
-                 'nonce': ''.join([random.choice(string.ascii_letters) for _ in range(32)]),
 
-                 'redirectUri': 'https://fusion.ddmcdn.com/app/mercury-sdk/180/redirectHandler.html?https://www.%s.com' % site,
 
-             })['access_token']
 
-         try:
 
-             stream = self._download_json(
 
-                 'https://api.discovery.com/v1/streaming/video/' + video_id,
 
-                 display_id, headers={
 
-                     'Authorization': 'Bearer ' + access_token,
 
-                 })
 
-         except ExtractorError as e:
 
-             if isinstance(e.cause, compat_HTTPError) and e.cause.code == 403:
 
-                 e_description = self._parse_json(
 
-                     e.cause.read().decode(), display_id)['description']
 
-                 if 'resource not available for country' in e_description:
 
-                     self.raise_geo_restricted(countries=self._GEO_COUNTRIES)
 
-                 if 'Authorized Networks' in e_description:
 
-                     raise ExtractorError(
 
-                         'This video is only available via cable service provider subscription that'
 
-                         ' is not currently supported. You may want to use --cookies.', expected=True)
 
-                 raise ExtractorError(e_description)
 
-             raise
 
-         return self._extract_video_info(video, stream, display_id)
 
 
  |