@ -1,11 +1,17 @@
from __future__ import unicode_literals
from __future__ import unicode_literals
import re
from . common import InfoExtractor
from . common import InfoExtractor
from . . utils import (
ExtractorError ,
int_or_none ,
)
class AolIE ( InfoExtractor ) :
class AolIE ( InfoExtractor ) :
IE_NAME = ' on.aol.com '
IE_NAME = ' on.aol.com '
_VALID_URL = r ' (?:aol-video:|https?://on \ .aol \ .com/video/.*-)(?P<id>[ 0-9]+)(?:$|\ ? )'
_VALID_URL = r ' (?:aol-video:|https?://on \ .aol \ .com/video/.*-)(?P<id>[ ^/?-]+ )'
_TESTS = [ {
_TESTS = [ {
' url ' : ' http://on.aol.com/video/u-s--official-warns-of-largest-ever-irs-phone-scam-518167793?icid=OnHomepageC2Wide_MustSee_Img ' ,
' url ' : ' http://on.aol.com/video/u-s--official-warns-of-largest-ever-irs-phone-scam-518167793?icid=OnHomepageC2Wide_MustSee_Img ' ,
@ -14,13 +20,79 @@ class AolIE(InfoExtractor):
' id ' : ' 518167793 ' ,
' id ' : ' 518167793 ' ,
' ext ' : ' mp4 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' U.S. Official Warns Of \' Largest Ever \' IRS Phone Scam ' ,
' title ' : ' U.S. Official Warns Of \' Largest Ever \' IRS Phone Scam ' ,
' description ' : ' A major phone scam has cost thousands of taxpayers more than $1 million, with less than a month until income tax returns are due to the IRS. ' ,
' timestamp ' : 1395405060 ,
' upload_date ' : ' 20140321 ' ,
' uploader ' : ' Newsy Studio ' ,
} ,
} ,
' add_ie ' : [ ' FiveMin ' ] ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
}
} , {
' url ' : ' http://on.aol.com/video/netflix-is-raising-rates-5707d6b8e4b090497b04f706?context=PC:homepage:PL1944:1460189336183 ' ,
' info_dict ' : {
' id ' : ' 5707d6b8e4b090497b04f706 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' Netflix is Raising Rates ' ,
' description ' : ' Netflix is rewarding millions of it’ s long-standing members with an increase in cost. Veuer’ s Carly Figueroa has more. ' ,
' upload_date ' : ' 20160408 ' ,
' timestamp ' : 1460123280 ,
' uploader ' : ' Veuer ' ,
} ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
}
} ]
} ]
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
video_id = self . _match_id ( url )
video_id = self . _match_id ( url )
return self . url_result ( ' 5min: %s ' % video_id )
response = self . _download_json (
' https://feedapi.b2c.on.aol.com/v1.0/app/videos/aolon/ %s /details ' % video_id ,
video_id ) [ ' response ' ]
if response [ ' statusText ' ] != ' Ok ' :
raise ExtractorError ( ' %s said: %s ' % ( self . IE_NAME , response [ ' statusText ' ] ) , expected = True )
video_data = response [ ' data ' ]
formats = [ ]
m3u8_url = video_data . get ( ' videoMasterPlaylist ' )
if m3u8_url :
formats . extend ( self . _extract_m3u8_formats (
m3u8_url , video_id , ' mp4 ' , m3u8_id = ' hls ' , fatal = False ) )
for rendition in video_data . get ( ' renditions ' , [ ] ) :
video_url = rendition . get ( ' url ' )
if not video_url :
continue
ext = rendition . get ( ' format ' )
if ext == ' m3u8 ' :
formats . extend ( self . _extract_m3u8_formats (
video_url , video_id , ' mp4 ' , m3u8_id = ' hls ' , fatal = False ) )
else :
f = {
' url ' : video_url ,
' format_id ' : rendition . get ( ' quality ' ) ,
}
mobj = re . search ( r ' ( \ d+)x( \ d+) ' , video_url )
if mobj :
f . update ( {
' width ' : int ( mobj . group ( 1 ) ) ,
' height ' : int ( mobj . group ( 2 ) ) ,
} )
formats . append ( f )
self . _sort_formats ( formats , ( ' width ' , ' height ' , ' tbr ' , ' format_id ' ) )
return {
' id ' : video_id ,
' title ' : video_data [ ' title ' ] ,
' duration ' : int_or_none ( video_data . get ( ' duration ' ) ) ,
' timestamp ' : int_or_none ( video_data . get ( ' publishDate ' ) ) ,
' view_count ' : int_or_none ( video_data . get ( ' views ' ) ) ,
' description ' : video_data . get ( ' description ' ) ,
' uploader ' : video_data . get ( ' videoOwner ' ) ,
' formats ' : formats ,
}
class AolFeaturesIE ( InfoExtractor ) :
class AolFeaturesIE ( InfoExtractor ) :