2014-01-27 12:47:30 +08:00
from __future__ import unicode_literals
import re
from . common import InfoExtractor
from . . utils import (
2016-04-15 20:54:12 +08:00
determine_ext ,
2014-01-27 12:47:30 +08:00
parse_duration ,
unified_strdate ,
)
class HuffPostIE ( InfoExtractor ) :
IE_DESC = ' Huffington Post '
_VALID_URL = r ''' (?x)
https ? : / / ( embed \. ) ? live \. huffingtonpost \. com /
( ? :
r / segment / [ ^ / ] + / |
HPLEmbedPlayer / \? segmentId =
)
( ? P < id > [ 0 - 9 a - f ] + ) '''
_TEST = {
' url ' : ' http://live.huffingtonpost.com/r/segment/legalese-it/52dd3e4b02a7602131000677 ' ,
2014-01-27 13:55:35 +08:00
' md5 ' : ' 55f5e8981c1c80a64706a44b74833de8 ' ,
2014-01-27 12:47:30 +08:00
' info_dict ' : {
2014-03-29 21:35:45 +08:00
' id ' : ' 52dd3e4b02a7602131000677 ' ,
' ext ' : ' mp4 ' ,
2014-01-27 13:55:35 +08:00
' title ' : ' Legalese It! with @MikeSacksHP ' ,
' description ' : ' This week on Legalese It, Mike talks to David Bosco about his new book on the ICC, " Rough Justice, " he also discusses the Virginia AG \' s historic stance on gay marriage, the execution of Edgar Tamayo, the ICC \' s delay of Kenya \' s President and more. ' ,
2014-01-27 12:47:30 +08:00
' duration ' : 1549 ,
2014-01-27 13:55:35 +08:00
' upload_date ' : ' 20140124 ' ,
2016-04-15 20:54:12 +08:00
} ,
' params ' : {
# m3u8 download
' skip_download ' : True ,
} ,
' expected_warnings ' : [ ' HTTP Error 404: Not Found ' ] ,
2014-01-27 12:47:30 +08:00
}
def _real_extract ( self , url ) :
2014-10-13 16:08:59 +08:00
video_id = self . _match_id ( url )
2014-01-27 12:47:30 +08:00
api_url = ' http://embed.live.huffingtonpost.com/api/segments/ %s .json ' % video_id
data = self . _download_json ( api_url , video_id ) [ ' data ' ]
video_title = data [ ' title ' ]
2015-01-08 21:07:28 +08:00
duration = parse_duration ( data . get ( ' running_time ' ) )
upload_date = unified_strdate (
data . get ( ' schedule ' , { } ) . get ( ' starts_at ' ) or data . get ( ' segment_start_date_time ' ) )
2014-01-27 13:55:35 +08:00
description = data . get ( ' description ' )
2014-01-27 12:47:30 +08:00
thumbnails = [ ]
2016-04-15 20:54:12 +08:00
for url in filter ( None , data [ ' images ' ] . values ( ) ) :
2014-01-27 12:47:30 +08:00
m = re . match ( ' .*-([0-9]+x[0-9]+) \ . ' , url )
if not m :
continue
thumbnails . append ( {
' url ' : url ,
' resolution ' : m . group ( 1 ) ,
} )
2016-04-15 20:54:12 +08:00
formats = [ ]
sources = data . get ( ' sources ' , { } )
live_sources = list ( sources . get ( ' live ' , { } ) . items ( ) ) + list ( sources . get ( ' live_again ' , { } ) . items ( ) )
for key , url in live_sources :
ext = determine_ext ( url )
if ext == ' m3u8 ' :
formats . extend ( self . _extract_m3u8_formats (
url , video_id , ext = ' mp4 ' , m3u8_id = ' hls ' , fatal = False ) )
elif ext == ' f4m ' :
2016-04-16 21:41:22 +08:00
formats . extend ( self . _extract_f4m_formats (
2016-04-15 20:54:12 +08:00
url + ' ?hdcore=2.9.5 ' , video_id , f4m_id = ' hds ' , fatal = False ) )
else :
formats . append ( {
' format ' : key ,
' format_id ' : key . replace ( ' / ' , ' . ' ) ,
' ext ' : ' mp4 ' ,
' url ' : url ,
' vcodec ' : ' none ' if key . startswith ( ' audio/ ' ) else None ,
} )
2015-01-08 21:07:28 +08:00
if not formats and data . get ( ' fivemin_id ' ) :
return self . url_result ( ' 5min: %s ' % data [ ' fivemin_id ' ] )
2014-01-27 12:47:30 +08:00
self . _sort_formats ( formats )
return {
' id ' : video_id ,
' title ' : video_title ,
2014-01-27 13:55:35 +08:00
' description ' : description ,
2014-01-27 12:47:30 +08:00
' formats ' : formats ,
' duration ' : duration ,
' upload_date ' : upload_date ,
' thumbnails ' : thumbnails ,
}