@ -3,18 +3,17 @@ from __future__ import unicode_literals
import re
import re
from .theplatform import ThePlatformIE
from ..compat import compat_urllib_parse
from .cbs import CBSIE
from ..utils import int_or_none
from ..utils import int_or_none
class CBSInteractiveIE ( ThePlatform IE) :
class CBSInteractiveIE ( CBS IE) :
_VALID_URL = r ' https?://(?:www \ .)?(?P<site>cnet|zdnet) \ .com/(?:videos|video/share)/(?P<id>[^/?]+) '
_VALID_URL = r ' https?://(?:www \ .)?(?P<site>cnet|zdnet) \ .com/(?:videos|video/share)/(?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/ ' ,
' md5 ' : ' 041233212a0d06b179c87cbcca1577b8 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 56f4ea68-bd21-4852-b08c-4de5b8354c60 ' ,
' id ' : ' R49SYt__yAfmlXR85z4f7gNmCBDcN_00 ' ,
' display_id ' : ' hands-on-with-microsofts-windows-8-1-update ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' 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. ' ,
@ -25,45 +24,46 @@ class CBSInteractiveIE(ThePlatformIE):
' upload_date ' : ' 20140402 ' ,
' upload_date ' : ' 20140402 ' ,
} ,
} ,
' params ' : {
' params ' : {
' format ' : ' mp4 ' ,
# m3u8 download
' skip_download ' : True ,
} ,
} ,
} , {
} , {
' 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/ ' ,
' md5 ' : ' f2b16d73e08d69591dd9e25564695c0c ' ,
' md5 ' : ' f11d27b2fa18597fbf92444d2a9ed386 ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' 56527b93-d25d-44e3-b738-f989ce2e49ba ' ,
' id ' : ' kjOJd_OoVJqbg_ZD8MZCOk8Wekb9QccK ' ,
' display_id ' : ' whiny-pothole-tweets-at-local-government-when-hit-by-cars-tomorrow-daily-187 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Whiny potholes tweet at local government when hit by cars (Tomorrow Daily 187) ' ,
' 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 ' : ' md5:d2b9a95a5ffe978ae6fbd4cf944d618f ' ,
' uploader_id ' : ' b163284d-6b73-44fc-b3e6-3da66c392d40 ' ,
' uploader_id ' : ' b163284d-6b73-44fc-b3e6-3da66c392d40 ' ,
' uploader ' : ' Ashley Esqueda ' ,
' uploader ' : ' Ashley Esqueda ' ,
' duration ' : 1482 ,
' duration ' : 1482 ,
' timestamp ' : 1433289889 ,
' timestamp ' : 1433289889 ,
' upload_date ' : ' 20150603 ' ,
' upload_date ' : ' 20150603 ' ,
} ,
} ,
' params ' : {
' format ' : ' mp4 ' ,
} ,
} , {
} , {
' url ' : ' http://www.zdnet.com/video/share/video-keeping-android-smartphones-and-tablets-secure/ ' ,
' url ' : ' http://www.zdnet.com/video/share/video-keeping-android-smartphones-and-tablets-secure/ ' ,
' info_dict ' : {
' info_dict ' : {
' id ' : ' bc1af9f0-a2b5-4e54-880d-0d95525781c0 ' ,
' id ' : ' k0r4T_ehht4xW_hAOqiVQPuBDPZ8SRjt ' ,
' display_id ' : ' video-keeping-android-smartphones-and-tablets-secure ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Video: Keeping Android smartphones and tablets secure ' ,
' title ' : ' Video: Keeping Android smartphones and tablets secure ' ,
' 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. ' ,
' 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. ' ,
' uploader_id ' : ' f2d97ea2-8175-11e2-9d12-0018fe8a00b0 ' ,
' uploader_id ' : ' f2d97ea2-8175-11e2-9d12-0018fe8a00b0 ' ,
' uploader ' : ' Adrian Kingsley-Hughes ' ,
' uploader ' : ' Adrian Kingsley-Hughes ' ,
' duration ' : 731 ,
' timestamp ' : 1449129925 ,
' timestamp ' : 1449129925 ,
' upload_date ' : ' 20151203 ' ,
' upload_date ' : ' 20151203 ' ,
} ,
} ,
' params ' : {
' params ' : {
# m3u8 download
# m3u8 download
' skip_download ' : True ,
' skip_download ' : True ,
}
} ,
} ]
} ]
TP_RELEASE_URL_TEMPLATE = ' http://link.theplatform.com/s/kYEXFC/ %s ?mbr=true '
MPX_ACCOUNTS = {
MPX_ACCOUNTS = {
' cnet ' : 2288573011 ,
' cnet ' : 2198311517 ,
' zdnet ' : 2387448114 ,
' zdnet ' : 2387448114 ,
}
}
@ -77,7 +77,8 @@ class CBSInteractiveIE(ThePlatformIE):
data = self . _parse_json ( data_json , display_id )
data = self . _parse_json ( data_json , display_id )
vdata = data . get ( ' video ' ) or data [ ' videos ' ] [ 0 ]
vdata = data . get ( ' video ' ) or data [ ' videos ' ] [ 0 ]
video_id = vdata [ ' id ' ]
video_id = vdata [ ' mpxRefId ' ]
title = vdata [ ' title ' ]
title = vdata [ ' title ' ]
author = vdata . get ( ' author ' )
author = vdata . get ( ' author ' )
if author :
if author :
@ -87,37 +88,7 @@ class CBSInteractiveIE(ThePlatformIE):
uploader = None
uploader = None
uploader_id = None
uploader_id = None
media_guid_path = ' media/guid/ %d / %s ' % ( self . MPX_ACCOUNTS [ site ] , vdata [ ' mpxRefId ' ] )
formats , subtitles = [ ] , { }
for ( fkey , vid ) in vdata . get ( ' files ' , { } ) . items ( ) :
if fkey == ' hls_phone ' and ' hls_tablet ' in vdata [ ' files ' ] :
continue
release_url = self . TP_RELEASE_URL_TEMPLATE % vid
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 )
if ' m3u8 ' in vdata :
parsed_url = compat_urllib_parse . urlparse ( url )
m3u8_url = ( ' %s :// %s %s '
% ( parsed_url . scheme , parsed_url . netloc , vdata [ ' m3u8 ' ] ) )
m3u8_formats = self . _extract_m3u8_formats ( m3u8_url , video_id )
for format in m3u8_formats :
format [ ' url ' ] = format [ ' url ' ] . replace ( ' https:// ' , ' http:// ' )
formats . extend ( m3u8_formats )
if ' mp4 ' in vdata :
formats . append ( {
' url ' : vdata [ ' mp4 ' ] ,
' format_id ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
} )
self . _sort_formats ( formats )
info = self . _extract_theplatform_metadata ( ' kYEXFC/ %s ' % media_guid_path , video_id )
info = self . _extract_video_info ( video_id , site , self . MPX_ACCOUNTS [ site ] )
info . update ( {
info . update ( {
' id ' : video_id ,
' id ' : video_id ,
' display_id ' : display_id ,
' display_id ' : display_id ,
@ -125,7 +96,5 @@ class CBSInteractiveIE(ThePlatformIE):
' duration ' : int_or_none ( vdata . get ( ' duration ' ) ) ,
' duration ' : int_or_none ( vdata . get ( ' duration ' ) ) ,
' uploader ' : uploader ,
' uploader ' : uploader ,
' uploader_id ' : uploader_id ,
' uploader_id ' : uploader_id ,
' subtitles ' : subtitles ,
' formats ' : formats ,
} )
} )
return info
return info