2014-02-13 16:32:42 +01:00
from __future__ import unicode_literals
2015-04-27 17:44:13 +02:00
import json
2013-06-23 21:08:17 +02:00
from . common import InfoExtractor
2015-04-27 17:44:13 +02:00
from . . compat import compat_urllib_request
2014-12-13 12:24:42 +01:00
from . . utils import (
2015-04-27 17:44:13 +02:00
determine_ext ,
clean_html ,
qualities ,
2013-06-23 21:08:17 +02:00
)
2015-04-27 17:44:13 +02:00
def _decrypt_config ( key , string ) :
a = ' '
i = ' '
r = ' '
while len ( a ) < ( len ( string ) / 2 ) :
a + = key
a = a [ 0 : int ( len ( string ) / 2 ) ]
t = 0
while t < len ( string ) :
i + = chr ( int ( string [ t ] + string [ t + 1 ] , 16 ) )
t + = 2
icko = [ s for s in i ]
for t , c in enumerate ( a ) :
r + = chr ( ord ( c ) ^ ord ( icko [ t ] ) )
return r
2013-06-23 21:08:17 +02:00
class EscapistIE ( InfoExtractor ) :
2015-02-10 15:45:36 +01:00
_VALID_URL = r ' https?://?(www \ .)?escapistmagazine \ .com/videos/view/[^/?#]+/(?P<id>[0-9]+)-[^/?#]*(?:$|[?#]) '
2015-04-27 17:44:13 +02:00
_TESTS = [ {
2014-02-13 16:32:42 +01:00
' url ' : ' http://www.escapistmagazine.com/videos/view/the-escapist-presents/6618-Breaking-Down-Baldurs-Gate ' ,
2015-04-27 17:44:13 +02:00
' md5 ' : ' c6793dbda81388f4264c1ba18684a74d ' ,
2014-02-13 16:32:42 +01:00
' 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. " ,
' title ' : " Breaking Down Baldur ' s Gate " ,
2015-02-20 23:22:47 +01:00
' thumbnail ' : ' re:^https?://.* \ .jpg$ ' ,
2015-02-28 20:52:52 +01:00
' duration ' : 264 ,
2013-06-27 20:46:46 +02:00
}
2015-04-27 17:44:13 +02:00
} , {
' url ' : ' http://www.escapistmagazine.com/videos/view/zero-punctuation/10044-Evolve-One-vs-Multiplayer ' ,
' md5 ' : ' cf8842a8a46444d241f9a9980d7874f2 ' ,
' info_dict ' : {
' id ' : ' 10044 ' ,
' ext ' : ' mp4 ' ,
' description ' : ' This week, Zero Punctuation reviews Evolve. ' ,
' title ' : ' Evolve - One vs Multiplayer ' ,
' thumbnail ' : ' re:^https?://.* \ .jpg$ ' ,
' duration ' : 304 ,
}
} ]
2013-06-23 21:08:17 +02:00
def _real_extract ( self , url ) :
2015-02-10 15:45:36 +01:00
video_id = self . _match_id ( url )
2015-04-27 17:44:13 +02:00
webpage = self . _download_webpage ( url , video_id )
2015-04-27 18:17:51 +02:00
imsVideo = self . _parse_json (
self . _search_regex (
r ' imsVideo \ .play \ (( { .+?}) \ ); ' , webpage , ' imsVideo ' ) ,
video_id )
2015-04-27 17:44:13 +02:00
video_id = imsVideo [ ' videoID ' ]
key = imsVideo [ ' hash ' ]
quality = qualities ( [ ' lq ' , ' hq ' , ' hd ' ] )
2013-06-23 21:08:17 +02:00
2013-11-20 06:47:50 +01:00
formats = [ ]
2015-04-27 17:44:13 +02:00
for q in [ ' lq ' , ' hq ' , ' hd ' ] :
config_req = compat_urllib_request . Request ( ' http://www.escapistmagazine.com/videos/ '
' vidconfig.php?videoID= %s &hash= %s &quality= %s ' % ( video_id , key , ' mp4_ ' + q ) )
config_req . add_header ( ' Referer ' , url )
config = self . _download_webpage ( config_req , video_id , ' Downloading video config ' + q . upper ( ) )
data = json . loads ( _decrypt_config ( key , config ) )
title = clean_html ( data [ ' videoData ' ] [ ' title ' ] )
duration = data [ ' videoData ' ] [ ' duration ' ] / 1000
for i , v in enumerate ( data [ ' files ' ] [ ' videos ' ] ) :
formats . append ( {
' url ' : v ,
' format_id ' : determine_ext ( v ) + ' _ ' + q + str ( i ) ,
' quality ' : quality ( q ) ,
} )
return {
2014-02-13 16:32:42 +01:00
' id ' : video_id ,
2013-11-20 06:47:50 +01:00
' formats ' : formats ,
2013-06-23 21:08:17 +02:00
' title ' : title ,
2013-07-12 19:00:19 +02:00
' thumbnail ' : self . _og_search_thumbnail ( webpage ) ,
2015-04-27 17:44:13 +02:00
' description ' : self . _og_search_description ( webpage ) ,
2015-02-28 20:52:52 +01:00
' duration ' : duration ,
2013-06-23 21:08:17 +02:00
}