diff options
Diffstat (limited to 'youtube_dl')
| -rw-r--r-- | youtube_dl/extractor/adn.py | 57 | 
1 files changed, 32 insertions, 25 deletions
diff --git a/youtube_dl/extractor/adn.py b/youtube_dl/extractor/adn.py index a55ebbcbd..5ff419f19 100644 --- a/youtube_dl/extractor/adn.py +++ b/youtube_dl/extractor/adn.py @@ -31,30 +31,34 @@ from ..utils import (  class ADNIE(InfoExtractor): -    IE_DESC = 'Anime Digital Network' -    _VALID_URL = r'https?://(?:www\.)?animedigitalnetwork\.fr/video/[^/]+/(?P<id>\d+)' -    _TEST = { -        'url': 'http://animedigitalnetwork.fr/video/blue-exorcist-kyoto-saga/7778-episode-1-debut-des-hostilites', -        'md5': '0319c99885ff5547565cacb4f3f9348d', +    IE_DESC = 'Animation Digital Network' +    _VALID_URL = r'https?://(?:www\.)?(?:animation|anime)digitalnetwork\.fr/video/[^/]+/(?P<id>\d+)' +    _TESTS = [{ +        'url': 'https://animationdigitalnetwork.fr/video/fruits-basket/9841-episode-1-a-ce-soir', +        'md5': '1c9ef066ceb302c86f80c2b371615261',          'info_dict': { -            'id': '7778', +            'id': '9841',              'ext': 'mp4', -            'title': 'Blue Exorcist - Kyôto Saga - Episode 1', -            'description': 'md5:2f7b5aa76edbc1a7a92cedcda8a528d5', -            'series': 'Blue Exorcist - Kyôto Saga', -            'duration': 1467, -            'release_date': '20170106', +            'title': 'Fruits Basket - Episode 1', +            'description': 'md5:14be2f72c3c96809b0ca424b0097d336', +            'series': 'Fruits Basket', +            'duration': 1437, +            'release_date': '20190405',              'comment_count': int,              'average_rating': float, -            'season_number': 2, -            'episode': 'Début des hostilités', +            'season_number': 1, +            'episode': 'À ce soir !',              'episode_number': 1, -        } -    } +        }, +        'skip': 'Only available in region (FR, ...)', +    }, { +        'url': 'http://animedigitalnetwork.fr/video/blue-exorcist-kyoto-saga/7778-episode-1-debut-des-hostilites', +        'only_matching': True, +    }] -    _NETRC_MACHINE = 'animedigitalnetwork' -    _BASE_URL = 'http://animedigitalnetwork.fr' -    _API_BASE_URL = 'https://gw.api.animedigitalnetwork.fr/' +    _NETRC_MACHINE = 'animationdigitalnetwork' +    _BASE = 'animationdigitalnetwork.fr' +    _API_BASE_URL = 'https://gw.api.' + _BASE + '/'      _PLAYER_BASE_URL = _API_BASE_URL + 'player/'      _HEADERS = {}      _LOGIN_ERR_MESSAGE = 'Unable to log in' @@ -82,14 +86,14 @@ class ADNIE(InfoExtractor):          if subtitle_location:              enc_subtitles = self._download_webpage(                  subtitle_location, video_id, 'Downloading subtitles data', -                fatal=False, headers={'Origin': 'https://animedigitalnetwork.fr'}) +                fatal=False, headers={'Origin': 'https://' + self._BASE})          if not enc_subtitles:              return None -        # http://animedigitalnetwork.fr/components/com_vodvideo/videojs/adn-vjs.min.js +        # http://animationdigitalnetwork.fr/components/com_vodvideo/videojs/adn-vjs.min.js          dec_subtitles = intlist_to_bytes(aes_cbc_decrypt(              bytes_to_intlist(compat_b64decode(enc_subtitles[24:])), -            bytes_to_intlist(binascii.unhexlify(self._K + 'ab9f52f5baae7c72')), +            bytes_to_intlist(binascii.unhexlify(self._K + '7fac1178830cfe0c')),              bytes_to_intlist(compat_b64decode(enc_subtitles[:24]))          ))          subtitles_json = self._parse_json( @@ -138,9 +142,9 @@ Format: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text'''          if not username:              return          try: +            url = self._API_BASE_URL + 'authentication/login'              access_token = (self._download_json( -                self._API_BASE_URL + 'authentication/login', None, -                'Logging in', self._LOGIN_ERR_MESSAGE, fatal=False, +                url, None, 'Logging in', self._LOGIN_ERR_MESSAGE, fatal=False,                  data=urlencode_postdata({                      'password': password,                      'rememberMe': False, @@ -153,7 +157,8 @@ Format: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text'''              message = None              if isinstance(e.cause, compat_HTTPError) and e.cause.code == 401:                  resp = self._parse_json( -                    e.cause.read().decode(), None, fatal=False) or {} +                    self._webpage_read_content(e.cause, url, username), +                    username, fatal=False) or {}                  message = resp.get('message') or resp.get('code')              self.report_warning(message or self._LOGIN_ERR_MESSAGE) @@ -211,7 +216,9 @@ Format: Marked,Start,End,Style,Name,MarginL,MarginR,MarginV,Effect,Text'''                      # This usually goes away with a different random pkcs1pad, so retry                      continue -                error = self._parse_json(e.cause.read(), video_id) +                error = self._parse_json( +                    self._webpage_read_content(e.cause, links_url, video_id), +                    video_id, fatal=False) or {}                  message = error.get('message')                  if e.cause.code == 403 and error.get('code') == 'player-bad-geolocation-country':                      self.raise_geo_restricted(msg=message)  | 
