+ 'uploader': video_uploader,
+ 'title': video_title,
+ 'stitle': simple_title,
+ 'ext': video_extension.decode('utf-8'),
+ })
+ except UnavailableFormatError:
+ self._downloader.trouble(u'ERROR: format not available for video')
+
+
+class GenericIE(InfoExtractor):
+ """Generic last-resort information extractor."""
+
+ def __init__(self, downloader=None):
+ InfoExtractor.__init__(self, downloader)
+
+ @staticmethod
+ def suitable(url):
+ return True
+
+ def report_download_webpage(self, video_id):
+ """Report webpage download."""
+ self._downloader.to_stdout(u'WARNING: Falling back on generic information extractor.')
+ self._downloader.to_stdout(u'[generic] %s: Downloading webpage' % video_id)
+
+ def report_extraction(self, video_id):
+ """Report information extraction."""
+ self._downloader.to_stdout(u'[generic] %s: Extracting information' % video_id)
+
+ def _real_initialize(self):
+ return
+
+ def _real_extract(self, url):
+ video_id = url.split('/')[-1]
+ request = urllib2.Request(url)
+ try:
+ self.report_download_webpage(video_id)
+ webpage = urllib2.urlopen(request).read()
+ except (urllib2.URLError, httplib.HTTPException, socket.error), err:
+ self._downloader.trouble(u'ERROR: Unable to retrieve video webpage: %s' % str(err))
+ return
+ except ValueError, err:
+ # since this is the last-resort InfoExtractor, if
+ # this error is thrown, it'll be thrown here
+ self._downloader.trouble(u'ERROR: Invalid URL: %s' % url)
+ return
+
+ # Start with something easy: JW Player in SWFObject
+ mobj = re.search(r'flashvars: [\'"](?:.*&)?file=(http[^\'"&]*)', webpage)
+ if mobj is None:
+ # Broaden the search a little bit
+ mobj = re.search(r'[^A-Za-z0-9]?(?:file|source)=(http[^\'"&]*)', webpage)
+ if mobj is None:
+ self._downloader.trouble(u'ERROR: Invalid URL: %s' % url)
+ return
+
+ # It's possible that one of the regexes
+ # matched, but returned an empty group:
+ if mobj.group(1) is None:
+ self._downloader.trouble(u'ERROR: Invalid URL: %s' % url)
+ return
+
+ video_url = urllib.unquote(mobj.group(1))
+ video_id = os.path.basename(video_url)
+
+ # here's a fun little line of code for you:
+ video_extension = os.path.splitext(video_id)[1][1:]
+ video_id = os.path.splitext(video_id)[0]
+
+ # it's tempting to parse this further, but you would
+ # have to take into account all the variations like
+ # Video Title - Site Name
+ # Site Name | Video Title
+ # Video Title - Tagline | Site Name
+ # and so on and so forth; it's just not practical
+ mobj = re.search(r'<title>(.*)</title>', webpage)
+ if mobj is None:
+ self._downloader.trouble(u'ERROR: unable to extract title')
+ return
+ video_title = mobj.group(1).decode('utf-8')
+ video_title = sanitize_title(video_title)
+ simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+
+ # video uploader is domain name
+ mobj = re.match(r'(?:https?://)?([^/]*)/.*', url)
+ if mobj is None:
+ self._downloader.trouble(u'ERROR: unable to extract title')
+ return
+ video_uploader = mobj.group(1).decode('utf-8')
+
+ try:
+ # Process video information
+ self._downloader.process_info({
+ 'id': video_id.decode('utf-8'),
+ 'url': video_url.decode('utf-8'),
+ 'uploader': video_uploader,
+ 'title': video_title,
+ 'stitle': simple_title,