@ -1,9 +1,9 @@
import json
from __future__ import unicode_literals
import re
import re
from .common import InfoExtractor
from .common import InfoExtractor
from ..utils import (
from ..utils import (
compat_str ,
compat_urllib_parse ,
compat_urllib_parse ,
ExtractorError ,
ExtractorError ,
@ -11,70 +11,68 @@ from ..utils import (
class EscapistIE ( InfoExtractor ) :
class EscapistIE ( InfoExtractor ) :
_VALID_URL = r ' ^https?://?(www \ .)?escapistmagazine \ .com/videos/view/(?P<showname>[^/]+)/(?P<episode>[^/?]+)[/?]?.*$ '
_VALID_URL = r ' ^https?://?(www \ .)?escapistmagazine \ .com/videos/view/(?P<showname>[^/]+)/(?P<id>[0-9]+)- '
_TEST = {
_TEST = {
u ' url ' : u ' http://www.escapistmagazine.com/videos/view/the-escapist-presents/6618-Breaking-Down-Baldurs-Gate ' ,
u ' file ' : u ' 6618-Breaking-Down-Baldurs-Gate.mp4 ' ,
u ' md5 ' : u ' ab3a706c681efca53f0a35f1415cf0d1 ' ,
u ' info_dict ' : {
u " description " : u " Baldur ' s Gate: Original, Modded or Enhanced Edition? I ' ll break down what you can expect from the new Baldur ' s Gate: Enhanced Edition. " ,
u " uploader " : u " the-escapist-presents " ,
u " title " : u " Breaking Down Baldur ' s Gate "
' 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. " ,
' uploader ' : ' the-escapist-presents ' ,
' title ' : " Breaking Down Baldur ' s Gate " ,
}
}
}
}
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
mobj = re . match ( self . _VALID_URL , url )
showName = mobj . group ( ' showname ' )
showName = mobj . group ( ' showname ' )
videoI d = mobj . group ( ' ep iso de ' )
video_i d = mobj . group ( ' id ' )
self . report_extraction ( videoI d )
webpage = self . _download_webpage ( url , videoI d )
self . report_extraction ( video_i d )
webpage = self . _download_webpage ( url , video_i d )
videoDesc = self . _html_search_regex (
videoDesc = self . _html_search_regex (
r ' <meta name= " description " content= " ([^ " ]*) " ' ,
r ' <meta name= " description " content= " ([^ " ]*) " ' ,
webpage , u ' description ' , fatal = False )
webpage , ' description ' , fatal = False )
playerUrl = self . _og_search_video_url ( webpage , name = u ' player URL ' )
playerUrl = self . _og_search_video_url ( webpage , name = u ' player URL ' )
title = self . _html_search_regex (
title = self . _html_search_regex (
r ' <meta name= " title " content= " ([^ " ]*) " ' ,
r ' <meta name= " title " content= " ([^ " ]*) " ' ,
webpage , u ' title ' ) . split ( ' : ' ) [ - 1 ]
webpage , ' title ' ) . split ( ' : ' ) [ - 1 ]
configUrl = self . _search_regex ( ' config=(.*)$ ' , playerUrl , u ' config URL ' )
configUrl = self . _search_regex ( ' config=(.*)$ ' , playerUrl , ' config URL ' )
configUrl = compat_urllib_parse . unquote ( configUrl )
configUrl = compat_urllib_parse . unquote ( configUrl )
formats = [ ]
formats = [ ]
def _add_format ( name , cfgurl ) :
configJSON = self . _download_webpage (
cfgurl , videoId ,
u ' Downloading ' + name + ' configuration ' ,
u ' Unable to download ' + name + ' configuration ' )
# Technically, it's JavaScript, not JSON
configJSON = configJSON . replace ( " ' " , ' " ' )
def _add_format ( name , cfgurl , quality ) :
config = self . _download_json (
cfgurl , video_id ,
' Downloading ' + name + ' configuration ' ,
' Unable to download ' + name + ' configuration ' ,
transform_source = lambda s : s . replace ( " ' " , ' " ' ) )
try :
config = json . loads ( configJSON )
except ( ValueError , ) as err :
raise ExtractorError ( u ' Invalid JSON in configuration file: ' + compat_str ( err ) )
playlist = config [ ' playlist ' ]
playlist = config [ ' playlist ' ]
formats . append ( {
formats . append ( {
' url ' : playlist [ 1 ] [ ' url ' ] ,
' url ' : playlist [ 1 ] [ ' url ' ] ,
' format_id ' : name ,
' format_id ' : name ,
' quality ' : quality ,
} )
} )
_add_format ( u ' normal ' , configUrl )
_add_format ( ' normal ' , configUrl , quality = 0 )
hq_url = ( configUrl +
hq_url = ( configUrl +
( ' &hq=1 ' if ' ? ' in configUrl else configUrl + ' ?hq=1 ' ) )
( ' &hq=1 ' if ' ? ' in configUrl else configUrl + ' ?hq=1 ' ) )
try :
try :
_add_format ( u ' hq ' , hq_url )
_add_format ( ' hq ' , hq_url , quality = 1 )
except ExtractorError :
except ExtractorError :
pass # That's fine, we'll just use normal quality
pass # That's fine, we'll just use normal quality
self . _sort_formats ( formats )
return {
return {
' id ' : videoId ,
' id ' : video_i d ,
' formats ' : formats ,
' formats ' : formats ,
' uploader ' : showName ,
' uploader ' : showName ,
' title ' : title ,
' title ' : title ,