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.
def fixed_template(self):
"""Checks if the output template is fixed."""
- return (re.search(ur'%\(.+?\)s', self._params['outtmpl']) is None)
+ return (re.search(ur'(?u)%\(.+?\)s', self._params['outtmpl']) is None)
def download(self, url_list):
"""Download a given list of URLs."""
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 (ValueError, KeyError), err:
format_param = params.get('format', None)
# Extension
- video_extension = {18: 'mp4'}.get(format_param, 'flv')
+ video_extension = {'18': 'mp4'}.get(format_param, 'flv')
# Normalize URL, including format
normalized_url = 'http://www.youtube.com/watch?v=%s' % video_id
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 [{
if __name__ == '__main__':
try:
+ # Modules needed only when running the main program
+ import optparse
+
# General configuration
urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()))
urllib2.install_opener(urllib2.build_opener(urllib2.HTTPCookieProcessor()))
+ socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words)
+
+ # Parse command line
# Information extractors
youtube_ie = YoutubeIE()
'usenetrc': False,
'username': None,
'password': None,
- 'quiet': False,
- 'simulate': False,
+ 'quiet': True,
+ 'forceurl': True,
+ 'forcetitle': True,
+ 'simulate': True,
'format': None,
- 'outtmpl': '%(ext)s/%(ext)s/%(id)s.%(ext)s'
+ 'outtmpl': '%(id)s.%(ext)s'
})
fd.add_info_extractor(youtube_ie)
fd.download([