]>
Commit | Line | Data |
---|---|---|
1 | # coding: utf-8 | |
2 | from __future__ import unicode_literals | |
3 | ||
4 | import re | |
5 | ||
6 | from .theplatform import ThePlatformIE | |
7 | from ..utils import int_or_none | |
8 | ||
9 | ||
10 | class CBSInteractiveIE(ThePlatformIE): | |
11 | _VALID_URL = r'https?://(?:www\.)?(?P<site>cnet|zdnet)\.com/(?:videos|video/share)/(?P<id>[^/?]+)' | |
12 | _TESTS = [{ | |
13 | 'url': 'http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/', | |
14 | 'info_dict': { | |
15 | 'id': '56f4ea68-bd21-4852-b08c-4de5b8354c60', | |
16 | 'ext': 'flv', | |
17 | 'title': 'Hands-on with Microsoft Windows 8.1 Update', | |
18 | 'description': 'The new update to the Windows 8 OS brings improved performance for mouse and keyboard users.', | |
19 | 'uploader_id': '6085384d-619e-11e3-b231-14feb5ca9861', | |
20 | 'uploader': 'Sarah Mitroff', | |
21 | 'duration': 70, | |
22 | 'timestamp': 1396479627, | |
23 | 'upload_date': '20140402', | |
24 | }, | |
25 | }, { | |
26 | 'url': 'http://www.cnet.com/videos/whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187/', | |
27 | 'info_dict': { | |
28 | 'id': '56527b93-d25d-44e3-b738-f989ce2e49ba', | |
29 | 'ext': 'flv', | |
30 | 'title': 'Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187)', | |
31 | 'description': 'Khail and Ashley wonder what other civic woes can be solved by self-tweeting objects, investigate a new kind of VR camera and watch an origami robot self-assemble, walk, climb, dig and dissolve. #TDPothole', | |
32 | 'uploader_id': 'b163284d-6b73-44fc-b3e6-3da66c392d40', | |
33 | 'uploader': 'Ashley Esqueda', | |
34 | 'duration': 1482, | |
35 | 'timestamp': 1433289889, | |
36 | 'upload_date': '20150603', | |
37 | }, | |
38 | }, { | |
39 | 'url': 'http://www.zdnet.com/video/share/video-keeping-android-smartphones-and-tablets-secure/', | |
40 | 'info_dict': { | |
41 | 'id': 'bc1af9f0-a2b5-4e54-880d-0d95525781c0', | |
42 | 'ext': 'mp4', | |
43 | 'title': 'Video: Keeping Android smartphones and tablets secure', | |
44 | 'description': 'Here\'s the best way to keep Android devices secure, and what you do when they\'ve come to the end of their lives.', | |
45 | 'uploader_id': 'f2d97ea2-8175-11e2-9d12-0018fe8a00b0', | |
46 | 'uploader': 'Adrian Kingsley-Hughes', | |
47 | 'timestamp': 1448961720, | |
48 | 'upload_date': '20151201', | |
49 | }, | |
50 | 'params': { | |
51 | # m3u8 download | |
52 | 'skip_download': True, | |
53 | } | |
54 | }] | |
55 | TP_RELEASE_URL_TEMPLATE = 'http://link.theplatform.com/s/kYEXFC/%s?mbr=true' | |
56 | MPX_ACCOUNTS = { | |
57 | 'cnet': 2288573011, | |
58 | 'zdnet': 2387448114, | |
59 | } | |
60 | ||
61 | def _real_extract(self, url): | |
62 | site, display_id = re.match(self._VALID_URL, url).groups() | |
63 | webpage = self._download_webpage(url, display_id) | |
64 | ||
65 | data_json = self._html_search_regex( | |
66 | r"data-(?:cnet|zdnet)-video(?:-uvp)?-options='([^']+)'", | |
67 | webpage, 'data json') | |
68 | data = self._parse_json(data_json, display_id) | |
69 | vdata = data.get('video') or data['videos'][0] | |
70 | ||
71 | video_id = vdata['id'] | |
72 | title = vdata['title'] | |
73 | author = vdata.get('author') | |
74 | if author: | |
75 | uploader = '%s %s' % (author['firstName'], author['lastName']) | |
76 | uploader_id = author.get('id') | |
77 | else: | |
78 | uploader = None | |
79 | uploader_id = None | |
80 | ||
81 | media_guid_path = 'media/guid/%d/%s' % (self.MPX_ACCOUNTS[site], vdata['mpxRefId']) | |
82 | formats, subtitles = [], {} | |
83 | for (fkey, vid) in vdata['files'].items(): | |
84 | if fkey == 'hls_phone' and 'hls_tablet' in vdata['files']: | |
85 | continue | |
86 | release_url = self.TP_RELEASE_URL_TEMPLATE % vid | |
87 | if fkey == 'hds': | |
88 | release_url += '&manifest=f4m' | |
89 | tp_formats, tp_subtitles = self._extract_theplatform_smil(release_url, video_id, 'Downloading %s SMIL data' % fkey) | |
90 | formats.extend(tp_formats) | |
91 | subtitles = self._merge_subtitles(subtitles, tp_subtitles) | |
92 | self._sort_formats(formats) | |
93 | ||
94 | info = self._extract_theplatform_metadata('kYEXFC/%s' % media_guid_path, video_id) | |
95 | info.update({ | |
96 | 'id': video_id, | |
97 | 'display_id': display_id, | |
98 | 'title': title, | |
99 | 'duration': int_or_none(vdata.get('duration')), | |
100 | 'uploader': uploader, | |
101 | 'uploader_id': uploader_id, | |
102 | 'subtitles': subtitles, | |
103 | 'formats': formats, | |
104 | }) | |
105 | return info |