]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/adn.py
   2 from __future__ 
import unicode_literals
 
   8 from .common 
import InfoExtractor
 
   9 from ..aes 
import aes_cbc_decrypt
 
  10 from ..compat 
import compat_ord
 
  16     srt_subtitles_timecode
, 
  22 class ADNIE(InfoExtractor
): 
  23     IE_DESC 
= 'Anime Digital Network' 
  24     _VALID_URL 
= r
'https?://(?:www\.)?animedigitalnetwork\.fr/video/[^/]+/(?P<id>\d+)' 
  26         'url': 'http://animedigitalnetwork.fr/video/blue-exorcist-kyoto-saga/7778-episode-1-debut-des-hostilites', 
  27         'md5': 'e497370d847fd79d9d4c74be55575c7a', 
  31             'title': 'Blue Exorcist - Kyôto Saga - Épisode 1', 
  32             'description': 'md5:2f7b5aa76edbc1a7a92cedcda8a528d5', 
  35     _BASE_URL 
= 'http://animedigitalnetwork.fr' 
  37     def _get_subtitles(self
, sub_path
, video_id
): 
  41         enc_subtitles 
= self
._download
_webpage
( 
  42             urljoin(self
._BASE
_URL
, sub_path
), 
  43             video_id
, fatal
=False, headers
={ 
  44                 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0', 
  49         # http://animedigitalnetwork.fr/components/com_vodvideo/videojs/adn-vjs.min.js 
  50         dec_subtitles 
= intlist_to_bytes(aes_cbc_decrypt( 
  51             bytes_to_intlist(base64
.b64decode(enc_subtitles
[24:])), 
  52             bytes_to_intlist(b
'\x1b\xe0\x29\x61\x38\x94\x24\x00\x12\xbd\xc5\x80\xac\xce\xbe\xb0'), 
  53             bytes_to_intlist(base64
.b64decode(enc_subtitles
[:24])) 
  55         subtitles_json 
= self
._parse
_json
( 
  56             dec_subtitles
[:-compat_ord(dec_subtitles
[-1])].decode(), 
  58         if not subtitles_json
: 
  62         for sub_lang
, sub 
in subtitles_json
.items(): 
  64             for num
, current 
in enumerate(sub
): 
  66                     float_or_none(current
.get('startTime')), 
  67                     float_or_none(current
.get('endTime')), 
  69                 if start 
is None or end 
is None or text 
is None: 
  71                 srt 
+= os
.linesep
.join( 
  75                             srt_subtitles_timecode(start
), 
  76                             srt_subtitles_timecode(end
)), 
  81             if sub_lang 
== 'vostf': 
  83             subtitles
.setdefault(sub_lang
, []).extend([{ 
  85                 'data': json
.dumps(sub
), 
  92     def _real_extract(self
, url
): 
  93         video_id 
= self
._match
_id
(url
) 
  94         webpage 
= self
._download
_webpage
(url
, video_id
) 
  95         player_config 
= self
._parse
_json
(self
._search
_regex
( 
  96             r
'playerConfig\s*=\s*({.+});', webpage
, 'player config'), video_id
) 
  99         video_info_str 
= self
._search
_regex
( 
 100             r
'videoInfo\s*=\s*({.+});', webpage
, 
 101             'video info', fatal
=False) 
 103             video_info 
= self
._parse
_json
( 
 104                 video_info_str
, video_id
, fatal
=False) or {} 
 106         options 
= player_config
.get('options') or {} 
 107         metas 
= options
.get('metas') or {} 
 108         title 
= metas
.get('title') or video_info
['title'] 
 109         links 
= player_config
.get('links') or {} 
 112             links_url 
= player_config
['linksurl'] 
 113             links_data 
= self
._download
_json
(urljoin( 
 114                 self
._BASE
_URL
, links_url
), video_id
) 
 115             links 
= links_data
.get('links') or {} 
 116             error 
= links_data
.get('error') 
 119         for format_id
, qualities 
in links
.items(): 
 120             if not isinstance(qualities
, dict): 
 122             for load_balancer_url 
in qualities
.values(): 
 123                 load_balancer_data 
= self
._download
_json
( 
 124                     load_balancer_url
, video_id
, fatal
=False) or {} 
 125                 m3u8_url 
= load_balancer_data
.get('location') 
 128                 m3u8_formats 
= self
._extract
_m
3u8_formats
( 
 129                     m3u8_url
, video_id
, 'mp4', 'm3u8_native', 
 130                     m3u8_id
=format_id
, fatal
=False) 
 131                 if format_id 
== 'vf': 
 132                     for f 
in m3u8_formats
: 
 134                 formats
.extend(m3u8_formats
) 
 136             error 
= options
.get('error') 
 137         if not formats 
and error
: 
 138             raise ExtractorError('%s said: %s' % (self
.IE_NAME
, error
), expected
=True) 
 139         self
._sort
_formats
(formats
) 
 144             'description': strip_or_none(metas
.get('summary') or video_info
.get('resume')), 
 145             'thumbnail': video_info
.get('image'), 
 147             'subtitles': self
.extract_subtitles(player_config
.get('subtitles'), video_id
), 
 148             'episode': metas
.get('subtitle') or video_info
.get('videoTitle'), 
 149             'series': video_info
.get('playlistTitle'),