]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/naver.py
   2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
  18 class NaverBaseIE(InfoExtractor
): 
  19     _CAPTION_EXT_RE 
= r
'\.(?:ttml|vtt)' 
  21     def _extract_video_info(self
, video_id
, vid
, key
): 
  22         video_data 
= self
._download
_json
( 
  23             'http://play.rmcnmv.naver.com/vod/play/v2.0/' + vid
, 
  27         meta 
= video_data
['meta'] 
  28         title 
= meta
['subject'] 
  30         get_list 
= lambda x
: try_get(video_data
, lambda y
: y
[x 
+ 's']['list'], list) or [] 
  32         def extract_formats(streams
, stream_type
, query
={}): 
  33             for stream 
in streams
: 
  34                 stream_url 
= stream
.get('source') 
  37                 stream_url 
= update_url_query(stream_url
, query
) 
  38                 encoding_option 
= stream
.get('encodingOption', {}) 
  39                 bitrate 
= stream
.get('bitrate', {}) 
  41                     'format_id': '%s_%s' % (stream
.get('type') or stream_type
, dict_get(encoding_option
, ('name', 'id'))), 
  43                     'width': int_or_none(encoding_option
.get('width')), 
  44                     'height': int_or_none(encoding_option
.get('height')), 
  45                     'vbr': int_or_none(bitrate
.get('video')), 
  46                     'abr': int_or_none(bitrate
.get('audio')), 
  47                     'filesize': int_or_none(stream
.get('size')), 
  48                     'protocol': 'm3u8_native' if stream_type 
== 'HLS' else None, 
  51         extract_formats(get_list('video'), 'H264') 
  52         for stream_set 
in video_data
.get('streams', []): 
  54             for param 
in stream_set
.get('keys', []): 
  55                 query
[param
['name']] = param
['value'] 
  56             stream_type 
= stream_set
.get('type') 
  57             videos 
= stream_set
.get('videos') 
  59                 extract_formats(videos
, stream_type
, query
) 
  60             elif stream_type 
== 'HLS': 
  61                 stream_url 
= stream_set
.get('source') 
  64                 formats
.extend(self
._extract
_m
3u8_formats
( 
  65                     update_url_query(stream_url
, query
), video_id
, 
  66                     'mp4', 'm3u8_native', m3u8_id
=stream_type
, fatal
=False)) 
  67         self
._sort
_formats
(formats
) 
  69         replace_ext 
= lambda x
, y
: re
.sub(self
._CAPTION
_EXT
_RE
, '.' + y
, x
) 
  71         def get_subs(caption_url
): 
  72             if re
.search(self
._CAPTION
_EXT
_RE
, caption_url
): 
  74                     'url': replace_ext(caption_url
, 'ttml'), 
  76                     'url': replace_ext(caption_url
, 'vtt'), 
  79                 return [{'url': caption_url
}] 
  81         automatic_captions 
= {} 
  83         for caption 
in get_list('caption'): 
  84             caption_url 
= caption
.get('source') 
  87             sub_dict 
= automatic_captions 
if caption
.get('type') == 'auto' else subtitles
 
  88             sub_dict
.setdefault(dict_get(caption
, ('locale', 'language')), []).extend(get_subs(caption_url
)) 
  90         user 
= meta
.get('user', {}) 
  96             'subtitles': subtitles
, 
  97             'automatic_captions': automatic_captions
, 
  98             'thumbnail': try_get(meta
, lambda x
: x
['cover']['source']), 
  99             'view_count': int_or_none(meta
.get('count')), 
 100             'uploader_id': user
.get('id'), 
 101             'uploader': user
.get('name'), 
 102             'uploader_url': user
.get('url'), 
 106 class NaverIE(NaverBaseIE
): 
 107     _VALID_URL 
= r
'https?://(?:m\.)?tv(?:cast)?\.naver\.com/(?:v|embed)/(?P<id>\d+)' 
 110         'url': 'http://tv.naver.com/v/81652', 
 114             'title': '[9월 모의고사 해설강의][수학_김상희] 수학 A형 16~20번', 
 115             'description': '메가스터디 수학 김상희 선생님이 9월 모의고사 수학A형 16번에서 20번까지 해설강의를 공개합니다.', 
 116             'timestamp': 1378200754, 
 117             'upload_date': '20130903', 
 118             'uploader': '메가스터디, 합격불변의 법칙', 
 119             'uploader_id': 'megastudy', 
 122         'url': 'http://tv.naver.com/v/395837', 
 123         'md5': '8a38e35354d26a17f73f4e90094febd3', 
 127             'title': '9년이 지나도 아픈 기억, 전효성의 아버지', 
 128             'description': 'md5:eb6aca9d457b922e43860a2a2b1984d3', 
 129             'timestamp': 1432030253, 
 130             'upload_date': '20150519', 
 131             'uploader': '4가지쇼 시즌2', 
 132             'uploader_id': 'wrappinguser29', 
 134         'skip': 'Georestricted', 
 136         'url': 'http://tvcast.naver.com/v/81652', 
 137         'only_matching': True, 
 140     def _real_extract(self
, url
): 
 141         video_id 
= self
._match
_id
(url
) 
 142         content 
= self
._download
_json
( 
 143             'https://tv.naver.com/api/json/v/' + video_id
, 
 144             video_id
, headers
=self
.geo_verification_headers()) 
 145         player_info_json 
= content
.get('playerInfoJson') or {} 
 146         current_clip 
= player_info_json
.get('currentClip') or {} 
 148         vid 
= current_clip
.get('videoId') 
 149         in_key 
= current_clip
.get('inKey') 
 151         if not vid 
or not in_key
: 
 152             player_auth 
= try_get(player_info_json
, lambda x
: x
['playerOption']['auth']) 
 153             if player_auth 
== 'notCountry': 
 154                 self
.raise_geo_restricted(countries
=['KR']) 
 155             elif player_auth 
== 'notLogin': 
 156                 self
.raise_login_required() 
 157             raise ExtractorError('couldn\'t extract vid and key') 
 158         info 
= self
._extract
_video
_info
(video_id
, vid
, in_key
) 
 160             'description': clean_html(current_clip
.get('description')), 
 161             'timestamp': int_or_none(current_clip
.get('firstExposureTime'), 1000), 
 162             'duration': parse_duration(current_clip
.get('displayPlayTime')), 
 163             'like_count': int_or_none(current_clip
.get('recommendPoint')), 
 164             'age_limit': 19 if current_clip
.get('adult') else None,