merge gvalkov/optparse-refactor (minus stty)

This commit is contained in:
Philipp Hagemeister 2011-08-24 23:21:55 +02:00
commit 2c8d32de33
1 changed files with 389 additions and 324 deletions

View File

@ -1,14 +1,19 @@
#!/usr/bin/env python #!/usr/bin/env python
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Author: Ricardo Garcia Gonzalez
# Author: Danny Colligan __author__ = (
# Author: Benjamin Johnson 'Ricardo Garcia Gonzalez',
# Author: Vasyl' Vavrychuk 'Danny Colligan',
# Author: Witold Baryluk 'Benjamin Johnson',
# Author: Paweł Paprota 'Vasyl\' Vavrychuk',
# Author: Gergely Imreh 'Witold Baryluk',
# Author: Philipp Hagemeister <phihag@phihag.de> 'Paweł Paprota',
# License: Public domain code 'Gergely Imreh',
)
__license__ = 'Public Domain'
__version__ = '2011.08.24-phihag'
import cookielib import cookielib
import datetime import datetime
import gzip import gzip
@ -2942,20 +2947,15 @@ class FFmpegExtractAudioPP(PostProcessor):
information['filepath'] = new_path information['filepath'] = new_path
return information return information
### MAIN PROGRAM ###
if __name__ == '__main__':
try:
# Modules needed only when running the main program
import getpass
import optparse
# Function to update the program file with the latest version from the repository. def updateSelf(downloader, filename):
def update_self(downloader, filename): ''' Update the program file with the latest version from the repository '''
# Note: downloader only used for options # Note: downloader only used for options
if not os.access(filename, os.W_OK): if not os.access(filename, os.W_OK):
sys.exit('ERROR: no write permissions on %s' % filename) sys.exit('ERROR: no write permissions on %s' % filename)
downloader.to_screen('Updating to latest stable version...') downloader.to_screen('Updating to latest stable version...')
try: try:
latest_url = 'http://github.com/rg3/youtube-dl/raw/master/LATEST_VERSION' latest_url = 'http://github.com/rg3/youtube-dl/raw/master/LATEST_VERSION'
latest_version = urllib.urlopen(latest_url).read().strip() latest_version = urllib.urlopen(latest_url).read().strip()
@ -2963,60 +2963,109 @@ if __name__ == '__main__':
newcontent = urllib.urlopen(prog_url).read() newcontent = urllib.urlopen(prog_url).read()
except (IOError, OSError), err: except (IOError, OSError), err:
sys.exit('ERROR: unable to download latest version') sys.exit('ERROR: unable to download latest version')
try: try:
stream = open(filename, 'w') stream = open(filename, 'w')
stream.write(newcontent) stream.write(newcontent)
stream.close() stream.close()
except (IOError, OSError), err: except (IOError, OSError), err:
sys.exit('ERROR: unable to overwrite current version') sys.exit('ERROR: unable to overwrite current version')
downloader.to_screen('Updated to version %s' % latest_version) downloader.to_screen('Updated to version %s' % latest_version)
# Parse command line def parseOpts():
parser = optparse.OptionParser( # Deferred imports
usage='Usage: %prog [options] url...', import getpass
version='2011.08.04-phihag', import optparse
conflict_handler='resolve',
)
parser.add_option('-h', '--help', def _format_option_string(option):
''' ('-o', '--option') -> -o, --format METAVAR'''
opts = []
if option._short_opts: opts.append(option._short_opts[0])
if option._long_opts: opts.append(option._long_opts[0])
if len(opts) > 1: opts.insert(1, ', ')
if option.takes_value(): opts.append(' %s' % option.metavar)
return "".join(opts)
def _find_term_columns():
columns = os.environ.get('COLUMNS', None)
if columns:
return int(columns)
# TODO: Breaks on phihag's system
#if sys.platform.startswith('linux'):
# try:
# return os.popen('stty size', 'r').read().split()[1]
# except: pass
return None
max_width = 80
max_help_position = 80
# No need to wrap help messages if we're on a wide console
columns = _find_term_columns()
if columns: max_width = columns
fmt = optparse.IndentedHelpFormatter(width=max_width, max_help_position=max_help_position)
fmt.format_option_strings = _format_option_string
kw = {
'version' : __version__,
'formatter' : fmt,
'usage' : '%prog [options] url...',
'conflict_handler' : 'resolve',
}
parser = optparse.OptionParser(**kw)
# option groups
general = optparse.OptionGroup(parser, 'General Options')
authentication = optparse.OptionGroup(parser, 'Authentication Options')
video_format = optparse.OptionGroup(parser, 'Video Format Options')
postproc = optparse.OptionGroup(parser, 'Post-processing Options')
filesystem = optparse.OptionGroup(parser, 'Filesystem Options')
verbosity = optparse.OptionGroup(parser, 'Verbosity / Simulation Options')
general.add_option('-h', '--help',
action='help', help='print this help text and exit') action='help', help='print this help text and exit')
parser.add_option('-v', '--version', general.add_option('-v', '--version',
action='version', help='print program version and exit') action='version', help='print program version and exit')
parser.add_option('-U', '--update', general.add_option('-U', '--update',
action='store_true', dest='update_self', help='update this program to latest stable version') action='store_true', dest='update_self', help='update this program to latest stable version')
parser.add_option('-i', '--ignore-errors', general.add_option('-i', '--ignore-errors',
action='store_true', dest='ignoreerrors', help='continue on download errors', default=False) action='store_true', dest='ignoreerrors', help='continue on download errors', default=False)
parser.add_option('-r', '--rate-limit', general.add_option('-r', '--rate-limit',
dest='ratelimit', metavar='LIMIT', help='download rate limit (e.g. 50k or 44.6m)') dest='ratelimit', metavar='LIMIT', help='download rate limit (e.g. 50k or 44.6m)')
parser.add_option('-R', '--retries', general.add_option('-R', '--retries',
dest='retries', metavar='RETRIES', help='number of retries (default is 10)', default=10) dest='retries', metavar='RETRIES', help='number of retries (default is 10)', default=10)
parser.add_option('--playlist-start', general.add_option('--playlist-start',
dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is 1)', default=1) dest='playliststart', metavar='NUMBER', help='playlist video to start at (default is 1)', default=1)
parser.add_option('--playlist-end', general.add_option('--playlist-end',
dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1) dest='playlistend', metavar='NUMBER', help='playlist video to end at (default is last)', default=-1)
parser.add_option('--dump-user-agent', general.add_option('--dump-user-agent',
action='store_true', dest='dump_user_agent', action='store_true', dest='dump_user_agent',
help='display the current browser identification', default=False) help='display the current browser identification', default=False)
authentication = optparse.OptionGroup(parser, 'Authentication Options')
authentication.add_option('-u', '--username', authentication.add_option('-u', '--username',
dest='username', metavar='USERNAME', help='account username') dest='username', metavar='USERNAME', help='account username')
authentication.add_option('-p', '--password', authentication.add_option('-p', '--password',
dest='password', metavar='PASSWORD', help='account password') dest='password', metavar='PASSWORD', help='account password')
authentication.add_option('-n', '--netrc', authentication.add_option('-n', '--netrc',
action='store_true', dest='usenetrc', help='use .netrc authentication data', default=False) action='store_true', dest='usenetrc', help='use .netrc authentication data', default=False)
parser.add_option_group(authentication)
video_format = optparse.OptionGroup(parser, 'Video Format Options')
video_format.add_option('-f', '--format', video_format.add_option('-f', '--format',
action='store', dest='format', metavar='FORMAT', help='video format code') action='store', dest='format', metavar='FORMAT', help='video format code')
video_format.add_option('--all-formats', video_format.add_option('--all-formats',
action='store_const', dest='format', help='download all available video formats', const='-1') action='store_const', dest='format', help='download all available video formats', const='-1')
video_format.add_option('--max-quality', video_format.add_option('--max-quality',
action='store', dest='format_limit', metavar='FORMAT', help='highest quality format to download') action='store', dest='format_limit', metavar='FORMAT', help='highest quality format to download')
parser.add_option_group(video_format)
verbosity = optparse.OptionGroup(parser, 'Verbosity / Simulation Options')
verbosity.add_option('-q', '--quiet', verbosity.add_option('-q', '--quiet',
action='store_true', dest='quiet', help='activates quiet mode', default=False) action='store_true', dest='quiet', help='activates quiet mode', default=False)
verbosity.add_option('-s', '--simulate', verbosity.add_option('-s', '--simulate',
@ -3039,9 +3088,8 @@ if __name__ == '__main__':
verbosity.add_option('--console-title', verbosity.add_option('--console-title',
action='store_true', dest='consoletitle', action='store_true', dest='consoletitle',
help='display progress in console titlebar', default=False) help='display progress in console titlebar', default=False)
parser.add_option_group(verbosity)
filesystem = optparse.OptionGroup(parser, 'Filesystem Options')
filesystem.add_option('-t', '--title', filesystem.add_option('-t', '--title',
action='store_true', dest='usetitle', help='use title in file name', default=False) action='store_true', dest='usetitle', help='use title in file name', default=False)
filesystem.add_option('-l', '--literal', filesystem.add_option('-l', '--literal',
@ -3070,16 +3118,27 @@ if __name__ == '__main__':
filesystem.add_option('--write-info-json', filesystem.add_option('--write-info-json',
action='store_true', dest='writeinfojson', action='store_true', dest='writeinfojson',
help='write video metadata to a .info.json file', default=False) help='write video metadata to a .info.json file', default=False)
parser.add_option_group(filesystem)
postproc = optparse.OptionGroup(parser, 'Post-processing Options')
postproc.add_option('--extract-audio', action='store_true', dest='extractaudio', default=False, postproc.add_option('--extract-audio', action='store_true', dest='extractaudio', default=False,
help='convert video files to audio-only files (requires ffmpeg and ffprobe)') help='convert video files to audio-only files (requires ffmpeg and ffprobe)')
postproc.add_option('--audio-format', metavar='FORMAT', dest='audioformat', default='best', postproc.add_option('--audio-format', metavar='FORMAT', dest='audioformat', default='best',
help='"best", "aac" or "mp3"; best by default') help='"best", "aac" or "mp3"; best by default')
parser.add_option_group(general)
parser.add_option_group(filesystem)
parser.add_option_group(verbosity)
parser.add_option_group(video_format)
parser.add_option_group(authentication)
parser.add_option_group(postproc) parser.add_option_group(postproc)
(opts, args) = parser.parse_args() opts, args = parser.parse_args()
return parser, opts, args
def main():
parser, opts, args = parseOpts()
# Open appropriate CookieJar # Open appropriate CookieJar
if opts.cookiefile is None: if opts.cookiefile is None:
@ -3139,15 +3198,15 @@ if __name__ == '__main__':
except (TypeError, ValueError), err: except (TypeError, ValueError), err:
parser.error(u'invalid retry count specified') parser.error(u'invalid retry count specified')
try: try:
opts.playliststart = long(opts.playliststart) opts.playliststart = int(opts.playliststart)
if opts.playliststart <= 0: if opts.playliststart <= 0:
raise ValueError raise ValueError(u'Playlist start must be positive')
except (TypeError, ValueError), err: except (TypeError, ValueError), err:
parser.error(u'invalid playlist start number specified') parser.error(u'invalid playlist start number specified')
try: try:
opts.playlistend = long(opts.playlistend) opts.playlistend = int(opts.playlistend)
if opts.playlistend != -1 and (opts.playlistend <= 0 or opts.playlistend < opts.playliststart): if opts.playlistend != -1 and (opts.playlistend <= 0 or opts.playlistend < opts.playliststart):
raise ValueError raise ValueError(u'Playlist end must be greater than playlist start')
except (TypeError, ValueError), err: except (TypeError, ValueError), err:
parser.error(u'invalid playlist end number specified') parser.error(u'invalid playlist end number specified')
if opts.extractaudio: if opts.extractaudio:
@ -3235,7 +3294,7 @@ if __name__ == '__main__':
# Update version # Update version
if opts.update_self: if opts.update_self:
update_self(fd, sys.argv[0]) updateSelf(fd, sys.argv[0])
# Maybe do nothing # Maybe do nothing
if len(all_urls) < 1: if len(all_urls) < 1:
@ -3254,9 +3313,15 @@ if __name__ == '__main__':
sys.exit(retcode) sys.exit(retcode)
if __name__ == '__main__':
try:
main()
except DownloadError: except DownloadError:
sys.exit(1) sys.exit(1)
except SameFileError: except SameFileError:
sys.exit(u'ERROR: fixed output name but more than one file to download') sys.exit(u'ERROR: fixed output name but more than one file to download')
except KeyboardInterrupt: except KeyboardInterrupt:
sys.exit(u'\nERROR: Interrupted by user') sys.exit(u'\nERROR: Interrupted by user')
# vim: set ts=4 sw=4 sts=4 noet ai si filetype=python: