]>
Raphaël G. Git Repositories - youtubedl/blob - youtube_dl/extractor/afreecatv.py
513dd81df5cd8c044eaba800facdf76cca3cc509
   2 from __future__ 
import unicode_literals
 
   6 from .common 
import InfoExtractor
 
   7 from ..compat 
import compat_xpath
 
  16 class AfreecaTVIE(InfoExtractor
): 
  18     IE_DESC 
= 'afreecatv.com' 
  22                             (?:(?:live|afbbs|www)\.)?afreeca(?:tv)?\.com(?::\d+)? 
  24                                 /app/(?:index|read_ucc_bbs)\.cgi| 
  25                                 /player/[Pp]layer\.(?:swf|html) 
  27                             vod\.afreecatv\.com/PLAYER/STATION/ 
  32         'url': 'http://live.afreecatv.com:8079/app/index.cgi?szType=read_ucc_bbs&szBjId=dailyapril&nStationNo=16711924&nBbsNo=18605867&nTitleNo=36164052&szSkin=', 
  33         'md5': 'f72c89fe7ecc14c1b5ce506c4996046e', 
  37             'title': '데일리 에이프릴 요정들의 시상식!', 
  38             'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
  39             'uploader': 'dailyapril', 
  40             'uploader_id': 'dailyapril', 
  41             'upload_date': '20160503', 
  43         'skip': 'Video is gone', 
  45         'url': 'http://afbbs.afreecatv.com:8080/app/read_ucc_bbs.cgi?nStationNo=16711924&nTitleNo=36153164&szBjId=dailyapril&nBbsNo=18605867', 
  48             'title': "BJ유트루와 함께하는 '팅커벨 메이크업!'", 
  49             'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
  50             'uploader': 'dailyapril', 
  51             'uploader_id': 'dailyapril', 
  55             'md5': 'd8b7c174568da61d774ef0203159bf97', 
  59                 'title': "BJ유트루와 함께하는 '팅커벨 메이크업!'", 
  60                 'upload_date': '20160502', 
  63             'md5': '58f2ce7f6044e34439ab2d50612ab02b', 
  67                 'title': "BJ유트루와 함께하는 '팅커벨 메이크업!'", 
  68                 'upload_date': '20160502', 
  71         'skip': 'Video is gone', 
  73         'url': 'http://vod.afreecatv.com/PLAYER/STATION/18650793', 
  77             'title': '오늘은 다르다! 쏘님의 우월한 위아래~ 댄스리액션!', 
  78             'thumbnail': r
're:^https?://.*\.jpg$', 
  80             'uploader_id': 'badkids', 
  84             'skip_download': True, 
  87         'url': 'http://vod.afreecatv.com/PLAYER/STATION/10481652', 
  90             'title': "BJ유트루와 함께하는 '팅커벨 메이크업!'", 
  91             'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
  92             'uploader': 'dailyapril', 
  93             'uploader_id': 'dailyapril', 
  98             'md5': 'd8b7c174568da61d774ef0203159bf97', 
 100                 'id': '20160502_c4c62b9d_174361386_1', 
 102                 'title': "BJ유트루와 함께하는 '팅커벨 메이크업!' (part 1)", 
 103                 'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
 104                 'uploader': 'dailyapril', 
 105                 'uploader_id': 'dailyapril', 
 106                 'upload_date': '20160502', 
 110             'md5': '58f2ce7f6044e34439ab2d50612ab02b', 
 112                 'id': '20160502_39e739bb_174361386_2', 
 114                 'title': "BJ유트루와 함께하는 '팅커벨 메이크업!' (part 2)", 
 115                 'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
 116                 'uploader': 'dailyapril', 
 117                 'uploader_id': 'dailyapril', 
 118                 'upload_date': '20160502', 
 123             'skip_download': True, 
 127         'url': 'http://vod.afreecatv.com/PLAYER/STATION/20515605', 
 129             'id': '20170411_BE689A0E_190960999_1_2_h', 
 132             'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
 134             'uploader_id': 'dasl8121', 
 135             'upload_date': '20170411', 
 139             'skip_download': True, 
 143         'url': 'http://vod.afreecatv.com/PLAYER/STATION/26542731', 
 145             'id': '20171001_F1AE1711_196617479_1', 
 147             'title': '[생]서아 초심 찾기 방송 (part 1)', 
 148             'thumbnail': 're:^https?://(?:video|st)img.afreecatv.com/.*$', 
 150             'uploader_id': 'bjdyrksu', 
 151             'upload_date': '20171001', 
 156             'skip_download': True, 
 159         'url': 'http://www.afreecatv.com/player/Player.swf?szType=szBjId=djleegoon&nStationNo=11273158&nBbsNo=13161095&nTitleNo=36327652', 
 160         'only_matching': True, 
 162         'url': 'http://vod.afreecatv.com/PLAYER/STATION/15055030', 
 163         'only_matching': True, 
 167     def parse_video_key(key
): 
 169         m 
