@ -31,30 +31,34 @@ from ..utils import (
class ADNIE ( InfoExtractor ) :
IE_DESC = ' Anim e 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 = ' Anim ation Digital Network'
_VALID_URL = r ' https?://(?:www \ .)? (?:animation| anime) digitalnetwork\ .fr/video/[^/]+/(?P<id> \ d+) '
_TEST S = [ {
' url ' : ' http s://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 ' : 14 6 7,
' release_date ' : ' 201 70106 ' ,
' title ' : ' Fruits Basket - Episode 1' ,
' description ' : ' md5: 14be2f72c3c96809b0ca424b0097d336 ' ,
' series ' : ' Fruits Basket ' ,
' duration ' : 14 3 7,
' release_date ' : ' 201 90405 ' ,
' 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 = ' anim ation digitalnetwork'
_BASE = ' animation digitalnetwork.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://anim e digitalnetwork.fr/components/com_vodvideo/videojs/adn-vjs.min.js
# http://anim ation digitalnetwork.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 )