]>
Commit | Line | Data |
---|---|---|
150f2082 | 1 | # encoding: utf-8 |
23f4a93b PH |
2 | |
3 | from __future__ import unicode_literals | |
4 | ||
150f2082 | 5 | import re |
150f2082 JMF |
6 | |
7 | from .common import InfoExtractor | |
1cc79574 | 8 | from ..compat import ( |
150f2082 | 9 | compat_urllib_parse, |
150f2082 JMF |
10 | ) |
11 | ||
12 | ||
13 | class DaumIE(InfoExtractor): | |
e5a79071 | 14 | _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/(?:v/|.*?clipid=)(?P<id>[^?#&]+)' |
23f4a93b | 15 | IE_NAME = 'daum.net' |
150f2082 | 16 | |
e5a79071 | 17 | _TESTS = [{ |
23f4a93b PH |
18 | 'url': 'http://tvpot.daum.net/clip/ClipView.do?clipid=52554690', |
19 | 'info_dict': { | |
20 | 'id': '52554690', | |
21 | 'ext': 'mp4', | |
22 | 'title': 'DOTA 2GETHER 시즌2 6회 - 2부', | |
23 | 'description': 'DOTA 2GETHER 시즌2 6회 - 2부', | |
24 | 'upload_date': '20130831', | |
25 | 'duration': 3868, | |
150f2082 | 26 | }, |
e5a79071 PH |
27 | }, { |
28 | 'url': 'http://tvpot.daum.net/v/vab4dyeDBysyBssyukBUjBz', | |
29 | 'only_matching': True, | |
30 | }, { | |
31 | 'url': 'http://tvpot.daum.net/v/07dXWRka62Y%24', | |
32 | 'only_matching': True, | |
33 | }] | |
150f2082 JMF |
34 | |
35 | def _real_extract(self, url): | |
36 | mobj = re.match(self._VALID_URL, url) | |
e5a79071 | 37 | video_id = mobj.group('id') |
9363169b JMF |
38 | canonical_url = 'http://tvpot.daum.net/v/%s' % video_id |
39 | webpage = self._download_webpage(canonical_url, video_id) | |
ce93879a PH |
40 | full_id = self._search_regex( |
41 | r'<iframe src="http://videofarm.daum.net/controller/video/viewer/Video.html\?.*?vid=(.+?)[&"]', | |
23f4a93b | 42 | webpage, 'full id') |
150f2082 | 43 | query = compat_urllib_parse.urlencode({'vid': full_id}) |
e26f8712 | 44 | info = self._download_xml( |
150f2082 | 45 | 'http://tvpot.daum.net/clip/ClipInfoXml.do?' + query, video_id, |
23f4a93b | 46 | 'Downloading video info') |
e26f8712 | 47 | urls = self._download_xml( |
150f2082 | 48 | 'http://videofarm.daum.net/controller/api/open/v1_2/MovieData.apixml?' + query, |
23f4a93b | 49 | video_id, 'Downloading video formats info') |
150f2082 | 50 | |
150f2082 JMF |
51 | formats = [] |
52 | for format_el in urls.findall('result/output_list/output_list'): | |
53 | profile = format_el.attrib['profile'] | |
54 | format_query = compat_urllib_parse.urlencode({ | |
55 | 'vid': full_id, | |
56 | 'profile': profile, | |
57 | }) | |
e26f8712 | 58 | url_doc = self._download_xml( |
150f2082 | 59 | 'http://videofarm.daum.net/controller/api/open/v1_2/MovieLocation.apixml?' + format_query, |
e5a79071 | 60 | video_id, note='Downloading video data for %s format' % profile) |
150f2082 JMF |
61 | format_url = url_doc.find('result/url').text |
62 | formats.append({ | |
63 | 'url': format_url, | |
150f2082 JMF |
64 | 'format_id': profile, |
65 | }) | |
66 | ||
fb7abb31 | 67 | return { |
150f2082 JMF |
68 | 'id': video_id, |
69 | 'title': info.find('TITLE').text, | |
70 | 'formats': formats, | |
71 | 'thumbnail': self._og_search_thumbnail(webpage), | |
9363169b | 72 | 'description': info.find('CONTENTS').text, |
150f2082 JMF |
73 | 'duration': int(info.find('DURATION').text), |
74 | 'upload_date': info.find('REGDTTM').text[:8], | |
75 | } |