@ -1,3 +1,5 @@
from __future__ import unicode_literals
import itertools
import itertools
import json
import json
import re
import re
@ -12,25 +14,25 @@ from ..utils import (
class YahooIE ( InfoExtractor ) :
class YahooIE ( InfoExtractor ) :
IE_DESC = u ' Yahoo screen '
IE_DESC = ' Yahoo screen '
_VALID_URL = r ' http://screen \ .yahoo \ .com/.*?-(?P<id> \ d*?) \ .html '
_VALID_URL = r ' http://screen \ .yahoo \ .com/.*?-(?P<id> \ d*?) \ .html '
_TESTS = [
_TESTS = [
{
{
u ' url ' : u ' http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html ' ,
' url ' : ' http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html ' ,
u ' file ' : u ' 214727115.mp4 ' ,
' file ' : ' 214727115.mp4 ' ,
u ' md5 ' : u ' 4962b075c08be8690a922ee026d05e69 ' ,
' md5 ' : ' 4962b075c08be8690a922ee026d05e69 ' ,
u ' info_dict ' : {
' info_dict ' : {
u ' title ' : u ' Julian Smith & Travis Legg Watch Julian Smith ' ,
' title ' : ' Julian Smith & Travis Legg Watch Julian Smith ' ,
u ' description ' : u ' Julian and Travis watch Julian Smith ' ,
' description ' : ' Julian and Travis watch Julian Smith ' ,
} ,
} ,
} ,
} ,
{
{
u ' url ' : u ' http://screen.yahoo.com/wired/codefellas-s1-ep12-cougar-lies-103000935.html ' ,
' url ' : ' http://screen.yahoo.com/wired/codefellas-s1-ep12-cougar-lies-103000935.html ' ,
u ' file ' : u ' 103000935.mp4 ' ,
' file ' : ' 103000935.mp4 ' ,
u ' md5 ' : u ' d6e6fc6e1313c608f316ddad7b82b306 ' ,
' md5 ' : ' d6e6fc6e1313c608f316ddad7b82b306 ' ,
u ' info_dict ' : {
' info_dict ' : {
u ' title ' : u ' Codefellas - The Cougar Lies with Spanish Moss ' ,
' title ' : ' Codefellas - The Cougar Lies with Spanish Moss ' ,
u ' description ' : u ' Agent Topple \' s mustache does its dirty work, and Nicole brokers a deal for peace. But why is the NSA collecting millions of Instagram brunch photos? And if your waffles have nothing to hide, what are they so worried about? ' ,
' description ' : ' Agent Topple \' s mustache does its dirty work, and Nicole brokers a deal for peace. But why is the NSA collecting millions of Instagram brunch photos? And if your waffles have nothing to hide, what are they so worried about? ' ,
} ,
} ,
} ,
} ,
]
]
@ -41,7 +43,7 @@ class YahooIE(InfoExtractor):
webpage = self . _download_webpage ( url , video_id )
webpage = self . _download_webpage ( url , video_id )
items_json = self . _search_regex ( r ' mediaItems: ( { .*?})$ ' ,
items_json = self . _search_regex ( r ' mediaItems: ( { .*?})$ ' ,
webpage , u ' items ' , flags = re . MULTILINE )
webpage , ' items ' , flags = re . MULTILINE )
items = json . loads ( items_json )
items = json . loads ( items_json )
info = items [ ' mediaItems ' ] [ ' query ' ] [ ' results ' ] [ ' mediaObj ' ] [ 0 ]
info = items [ ' mediaItems ' ] [ ' query ' ] [ ' results ' ] [ ' mediaObj ' ] [ 0 ]
# The 'meta' field is not always in the video webpage, we request it
# The 'meta' field is not always in the video webpage, we request it
@ -60,7 +62,7 @@ class YahooIE(InfoExtractor):
} )
} )
query_result_json = self . _download_webpage (
query_result_json = self . _download_webpage (
' http://video.query.yahoo.com/v1/public/yql? ' + data ,
' http://video.query.yahoo.com/v1/public/yql? ' + data ,
video_id , u ' Downloading video info ' )
video_id , ' Downloading video info ' )
query_result = json . loads ( query_result_json )
query_result = json . loads ( query_result_json )
info = query_result [ ' query ' ] [ ' results ' ] [ ' mediaObj ' ] [ 0 ]
info = query_result [ ' query ' ] [ ' results ' ] [ ' mediaObj ' ] [ 0 ]
meta = info [ ' meta ' ]
meta = info [ ' meta ' ]
@ -103,13 +105,13 @@ class YahooNewsIE(YahooIE):
_VALID_URL = r ' http://news \ .yahoo \ .com/video/.*?-(?P<id> \ d*?) \ .html '
_VALID_URL = r ' http://news \ .yahoo \ .com/video/.*?-(?P<id> \ d*?) \ .html '
_TEST = {
_TEST = {
u ' url ' : u ' http://news.yahoo.com/video/china-moses-crazy-blues-104538833.html ' ,
' url ' : ' http://news.yahoo.com/video/china-moses-crazy-blues-104538833.html ' ,
u ' md5 ' : u ' 67010fdf3a08d290e060a4dd96baa07b ' ,
' md5 ' : ' 67010fdf3a08d290e060a4dd96baa07b ' ,
u ' info_dict ' : {
' info_dict ' : {
u ' id ' : u ' 104538833 ' ,
' id ' : ' 104538833 ' ,
u ' ext ' : u ' mp4 ' ,
' ext ' : ' mp4 ' ,
u ' title ' : u ' China Moses Is Crazy About the Blues ' ,
' title ' : ' China Moses Is Crazy About the Blues ' ,
u ' description ' : u ' md5:9900ab8cd5808175c7b3fe55b979bed0 ' ,
' description ' : ' md5:9900ab8cd5808175c7b3fe55b979bed0 ' ,
} ,
} ,
}
}
@ -120,14 +122,14 @@ class YahooNewsIE(YahooIE):
mobj = re . match ( self . _VALID_URL , url )
mobj = re . match ( self . _VALID_URL , url )
video_id = mobj . group ( ' id ' )
video_id = mobj . group ( ' id ' )
webpage = self . _download_webpage ( url , video_id )
webpage = self . _download_webpage ( url , video_id )
long_id = self . _search_regex ( r ' contentId: \' (.+?) \' , ' , webpage , u ' long id ' )
long_id = self . _search_regex ( r ' contentId: \' (.+?) \' , ' , webpage , ' long id ' )
return self . _get_info ( long_id , video_id )
return self . _get_info ( long_id , video_id )
class YahooSearchIE ( SearchInfoExtractor ) :
class YahooSearchIE ( SearchInfoExtractor ) :
IE_DESC = u ' Yahoo screen search '
IE_DESC = ' Yahoo screen search '
_MAX_RESULTS = 1000
_MAX_RESULTS = 1000
IE_NAME = u ' screen.yahoo:search '
IE_NAME = ' screen.yahoo:search '
_SEARCH_KEY = ' yvsearch '
_SEARCH_KEY = ' yvsearch '
def _get_n_results ( self , query , n ) :
def _get_n_results ( self , query , n ) :
@ -139,12 +141,12 @@ class YahooSearchIE(SearchInfoExtractor):
' entries ' : [ ]
' entries ' : [ ]
}
}
for pagenum in itertools . count ( 0 ) :
for pagenum in itertools . count ( 0 ) :
result_url = u ' http://video.search.yahoo.com/search/?p= %s &fr=screen&o=js&gs=0&b= %d ' % ( compat_urllib_parse . quote_plus ( query ) , pagenum * 30 )
result_url = ' http://video.search.yahoo.com/search/?p= %s &fr=screen&o=js&gs=0&b= %d ' % ( compat_urllib_parse . quote_plus ( query ) , pagenum * 30 )
webpage = self . _download_webpage ( result_url , query ,
webpage = self . _download_webpage ( result_url , query ,
note = ' Downloading results page ' + str ( pagenum + 1 ) )
note = ' Downloading results page ' + str ( pagenum + 1 ) )
info = json . loads ( webpage )
info = json . loads ( webpage )
m = info [ u ' m ' ]
m = info [ ' m ' ]
results = info [ u ' results ' ]
results = info [ ' results ' ]
for ( i , r ) in enumerate ( results ) :
for ( i , r ) in enumerate ( results ) :
if ( pagenum * 30 ) + i > = n :
if ( pagenum * 30 ) + i > = n :
@ -152,7 +154,7 @@ class YahooSearchIE(SearchInfoExtractor):
mobj = re . search ( r ' (?P<url>screen \ .yahoo \ .com/.*?- \ d*? \ .html) " ' , r )
mobj = re . search ( r ' (?P<url>screen \ .yahoo \ .com/.*?- \ d*? \ .html) " ' , r )
e = self . url_result ( ' http:// ' + mobj . group ( ' url ' ) , ' Yahoo ' )
e = self . url_result ( ' http:// ' + mobj . group ( ' url ' ) , ' Yahoo ' )
res [ ' entries ' ] . append ( e )
res [ ' entries ' ] . append ( e )
if ( pagenum * 30 + i > = n ) or ( m [ u ' last ' ] > = ( m [ u ' total ' ] - 1 ) ) :
if ( pagenum * 30 + i > = n ) or ( m [ ' last ' ] > = ( m [ ' total ' ] - 1 ) ) :
break
break
return res
return res