2014-01-29 22:34:35 +08:00
from __future__ import unicode_literals
2013-06-24 03:14:19 +08:00
import base64
from . common import InfoExtractor
2014-12-13 19:24:42 +08:00
from . . compat import (
2015-07-18 01:39:54 +08:00
compat_urllib_parse_unquote ,
2015-07-03 11:53:37 +08:00
compat_urlparse ,
2013-06-24 03:14:19 +08:00
)
class InfoQIE ( InfoExtractor ) :
2015-06-25 21:54:44 +08:00
_VALID_URL = r ' https?://(?:www \ .)?infoq \ .com/(?:[^/]+/)+(?P<id>[^/]+) '
2014-04-20 07:01:37 +08:00
2015-06-25 21:54:44 +08:00
_TESTS = [ {
2014-04-21 08:55:35 +08:00
' url ' : ' http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things ' ,
2014-04-21 09:21:34 +08:00
' md5 ' : ' b5ca0e0a8c1fed93b0e65e48e462f9a2 ' ,
2014-04-21 08:55:35 +08:00
' info_dict ' : {
' id ' : ' 12-jan-pythonthings ' ,
' ext ' : ' mp4 ' ,
' description ' : ' Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience. ' ,
' title ' : ' A Few of My Favorite [Python] Things ' ,
2013-06-28 02:27:08 +08:00
} ,
2015-06-25 21:54:44 +08:00
} , {
' url ' : ' http://www.infoq.com/fr/presentations/changez-avis-sur-javascript ' ,
' only_matching ' : True ,
} ]
2013-06-24 03:14:19 +08:00
def _real_extract ( self , url ) :
2014-12-13 19:24:42 +08:00
video_id = self . _match_id ( url )
2014-02-02 19:03:36 +08:00
webpage = self . _download_webpage ( url , video_id )
2013-06-24 03:14:19 +08:00
2014-04-20 07:01:37 +08:00
video_title = self . _html_search_regex ( r ' <title>(.*?)</title> ' , webpage , ' title ' )
video_description = self . _html_search_meta ( ' description ' , webpage , ' description ' )
2013-06-24 03:14:19 +08:00
2014-04-20 07:10:30 +08:00
# The server URL is hardcoded
2014-04-20 07:01:37 +08:00
video_url = ' rtmpe://video.infoq.com/cfx/st/ '
2014-04-20 07:10:30 +08:00
# Extract video URL
2014-04-21 09:21:34 +08:00
encoded_id = self . _search_regex (
r " jsclassref \ s*= \ s* ' ([^ ' ]*) ' " , webpage , ' encoded id ' )
2015-07-18 01:39:54 +08:00
real_id = compat_urllib_parse_unquote ( base64 . b64decode ( encoded_id . encode ( ' ascii ' ) ) . decode ( ' utf-8 ' ) )
2014-04-20 07:10:30 +08:00
playpath = ' mp4: ' + real_id
2013-06-24 03:14:19 +08:00
2014-04-20 07:01:37 +08:00
video_filename = playpath . split ( ' / ' ) [ - 1 ]
2013-06-24 03:14:19 +08:00
video_id , extension = video_filename . split ( ' . ' )
2014-04-21 09:21:34 +08:00
http_base = self . _search_regex (
2015-07-03 11:53:37 +08:00
r ' EXPRESSINSTALL_SWF \ s*= \ s*[^ " ]* " ((?:https?:)?//[^/ " ]+/) ' , webpage ,
2014-04-21 09:21:34 +08:00
' HTTP base URL ' )
formats = [ {
' format_id ' : ' rtmp ' ,
' url ' : video_url ,
' ext ' : extension ,
' play_path ' : playpath ,
} , {
' format_id ' : ' http ' ,
2015-07-03 11:53:37 +08:00
' url ' : compat_urlparse . urljoin ( url , http_base ) + real_id ,
2014-04-21 09:21:34 +08:00
} ]
self . _sort_formats ( formats )
2014-04-21 08:55:35 +08:00
return {
2013-06-24 03:14:19 +08:00
' id ' : video_id ,
' title ' : video_title ,
' description ' : video_description ,
2014-04-21 09:21:34 +08:00
' formats ' : formats ,
2014-04-21 08:55:35 +08:00
}