2014-02-13 09:32:42 -06:00
from __future__ import unicode_literals
2013-06-23 14:08:17 -05:00
from . common import InfoExtractor
2014-12-13 05:24:42 -06:00
from . . compat import (
2013-06-23 14:08:17 -05:00
compat_urllib_parse ,
2014-12-13 05:24:42 -06:00
)
from . . utils import (
2013-06-23 14:08:17 -05:00
ExtractorError ,
2015-02-10 08:45:36 -06:00
js_to_json ,
2013-06-23 14:08:17 -05:00
)
class EscapistIE ( InfoExtractor ) :
2015-02-10 08:45:36 -06:00
_VALID_URL = r ' https?://?(www \ .)?escapistmagazine \ .com/videos/view/[^/?#]+/(?P<id>[0-9]+)-[^/?#]*(?:$|[?#]) '
2013-06-27 13:46:46 -05:00
_TEST = {
2014-02-13 09:32:42 -06:00
' url ' : ' http://www.escapistmagazine.com/videos/view/the-escapist-presents/6618-Breaking-Down-Baldurs-Gate ' ,
' md5 ' : ' ab3a706c681efca53f0a35f1415cf0d1 ' ,
' info_dict ' : {
' id ' : ' 6618 ' ,
' ext ' : ' mp4 ' ,
' description ' : " Baldur ' s Gate: Original, Modded or Enhanced Edition? I ' ll break down what you can expect from the new Baldur ' s Gate: Enhanced Edition. " ,
2015-02-10 08:45:36 -06:00
' uploader_id ' : ' the-escapist-presents ' ,
' uploader ' : ' The Escapist Presents ' ,
2014-02-13 09:32:42 -06:00
' title ' : " Breaking Down Baldur ' s Gate " ,
2013-06-27 13:46:46 -05:00
}
}
2013-06-23 14:08:17 -05:00
def _real_extract ( self , url ) :
2015-02-10 08:45:36 -06:00
video_id = self . _match_id ( url )
2014-02-13 09:32:42 -06:00
webpage = self . _download_webpage ( url , video_id )
2013-06-23 14:08:17 -05:00
2015-02-10 08:45:36 -06:00
uploader_id = self . _html_search_regex (
r " <h1 class= ' headline ' ><a href= ' /videos/view/(.*?) ' " ,
webpage , ' uploader ID ' , fatal = False )
uploader = self . _html_search_regex (
r " <h1 class= ' headline ' >(.*?)</a> " ,
webpage , ' uploader ' , fatal = False )
description = self . _html_search_meta ( ' description ' , webpage )
2013-06-23 14:08:17 -05:00
2015-02-10 08:45:36 -06:00
raw_title = self . _html_search_meta ( ' title ' , webpage , fatal = True )
title = raw_title . partition ( ' : ' ) [ 2 ]
2013-06-23 14:08:17 -05:00
2015-02-10 08:45:36 -06:00
player_url = self . _og_search_video_url ( webpage , name = ' player URL ' )
config_url = compat_urllib_parse . unquote ( self . _search_regex (
r ' config=(.*)$ ' , player_url , ' config URL ' ) )
2013-06-23 14:08:17 -05:00
2013-11-19 23:47:50 -06:00
formats = [ ]
2013-06-23 14:08:17 -05:00
2014-02-13 09:32:42 -06:00
def _add_format ( name , cfgurl , quality ) :
config = self . _download_json (
cfgurl , video_id ,
' Downloading ' + name + ' configuration ' ,
' Unable to download ' + name + ' configuration ' ,
2015-02-10 08:45:36 -06:00
transform_source = js_to_json )
2013-06-23 14:08:17 -05:00
2013-11-19 23:47:50 -06:00
playlist = config [ ' playlist ' ]
2015-02-10 08:55:51 -06:00
video_url = next (
p [ ' url ' ] for p in playlist
if p . get ( ' eventCategory ' ) == ' Video ' )
2013-11-19 23:47:50 -06:00
formats . append ( {
2015-02-10 08:55:51 -06:00
' url ' : video_url ,
2013-11-19 23:47:50 -06:00
' format_id ' : name ,
2014-02-13 09:32:42 -06:00
' quality ' : quality ,
2013-11-19 23:47:50 -06:00
} )
2013-06-23 14:08:17 -05:00
2015-02-10 08:45:36 -06:00
_add_format ( ' normal ' , config_url , quality = 0 )
hq_url = ( config_url +
( ' &hq=1 ' if ' ? ' in config_url else config_url + ' ?hq=1 ' ) )
2013-11-19 23:47:50 -06:00
try :
2014-02-13 09:32:42 -06:00
_add_format ( ' hq ' , hq_url , quality = 1 )
2013-11-19 23:55:07 -06:00
except ExtractorError :
pass # That's fine, we'll just use normal quality
2013-11-19 23:47:50 -06:00
2014-02-13 09:32:42 -06:00
self . _sort_formats ( formats )
2013-11-19 23:47:50 -06:00
return {
2014-02-13 09:32:42 -06:00
' id ' : video_id ,
2013-11-19 23:47:50 -06:00
' formats ' : formats ,
2015-02-10 08:45:36 -06:00
' uploader ' : uploader ,
' uploader_id ' : uploader_id ,
2013-06-23 14:08:17 -05:00
' title ' : title ,
2013-07-12 12:00:19 -05:00
' thumbnail ' : self . _og_search_thumbnail ( webpage ) ,
2015-02-10 08:45:36 -06:00
' description ' : description ,
' player_url ' : player_url ,
2013-06-23 14:08:17 -05:00
}