import urllib2
std_headers = {
- 'User-Agent': 'UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9) Gecko/2008052906 Firefox/3.0',
+ 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1',
'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Accept': 'text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
'Accept-Language': 'en-us,en;q=0.5',
password: Password for authentication purposes.
usenetrc: Use netrc for authentication instead.
quiet: Do not print messages to stdout.
+ forceurl: Force printing final URL.
+ forcetitle: Force printing title.
simulate: Do not download the video files.
format: Video format code.
outtmpl: Template for output names.
if not self._params.get('quiet', False):
sys.stdout.write('%s%s' % (message, ['\n', ''][skip_eol]))
sys.stdout.flush()
+
+ def to_stderr(self, message):
+ """Print message to stderr."""
+ sys.stderr.write('%s\n' % message)
+
+ def fixed_template(self):
+ """Checks if the output template is fixed."""
+ return (re.search(ur'(?u)%\(.+?\)s', self._params['outtmpl']) is None)
def download(self, url_list):
"""Download a given list of URLs."""
+ if len(url_list) > 1 and self.fixed_template():
+ sys.exit('ERROR: fixed output name but more than one file to download')
+
for url in url_list:
suitable_found = False
for ie in self._ies:
suitable_found = True
results = [x for x in ie.extract(url) if x is not None]
- if (len(url_list) > 1 or len(results) > 1) and re.search(r'%\(.+?\)s', self._params['outtmpl']) is None:
+ if len(results) > 1 and self.fixed_template():
sys.exit('ERROR: fixed output name but more than one file to download')
- if self._params.get('simulate', False):
- continue
-
for result in results:
+
+ # Forced printings
+ if self._params.get('forcetitle', False):
+ print result['title']
+ if self._params.get('forceurl', False):
+ print result['url']
+
+ # Do nothing else if in simulate mode
+ if self._params.get('simulate', False):
+ continue
+
try:
filename = self._params['outtmpl'] % result
- except (KeyError), err:
- sys.stderr.write('ERROR: invalid output template: %s\n' % str(err))
+ except (ValueError, KeyError), err:
+ self.to_stderr('ERROR: invalid output template: %s' % str(err))
continue
try:
self.pmkdir(filename)
except (OSError, IOError), err:
- sys.stderr.write('ERROR: unable to create directories: %s\n' % str(err))
+ self.to_stderr('ERROR: unable to create directories: %s' % str(err))
continue
try:
outstream = open(filename, 'wb')
except (OSError, IOError), err:
- sys.stderr.write('ERROR: unable to open for writing: %s\n' % str(err))
+ self.to_stderr('ERROR: unable to open for writing: %s' % str(err))
continue
try:
self._do_download(outstream, result['url'])
outstream.close()
except (OSError, IOError), err:
- sys.stderr.write('ERROR: unable to write video data: %s\n' % str(err))
+ self.to_stderr('ERROR: unable to write video data: %s' % str(err))
continue
except (urllib2.URLError, httplib.HTTPException, socket.error), err:
- sys.stderr.write('ERROR: unable to download video data: %s\n' % str(err))
+ self.to_stderr('ERROR: unable to download video data: %s' % str(err))
continue
break
if not suitable_found:
- sys.stderr.write('ERROR: no suitable InfoExtractor: %s\n' % url)
+ self.to_stderr('ERROR: no suitable InfoExtractor: %s' % url)
def _do_download(self, stream, url):
request = urllib2.Request(url, None, std_headers)
self.to_stderr('ERROR: Unable to extract video title')
return [None]
video_title = mobj.group(1).decode('utf-8')
- video_title = re.sub(u'&(.+?);', lambda x: unichr(htmlentitydefs.name2codepoint[x.group(1)]), video_title)
+ video_title = re.sub(ur'(?u)&(.+?);', lambda x: unichr(htmlentitydefs.name2codepoint[x.group(1)]), video_title)
# simplified title
- simple_title = re.sub(u'([^%s]+)' % simple_title_chars, u'_', video_title)
- simple_title = simple_title.strip(u'_')
+ simple_title = re.sub(ur'(?u)([^%s]+)' % simple_title_chars, ur'_', video_title)
+ simple_title = simple_title.strip(ur'_')
# Return information
return [{
'username': None,
'password': None,
'quiet': False,
- 'simulate': True,
+ 'forceurl': False,
+ 'forcetitle': False,
+ 'simulate': False,
'format': None,
- 'outtmpl': '%(id)s.%(ext)s'
+ 'outtmpl': '%(ext)s/%(ext)s/%(id)s.%(ext)s'
})
fd.add_info_extractor(youtube_ie)
fd.download([