mirror of
https://github.com/ytdl-org/youtube-dl.git
synced 2025-05-09 23:27:30 +00:00
Merge 6a4f0a114d88965c171d0117db68be64b4db9acd into 33d507f1fe828b186dec9b61ff4fc6b5fdcf42b2
This commit is contained in:
commit
e571bfea81
149
youtube-dl
149
youtube-dl
@ -1,13 +1,19 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
# Author: Ricardo Garcia Gonzalez
|
||||
# Author: Danny Colligan
|
||||
# Author: Benjamin Johnson
|
||||
# Author: Vasyl' Vavrychuk
|
||||
# Author: Witold Baryluk
|
||||
# Author: Paweł Paprota
|
||||
# Author: Gergely Imreh
|
||||
# License: Public domain code
|
||||
|
||||
__author__ = (
|
||||
"Ricardo Garcia Gonzalez",
|
||||
"Danny Colligan",
|
||||
"Benjamin Johnson",
|
||||
"Vasyl' Vavrychuk",
|
||||
"Witold Baryluk",
|
||||
"Paweł Paprota",
|
||||
"Gergely Imreh",
|
||||
)
|
||||
|
||||
__license__ = "Public Domain"
|
||||
__version__ = '2011.08.04'
|
||||
|
||||
import cookielib
|
||||
import ctypes
|
||||
import datetime
|
||||
@ -2693,20 +2699,15 @@ class FFmpegExtractAudioPP(PostProcessor):
|
||||
information['filepath'] = new_path
|
||||
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 update_self(downloader, filename):
|
||||
def updateSelf(downloader, filename):
|
||||
''' Update the program file with the latest version from the repository '''
|
||||
# Note: downloader only used for options
|
||||
if not os.access(filename, os.W_OK):
|
||||
sys.exit('ERROR: no write permissions on %s' % filename)
|
||||
|
||||
downloader.to_screen('Updating to latest stable version...')
|
||||
|
||||
try:
|
||||
latest_url = 'http://github.com/rg3/youtube-dl/raw/master/LATEST_VERSION'
|
||||
latest_version = urllib.urlopen(latest_url).read().strip()
|
||||
@ -2714,60 +2715,108 @@ if __name__ == '__main__':
|
||||
newcontent = urllib.urlopen(prog_url).read()
|
||||
except (IOError, OSError), err:
|
||||
sys.exit('ERROR: unable to download latest version')
|
||||
|
||||
try:
|
||||
stream = open(filename, 'w')
|
||||
stream.write(newcontent)
|
||||
stream.close()
|
||||
except (IOError, OSError), err:
|
||||
sys.exit('ERROR: unable to overwrite current version')
|
||||
|
||||
downloader.to_screen('Updated to version %s' % latest_version)
|
||||
|
||||
# Parse command line
|
||||
parser = optparse.OptionParser(
|
||||
usage='Usage: %prog [options] url...',
|
||||
version='2011.08.04',
|
||||
conflict_handler='resolve',
|
||||
)
|
||||
|
||||
parser.add_option('-h', '--help',
|
||||
def parseOpts():
|
||||
# Deferred imports
|
||||
import getpass
|
||||
import optparse
|
||||
|
||||
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)
|
||||
|
||||
if sys.platform.startswith('linux'):
|
||||
try: columns = os.popen('stty size', 'r').read().split()[1]
|
||||
except: pass
|
||||
|
||||
if columns: return int(columns)
|
||||
|
||||
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' : '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')
|
||||
parser.add_option('-v', '--version',
|
||||
general.add_option('-v', '--version',
|
||||
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')
|
||||
parser.add_option('-i', '--ignore-errors',
|
||||
general.add_option('-i', '--ignore-errors',
|
||||
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)')
|
||||
parser.add_option('-R', '--retries',
|
||||
general.add_option('-R', '--retries',
|
||||
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)
|
||||
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)
|
||||
parser.add_option('--dump-user-agent',
|
||||
general.add_option('--dump-user-agent',
|
||||
action='store_true', dest='dump_user_agent',
|
||||
help='display the current browser identification', default=False)
|
||||
|
||||
authentication = optparse.OptionGroup(parser, 'Authentication Options')
|
||||
authentication.add_option('-u', '--username',
|
||||
dest='username', metavar='USERNAME', help='account username')
|
||||
authentication.add_option('-p', '--password',
|
||||
dest='password', metavar='PASSWORD', help='account password')
|
||||
authentication.add_option('-n', '--netrc',
|
||||
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',
|
||||
action='store', dest='format', metavar='FORMAT', help='video format code')
|
||||
video_format.add_option('--all-formats',
|
||||
action='store_const', dest='format', help='download all available video formats', const='-1')
|
||||
video_format.add_option('--max-quality',
|
||||
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',
|
||||
action='store_true', dest='quiet', help='activates quiet mode', default=False)
|
||||
verbosity.add_option('-s', '--simulate',
|
||||
@ -2790,9 +2839,8 @@ if __name__ == '__main__':
|
||||
verbosity.add_option('--console-title',
|
||||
action='store_true', dest='consoletitle',
|
||||
help='display progress in console titlebar', default=False)
|
||||
parser.add_option_group(verbosity)
|
||||
|
||||
filesystem = optparse.OptionGroup(parser, 'Filesystem Options')
|
||||
|
||||
filesystem.add_option('-t', '--title',
|
||||
action='store_true', dest='usetitle', help='use title in file name', default=False)
|
||||
filesystem.add_option('-l', '--literal',
|
||||
@ -2815,16 +2863,27 @@ if __name__ == '__main__':
|
||||
filesystem.add_option('--no-mtime',
|
||||
action='store_false', dest='updatetime',
|
||||
help='do not use the Last-modified header to set the file modification time', default=True)
|
||||
parser.add_option_group(filesystem)
|
||||
|
||||
postproc = optparse.OptionGroup(parser, 'Post-processing Options')
|
||||
|
||||
postproc.add_option('--extract-audio', action='store_true', dest='extractaudio', default=False,
|
||||
help='convert video files to audio-only files (requires ffmpeg and ffprobe)')
|
||||
postproc.add_option('--audio-format', metavar='FORMAT', dest='audioformat', default='best',
|
||||
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)
|
||||
|
||||
(opts, args) = parser.parse_args()
|
||||
opts, args = parser.parse_args()
|
||||
|
||||
return parser, opts, args
|
||||
|
||||
def main():
|
||||
parser, opts, args = parseOpts()
|
||||
|
||||
# Open appropriate CookieJar
|
||||
if opts.cookiefile is None:
|
||||
@ -2976,7 +3035,7 @@ if __name__ == '__main__':
|
||||
|
||||
# Update version
|
||||
if opts.update_self:
|
||||
update_self(fd, sys.argv[0])
|
||||
updateSelf(fd, sys.argv[0])
|
||||
|
||||
# Maybe do nothing
|
||||
if len(all_urls) < 1:
|
||||
@ -2995,9 +3054,15 @@ if __name__ == '__main__':
|
||||
|
||||
sys.exit(retcode)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
main()
|
||||
except DownloadError:
|
||||
sys.exit(1)
|
||||
except SameFileError:
|
||||
sys.exit(u'ERROR: fixed output name but more than one file to download')
|
||||
except KeyboardInterrupt:
|
||||
sys.exit(u'\nERROR: Interrupted by user')
|
||||
|
||||
# vim: set ts=4 sw=4 sts=4 noet ai si filetype=python:
|
||||
|
Loading…
x
Reference in New Issue
Block a user