]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/bilibili.py
ecc17ebebca9e1819fc804f37d48dcceb80c44c5
   2 from __future__ 
import unicode_literals
 
   7 import xml
.etree
.ElementTree 
as ET
 
   9 from .common 
import InfoExtractor
 
  17 class BiliBiliIE(InfoExtractor
): 
  18     _VALID_URL 
= r
'http://www\.bilibili\.(?:tv|com)/video/av(?P<id>[0-9]+)/' 
  21         'url': 'http://www.bilibili.tv/video/av1074402/', 
  22         'md5': '2c301e4dab317596e837c3e7633e7d86', 
  24             'id': '1074402_part1', 
  28             'upload_date': '20140420', 
  29             'thumbnail': 're:^https?://.+\.jpg', 
  32         'url': 'http://www.bilibili.com/video/av1041170/', 
  35             'title': '【BD1080P】刀语【诸神&异域】', 
  40     def _real_extract(self
, url
): 
  41         video_id 
= self
._match
_id
(url
) 
  42         webpage 
= self
._download
_webpage
(url
, video_id
) 
  44         if '(此视频不存在或被删除)' in webpage
: 
  46                 'The video does not exist or was deleted', expected
=True) 
  48         if '>你没有权限浏览! 由于版权相关问题 我们不对您所在的地区提供服务<' in webpage
: 
  50                 'The video is not available in your region due to copyright reasons', 
  53         video_code 
= self
._search
_regex
( 
  54             r
'(?s)<div itemprop="video".*?>(.*?)</div>', webpage
, 'video code') 
  56         title 
= self
._html
_search
_meta
( 
  57             'media:title', video_code
, 'title', fatal
=True) 
  58         duration_str 
= self
._html
_search
_meta
( 
  59             'duration', video_code
, 'duration') 
  60         if duration_str 
is None: 
  63             duration_mobj 
= re
.match( 
  64                 r
'^T(?:(?P<hours>[0-9]+)H)?(?P<minutes>[0-9]+)M(?P<seconds>[0-9]+)S$', 
  67                 int_or_none(duration_mobj
.group('hours'), default
=0) * 3600 + 
  68                 int(duration_mobj
.group('minutes')) * 60 + 
  69                 int(duration_mobj
.group('seconds'))) 
  70         upload_date 
= unified_strdate(self
._html
_search
_meta
( 
  71             'uploadDate', video_code
, fatal
=False)) 
  72         thumbnail 
= self
._html
_search
_meta
( 
  73             'thumbnailUrl', video_code
, 'thumbnail', fatal
=False) 
  75         cid 
= self
._search
_regex
(r
'cid=(\d+)', webpage
, 'cid') 
  79         lq_page 
= self
._download
_webpage
( 
  80             'http://interface.bilibili.com/v_cdn_play?appkey=1&cid=%s' % cid
, 
  82             note
='Downloading LQ video info' 
  85             err_info 
= json
.loads(lq_page
) 
  87                 'BiliBili said: ' + err_info
['error_text'], expected
=True) 
  91         lq_doc 
= ET
.fromstring(lq_page
) 
  92         lq_durls 
= lq_doc
.findall('./durl') 
  94         hq_doc 
= self
._download
_xml
( 
  95             'http://interface.bilibili.com/playurl?appkey=1&cid=%s' % cid
, 
  97             note
='Downloading HQ video info', 
 100         if hq_doc 
is not False: 
 101             hq_durls 
= hq_doc
.findall('./durl') 
 102             assert len(lq_durls
) == len(hq_durls
) 
 104             hq_durls 
= itertools
.repeat(None) 
 107         for lq_durl
, hq_durl 
in zip(lq_durls
, hq_durls
): 
 111                 'url': lq_durl
.find('./url').text
, 
 112                 'filesize': int_or_none( 
 113                     lq_durl
.find('./size'), get_attr
='text'), 
 115             if hq_durl 
is not None: 
 120                     'url': hq_durl
.find('./url').text
, 
 121                     'filesize': int_or_none( 
 122                         hq_durl
.find('./size'), get_attr
='text'), 
 124             self
._sort
_formats
(formats
) 
 127                 'id': '%s_part%d' % (video_id
, i
), 
 130                 'duration': duration
, 
 131                 'upload_date': upload_date
, 
 132                 'thumbnail': thumbnail
, 
 138             '_type': 'multi_video',