@ -1,27 +1,27 @@
from __future__ import unicode_literals
import base64
import base64
import re
import re
from . common import InfoExtractor
from . common import InfoExtractor
from . . utils import (
from . . utils import (
compat_urllib_parse ,
compat_urllib_parse ,
ExtractorError ,
)
)
class InfoQIE ( InfoExtractor ) :
class InfoQIE ( InfoExtractor ) :
_VALID_URL = r ' ^(?:https?://)?(?:www \ .)?infoq \ .com/[^/]+/[^/]+$ '
_VALID_URL = r ' ^(?:https?://)?(?:www \ .)?infoq \ .com/[^/]+/[^/]+$ '
_TEST = {
_TEST = {
u " name " : u " InfoQ " ,
" name " : " InfoQ " ,
u " url " : u " http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things " ,
" url " : " http://www.infoq.com/presentations/A-Few-of-My-Favorite-Python-Things " ,
u " file " : u " 12-jan-pythonthings.mp4 " ,
" file " : " 12-jan-pythonthings.mp4 " ,
u " info_dict " : {
" info_dict " : {
u " description " : u " Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience. " ,
" description " : " Mike Pirnat presents some tips and tricks, standard libraries and third party packages that make programming in Python a richer experience. " ,
u " title " : u " A Few of My Favorite [Python] Things "
" title " : " A Few of My Favorite [Python] Things " ,
} ,
" params " : {
" skip_download " : True ,
} ,
} ,
u " params " : {
u " skip_download " : True
}
}
}
def _real_extract ( self , url ) :
def _real_extract ( self , url ) :
@ -31,32 +31,25 @@ class InfoQIE(InfoExtractor):
self . report_extraction ( url )
self . report_extraction ( url )
# Extract video URL
# Extract video URL
mobj = re . search ( r " jsclassref ?= ? ' ([^ ' ]*) ' " , webpage )
encoded_id = self . _search_regex ( r " jsclassref ?= ? ' ([^ ' ]*) ' " , webpage , ' encoded id ' )
if mobj is None :
real_id = compat_urllib_parse . unquote ( base64 . b64decode ( encoded_id . encode ( ' ascii ' ) ) . decode ( ' utf-8 ' ) )
raise ExtractorError ( u ' Unable to extract video url ' )
real_id = compat_urllib_parse . unquote ( base64 . b64decode ( mobj . group ( 1 ) . encode ( ' ascii ' ) ) . decode ( ' utf-8 ' ) )
video_url = ' rtmpe://video.infoq.com/cfx/st/ ' + real_id
video_url = ' rtmpe://video.infoq.com/cfx/st/ ' + real_id
# Extract title
# Extract title
video_title = self . _search_regex ( r ' contentTitle = " (.*?) " ; ' ,
video_title = self . _search_regex ( r ' contentTitle = " (.*?) " ; ' ,
webpage , u ' title ' )
webpage , ' title ' )
# Extract description
# Extract description
video_description = self . _html_search_regex ( r ' <meta name= " description " content= " (.*) " (?: \ s*/)?> ' ,
video_description = self . _html_search_regex ( r ' <meta name= " description " content= " (.*) " (?: \ s*/)?> ' ,
webpage , u ' description ' , fatal = False )
webpage , ' description ' , fatal = False )
video_filename = video_url . split ( ' / ' ) [ - 1 ]
video_filename = video_url . split ( ' / ' ) [ - 1 ]
video_id , extension = video_filename . split ( ' . ' )
video_id , extension = video_filename . split ( ' . ' )
info = {
return {
' id ' : video_id ,
' id ' : video_id ,
' url ' : video_url ,
' url ' : video_url ,
' uploader ' : None ,
' upload_date ' : None ,
' title ' : video_title ,
' title ' : video_title ,
' ext ' : extension , # Extension is always(?) mp4, but seems to be flv
' ext ' : extension , # Extension is always(?) mp4, but seems to be flv
' thumbnail ' : None ,
' description ' : video_description ,
' description ' : video_description ,
}
}
return [ info ]