2014-04-03 09:21:21 -05:00
# coding: utf-8
from __future__ import unicode_literals
2015-09-23 07:28:05 -05:00
from . theplatform import ThePlatformIE
2015-12-20 05:43:00 -06:00
from . . utils import int_or_none
2014-04-03 09:21:21 -05:00
2015-12-20 05:43:00 -06:00
class CNETIE ( ThePlatformIE ) :
2014-04-03 09:21:21 -05:00
_VALID_URL = r ' https?://(?:www \ .)?cnet \ .com/videos/(?P<id>[^/]+)/ '
2015-06-08 00:32:04 -05:00
_TESTS = [ {
2014-04-03 09:21:21 -05:00
' url ' : ' http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/ ' ,
' info_dict ' : {
' id ' : ' 56f4ea68-bd21-4852-b08c-4de5b8354c60 ' ,
2015-12-20 05:43:00 -06:00
' ext ' : ' flv ' ,
2014-04-03 09:21:21 -05:00
' title ' : ' Hands-on with Microsoft Windows 8.1 Update ' ,
' description ' : ' The new update to the Windows 8 OS brings improved performance for mouse and keyboard users. ' ,
2014-12-12 08:55:55 -06:00
' uploader_id ' : ' 6085384d-619e-11e3-b231-14feb5ca9861 ' ,
2014-04-03 09:21:21 -05:00
' uploader ' : ' Sarah Mitroff ' ,
2015-12-20 05:43:00 -06:00
' duration ' : 70 ,
2016-04-01 14:42:15 -05:00
' timestamp ' : 1396479627 ,
' upload_date ' : ' 20140402 ' ,
2014-12-12 08:55:55 -06:00
} ,
2015-06-08 00:32:04 -05:00
} , {
' url ' : ' http://www.cnet.com/videos/whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187/ ' ,
' info_dict ' : {
' id ' : ' 56527b93-d25d-44e3-b738-f989ce2e49ba ' ,
2015-12-20 05:43:00 -06:00
' ext ' : ' flv ' ,
' title ' : ' Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187) ' ,
2015-06-08 00:32:04 -05:00
' 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 ' ,
' uploader_id ' : ' b163284d-6b73-44fc-b3e6-3da66c392d40 ' ,
' uploader ' : ' Ashley Esqueda ' ,
2015-12-20 05:43:00 -06:00
' duration ' : 1482 ,
2016-04-01 14:42:15 -05:00
' timestamp ' : 1433289889 ,
' upload_date ' : ' 20150603 ' ,
2015-06-08 00:32:04 -05:00
} ,
} ]
2016-04-01 14:42:15 -05:00
TP_RELEASE_URL_TEMPLATE = ' http://link.theplatform.com/s/kYEXFC/ %s ?mbr=true '
2014-04-03 09:21:21 -05:00
def _real_extract ( self , url ) :
2014-12-12 08:55:55 -06:00
display_id = self . _match_id ( url )
2014-04-03 09:21:21 -05:00
webpage = self . _download_webpage ( url , display_id )
2014-12-12 08:55:55 -06:00
2014-04-03 09:21:21 -05:00
data_json = self . _html_search_regex (
2015-12-20 05:43:00 -06:00
r " data-cnet-video(?:-uvp)?-options= ' ([^ ' ]+) ' " ,
2014-04-03 09:21:21 -05:00
webpage , ' data json ' )
2015-12-20 05:43:00 -06:00
data = self . _parse_json ( data_json , display_id )
vdata = data . get ( ' video ' ) or data [ ' videos ' ] [ 0 ]
2014-12-12 08:55:55 -06:00
2014-04-03 09:21:21 -05:00
video_id = vdata [ ' id ' ]
2015-09-23 07:28:05 -05:00
title = vdata [ ' title ' ]
2014-04-03 09:21:21 -05:00
author = vdata . get ( ' author ' )
if author :
uploader = ' %s %s ' % ( author [ ' firstName ' ] , author [ ' lastName ' ] )
2014-12-12 08:55:55 -06:00
uploader_id = author . get ( ' id ' )
2014-04-03 09:21:21 -05:00
else :
uploader = None
uploader_id = None
2016-04-01 14:42:15 -05:00
media_guid_path = ' media/guid/2288573011/ %s ' % vdata [ ' mpxRefId ' ]
formats , subtitles = self . _extract_theplatform_smil ( self . TP_RELEASE_URL_TEMPLATE % media_guid_path , video_id )
2015-11-06 00:23:03 -06:00
for ( fkey , vid ) in vdata [ ' files ' ] . items ( ) :
if fkey == ' hls_phone ' and ' hls_tablet ' in vdata [ ' files ' ] :
continue
2016-04-01 14:42:15 -05:00
release_url = self . TP_RELEASE_URL_TEMPLATE % vid
2015-12-20 05:43:00 -06:00
if fkey == ' hds ' :
release_url + = ' &manifest=f4m '
tp_formats , tp_subtitles = self . _extract_theplatform_smil ( release_url , video_id , ' Downloading %s SMIL data ' % fkey )
formats . extend ( tp_formats )
subtitles = self . _merge_subtitles ( subtitles , tp_subtitles )
2015-09-23 07:28:05 -05:00
self . _sort_formats ( formats )
2016-04-01 14:42:15 -05:00
info = self . get_metadata ( ' kYEXFC/ %s ' % media_guid_path , video_id )
info . update ( {
2014-04-03 09:21:21 -05:00
' id ' : video_id ,
' display_id ' : display_id ,
' title ' : title ,
2016-04-01 14:42:15 -05:00
' duration ' : int_or_none ( vdata . get ( ' duration ' ) ) ,
2014-04-03 09:21:21 -05:00
' uploader ' : uploader ,
' uploader_id ' : uploader_id ,
2015-09-23 07:28:05 -05:00
' subtitles ' : subtitles ,
' formats ' : formats ,
2016-04-01 14:42:15 -05:00
} )
return info