= re
.match(r
'^(?P<upload_date>\d{8})_\w+_(?P<part>\d+)$', key
) 
 171             video_key
['upload_date'] = m
.group('upload_date') 
 172             video_key
['part'] = int(m
.group('part')) 
 175     def _real_extract(self
, url
): 
 176         video_id 
= self
._match
_id
(url
) 
 178         video_xml 
= self
._download
_xml
( 
 179             'http://afbbs.afreecatv.com:8080/api/video/get_video_info.php', 
 181                 'nTitleNo': video_id
, 
 182                 'partialView': 'SKIP_ADULT', 
 185         flag 
= xpath_text(video_xml
, './track/flag', 'flag', default
=None) 
 186         if flag 
and flag 
!= 'SUCCEED': 
 187             raise ExtractorError( 
 188                 '%s said: %s' % (self
.IE_NAME
, flag
), expected
=True) 
 190         video_element 
= video_xml
.findall(compat_xpath('./track/video'))[1] 
 191         if video_element 
is None or video_element
.text 
is None: 
 192             raise ExtractorError('Specified AfreecaTV video does not exist', 
 195         video_url 
= video_element
.text
.strip() 
 197         title 
= xpath_text(video_xml
, './track/title', 'title', fatal
=True) 
 199         uploader 
= xpath_text(video_xml
, './track/nickname', 'uploader') 
 200         uploader_id 
= xpath_text(video_xml
, './track/bj_id', 'uploader id') 
 201         duration 
= int_or_none(xpath_text( 
 202             video_xml
, './track/duration', 'duration')) 
 203         thumbnail 
= xpath_text(video_xml
, './track/titleImage', 'thumbnail') 
 206             'uploader': uploader
, 
 207             'uploader_id': uploader_id
, 
 208             'thumbnail': thumbnail
, 
 211         info 
= common_entry
.copy() 
 215             'duration': duration
, 
 220             file_elements 
= video_element
.findall(compat_xpath('./file')) 
 221             one 
= len(file_elements
) == 1 
 222             for file_num
, file_element 
in enumerate(file_elements
, start
=1): 
 223                 file_url 
= file_element
.text
 
 226                 key 
= file_element
.get('key', '') 
 227                 upload_date 
= self
._search
_regex
( 
 228                     r
'^(\d{8})_', key
, 'upload date', default
=None) 
 229                 file_duration 
= int_or_none(file_element
.get('duration')) 
 230                 format_id 
= key 
if key 
else '%s_%s' % (video_id
, file_num
) 
 231                 if determine_ext(file_url
) == 'm3u8': 
 232                     formats 
= self
._extract
_m
3u8_formats
( 
 233                         file_url
, video_id
, 'mp4', entry_protocol
='m3u8_native', 
 235                         note
='Downloading part %d m3u8 information' % file_num
) 
 243                 self
._sort
_formats
(formats
) 
 244                 file_info 
= common_entry
.copy() 
 247                     'title': title 
if one 
else '%s (part %d)' % (title
, file_num
), 
 248                     'upload_date': upload_date
, 
 249                     'duration': file_duration
, 
 252                 entries
.append(file_info
) 
 253             entries_info 
= info
.copy() 
 254             entries_info
.update({ 
 255                 '_type': 'multi_video', 
 263             'uploader': uploader
, 
 264             'uploader_id': uploader_id
, 
 265             'duration': duration
, 
 266             'thumbnail': thumbnail
, 
 269         if determine_ext(video_url
) == 'm3u8': 
 270             info
['formats'] = self
._extract
_m
3u8_formats
( 
 271                 video_url
, video_id
, 'mp4', entry_protocol
='m3u8_native', 
 274             app
, playpath 
= video_url
.split('mp4:') 
 278                 'play_path': 'mp4:' + playpath
, 
 279                 'rtmp_live': True,  # downloading won't end without this