2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
  14 from ..compat 
import compat_urllib_parse_urlencode
 
  17 class VLiveIE(InfoExtractor
): 
  19     _VALID_URL 
= r
'https?://(?:(?:www|m)\.)?vlive\.tv/video/(?P<id>[0-9]+)' 
  21         'url': 'http://www.vlive.tv/video/1326', 
  22         'md5': 'cc7314812855ce56de70a06a27314983', 
  26             'title': "[V LIVE] Girl's Day's Broadcast", 
  27             'creator': "Girl's Day", 
  32     def _real_extract(self
, url
): 
  33         video_id 
= self
._match
_id
(url
) 
  35         webpage 
= self
._download
_webpage
( 
  36             'http://www.vlive.tv/video/%s' % video_id
, video_id
) 
  38         video_params 
= self
._search
_regex
( 
  39             r
'\bvlive\.video\.init\(([^)]+)\)', 
  40             webpage
, 'video params') 
  41         status
, _
, _
, live_params
, long_video_id
, key 
= re
.split( 
  42             r
'"\s*,\s*"', video_params
)[2:8] 
  43         status 
= remove_start(status
, 'PRODUCT_') 
  45         if status 
== 'LIVE_ON_AIR' or status 
== 'BIG_EVENT_ON_AIR': 
  46             live_params 
= self
._parse
_json
('"%s"' % live_params
, video_id
) 
  47             live_params 
= self
._parse
_json
(live_params
, video_id
) 
  48             return self
._live
(video_id
, webpage
, live_params
) 
  49         elif status 
== 'VOD_ON_AIR' or status 
== 'BIG_EVENT_INTRO': 
  50             if long_video_id 
and key
: 
  51                 return self
._replay
(video_id
, webpage
, long_video_id
, key
) 
  53                 status 
= 'COMING_SOON' 
  55         if status 
== 'LIVE_END': 
  56             raise ExtractorError('Uploading for replay. Please wait...', 
  58         elif status 
== 'COMING_SOON': 
  59             raise ExtractorError('Coming soon!', expected
=True) 
  60         elif status 
== 'CANCELED': 
  61             raise ExtractorError('We are sorry, ' 
  62                                  'but the live broadcast has been canceled.', 
  65             raise ExtractorError('Unknown status %s' % status
) 
  67     def _get_common_fields(self
, webpage
): 
  68         title 
= self
._og
_search
_title
(webpage
) 
  69         creator 
= self
._html
_search
_regex
( 
  70             r
'<div[^>]+class="info_area"[^>]*>\s*<a\s+[^>]*>([^<]+)', 
  71             webpage
, 'creator', fatal
=False) 
  72         thumbnail 
= self
._og
_search
_thumbnail
(webpage
) 
  76             'thumbnail': thumbnail
, 
  79     def _live(self
, video_id
, webpage
, live_params
): 
  81         for vid 
in live_params
.get('resolutions', []): 
  82             formats
.extend(self
._extract
_m
3u8_formats
( 
  83                 vid
['cdnUrl'], video_id
, 'mp4', 
  84                 m3u8_id
=vid
.get('name'), 
  85                 fatal
=False, live
=True)) 
  86         self
._sort
_formats
(formats
) 
  88         return dict(self
._get
_common
_fields
(webpage
), 
  93     def _replay(self
, video_id
, webpage
, long_video_id
, key
): 
  94         playinfo 
= self
._download
_json
( 
  95             'http://global.apis.naver.com/rmcnmv/rmcnmv/vod_play_videoInfo.json?%s' 
  96             % compat_urllib_parse_urlencode({ 
  97                 'videoId': long_video_id
, 
 100                 'doct': 'json',  # document type (xml or json) 
 101                 'cpt': 'vtt',  # captions type (vtt or ttml) 
 105             'url': vid
['source'], 
 106             'format_id': vid
.get('encodingOption', {}).get('name'), 
 107             'abr': float_or_none(vid
.get('bitrate', {}).get('audio')), 
 108             'vbr': float_or_none(vid
.get('bitrate', {}).get('video')), 
 109             'width': int_or_none(vid
.get('encodingOption', {}).get('width')), 
 110             'height': int_or_none(vid
.get('encodingOption', {}).get('height')), 
 111             'filesize': int_or_none(vid
.get('size')), 
 112         } for vid 
in playinfo
.get('videos', {}).get('list', []) if vid
.get('source')] 
 113         self
._sort
_formats
(formats
) 
 115         view_count 
= int_or_none(playinfo
.get('meta', {}).get('count')) 
 118         for caption 
in playinfo
.get('captions', {}).get('list', []): 
 119             lang 
= dict_get(caption
, ('language', 'locale', 'country', 'label')) 
 120             if lang 
and caption
.get('source'): 
 123                     'url': caption
['source']}] 
 125         return dict(self
._get
_common
_fields
(webpage
), 
 128                     view_count
=view_count
,