@ -1,4 +1,5 @@
# coding: utf-8
# coding: utf-8
from __future__ import unicode_literals
import re
import re
import json
import json
@ -20,30 +21,31 @@ class CondeNastIE(InfoExtractor):
# The keys are the supported sites and the values are the name to be shown
# The keys are the supported sites and the values are the name to be shown
# to the user and in the extractor description.
# to the user and in the extractor description.
_SITES = { ' wired ' : u ' WIRED ' ,
_SITES = {
' gq ' : u ' GQ ' ,
' wired ' : ' WIRED ' ,
' vogue ' : u ' Vogue ' ,
' gq ' : ' GQ ' ,
' glamour ' : u ' Glamour ' ,
' vogue ' : ' Vogue ' ,
' wmagazine ' : u ' W Magazine ' ,
' glamour ' : ' Glamour ' ,
' vanityfair ' : u ' Vanity Fair ' ,
' wmagazine ' : ' W Magazine ' ,
}
' vanityfair ' : ' Vanity Fair ' ,
}
_VALID_URL = r ' http://(video|www).(?P<site> %s ).com/(?P<type>watch|series|video)/(?P<id>.+) ' % ' | ' . join ( _SITES . keys ( ) )
_VALID_URL = r ' http://(video|www).(?P<site> %s ).com/(?P<type>watch|series|video)/(?P<id>.+) ' % ' | ' . join ( _SITES . keys ( ) )
IE_DESC = u ' Condé Nast media group: %s ' % ' , ' . join ( sorted ( _SITES . values ( ) ) )
IE_DESC = ' Condé Nast media group: %s ' % ' , ' . join ( sorted ( _SITES . values ( ) ) )
_TEST = {
_TEST = {
u ' url ' : u ' http://video.wired.com/watch/3d-printed-speakers-lit-with-led ' ,
' url ' : ' http://video.wired.com/watch/3d-printed-speakers-lit-with-led ' ,
u ' file ' : u ' 5171b343c2b4c00dd0c1ccb3.mp4 ' ,
' file ' : ' 5171b343c2b4c00dd0c1ccb3.mp4 ' ,
u ' md5 ' : u ' 1921f713ed48aabd715691f774c451f7 ' ,
' md5 ' : ' 1921f713ed48aabd715691f774c451f7 ' ,
u ' info_dict ' : {
' info_dict ' : {
u ' title ' : u ' 3D Printed Speakers Lit With LED ' ,
' title ' : ' 3D Printed Speakers Lit With LED ' ,
u ' description ' : u ' Check out these beautiful 3D printed LED speakers. You can \' t actually buy them, but LumiGeek is working on a board that will let you make you \' re own. ' ,
' description ' : ' Check out these beautiful 3D printed LED speakers. You can \' t actually buy them, but LumiGeek is working on a board that will let you make you \' re own. ' ,
}
}
}
}
def _extract_series ( self , url , webpage ) :
def _extract_series ( self , url , webpage ) :
title = self . _html_search_regex ( r ' <div class= " cne-series-info " >.*?<h1>(.+?)</h1> ' ,
title = self . _html_search_regex ( r ' <div class= " cne-series-info " >.*?<h1>(.+?)</h1> ' ,
webpage , u ' series title ' , flags = re . DOTALL )
webpage , ' series title ' , flags = re . DOTALL )
url_object = compat_urllib_parse_urlparse ( url )
url_object = compat_urllib_parse_urlparse ( url )
base_url = ' %s :// %s ' % ( url_object . scheme , url_object . netloc )
base_url = ' %s :// %s ' % ( url_object . scheme , url_object . netloc )
m_paths = re . finditer ( r ' <p class= " cne-thumb-title " >.*?<a href= " (/watch/.+?)[ " \ ?] ' ,
m_paths = re . finditer ( r ' <p class= " cne-thumb-title " >.*?<a href= " (/watch/.+?)[ " \ ?] ' ,
@ -57,24 +59,24 @@ class CondeNastIE(InfoExtractor):
description = self . _html_search_regex ( [ r ' <div class= " cne-video-description " >(.+?)</div> ' ,
description = self . _html_search_regex ( [ r ' <div class= " cne-video-description " >(.+?)</div> ' ,
r ' <div class= " video-post-content " >(.+?)</div> ' ,
r ' <div class= " video-post-content " >(.+?)</div> ' ,
] ,
] ,
webpage , u ' description ' ,
webpage , ' description ' ,
fatal = False , flags = re . DOTALL )
fatal = False , flags = re . DOTALL )
params = self . _search_regex ( r ' var params = { (.+?)}[;,] ' , webpage ,
params = self . _search_regex ( r ' var params = { (.+?)}[;,] ' , webpage ,
u ' player params ' , flags = re . DOTALL )
' player params ' , flags = re . DOTALL )
video_id = self . _search_regex ( r ' videoId: [ \' " ](.+?)[ \' " ] ' , params , u ' video id ' )
video_id = self . _search_regex ( r ' videoId: [ \' " ](.+?)[ \' " ] ' , params , ' video id ' )
player_id = self . _search_regex ( r ' playerId: [ \' " ](.+?)[ \' " ] ' , params , u ' player id ' )
player_id = self . _search_regex ( r ' playerId: [ \' " ](.+?)[ \' " ] ' , params , ' player id ' )
target = self . _search_regex ( r ' target: [ \' " ](.+?)[ \' " ] ' , params , u ' target ' )
target = self . _search_regex ( r ' target: [ \' " ](.+?)[ \' " ] ' , params , ' target ' )
data = compat_urllib_parse . urlencode ( { ' videoId ' : video_id ,
data = compat_urllib_parse . urlencode ( { ' videoId ' : video_id ,
' playerId ' : player_id ,
' playerId ' : player_id ,
' target ' : target ,
' target ' : target ,
} )
} )
base_info_url = self . _search_regex ( r ' url = [ \' " ](.+?)[ \' " ][,;] ' ,
base_info_url = self . _search_regex ( r ' url = [ \' " ](.+?)[ \' " ][,;] ' ,
webpage , u ' base info url ' ,
webpage , ' base info url ' ,
default = ' http://player.cnevids.com/player/loader.js? ' )
default = ' http://player.cnevids.com/player/loader.js? ' )
info_url = base_info_url + data
info_url = base_info_url + data
info_page = self . _download_webpage ( info_url , video_id ,
info_page = self . _download_webpage ( info_url , video_id ,
u ' Downloading video info ' )
' Downloading video info ' )
video_info = self . _search_regex ( r ' var video = ( { .+?}); ' , info_page , u ' video info ' )
video_info = self . _search_regex ( r ' var video = ( { .+?}); ' , info_page , ' video info ' )
video_info = json . loads ( video_info )
video_info = json . loads ( video_info )
def _formats_sort_key ( f ) :
def _formats_sort_key ( f ) :