mirror of
https://github.com/ytdl-org/youtube-dl
synced 2024-11-14 14:28:00 +09:00
Merge pull request #580 from FiloSottile/master
The new shiny build system
This commit is contained in:
commit
d050de77f9
9
.gitignore
vendored
9
.gitignore
vendored
@ -4,3 +4,12 @@
|
|||||||
wine-py2exe/
|
wine-py2exe/
|
||||||
py2exe.log
|
py2exe.log
|
||||||
*.kate-swp
|
*.kate-swp
|
||||||
|
build/
|
||||||
|
dist/
|
||||||
|
MANIFEST
|
||||||
|
README.txt
|
||||||
|
youtube-dl.1
|
||||||
|
youtube-dl.bash-completion
|
||||||
|
youtube-dl
|
||||||
|
youtube-dl.exe
|
||||||
|
youtube-dl.tar.gz
|
||||||
|
14
.travis.yml
14
.travis.yml
@ -1,11 +1,13 @@
|
|||||||
language: python
|
language: python
|
||||||
#specify the python version
|
|
||||||
python:
|
python:
|
||||||
- "2.6"
|
- "2.6"
|
||||||
- "2.7"
|
- "2.7"
|
||||||
notifications:
|
# - "3.3"
|
||||||
irc: "irc.freenode.org#youtube-dl"
|
|
||||||
#command to install the setup
|
|
||||||
install:
|
|
||||||
# command to run tests
|
|
||||||
script: nosetests test --verbose
|
script: nosetests test --verbose
|
||||||
|
notifications:
|
||||||
|
email:
|
||||||
|
- filippo.valsorda@gmail.com
|
||||||
|
irc:
|
||||||
|
channels:
|
||||||
|
- "irc.freenode.org#youtube-dl"
|
||||||
|
skip_join: true
|
||||||
|
@ -1 +1 @@
|
|||||||
2012.11.29
|
9999.99.99
|
3
MANIFEST.in
Normal file
3
MANIFEST.in
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
include README.md
|
||||||
|
include test/*.py
|
||||||
|
include test/*.json
|
40
Makefile
40
Makefile
@ -1,8 +1,7 @@
|
|||||||
all: youtube-dl README.md youtube-dl.1 youtube-dl.bash-completion LATEST_VERSION
|
all: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion
|
||||||
# TODO: re-add youtube-dl.exe, and make sure it's 1. safe and 2. doesn't need sudo
|
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
rm -f youtube-dl youtube-dl.exe youtube-dl.1 LATEST_VERSION
|
rm -rf youtube-dl youtube-dl.exe youtube-dl.1 youtube-dl.bash-completion README.txt MANIFEST build/ dist/
|
||||||
|
|
||||||
PREFIX=/usr/local
|
PREFIX=/usr/local
|
||||||
BINDIR=$(PREFIX)/bin
|
BINDIR=$(PREFIX)/bin
|
||||||
@ -20,8 +19,7 @@ install: youtube-dl youtube-dl.1 youtube-dl.bash-completion
|
|||||||
test:
|
test:
|
||||||
nosetests2 --nocapture test
|
nosetests2 --nocapture test
|
||||||
|
|
||||||
.PHONY: all clean install test README.md youtube-dl.bash-completion
|
.PHONY: all clean install test
|
||||||
# TODO un-phony README.md and youtube-dl.bash_completion by reading from .in files and generating from them
|
|
||||||
|
|
||||||
youtube-dl: youtube_dl/*.py
|
youtube-dl: youtube_dl/*.py
|
||||||
zip --quiet youtube-dl youtube_dl/*.py
|
zip --quiet youtube-dl youtube_dl/*.py
|
||||||
@ -31,28 +29,20 @@ youtube-dl: youtube_dl/*.py
|
|||||||
rm youtube-dl.zip
|
rm youtube-dl.zip
|
||||||
chmod a+x youtube-dl
|
chmod a+x youtube-dl
|
||||||
|
|
||||||
youtube-dl.exe: youtube_dl/*.py
|
|
||||||
bash devscripts/wine-py2exe.sh build_exe.py
|
|
||||||
|
|
||||||
README.md: youtube_dl/*.py
|
README.md: youtube_dl/*.py
|
||||||
@options=$$(COLUMNS=80 python -m youtube_dl --help | sed -e '1,/.*General Options.*/ d' -e 's/^\W\{2\}\(\w\)/## \1/') && \
|
COLUMNS=80 python -m youtube_dl --help | python devscripts/make_readme.py
|
||||||
header=$$(sed -e '/.*# OPTIONS/,$$ d' README.md) && \
|
|
||||||
footer=$$(sed -e '1,/.*# CONFIGURATION/ d' README.md) && \
|
README.txt: README.md
|
||||||
echo "$${header}" > README.md && \
|
pandoc -f markdown -t plain README.md -o README.txt
|
||||||
echo >> README.md && \
|
|
||||||
echo '# OPTIONS' >> README.md && \
|
|
||||||
echo "$${options}" >> README.md&& \
|
|
||||||
echo >> README.md && \
|
|
||||||
echo '# CONFIGURATION' >> README.md && \
|
|
||||||
echo "$${footer}" >> README.md
|
|
||||||
|
|
||||||
youtube-dl.1: README.md
|
youtube-dl.1: README.md
|
||||||
pandoc -s -w man README.md -o youtube-dl.1
|
pandoc -s -f markdown -t man README.md -o youtube-dl.1
|
||||||
|
|
||||||
youtube-dl.bash-completion: README.md
|
youtube-dl.bash-completion: youtube_dl/*.py devscripts/bash-completion.template
|
||||||
@options=`egrep -o '(--[a-z-]+) ' README.md | sort -u | xargs echo` && \
|
python devscripts/bash-completion.py
|
||||||
content=`sed "s/opts=\"[^\"]*\"/opts=\"$${options}\"/g" youtube-dl.bash-completion` && \
|
|
||||||
echo "$${content}" > youtube-dl.bash-completion
|
|
||||||
|
|
||||||
LATEST_VERSION: youtube_dl/__init__.py
|
youtube-dl.tar.gz: all
|
||||||
python -m youtube_dl --version > LATEST_VERSION
|
tar -czf youtube-dl.tar.gz -s "|^./|./youtube-dl/|" \
|
||||||
|
--exclude="*.pyc" --exclude="*.pyo" --exclude="*~" --exclude="youtube-dl.exe" \
|
||||||
|
--exclude="wine-py2exe/" --exclude="py2exe.log" --exclude="*.kate-swp" \
|
||||||
|
--exclude="build/" --exclude="dist/" --exclude="MANIFEST" --exclude=".git/" .
|
||||||
|
@ -51,7 +51,10 @@ which means you can modify it, redistribute it or use it however you like.
|
|||||||
%(upload_date)s for the upload date (YYYYMMDD),
|
%(upload_date)s for the upload date (YYYYMMDD),
|
||||||
%(extractor)s for the provider (youtube, metacafe,
|
%(extractor)s for the provider (youtube, metacafe,
|
||||||
etc), %(id)s for the video id and %% for a literal
|
etc), %(id)s for the video id and %% for a literal
|
||||||
percent. Use - to output to stdout.
|
percent. Use - to output to stdout. Can also be
|
||||||
|
used to download to a different directory, for
|
||||||
|
example with -o '/my/downloads/%(uploader)s/%(title
|
||||||
|
)s-%(id)s.%(ext)s' .
|
||||||
--restrict-filenames Restrict filenames to only ASCII characters, and
|
--restrict-filenames Restrict filenames to only ASCII characters, and
|
||||||
avoid "&" and spaces in filenames
|
avoid "&" and spaces in filenames
|
||||||
-a, --batch-file FILE file containing URLs to download ('-' for stdin)
|
-a, --batch-file FILE file containing URLs to download ('-' for stdin)
|
||||||
|
6
bin/youtube-dl
Executable file
6
bin/youtube-dl
Executable file
@ -0,0 +1,6 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import youtube_dl
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
youtube_dl.main()
|
48
build_exe.py
48
build_exe.py
@ -1,48 +0,0 @@
|
|||||||
from distutils.core import setup
|
|
||||||
import py2exe
|
|
||||||
import sys, os
|
|
||||||
|
|
||||||
"""This will create an exe that needs Microsoft Visual C++ 2008 Redistributable Package"""
|
|
||||||
|
|
||||||
# If run without args, build executables
|
|
||||||
if len(sys.argv) == 1:
|
|
||||||
sys.argv.append("py2exe")
|
|
||||||
|
|
||||||
# os.chdir(os.path.dirname(os.path.abspath(sys.argv[0]))) # conflict with wine-py2exe.sh
|
|
||||||
sys.path.append('./youtube_dl')
|
|
||||||
|
|
||||||
options = {
|
|
||||||
"bundle_files": 1,
|
|
||||||
"compressed": 1,
|
|
||||||
"optimize": 2,
|
|
||||||
"dist_dir": '.',
|
|
||||||
"dll_excludes": ['w9xpopen.exe']
|
|
||||||
}
|
|
||||||
|
|
||||||
console = [{
|
|
||||||
"script":"./youtube_dl/__main__.py",
|
|
||||||
"dest_base": "youtube-dl",
|
|
||||||
}]
|
|
||||||
|
|
||||||
init_file = open('./youtube_dl/__init__.py')
|
|
||||||
for line in init_file.readlines():
|
|
||||||
if line.startswith('__version__'):
|
|
||||||
version = line[11:].strip(" ='\n")
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
version = ''
|
|
||||||
|
|
||||||
setup(name='youtube-dl',
|
|
||||||
version=version,
|
|
||||||
description='Small command-line program to download videos from YouTube.com and other video sites',
|
|
||||||
url='https://github.com/rg3/youtube-dl',
|
|
||||||
packages=['youtube_dl'],
|
|
||||||
|
|
||||||
console = console,
|
|
||||||
options = {"py2exe": options},
|
|
||||||
zipfile = None,
|
|
||||||
)
|
|
||||||
|
|
||||||
import shutil
|
|
||||||
shutil.rmtree("build")
|
|
||||||
|
|
26
devscripts/bash-completion.py
Normal file
26
devscripts/bash-completion.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
import os
|
||||||
|
from os.path import dirname as dirn
|
||||||
|
import sys
|
||||||
|
|
||||||
|
sys.path.append(dirn(dirn((os.path.abspath(__file__)))))
|
||||||
|
import youtube_dl
|
||||||
|
|
||||||
|
BASH_COMPLETION_FILE = "youtube-dl.bash-completion"
|
||||||
|
BASH_COMPLETION_TEMPLATE = "devscripts/bash-completion.template"
|
||||||
|
|
||||||
|
def build_completion(opt_parser):
|
||||||
|
opts_flag = []
|
||||||
|
for group in opt_parser.option_groups:
|
||||||
|
for option in group.option_list:
|
||||||
|
#for every long flag
|
||||||
|
opts_flag.append(option.get_opt_string())
|
||||||
|
with open(BASH_COMPLETION_TEMPLATE) as f:
|
||||||
|
template = f.read()
|
||||||
|
with open(BASH_COMPLETION_FILE, "w") as f:
|
||||||
|
#just using the special char
|
||||||
|
filled_template = template.replace("{{flags}}", " ".join(opts_flag))
|
||||||
|
f.write(filled_template)
|
||||||
|
|
||||||
|
parser = youtube_dl.parseOpts()[0]
|
||||||
|
build_completion(parser)
|
14
devscripts/bash-completion.template
Normal file
14
devscripts/bash-completion.template
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
__youtube-dl()
|
||||||
|
{
|
||||||
|
local cur prev opts
|
||||||
|
COMPREPLY=()
|
||||||
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
opts="{{flags}}"
|
||||||
|
|
||||||
|
if [[ ${cur} == * ]] ; then
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
complete -F __youtube-dl youtube-dl
|
20
devscripts/make_readme.py
Normal file
20
devscripts/make_readme.py
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import sys
|
||||||
|
import re
|
||||||
|
|
||||||
|
README_FILE = 'README.md'
|
||||||
|
helptext = sys.stdin.read()
|
||||||
|
|
||||||
|
with open(README_FILE) as f:
|
||||||
|
oldreadme = f.read()
|
||||||
|
|
||||||
|
header = oldreadme[:oldreadme.index('# OPTIONS')]
|
||||||
|
footer = oldreadme[oldreadme.index('# CONFIGURATION'):]
|
||||||
|
|
||||||
|
options = helptext[helptext.index(' General Options:')+19:]
|
||||||
|
options = re.sub(r'^ (\w.+)$', r'## \1', options, flags=re.M)
|
||||||
|
options = '# OPTIONS\n' + options + '\n'
|
||||||
|
|
||||||
|
with open(README_FILE, 'w') as f:
|
||||||
|
f.write(header)
|
||||||
|
f.write(options)
|
||||||
|
f.write(footer)
|
40
devscripts/transition_helper.py
Normal file
40
devscripts/transition_helper.py
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
|
||||||
|
try:
|
||||||
|
import urllib.request as compat_urllib_request
|
||||||
|
except ImportError: # Python 2
|
||||||
|
import urllib2 as compat_urllib_request
|
||||||
|
|
||||||
|
sys.stderr.write(u'Hi! We changed distribution method and now youtube-dl needs to update itself one more time.\n')
|
||||||
|
sys.stderr.write(u'This will only happen once. Simply press enter to go on. Sorry for the trouble!\n')
|
||||||
|
sys.stderr.write(u'The new location of the binaries is https://github.com/rg3/youtube-dl/downloads, not the git repository.\n\n')
|
||||||
|
|
||||||
|
try:
|
||||||
|
raw_input()
|
||||||
|
except NameError: # Python 3
|
||||||
|
input()
|
||||||
|
|
||||||
|
filename = sys.argv[0]
|
||||||
|
|
||||||
|
API_URL = "https://api.github.com/repos/rg3/youtube-dl/downloads"
|
||||||
|
BIN_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl"
|
||||||
|
|
||||||
|
if not os.access(filename, os.W_OK):
|
||||||
|
sys.exit('ERROR: no write permissions on %s' % filename)
|
||||||
|
|
||||||
|
try:
|
||||||
|
urlh = compat_urllib_request.urlopen(BIN_URL)
|
||||||
|
newcontent = urlh.read()
|
||||||
|
urlh.close()
|
||||||
|
except (IOError, OSError) as err:
|
||||||
|
sys.exit('ERROR: unable to download latest version')
|
||||||
|
|
||||||
|
try:
|
||||||
|
with open(filename, 'wb') as outf:
|
||||||
|
outf.write(newcontent)
|
||||||
|
except (IOError, OSError) as err:
|
||||||
|
sys.exit('ERROR: unable to overwrite current version')
|
||||||
|
|
||||||
|
sys.stderr.write(u'Done! Now you can run youtube-dl.\n')
|
12
devscripts/transition_helper_exe/setup.py
Normal file
12
devscripts/transition_helper_exe/setup.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
from distutils.core import setup
|
||||||
|
import py2exe
|
||||||
|
|
||||||
|
py2exe_options = {
|
||||||
|
"bundle_files": 1,
|
||||||
|
"compressed": 1,
|
||||||
|
"optimize": 2,
|
||||||
|
"dist_dir": '.',
|
||||||
|
"dll_excludes": ['w9xpopen.exe']
|
||||||
|
}
|
||||||
|
|
||||||
|
setup(console=['youtube-dl.py'], options={ "py2exe": py2exe_options }, zipfile=None)
|
49
devscripts/transition_helper_exe/youtube-dl.py
Normal file
49
devscripts/transition_helper_exe/youtube-dl.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import sys, os
|
||||||
|
import urllib2
|
||||||
|
|
||||||
|
sys.stderr.write(u'Hi! We changed distribution method and now youtube-dl needs to update itself one more time.\n')
|
||||||
|
sys.stderr.write(u'This will only happen once. Simply press enter to go on. Sorry for the trouble!\n')
|
||||||
|
sys.stderr.write(u'The new location of the binaries is https://github.com/rg3/youtube-dl/downloads, not the git repository.\n\n')
|
||||||
|
|
||||||
|
raw_input()
|
||||||
|
|
||||||
|
filename = sys.argv[0]
|
||||||
|
|
||||||
|
API_URL = "https://api.github.com/repos/rg3/youtube-dl/downloads"
|
||||||
|
EXE_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl.exe"
|
||||||
|
|
||||||
|
if not os.access(filename, os.W_OK):
|
||||||
|
sys.exit('ERROR: no write permissions on %s' % filename)
|
||||||
|
|
||||||
|
exe = os.path.abspath(filename)
|
||||||
|
directory = os.path.dirname(exe)
|
||||||
|
if not os.access(directory, os.W_OK):
|
||||||
|
sys.exit('ERROR: no write permissions on %s' % directory)
|
||||||
|
|
||||||
|
try:
|
||||||
|
urlh = urllib2.urlopen(EXE_URL)
|
||||||
|
newcontent = urlh.read()
|
||||||
|
urlh.close()
|
||||||
|
with open(exe + '.new', 'wb') as outf:
|
||||||
|
outf.write(newcontent)
|
||||||
|
except (IOError, OSError) as err:
|
||||||
|
sys.exit('ERROR: unable to download latest version')
|
||||||
|
|
||||||
|
try:
|
||||||
|
bat = os.path.join(directory, 'youtube-dl-updater.bat')
|
||||||
|
b = open(bat, 'w')
|
||||||
|
b.write("""
|
||||||
|
echo Updating youtube-dl...
|
||||||
|
ping 127.0.0.1 -n 5 -w 1000 > NUL
|
||||||
|
move /Y "%s.new" "%s"
|
||||||
|
del "%s"
|
||||||
|
\n""" %(exe, exe, bat))
|
||||||
|
b.close()
|
||||||
|
|
||||||
|
os.startfile(bat)
|
||||||
|
except (IOError, OSError) as err:
|
||||||
|
sys.exit('ERROR: unable to overwrite current version')
|
||||||
|
|
||||||
|
sys.stderr.write(u'Done! Now you can run youtube-dl.\n')
|
74
setup.py
Normal file
74
setup.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from __future__ import print_function
|
||||||
|
from distutils.core import setup
|
||||||
|
import pkg_resources
|
||||||
|
import sys
|
||||||
|
|
||||||
|
try:
|
||||||
|
import py2exe
|
||||||
|
"""This will create an exe that needs Microsoft Visual C++ 2008 Redistributable Package"""
|
||||||
|
except ImportError:
|
||||||
|
if len(sys.argv) >= 2 and sys.argv[1] == 'py2exe':
|
||||||
|
print("Cannot import py2exe", file=sys.stderr)
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
py2exe_options = {
|
||||||
|
"bundle_files": 1,
|
||||||
|
"compressed": 1,
|
||||||
|
"optimize": 2,
|
||||||
|
"dist_dir": '.',
|
||||||
|
"dll_excludes": ['w9xpopen.exe']
|
||||||
|
}
|
||||||
|
py2exe_console = [{
|
||||||
|
"script": "./youtube_dl/__main__.py",
|
||||||
|
"dest_base": "youtube-dl",
|
||||||
|
}]
|
||||||
|
py2exe_params = {
|
||||||
|
'console': py2exe_console,
|
||||||
|
'options': { "py2exe": py2exe_options },
|
||||||
|
'zipfile': None
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sys.argv) >= 2 and sys.argv[1] == 'py2exe':
|
||||||
|
params = py2exe_params
|
||||||
|
else:
|
||||||
|
params = {
|
||||||
|
'scripts': ['bin/youtube-dl'],
|
||||||
|
'data_files': [('etc/bash_completion.d', ['youtube-dl.bash-completion']), # Installing system-wide would require sudo...
|
||||||
|
('share/doc/youtube_dl', ['README.txt']),
|
||||||
|
('share/man/man1/', ['youtube-dl.1'])]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the version from youtube_dl/version.py without importing the package
|
||||||
|
exec(compile(open('youtube_dl/version.py').read(), 'youtube_dl/version.py', 'exec'))
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name = 'youtube_dl',
|
||||||
|
version = __version__,
|
||||||
|
description = 'YouTube video downloader',
|
||||||
|
long_description = 'Small command-line program to download videos from YouTube.com and other video sites.',
|
||||||
|
url = 'https://github.com/rg3/youtube-dl',
|
||||||
|
author = 'Ricardo Garcia',
|
||||||
|
maintainer = 'Philipp Hagemeister',
|
||||||
|
maintainer_email = 'phihag@phihag.de',
|
||||||
|
packages = ['youtube_dl'],
|
||||||
|
|
||||||
|
# Provokes warning on most systems (why?!)
|
||||||
|
#test_suite = 'nose.collector',
|
||||||
|
#test_requires = ['nosetest'],
|
||||||
|
|
||||||
|
classifiers = [
|
||||||
|
"Topic :: Multimedia :: Video",
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"Environment :: Console",
|
||||||
|
"License :: Public Domain",
|
||||||
|
"Programming Language :: Python :: 2.6",
|
||||||
|
"Programming Language :: Python :: 2.7",
|
||||||
|
"Programming Language :: Python :: 3",
|
||||||
|
"Programming Language :: Python :: 3.3"
|
||||||
|
],
|
||||||
|
|
||||||
|
**params
|
||||||
|
)
|
BIN
youtube-dl
BIN
youtube-dl
Binary file not shown.
306
youtube-dl.1
306
youtube-dl.1
@ -1,306 +0,0 @@
|
|||||||
.TH YOUTUBE-DL 1 ""
|
|
||||||
.SH NAME
|
|
||||||
.PP
|
|
||||||
youtube-dl
|
|
||||||
.SH SYNOPSIS
|
|
||||||
.PP
|
|
||||||
\f[B]youtube-dl\f[] [OPTIONS] URL [URL...]
|
|
||||||
.SH DESCRIPTION
|
|
||||||
.PP
|
|
||||||
\f[B]youtube-dl\f[] is a small command-line program to download videos
|
|
||||||
from YouTube.com and a few more sites.
|
|
||||||
It requires the Python interpreter, version 2.x (x being at least 6),
|
|
||||||
and it is not platform specific.
|
|
||||||
It should work in your Unix box, in Windows or in Mac OS X.
|
|
||||||
It is released to the public domain, which means you can modify it,
|
|
||||||
redistribute it or use it however you like.
|
|
||||||
.SH OPTIONS
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-h,\ --help\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ print\ this\ help\ text\ and\ exit
|
|
||||||
--version\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ print\ program\ version\ and\ exit
|
|
||||||
-U,\ --update\ \ \ \ \ \ \ \ \ \ \ \ \ update\ this\ program\ to\ latest\ version
|
|
||||||
-i,\ --ignore-errors\ \ \ \ \ \ continue\ on\ download\ errors
|
|
||||||
-r,\ --rate-limit\ LIMIT\ \ \ download\ rate\ limit\ (e.g.\ 50k\ or\ 44.6m)
|
|
||||||
-R,\ --retries\ RETRIES\ \ \ \ number\ of\ retries\ (default\ is\ 10)
|
|
||||||
--buffer-size\ SIZE\ \ \ \ \ \ \ size\ of\ download\ buffer\ (e.g.\ 1024\ or\ 16k)\ (default
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ is\ 1024)
|
|
||||||
--no-resize-buffer\ \ \ \ \ \ \ do\ not\ automatically\ adjust\ the\ buffer\ size.\ By
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default,\ the\ buffer\ size\ is\ automatically\ resized
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ from\ an\ initial\ value\ of\ SIZE.
|
|
||||||
--dump-user-agent\ \ \ \ \ \ \ \ display\ the\ current\ browser\ identification
|
|
||||||
--user-agent\ UA\ \ \ \ \ \ \ \ \ \ specify\ a\ custom\ user\ agent
|
|
||||||
--list-extractors\ \ \ \ \ \ \ \ List\ all\ supported\ extractors\ and\ the\ URLs\ they
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ would\ handle
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Video Selection:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
--playlist-start\ NUMBER\ \ playlist\ video\ to\ start\ at\ (default\ is\ 1)
|
|
||||||
--playlist-end\ NUMBER\ \ \ \ playlist\ video\ to\ end\ at\ (default\ is\ last)
|
|
||||||
--match-title\ REGEX\ \ \ \ \ \ download\ only\ matching\ titles\ (regex\ or\ caseless
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sub-string)
|
|
||||||
--reject-title\ REGEX\ \ \ \ \ skip\ download\ for\ matching\ titles\ (regex\ or
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ caseless\ sub-string)
|
|
||||||
--max-downloads\ NUMBER\ \ \ Abort\ after\ downloading\ NUMBER\ files
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Filesystem Options:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-t,\ --title\ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ title\ in\ file\ name
|
|
||||||
--id\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ video\ ID\ in\ file\ name
|
|
||||||
-l,\ --literal\ \ \ \ \ \ \ \ \ \ \ \ [deprecated]\ alias\ of\ --title
|
|
||||||
-A,\ --auto-number\ \ \ \ \ \ \ \ number\ downloaded\ files\ starting\ from\ 00000
|
|
||||||
-o,\ --output\ TEMPLATE\ \ \ \ output\ filename\ template.\ Use\ %(title)s\ to\ get\ the
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ title,\ %(uploader)s\ for\ the\ uploader\ name,
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(autonumber)s\ to\ get\ an\ automatically\ incremented
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ number,\ %(ext)s\ for\ the\ filename\ extension,
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(upload_date)s\ for\ the\ upload\ date\ (YYYYMMDD),
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(extractor)s\ for\ the\ provider\ (youtube,\ metacafe,
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ etc),\ %(id)s\ for\ the\ video\ id\ and\ %%\ for\ a\ literal
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ percent.\ Use\ -\ to\ output\ to\ stdout.
|
|
||||||
--restrict-filenames\ \ \ \ \ Restrict\ filenames\ to\ only\ ASCII\ characters,\ and
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ avoid\ "&"\ and\ spaces\ in\ filenames
|
|
||||||
-a,\ --batch-file\ FILE\ \ \ \ file\ containing\ URLs\ to\ download\ (\[aq]-\[aq]\ for\ stdin)
|
|
||||||
-w,\ --no-overwrites\ \ \ \ \ \ do\ not\ overwrite\ files
|
|
||||||
-c,\ --continue\ \ \ \ \ \ \ \ \ \ \ resume\ partially\ downloaded\ files
|
|
||||||
--no-continue\ \ \ \ \ \ \ \ \ \ \ \ do\ not\ resume\ partially\ downloaded\ files\ (restart
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ from\ beginning)
|
|
||||||
--cookies\ FILE\ \ \ \ \ \ \ \ \ \ \ file\ to\ read\ cookies\ from\ and\ dump\ cookie\ jar\ in
|
|
||||||
--no-part\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ use\ .part\ files
|
|
||||||
--no-mtime\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ use\ the\ Last-modified\ header\ to\ set\ the\ file
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ modification\ time
|
|
||||||
--write-description\ \ \ \ \ \ write\ video\ description\ to\ a\ .description\ file
|
|
||||||
--write-info-json\ \ \ \ \ \ \ \ write\ video\ metadata\ to\ a\ .info.json\ file
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Verbosity / Simulation Options:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-q,\ --quiet\ \ \ \ \ \ \ \ \ \ \ \ \ \ activates\ quiet\ mode
|
|
||||||
-s,\ --simulate\ \ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video\ and\ do\ not\ write\ anything
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ to\ disk
|
|
||||||
--skip-download\ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video
|
|
||||||
-g,\ --get-url\ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ URL
|
|
||||||
-e,\ --get-title\ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ title
|
|
||||||
--get-thumbnail\ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ thumbnail\ URL
|
|
||||||
--get-description\ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ video\ description
|
|
||||||
--get-filename\ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ filename
|
|
||||||
--get-format\ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ format
|
|
||||||
--no-progress\ \ \ \ \ \ \ \ \ \ \ \ do\ not\ print\ progress\ bar
|
|
||||||
--console-title\ \ \ \ \ \ \ \ \ \ display\ progress\ in\ console\ titlebar
|
|
||||||
-v,\ --verbose\ \ \ \ \ \ \ \ \ \ \ \ print\ various\ debugging\ information
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Video Format Options:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-f,\ --format\ FORMAT\ \ \ \ \ \ video\ format\ code
|
|
||||||
--all-formats\ \ \ \ \ \ \ \ \ \ \ \ download\ all\ available\ video\ formats
|
|
||||||
--prefer-free-formats\ \ \ \ prefer\ free\ video\ formats\ unless\ a\ specific\ one\ is
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ requested
|
|
||||||
--max-quality\ FORMAT\ \ \ \ \ highest\ quality\ format\ to\ download
|
|
||||||
-F,\ --list-formats\ \ \ \ \ \ \ list\ all\ available\ formats\ (currently\ youtube\ only)
|
|
||||||
--write-srt\ \ \ \ \ \ \ \ \ \ \ \ \ \ write\ video\ closed\ captions\ to\ a\ .srt\ file
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (currently\ youtube\ only)
|
|
||||||
--srt-lang\ LANG\ \ \ \ \ \ \ \ \ \ language\ of\ the\ closed\ captions\ to\ download
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (optional)\ use\ IETF\ language\ tags\ like\ \[aq]en\[aq]
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Authentication Options:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-u,\ --username\ USERNAME\ \ account\ username
|
|
||||||
-p,\ --password\ PASSWORD\ \ account\ password
|
|
||||||
-n,\ --netrc\ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ .netrc\ authentication\ data
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SS Post-processing Options:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
-x,\ --extract-audio\ \ \ \ \ \ convert\ video\ files\ to\ audio-only\ files\ (requires
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ffmpeg\ or\ avconv\ and\ ffprobe\ or\ avprobe)
|
|
||||||
--audio-format\ FORMAT\ \ \ \ "best",\ "aac",\ "vorbis",\ "mp3",\ "m4a",\ or\ "wav";
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ best\ by\ default
|
|
||||||
--audio-quality\ QUALITY\ \ ffmpeg/avconv\ audio\ quality\ specification,\ insert\ a
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ value\ between\ 0\ (better)\ and\ 9\ (worse)\ for\ VBR\ or\ a
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ specific\ bitrate\ like\ 128K\ (default\ 5)
|
|
||||||
-k,\ --keep-video\ \ \ \ \ \ \ \ \ keeps\ the\ video\ file\ on\ disk\ after\ the\ post-
|
|
||||||
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ processing;\ the\ video\ is\ erased\ by\ default
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SH CONFIGURATION
|
|
||||||
.PP
|
|
||||||
You can configure youtube-dl by placing default arguments (such as
|
|
||||||
\f[C]--extract-audio\ --no-mtime\f[] to always extract the audio and not
|
|
||||||
copy the mtime) into \f[C]/etc/youtube-dl.conf\f[] and/or
|
|
||||||
\f[C]~/.local/config/youtube-dl.conf\f[].
|
|
||||||
.SH OUTPUT TEMPLATE
|
|
||||||
.PP
|
|
||||||
The \f[C]-o\f[] option allows users to indicate a template for the
|
|
||||||
output file names.
|
|
||||||
The basic usage is not to set any template arguments when downloading a
|
|
||||||
single file, like in
|
|
||||||
\f[C]youtube-dl\ -o\ funny_video.flv\ "http://some/video"\f[].
|
|
||||||
However, it may contain special sequences that will be replaced when
|
|
||||||
downloading each video.
|
|
||||||
The special sequences have the format \f[C]%(NAME)s\f[].
|
|
||||||
To clarify, that is a percent symbol followed by a name in parenthesis,
|
|
||||||
followed by a lowercase S.
|
|
||||||
Allowed names are:
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]id\f[]: The sequence will be replaced by the video identifier.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]url\f[]: The sequence will be replaced by the video URL.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]uploader\f[]: The sequence will be replaced by the nickname of the
|
|
||||||
person who uploaded the video.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]upload_date\f[]: The sequence will be replaced by the upload date
|
|
||||||
in YYYYMMDD format.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]title\f[]: The sequence will be replaced by the video title.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]ext\f[]: The sequence will be replaced by the appropriate extension
|
|
||||||
(like flv or mp4).
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]epoch\f[]: The sequence will be replaced by the Unix epoch when
|
|
||||||
creating the file.
|
|
||||||
.IP \[bu] 2
|
|
||||||
\f[C]autonumber\f[]: The sequence will be replaced by a five-digit
|
|
||||||
number that will be increased with each download, starting at zero.
|
|
||||||
.PP
|
|
||||||
The current default template is \f[C]%(id)s.%(ext)s\f[], but that will
|
|
||||||
be switchted to \f[C]%(title)s-%(id)s.%(ext)s\f[] (which can be
|
|
||||||
requested with \f[C]-t\f[] at the moment).
|
|
||||||
.PP
|
|
||||||
In some cases, you don\[aq]t want special characters such as 中, spaces,
|
|
||||||
or &, such as when transferring the downloaded filename to a Windows
|
|
||||||
system or the filename through an 8bit-unsafe channel.
|
|
||||||
In these cases, add the \f[C]--restrict-filenames\f[] flag to get a
|
|
||||||
shorter title:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
$\ youtube-dl\ --get-filename\ -o\ "%(title)s.%(ext)s"\ BaW_jenozKc
|
|
||||||
youtube-dl\ test\ video\ \[aq]\[aq]_ä↭𝕐.mp4\ \ \ \ #\ All\ kinds\ of\ weird\ characters
|
|
||||||
$\ youtube-dl\ --get-filename\ -o\ "%(title)s.%(ext)s"\ BaW_jenozKc\ --restrict-filenames
|
|
||||||
youtube-dl_test_video_.mp4\ \ \ \ \ \ \ \ \ \ #\ A\ simple\ file\ name
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.SH FAQ
|
|
||||||
.SS Can you please put the -b option back?
|
|
||||||
.PP
|
|
||||||
Most people asking this question are not aware that youtube-dl now
|
|
||||||
defaults to downloading the highest available quality as reported by
|
|
||||||
YouTube, which will be 1080p or 720p in some cases, so you no longer
|
|
||||||
need the -b option.
|
|
||||||
For some specific videos, maybe YouTube does not report them to be
|
|
||||||
available in a specific high quality format you\[aq]\[aq]re interested
|
|
||||||
in.
|
|
||||||
In that case, simply request it with the -f option and youtube-dl will
|
|
||||||
try to download it.
|
|
||||||
.SS I get HTTP error 402 when trying to download a video. What\[aq]s
|
|
||||||
this?
|
|
||||||
.PP
|
|
||||||
Apparently YouTube requires you to pass a CAPTCHA test if you download
|
|
||||||
too much.
|
|
||||||
We\[aq]\[aq]re considering to provide a way to let you solve the
|
|
||||||
CAPTCHA (https://github.com/rg3/youtube-dl/issues/154), but at the
|
|
||||||
moment, your best course of action is pointing a webbrowser to the
|
|
||||||
youtube URL, solving the CAPTCHA, and restart youtube-dl.
|
|
||||||
.SS I have downloaded a video but how can I play it?
|
|
||||||
.PP
|
|
||||||
Once the video is fully downloaded, use any video player, such as
|
|
||||||
vlc (http://www.videolan.org) or mplayer (http://www.mplayerhq.hu/).
|
|
||||||
.SS The links provided by youtube-dl -g are not working anymore
|
|
||||||
.PP
|
|
||||||
The URLs youtube-dl outputs require the downloader to have the correct
|
|
||||||
cookies.
|
|
||||||
Use the \f[C]--cookies\f[] option to write the required cookies into a
|
|
||||||
file, and advise your downloader to read cookies from that file.
|
|
||||||
Some sites also require a common user agent to be used, use
|
|
||||||
\f[C]--dump-user-agent\f[] to see the one in use by youtube-dl.
|
|
||||||
.SS ERROR: no fmt_url_map or conn information found in video info
|
|
||||||
.PP
|
|
||||||
youtube has switched to a new video info format in July 2011 which is
|
|
||||||
not supported by old versions of youtube-dl.
|
|
||||||
You can update youtube-dl with \f[C]sudo\ youtube-dl\ --update\f[].
|
|
||||||
.SS ERROR: unable to download video
|
|
||||||
.PP
|
|
||||||
youtube requires an additional signature since September 2012 which is
|
|
||||||
not supported by old versions of youtube-dl.
|
|
||||||
You can update youtube-dl with \f[C]sudo\ youtube-dl\ --update\f[].
|
|
||||||
.SS SyntaxError: Non-ASCII character
|
|
||||||
.PP
|
|
||||||
The error
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
File\ "youtube-dl",\ line\ 2
|
|
||||||
SyntaxError:\ Non-ASCII\ character\ \[aq]\\x93\[aq]\ ...
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.PP
|
|
||||||
means you\[aq]re using an outdated version of Python.
|
|
||||||
Please update to Python 2.6 or 2.7.
|
|
||||||
.PP
|
|
||||||
To run youtube-dl under Python 2.5, you\[aq]ll have to manually check it
|
|
||||||
out like this:
|
|
||||||
.IP
|
|
||||||
.nf
|
|
||||||
\f[C]
|
|
||||||
git\ clone\ git://github.com/rg3/youtube-dl.git
|
|
||||||
cd\ youtube-dl
|
|
||||||
python\ -m\ youtube_dl\ --help
|
|
||||||
\f[]
|
|
||||||
.fi
|
|
||||||
.PP
|
|
||||||
Please note that Python 2.5 is not supported anymore.
|
|
||||||
.SS What is this binary file? Where has the code gone?
|
|
||||||
.PP
|
|
||||||
Since June 2012 (#342) youtube-dl is packed as an executable zipfile,
|
|
||||||
simply unzip it (might need renaming to \f[C]youtube-dl.zip\f[] first on
|
|
||||||
some systems) or clone the git repository, as laid out above.
|
|
||||||
If you modify the code, you can run it by executing the
|
|
||||||
\f[C]__main__.py\f[] file.
|
|
||||||
To recompile the executable, run \f[C]make\ youtube-dl\f[].
|
|
||||||
.SS The exe throws a \f[I]Runtime error from Visual C++\f[]
|
|
||||||
.PP
|
|
||||||
To run the exe you need to install first the Microsoft Visual C++ 2008
|
|
||||||
Redistributable
|
|
||||||
Package (http://www.microsoft.com/en-us/download/details.aspx?id=29).
|
|
||||||
.SH COPYRIGHT
|
|
||||||
.PP
|
|
||||||
youtube-dl is released into the public domain by the copyright holders.
|
|
||||||
.PP
|
|
||||||
This README file was originally written by Daniel Bolton
|
|
||||||
(<https://github.com/dbbolton>) and is likewise released into the public
|
|
||||||
domain.
|
|
||||||
.SH BUGS
|
|
||||||
.PP
|
|
||||||
Bugs and suggestions should be reported at:
|
|
||||||
<https://github.com/rg3/youtube-dl/issues>
|
|
||||||
.PP
|
|
||||||
Please include:
|
|
||||||
.IP \[bu] 2
|
|
||||||
Your exact command line, like
|
|
||||||
\f[C]youtube-dl\ -t\ "http://www.youtube.com/watch?v=uHlDtZ6Oc3s&feature=channel_video_title"\f[].
|
|
||||||
A common mistake is not to escape the \f[C]&\f[].
|
|
||||||
Putting URLs in quotes should solve this problem.
|
|
||||||
.IP \[bu] 2
|
|
||||||
The output of \f[C]youtube-dl\ --version\f[]
|
|
||||||
.IP \[bu] 2
|
|
||||||
The output of \f[C]python\ --version\f[]
|
|
||||||
.IP \[bu] 2
|
|
||||||
The name and version of your Operating System ("Ubuntu 11.04 x64" or
|
|
||||||
"Windows 7 x64" is usually enough).
|
|
@ -1,14 +0,0 @@
|
|||||||
__youtube-dl()
|
|
||||||
{
|
|
||||||
local cur prev opts
|
|
||||||
COMPREPLY=()
|
|
||||||
cur="${COMP_WORDS[COMP_CWORD]}"
|
|
||||||
opts="--all-formats --audio-format --audio-quality --auto-number --batch-file --buffer-size --console-title --continue --cookies --dump-user-agent --extract-audio --format --get-description --get-filename --get-format --get-thumbnail --get-title --get-url --help --id --ignore-errors --keep-video --list-extractors --list-formats --literal --match-title --max-downloads --max-quality --netrc --no-continue --no-mtime --no-overwrites --no-part --no-progress --no-resize-buffer --output --password --playlist-end --playlist-start --prefer-free-formats --quiet --rate-limit --reject-title --restrict-filenames --retries --simulate --skip-download --srt-lang --title --update --user-agent --username --verbose --version --write-description --write-info-json --write-srt"
|
|
||||||
|
|
||||||
if [[ ${cur} == * ]] ; then
|
|
||||||
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
complete -F __youtube-dl youtube-dl
|
|
BIN
youtube-dl.exe
BIN
youtube-dl.exe
Binary file not shown.
@ -23,12 +23,6 @@ __authors__ = (
|
|||||||
)
|
)
|
||||||
|
|
||||||
__license__ = 'Public Domain'
|
__license__ = 'Public Domain'
|
||||||
__version__ = '2012.11.29'
|
|
||||||
|
|
||||||
UPDATE_URL = 'https://raw.github.com/rg3/youtube-dl/master/youtube-dl'
|
|
||||||
UPDATE_URL_VERSION = 'https://raw.github.com/rg3/youtube-dl/master/LATEST_VERSION'
|
|
||||||
UPDATE_URL_EXE = 'https://raw.github.com/rg3/youtube-dl/master/youtube-dl.exe'
|
|
||||||
|
|
||||||
|
|
||||||
import getpass
|
import getpass
|
||||||
import optparse
|
import optparse
|
||||||
@ -41,34 +35,46 @@ import sys
|
|||||||
import warnings
|
import warnings
|
||||||
|
|
||||||
from .utils import *
|
from .utils import *
|
||||||
|
from .version import __version__
|
||||||
from .FileDownloader import *
|
from .FileDownloader import *
|
||||||
from .InfoExtractors import *
|
from .InfoExtractors import *
|
||||||
from .PostProcessor import *
|
from .PostProcessor import *
|
||||||
|
|
||||||
def updateSelf(downloader, filename):
|
def updateSelf(downloader, filename):
|
||||||
''' Update the program file with the latest version from the repository '''
|
"""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):
|
# TODO: at least, check https certificates
|
||||||
sys.exit('ERROR: no write permissions on %s' % filename)
|
|
||||||
|
|
||||||
downloader.to_screen(u'Updating to latest version...')
|
from zipimport import zipimporter
|
||||||
|
|
||||||
urlv = compat_urllib_request.urlopen(UPDATE_URL_VERSION)
|
API_URL = "https://api.github.com/repos/rg3/youtube-dl/downloads"
|
||||||
newversion = urlv.read().strip()
|
BIN_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl"
|
||||||
if newversion == __version__:
|
EXE_URL = "https://github.com/downloads/rg3/youtube-dl/youtube-dl.exe"
|
||||||
downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
|
|
||||||
return
|
if hasattr(sys, "frozen"): # PY2EXE
|
||||||
urlv.close()
|
if not os.access(filename, os.W_OK):
|
||||||
|
sys.exit('ERROR: no write permissions on %s' % filename)
|
||||||
|
|
||||||
|
downloader.to_screen(u'Updating to latest version...')
|
||||||
|
|
||||||
|
urla = compat_urllib_request.urlopen(API_URL)
|
||||||
|
download = filter(lambda x: x["name"] == "youtube-dl.exe", json.loads(urla.read()))
|
||||||
|
if not download:
|
||||||
|
downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
|
||||||
|
return
|
||||||
|
newversion = download[0]["description"].strip()
|
||||||
|
if newversion == __version__:
|
||||||
|
downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
|
||||||
|
return
|
||||||
|
urla.close()
|
||||||
|
|
||||||
if hasattr(sys, "frozen"): #py2exe
|
|
||||||
exe = os.path.abspath(filename)
|
exe = os.path.abspath(filename)
|
||||||
directory = os.path.dirname(exe)
|
directory = os.path.dirname(exe)
|
||||||
if not os.access(directory, os.W_OK):
|
if not os.access(directory, os.W_OK):
|
||||||
sys.exit('ERROR: no write permissions on %s' % directory)
|
sys.exit('ERROR: no write permissions on %s' % directory)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
urlh = compat_urllib_request.urlopen(UPDATE_URL_EXE)
|
urlh = compat_urllib_request.urlopen(EXE_URL)
|
||||||
newcontent = urlh.read()
|
newcontent = urlh.read()
|
||||||
urlh.close()
|
urlh.close()
|
||||||
with open(exe + '.new', 'wb') as outf:
|
with open(exe + '.new', 'wb') as outf:
|
||||||
@ -91,9 +97,25 @@ del "%s"
|
|||||||
except (IOError, OSError) as err:
|
except (IOError, OSError) as err:
|
||||||
sys.exit('ERROR: unable to overwrite current version')
|
sys.exit('ERROR: unable to overwrite current version')
|
||||||
|
|
||||||
else:
|
elif isinstance(globals().get('__loader__'), zipimporter): # UNIX ZIP
|
||||||
|
if not os.access(filename, os.W_OK):
|
||||||
|
sys.exit('ERROR: no write permissions on %s' % filename)
|
||||||
|
|
||||||
|
downloader.to_screen(u'Updating to latest version...')
|
||||||
|
|
||||||
|
urla = compat_urllib_request.urlopen(API_URL)
|
||||||
|
download = [x for x in json.loads(urla.read().decode('utf8')) if x["name"] == "youtube-dl"]
|
||||||
|
if not download:
|
||||||
|
downloader.to_screen(u'ERROR: can\'t find the current version. Please try again later.')
|
||||||
|
return
|
||||||
|
newversion = download[0]["description"].strip()
|
||||||
|
if newversion == __version__:
|
||||||
|
downloader.to_screen(u'youtube-dl is up-to-date (' + __version__ + ')')
|
||||||
|
return
|
||||||
|
urla.close()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
urlh = compat_urllib_request.urlopen(UPDATE_URL)
|
urlh = compat_urllib_request.urlopen(BIN_URL)
|
||||||
newcontent = urlh.read()
|
newcontent = urlh.read()
|
||||||
urlh.close()
|
urlh.close()
|
||||||
except (IOError, OSError) as err:
|
except (IOError, OSError) as err:
|
||||||
@ -105,6 +127,10 @@ del "%s"
|
|||||||
except (IOError, OSError) as err:
|
except (IOError, OSError) as err:
|
||||||
sys.exit('ERROR: unable to overwrite current version')
|
sys.exit('ERROR: unable to overwrite current version')
|
||||||
|
|
||||||
|
else:
|
||||||
|
downloader.to_screen(u'It looks like you installed youtube-dl with pip or setup.py. Please use that to update.')
|
||||||
|
return
|
||||||
|
|
||||||
downloader.to_screen(u'Updated youtube-dl. Restart youtube-dl to use the new version.')
|
downloader.to_screen(u'Updated youtube-dl. Restart youtube-dl to use the new version.')
|
||||||
|
|
||||||
def parseOpts():
|
def parseOpts():
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
if __package__ is None:
|
if __package__ is None and not hasattr(sys, "frozen"):
|
||||||
|
# direct call of __main__.py
|
||||||
import os.path
|
import os.path
|
||||||
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||||
|
|
||||||
|
2
youtube_dl/version.py
Normal file
2
youtube_dl/version.py
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
|
||||||
|
__version__ = '2012.11.29'
|
Loading…
Reference in New Issue
Block a user