2016-04-09 11:32:23 +00:00
# coding: utf-8
2014-03-21 18:54:44 +00:00
from __future__ import unicode_literals
2016-04-09 09:47:46 +00:00
import re
2014-03-21 18:54:44 +00:00
from . common import InfoExtractor
2016-04-09 09:47:46 +00:00
from . . utils import (
ExtractorError ,
int_or_none ,
2018-07-21 12:08:28 +00:00
url_or_none ,
2016-04-09 09:47:46 +00:00
)
2014-03-21 18:54:44 +00:00
class AolIE ( InfoExtractor ) :
IE_NAME = ' on.aol.com '
2017-01-06 11:10:47 +00:00
_VALID_URL = r ' (?:aol-video:|https?://(?:(?:www|on) \ .)?aol \ .com/(?:[^/]+/)*(?:[^/?#&]+-)?)(?P<id>[^/?#&]+) '
2014-03-21 18:54:44 +00:00
2014-08-27 22:58:24 +00:00
_TESTS = [ {
2016-04-14 07:47:55 +00:00
# video with 5min ID
2014-03-21 18:54:44 +00:00
' url ' : ' http://on.aol.com/video/u-s--official-warns-of-largest-ever-irs-phone-scam-518167793?icid=OnHomepageC2Wide_MustSee_Img ' ,
' md5 ' : ' 18ef68f48740e86ae94b98da815eec42 ' ,
' info_dict ' : {
' id ' : ' 518167793 ' ,
' ext ' : ' mp4 ' ,
' title ' : ' U.S. Official Warns Of \' Largest Ever \' IRS Phone Scam ' ,
2016-04-09 09:47:46 +00:00
' 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 ' ,
2014-03-21 18:54:44 +00:00
} ,
2016-04-09 09:47:46 +00:00
' params ' : {
# m3u8 download
' skip_download ' : True ,
}
} , {
2016-04-14 07:47:55 +00:00
# video with vidible ID
2017-01-06 11:10:47 +00:00
' url ' : ' http://www.aol.com/video/view/netflix-is-raising-rates/5707d6b8e4b090497b04f706/ ' ,
2016-04-09 09:47:46 +00:00
' 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 ,
}
2016-04-14 07:47:55 +00:00
} , {
' url ' : ' http://on.aol.com/partners/abc-551438d309eab105804dbfe8/sneak-peek-was-haley-really-framed-570eaebee4b0448640a5c944 ' ,
' only_matching ' : True ,
} , {
' url ' : ' http://on.aol.com/shows/park-bench-shw518173474-559a1b9be4b0c3bfad3357a7?context=SH:SHW518173474:PL4327:1460619712763 ' ,
' only_matching ' : True ,
2016-05-03 15:24:51 +00:00
} , {
' url ' : ' http://on.aol.com/video/519442220 ' ,
' only_matching ' : True ,
} , {
' url ' : ' aol-video:5707d6b8e4b090497b04f706 ' ,
' only_matching ' : True ,
2014-08-27 22:58:24 +00:00
} ]
2014-03-21 18:54:44 +00:00
def _real_extract ( self , url ) :
2016-03-04 09:42:58 +00:00
video_id = self . _match_id ( url )
2016-04-09 09:47:46 +00:00
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 ' , [ ] ) :
2018-07-21 12:08:28 +00:00
video_url = url_or_none ( rendition . get ( ' url ' ) )
2016-04-09 09:47:46 +00:00
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 ,
}