@ -1,33 +1,33 @@
# coding: utf-8
# coding: utf-8
from __future__ import unicode_literals
from __future__ import unicode_literals
import json
from . common import InfoExtractor
from . theplatform import ThePlatformIE
from . theplatform import ThePlatformIE
from . . utils import int_or_none
class CNETIE ( InfoExtractor ) :
class CNETIE ( ThePlatformIE ) :
_VALID_URL = r ' https?://(?:www \ .)?cnet \ .com/videos/(?P<id>[^/]+)/ '
_VALID_URL = r ' https?://(?:www \ .)?cnet \ .com/videos/(?P<id>[^/]+)/ '
_TESTS = [ {
_TESTS = [ {
' url ' : ' http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/ ' ,
' url ' : ' http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/ ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 56f4ea68-bd21-4852-b08c-4de5b8354c60 ' ,
' id ' : ' 56f4ea68-bd21-4852-b08c-4de5b8354c60 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' flv ' ,
' title ' : ' Hands-on with Microsoft Windows 8.1 Update ' ,
' 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. ' ,
' description ' : ' The new update to the Windows 8 OS brings improved performance for mouse and keyboard users. ' ,
' uploader_id ' : ' 6085384d-619e-11e3-b231-14feb5ca9861 ' ,
' uploader_id ' : ' 6085384d-619e-11e3-b231-14feb5ca9861 ' ,
' uploader ' : ' Sarah Mitroff ' ,
' uploader ' : ' Sarah Mitroff ' ,
' duration ' : 70 ,
} ,
} ,
} , {
} , {
' url ' : ' http://www.cnet.com/videos/whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187/ ' ,
' url ' : ' http://www.cnet.com/videos/whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187/ ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 56527b93-d25d-44e3-b738-f989ce2e49ba ' ,
' id ' : ' 56527b93-d25d-44e3-b738-f989ce2e49ba ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' flv ' ,
' title ' : ' Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187) ' ,
' 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 ' ,
' 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_id ' : ' b163284d-6b73-44fc-b3e6-3da66c392d40 ' ,
' uploader ' : ' Ashley Esqueda ' ,
' uploader ' : ' Ashley Esqueda ' ,
' title' : ' Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187) ' ,
' duration' : 1482 ,
} ,
} ,
} ]
} ]
@ -36,10 +36,10 @@ class CNETIE(InfoExtractor):
webpage = self . _download_webpage ( url , display_id )
webpage = self . _download_webpage ( url , display_id )
data_json = self . _html_search_regex (
data_json = self . _html_search_regex (
r " <div class=\" videoPlayer \" \ s+.*? data-cnet-video-uvp-options=' ([^ ' ]+) ' " ,
r " data-cnet-video(?: -uvp)? -options=' ([^ ' ]+) ' " ,
webpage , ' data json ' )
webpage , ' data json ' )
data = json . loads ( data_json )
data = self . _parse_json ( data_json , display_id )
vdata = data [ ' videos ' ] [ 0 ]
vdata = data . get ( ' video ' ) or data [ ' videos ' ] [ 0 ]
video_id = vdata [ ' id ' ]
video_id = vdata [ ' id ' ]
title = vdata [ ' title ' ]
title = vdata [ ' title ' ]
@ -52,19 +52,22 @@ class CNETIE(InfoExtractor):
uploader_id = None
uploader_id = None
mpx_account = data [ ' config ' ] [ ' uvpConfig ' ] [ ' default ' ] [ ' mpx_account ' ]
mpx_account = data [ ' config ' ] [ ' uvpConfig ' ] [ ' default ' ] [ ' mpx_account ' ]
tp = ThePlatformIE ( self . _downloader )
metadata = self . get_metadata ( ' %s / %s ' % ( mpx_account , list ( vdata [ ' files ' ] . values ( ) ) [ 0 ] ) , video_id )
description = vdata . get ( ' description ' ) or metadata . get ( ' description ' )
duration = int_or_none ( vdata . get ( ' duration ' ) ) or metadata . get ( ' duration ' )
formats = [ ]
formats = [ ]
subtitles = { }
subtitles = { }
description = vdata . get ( ' description ' )
for ( fkey , vid ) in vdata [ ' files ' ] . items ( ) :
for ( fkey , vid ) in vdata [ ' files ' ] . items ( ) :
if fkey == ' hls_phone ' and ' hls_tablet ' in vdata [ ' files ' ] :
if fkey == ' hls_phone ' and ' hls_tablet ' in vdata [ ' files ' ] :
continue
continue
result = tp . extract ( ( ' http://link.theplatform.com/s/ %s / %s ' % ( mpx_account , vid ) ) )
release_url = ' http://link.theplatform.com/s/ %s / %s ?format=SMIL&mbr=true ' % ( mpx_account , vid )
formats . extend ( result [ ' formats ' ] )
if fkey == ' hds ' :
subtitles = self . _merge_subtitles ( subtitles , result [ ' subtitles ' ] )
release_url + = ' &manifest=f4m '
description = description or result . get ( ' description ' )
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 )
self . _sort_formats ( formats )
self . _sort_formats ( formats )
return {
return {
@ -72,6 +75,8 @@ class CNETIE(InfoExtractor):
' display_id ' : display_id ,
' display_id ' : display_id ,
' title ' : title ,
' title ' : title ,
' description ' : description ,
' description ' : description ,
' thumbnail ' : metadata . get ( ' thumbnail ' ) ,
' duration ' : duration ,
' uploader ' : uploader ,
' uploader ' : uploader ,
' uploader_id ' : uploader_id ,
' uploader_id ' : uploader_id ,
' subtitles ' : subtitles ,
' subtitles ' : subtitles ,