@ -4279,6 +4279,69 @@ class VineIE(InfoExtractor):
' uploader ' : uploader ,
} ]
class FlickrIE ( InfoExtractor ) :
""" Information Extractor for Flickr videos """
_VALID_URL = r ' (?:https?://)?(?:www \ .)?flickr \ .com/photos/(?P<uploader_id>[ \ w \ -]+)/(?P<id> \ d+).* '
def _real_extract ( self , url ) :
mobj = re . match ( self . _VALID_URL , url )
video_id = mobj . group ( ' id ' )
video_uploader_id = mobj . group ( ' uploader_id ' )
webpage_url = ' http://www.flickr.com/photos/ ' + video_uploader_id + ' / ' + video_id
webpage = self . _download_webpage ( webpage_url , video_id )
self . report_extraction ( video_id )
mobj = re . search ( r " photo_secret: ' ( \ w+) ' " , webpage )
if mobj is None :
raise ExtractorError ( u ' Unable to extract video secret ' )
secret = mobj . group ( 1 )
first_url = ' https://secure.flickr.com/apps/video/video_mtl_xml.gne?v=x&photo_id= ' + video_id + ' &secret= ' + secret + ' &bitrate=700&target=_self '
first_xml = self . _download_webpage ( first_url , video_id )
mobj = re . search ( r ' <Item id= " id " >( \ d+- \ d+)</Item> ' , first_xml )
if mobj is None :
raise ExtractorError ( u ' Unable to extract node_id ' )
node_id = mobj . group ( 1 )
second_url = ' https://secure.flickr.com/video_playlist.gne?node_id= ' + node_id + ' &tech=flash&mode=playlist&bitrate=700&secret= ' + secret + ' &rd=video.yahoo.com&noad=1 '
second_xml = self . _download_webpage ( second_url , video_id )
mobj = re . search ( r ' <STREAM APP= " (.+?) " FULLPATH= " (.+?) " ' , second_xml )
if mobj is None :
raise ExtractorError ( u ' Unable to extract video url ' )
video_url = mobj . group ( 1 ) + unescapeHTML ( mobj . group ( 2 ) )
mobj = re . search ( r ' <meta property= " og:title " content=(?: " ([^ " ]+) " | \' ([^ \' ]+) \' ) ' , webpage )
if mobj is None :
raise ExtractorError ( u ' Unable to extract title ' )
video_title = mobj . group ( 1 ) or mobj . group ( 2 )
mobj = re . search ( r ' <meta property= " og:description " content=(?: " ([^ " ]+) " | \' ([^ \' ]+) \' ) ' , webpage )
if mobj is None :
self . _downloader . report_warning ( u ' unable to extract description ' )
video_description = None
else :
video_description = mobj . group ( 1 ) or mobj . group ( 2 )
mobj = re . search ( r ' <meta property= " og:image " content=(?: " ([^ " ]+) " | \' ([^ \' ]+) \' ) ' , webpage )
if mobj is None :
raise ExtractorError ( u ' Unable to extract thumbnail ' )
thumbnail = mobj . group ( 1 ) or mobj . group ( 2 )
return [ {
' id ' : video_id ,
' url ' : video_url ,
' ext ' : ' mp4 ' ,
' title ' : video_title ,
' description ' : video_description ,
' thumbnail ' : thumbnail ,
' uploader_id ' : video_uploader_id ,
} ]
def gen_extractors ( ) :
""" Return a list of an instance of every supported extractor.
The order does matter ; the first extractor matched is the one handling the URL .
@ -4338,6 +4401,7 @@ def gen_extractors():
InaIE ( ) ,
HowcastIE ( ) ,
VineIE ( ) ,
FlickrIE ( ) ,
GenericIE ( )
]