mirror of
				https://github.com/ytdl-org/youtube-dl.git
				synced 2025-10-29 09:26:20 -07:00 
			
		
		
		
	Fix ADN extractor (#31275)
* Rename Anime Digital Network to Animation Digital Network, animationdigitalnetwork.fr * Update the test to an available video * Update the decoding key of subtitles * Keep the support of old URLs * Add a test to match the old URL * Reduce redundancy of the URL name * Fix md5 ^^" * Fix undefined _BASE * Process HTTP error text (eg geo-block) correctly and uniformly in Py3, Py2 * Skip test for CI since geo-blocked Signed-off-by: ache <ache@ache.one> Co-authored-by: dirkf <fieldhouse@gmx.net>
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user