2011-11-21 19:59:59 +01:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2013-05-04 07:09:50 +02:00
|
|
|
import codecs
|
2014-02-25 17:31:16 -05:00
|
|
|
import io
|
2011-11-21 19:59:59 +01:00
|
|
|
import os
|
2013-07-01 18:52:19 +02:00
|
|
|
import random
|
2011-11-21 19:59:59 +01:00
|
|
|
import sys
|
|
|
|
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
from .configuration import parse_options
|
2013-10-15 02:07:26 +02:00
|
|
|
from .utils import (
|
2014-03-18 14:27:42 +01:00
|
|
|
compat_getpass,
|
2013-10-15 02:07:26 +02:00
|
|
|
compat_print,
|
|
|
|
DateRange,
|
2014-04-30 10:02:03 +02:00
|
|
|
DEFAULT_OUTTMPL,
|
2013-10-15 02:07:26 +02:00
|
|
|
decodeOption,
|
|
|
|
DownloadError,
|
|
|
|
MaxDownloadsReached,
|
|
|
|
preferredencoding,
|
2014-02-25 01:43:17 +01:00
|
|
|
read_batch_urls,
|
2013-10-15 02:07:26 +02:00
|
|
|
SameFileError,
|
2013-12-16 05:04:12 +01:00
|
|
|
setproctitle,
|
2013-10-15 02:07:26 +02:00
|
|
|
std_headers,
|
|
|
|
write_string,
|
|
|
|
)
|
2012-12-30 19:49:14 +01:00
|
|
|
from .update import update_self
|
2013-10-15 02:07:26 +02:00
|
|
|
from .FileDownloader import (
|
|
|
|
FileDownloader,
|
|
|
|
)
|
2013-06-23 22:42:59 +02:00
|
|
|
from .extractor import gen_extractors
|
2013-06-18 22:14:21 +02:00
|
|
|
from .YoutubeDL import YoutubeDL
|
2014-01-07 05:49:17 +01:00
|
|
|
from .postprocessor import (
|
2014-02-22 13:55:51 +01:00
|
|
|
AtomicParsleyPP,
|
2014-02-22 18:10:07 +01:00
|
|
|
FFmpegAudioFixPP,
|
2013-10-15 02:07:26 +02:00
|
|
|
FFmpegMetadataPP,
|
|
|
|
FFmpegVideoConvertor,
|
|
|
|
FFmpegExtractAudioPP,
|
|
|
|
FFmpegEmbedSubtitlePP,
|
2014-01-02 07:47:28 -05:00
|
|
|
XAttrMetadataPP,
|
2013-10-15 02:07:26 +02:00
|
|
|
)
|
|
|
|
|
2011-11-21 19:59:59 +01:00
|
|
|
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
def _real_main(argv):
|
2013-05-04 07:09:50 +02:00
|
|
|
# Compatibility fixes for Windows
|
|
|
|
if sys.platform == 'win32':
|
|
|
|
# https://github.com/rg3/youtube-dl/issues/820
|
|
|
|
codecs.register(lambda name: codecs.lookup('utf-8') if name == 'cp65001' else None)
|
|
|
|
|
2013-12-16 05:04:12 +01:00
|
|
|
setproctitle(u'youtube-dl')
|
|
|
|
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
parser, opts, args = parse_options(argv)
|
2012-11-28 02:04:46 +01:00
|
|
|
|
|
|
|
if opts.user_agent is not None:
|
|
|
|
std_headers['User-Agent'] = opts.user_agent
|
2013-08-08 09:53:25 +02:00
|
|
|
|
2013-04-24 13:56:04 +02:00
|
|
|
if opts.referer is not None:
|
|
|
|
std_headers['Referer'] = opts.referer
|
2012-11-28 02:04:46 +01:00
|
|
|
|
2014-03-11 16:34:05 +01:00
|
|
|
if opts.headers is not None:
|
|
|
|
for h in opts.headers:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
|
|
|
|
if ':' not in h[1:]:
|
|
|
|
parser.error(u'wrong header formatting, it should be key:value, not "%s"' % h)
|
2014-03-11 16:34:05 +01:00
|
|
|
key, value = h.split(':', 2)
|
|
|
|
if opts.verbose:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
write_string(u'[debug] Adding header from command line option %s:%s\n' % (key, value))
|
2014-03-11 16:34:05 +01:00
|
|
|
std_headers[key] = value
|
|
|
|
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.dump_user_agent:
|
2013-06-24 15:57:53 +02:00
|
|
|
compat_print(std_headers['User-Agent'])
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
return
|
2012-11-28 02:04:46 +01:00
|
|
|
|
2014-02-25 01:43:17 +01:00
|
|
|
batch_urls = []
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.batchfile is not None:
|
|
|
|
try:
|
|
|
|
if opts.batchfile == '-':
|
|
|
|
batchfd = sys.stdin
|
|
|
|
else:
|
2014-02-25 01:43:17 +01:00
|
|
|
batchfd = io.open(opts.batchfile, 'r', encoding='utf-8', errors='ignore')
|
|
|
|
batch_urls = read_batch_urls(batchfd)
|
2013-07-30 23:11:44 +02:00
|
|
|
if opts.verbose:
|
2014-02-25 01:43:17 +01:00
|
|
|
write_string(u'[debug] Batch file urls: ' + repr(batch_urls) + u'\n')
|
2012-11-28 02:04:46 +01:00
|
|
|
except IOError:
|
|
|
|
sys.exit(u'ERROR: batch file could not be read')
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
|
|
|
|
all_urls = [url.strip() for url in batch_urls + args]
|
2014-01-05 05:24:50 +01:00
|
|
|
_enc = preferredencoding()
|
2014-01-05 10:58:36 +01:00
|
|
|
all_urls = [url.decode(_enc, 'ignore') if isinstance(url, bytes) else url for url in all_urls]
|
2012-11-28 02:04:46 +01:00
|
|
|
|
|
|
|
extractors = gen_extractors()
|
|
|
|
|
|
|
|
if opts.list_extractors:
|
2013-07-01 18:21:29 +02:00
|
|
|
for ie in sorted(extractors, key=lambda ie: ie.IE_NAME.lower()):
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
status = ' (CURRENTLY BROKEN)' if not ie.working() else ''
|
|
|
|
compat_print(ie.IE_NAME + status)
|
|
|
|
for url in all_urls:
|
|
|
|
if ie.suitable(url):
|
|
|
|
compat_print(u' ' + url)
|
|
|
|
return
|
2013-07-01 18:52:19 +02:00
|
|
|
if opts.list_extractor_descriptions:
|
|
|
|
for ie in sorted(extractors, key=lambda ie: ie.IE_NAME.lower()):
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if not ie.working():
|
2013-07-01 18:52:19 +02:00
|
|
|
continue
|
|
|
|
desc = getattr(ie, 'IE_DESC', ie.IE_NAME)
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if not desc:
|
2013-10-07 12:21:24 +02:00
|
|
|
continue
|
2013-07-01 18:52:19 +02:00
|
|
|
if hasattr(ie, 'SEARCH_KEY'):
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
searches = (u'cute kittens', u'slithering pythons', u'falling cat', u'angry poodle', u'purple fish', u'running tortoise')
|
|
|
|
counts = (u'', u'5', u'10', u'all')
|
|
|
|
desc += u' (Example: "%s%s:%s" )' % (ie.SEARCH_KEY, random.choice(counts), random.choice(searches))
|
2013-07-01 18:52:19 +02:00
|
|
|
compat_print(desc)
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
return
|
2012-11-28 02:04:46 +01:00
|
|
|
|
|
|
|
# Conflicting, missing and erroneous options
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.usenetrc and (opts.username or opts.password):
|
2012-11-28 02:04:46 +01:00
|
|
|
parser.error(u'using .netrc conflicts with giving username/password')
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.password and not opts.username:
|
|
|
|
parser.error(u'account username missing')
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.outtmpl is not None and (opts.usetitle or opts.autonumber or opts.useid):
|
|
|
|
parser.error(u'using output template conflicts with using title, video ID or auto number')
|
|
|
|
if opts.usetitle and opts.useid:
|
|
|
|
parser.error(u'using title conflicts with using video ID')
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.username and not opts.password:
|
2014-03-18 14:27:42 +01:00
|
|
|
opts.password = compat_getpass(u'Type account password and press [Return]: ')
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.ratelimit is not None:
|
|
|
|
numeric_limit = FileDownloader.parse_bytes(opts.ratelimit)
|
|
|
|
if numeric_limit is None:
|
|
|
|
parser.error(u'invalid rate limit specified')
|
|
|
|
opts.ratelimit = numeric_limit
|
2013-01-22 00:50:42 -05:00
|
|
|
if opts.min_filesize is not None:
|
|
|
|
numeric_limit = FileDownloader.parse_bytes(opts.min_filesize)
|
|
|
|
if numeric_limit is None:
|
|
|
|
parser.error(u'invalid min_filesize specified')
|
|
|
|
opts.min_filesize = numeric_limit
|
|
|
|
if opts.max_filesize is not None:
|
|
|
|
numeric_limit = FileDownloader.parse_bytes(opts.max_filesize)
|
|
|
|
if numeric_limit is None:
|
|
|
|
parser.error(u'invalid max_filesize specified')
|
|
|
|
opts.max_filesize = numeric_limit
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.retries is not None:
|
|
|
|
try:
|
|
|
|
opts.retries = int(opts.retries)
|
2013-11-22 19:57:52 +01:00
|
|
|
except (TypeError, ValueError):
|
2012-11-28 02:04:46 +01:00
|
|
|
parser.error(u'invalid retry count specified')
|
|
|
|
if opts.buffersize is not None:
|
|
|
|
numeric_buffersize = FileDownloader.parse_bytes(opts.buffersize)
|
|
|
|
if numeric_buffersize is None:
|
|
|
|
parser.error(u'invalid buffer size specified')
|
|
|
|
opts.buffersize = numeric_buffersize
|
2013-12-16 13:16:20 +01:00
|
|
|
if opts.playliststart <= 0:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
parser.error(u'Playlist start must be positive')
|
2013-12-16 13:16:20 +01:00
|
|
|
if opts.playlistend not in (-1, None) and opts.playlistend < opts.playliststart:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
parser.error(u'Playlist end must be greater than playlist start')
|
2012-11-28 02:04:46 +01:00
|
|
|
if opts.extractaudio:
|
2013-01-10 19:15:04 +01:00
|
|
|
if opts.audioformat not in ['best', 'aac', 'mp3', 'm4a', 'opus', 'vorbis', 'wav']:
|
2012-11-28 02:04:46 +01:00
|
|
|
parser.error(u'invalid audio format specified')
|
|
|
|
if opts.audioquality:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
opts.audioquality = opts.audioquality.strip('kK')
|
2012-11-28 02:04:46 +01:00
|
|
|
if not opts.audioquality.isdigit():
|
|
|
|
parser.error(u'invalid audio quality specified')
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.recodevideo:
|
2014-05-10 15:09:56 +02:00
|
|
|
if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv']:
|
2013-01-12 15:07:59 +01:00
|
|
|
parser.error(u'invalid video recode format specified')
|
2013-04-27 14:01:55 +02:00
|
|
|
if opts.date is not None:
|
|
|
|
date = DateRange.day(opts.date)
|
|
|
|
else:
|
|
|
|
date = DateRange(opts.dateafter, opts.datebefore)
|
2014-03-30 15:57:31 +02:00
|
|
|
if opts.default_search not in ('auto', 'auto_warning', None) and ':' not in opts.default_search:
|
2014-01-22 14:16:43 +01:00
|
|
|
parser.error(u'--default-search invalid; did you forget a colon (:) at the end?')
|
2012-11-28 02:04:46 +01:00
|
|
|
|
2014-01-22 14:53:23 +01:00
|
|
|
# Do not download videos when there are audio-only formats
|
|
|
|
if opts.extractaudio and not opts.keepvideo and opts.format is None:
|
|
|
|
opts.format = 'bestaudio/best'
|
|
|
|
|
2013-09-14 11:14:40 +02:00
|
|
|
# --all-sub automatically sets --write-sub if --write-auto-sub is not given
|
|
|
|
# this was the old behaviour if only --all-sub was given.
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.allsubtitles and not opts.writeautomaticsub:
|
2013-09-14 11:14:40 +02:00
|
|
|
opts.writesubtitles = True
|
|
|
|
|
2012-12-15 17:44:48 +01:00
|
|
|
if sys.version_info < (3,):
|
|
|
|
# In Python 2, sys.argv is a bytestring (also note http://bugs.python.org/issue2128 for Windows systems)
|
2012-12-15 23:54:44 +01:00
|
|
|
if opts.outtmpl is not None:
|
|
|
|
opts.outtmpl = opts.outtmpl.decode(preferredencoding())
|
2012-12-15 17:44:48 +01:00
|
|
|
outtmpl =((opts.outtmpl is not None and opts.outtmpl)
|
|
|
|
or (opts.format == '-1' and opts.usetitle and u'%(title)s-%(id)s-%(format)s.%(ext)s')
|
|
|
|
or (opts.format == '-1' and u'%(id)s-%(format)s.%(ext)s')
|
|
|
|
or (opts.usetitle and opts.autonumber and u'%(autonumber)s-%(title)s-%(id)s.%(ext)s')
|
|
|
|
or (opts.usetitle and u'%(title)s-%(id)s.%(ext)s')
|
|
|
|
or (opts.useid and u'%(id)s.%(ext)s')
|
|
|
|
or (opts.autonumber and u'%(autonumber)s-%(id)s.%(ext)s')
|
2014-04-30 10:02:03 +02:00
|
|
|
or DEFAULT_OUTTMPL)
|
2013-12-15 11:42:38 +01:00
|
|
|
if not os.path.splitext(outtmpl)[1] and opts.extractaudio:
|
2013-09-21 11:10:22 +02:00
|
|
|
parser.error(u'Cannot download a video and extract audio into the same'
|
2013-12-15 11:42:38 +01:00
|
|
|
u' file! Use "{0}.%(ext)s" instead of "{0}" as the output'
|
|
|
|
u' template'.format(outtmpl))
|
2013-09-24 21:55:25 +02:00
|
|
|
|
2013-12-16 04:15:10 +01:00
|
|
|
any_printing = opts.geturl or opts.gettitle or opts.getid or opts.getthumbnail or opts.getdescription or opts.getfilename or opts.getformat or opts.getduration or opts.dumpjson
|
2014-01-12 01:27:47 +01:00
|
|
|
download_archive_fn = os.path.expanduser(opts.download_archive) if opts.download_archive is not None else opts.download_archive
|
2013-12-16 04:15:10 +01:00
|
|
|
|
2013-11-17 21:05:14 +01:00
|
|
|
ydl_opts = {
|
2012-11-28 02:04:46 +01:00
|
|
|
'usenetrc': opts.usenetrc,
|
|
|
|
'username': opts.username,
|
|
|
|
'password': opts.password,
|
2013-06-25 22:22:32 +02:00
|
|
|
'videopassword': opts.videopassword,
|
2013-12-16 04:15:10 +01:00
|
|
|
'quiet': (opts.quiet or any_printing),
|
2014-03-26 00:43:46 +01:00
|
|
|
'no_warnings': opts.no_warnings,
|
2012-11-28 02:04:46 +01:00
|
|
|
'forceurl': opts.geturl,
|
|
|
|
'forcetitle': opts.gettitle,
|
2013-05-05 22:30:07 -07:00
|
|
|
'forceid': opts.getid,
|
2012-11-28 02:04:46 +01:00
|
|
|
'forcethumbnail': opts.getthumbnail,
|
|
|
|
'forcedescription': opts.getdescription,
|
2013-12-16 04:15:10 +01:00
|
|
|
'forceduration': opts.getduration,
|
2012-11-28 02:04:46 +01:00
|
|
|
'forcefilename': opts.getfilename,
|
|
|
|
'forceformat': opts.getformat,
|
2013-11-19 18:59:22 +05:00
|
|
|
'forcejson': opts.dumpjson,
|
2012-11-28 02:04:46 +01:00
|
|
|
'simulate': opts.simulate,
|
2013-12-16 04:15:10 +01:00
|
|
|
'skip_download': (opts.skip_download or opts.simulate or any_printing),
|
2012-11-28 02:04:46 +01:00
|
|
|
'format': opts.format,
|
|
|
|
'format_limit': opts.format_limit,
|
|
|
|
'listformats': opts.listformats,
|
2012-12-15 17:44:48 +01:00
|
|
|
'outtmpl': outtmpl,
|
2013-04-02 11:40:07 +07:00
|
|
|
'autonumber_size': opts.autonumber_size,
|
2012-11-28 02:04:46 +01:00
|
|
|
'restrictfilenames': opts.restrictfilenames,
|
|
|
|
'ignoreerrors': opts.ignoreerrors,
|
|
|
|
'ratelimit': opts.ratelimit,
|
|
|
|
'nooverwrites': opts.nooverwrites,
|
|
|
|
'retries': opts.retries,
|
|
|
|
'buffersize': opts.buffersize,
|
|
|
|
'noresizebuffer': opts.noresizebuffer,
|
|
|
|
'continuedl': opts.continue_dl,
|
|
|
|
'noprogress': opts.noprogress,
|
2013-02-18 18:52:06 +01:00
|
|
|
'progress_with_newline': opts.progress_with_newline,
|
2012-11-28 02:04:46 +01:00
|
|
|
'playliststart': opts.playliststart,
|
|
|
|
'playlistend': opts.playlistend,
|
2013-09-30 16:26:25 -04:00
|
|
|
'noplaylist': opts.noplaylist,
|
2012-11-28 02:04:46 +01:00
|
|
|
'logtostderr': opts.outtmpl == '-',
|
|
|
|
'consoletitle': opts.consoletitle,
|
|
|
|
'nopart': opts.nopart,
|
|
|
|
'updatetime': opts.updatetime,
|
|
|
|
'writedescription': opts.writedescription,
|
2013-10-14 16:18:58 +11:00
|
|
|
'writeannotations': opts.writeannotations,
|
2012-11-28 02:04:46 +01:00
|
|
|
'writeinfojson': opts.writeinfojson,
|
2013-05-01 14:04:33 +02:00
|
|
|
'writethumbnail': opts.writethumbnail,
|
2012-11-28 02:04:46 +01:00
|
|
|
'writesubtitles': opts.writesubtitles,
|
2013-06-25 23:45:16 +02:00
|
|
|
'writeautomaticsub': opts.writeautomaticsub,
|
2013-02-22 02:52:55 +01:00
|
|
|
'allsubtitles': opts.allsubtitles,
|
2013-02-22 04:50:05 +01:00
|
|
|
'listsubtitles': opts.listsubtitles,
|
2013-02-22 03:53:54 +01:00
|
|
|
'subtitlesformat': opts.subtitlesformat,
|
2013-09-06 16:26:22 +02:00
|
|
|
'subtitleslangs': opts.subtitleslangs,
|
2013-02-21 17:09:39 +01:00
|
|
|
'matchtitle': decodeOption(opts.matchtitle),
|
|
|
|
'rejecttitle': decodeOption(opts.rejecttitle),
|
2012-11-28 02:04:46 +01:00
|
|
|
'max_downloads': opts.max_downloads,
|
|
|
|
'prefer_free_formats': opts.prefer_free_formats,
|
|
|
|
'verbose': opts.verbose,
|
2013-04-11 18:31:35 +02:00
|
|
|
'dump_intermediate_pages': opts.dump_intermediate_pages,
|
2013-10-28 10:44:02 +01:00
|
|
|
'write_pages': opts.write_pages,
|
2012-12-11 09:57:40 +01:00
|
|
|
'test': opts.test,
|
2013-01-12 15:07:59 +01:00
|
|
|
'keepvideo': opts.keepvideo,
|
2013-01-22 00:50:42 -05:00
|
|
|
'min_filesize': opts.min_filesize,
|
2013-04-27 14:01:55 +02:00
|
|
|
'max_filesize': opts.max_filesize,
|
2013-12-16 03:09:49 +01:00
|
|
|
'min_views': opts.min_views,
|
|
|
|
'max_views': opts.max_views,
|
2013-05-01 14:04:33 +02:00
|
|
|
'daterange': date,
|
2013-09-24 21:26:10 +02:00
|
|
|
'cachedir': opts.cachedir,
|
2013-09-22 10:50:12 +02:00
|
|
|
'youtube_print_sig_code': opts.youtube_print_sig_code,
|
2013-10-06 06:06:30 +02:00
|
|
|
'age_limit': opts.age_limit,
|
2014-01-12 01:27:47 +01:00
|
|
|
'download_archive': download_archive_fn,
|
2013-11-22 19:57:52 +01:00
|
|
|
'cookiefile': opts.cookiefile,
|
|
|
|
'nocheckcertificate': opts.no_check_certificate,
|
2014-03-21 00:33:53 +01:00
|
|
|
'prefer_insecure': opts.prefer_insecure,
|
2013-11-26 08:03:11 +01:00
|
|
|
'proxy': opts.proxy,
|
2013-12-02 13:37:05 +01:00
|
|
|
'socket_timeout': opts.socket_timeout,
|
2013-12-09 04:08:51 +01:00
|
|
|
'bidi_workaround': opts.bidi_workaround,
|
2013-12-29 15:28:32 +01:00
|
|
|
'debug_printtraffic': opts.debug_printtraffic,
|
2014-01-08 17:53:34 +01:00
|
|
|
'prefer_ffmpeg': opts.prefer_ffmpeg,
|
2014-01-21 02:09:49 +01:00
|
|
|
'include_ads': opts.include_ads,
|
2014-01-22 14:16:43 +01:00
|
|
|
'default_search': opts.default_search,
|
2014-01-22 21:56:37 +01:00
|
|
|
'youtube_include_dash_manifest': opts.youtube_include_dash_manifest,
|
2014-03-30 06:02:41 +02:00
|
|
|
'encoding': opts.encoding,
|
2013-11-17 21:05:14 +01:00
|
|
|
}
|
2012-11-28 02:04:46 +01:00
|
|
|
|
2013-11-17 21:05:14 +01:00
|
|
|
with YoutubeDL(ydl_opts) as ydl:
|
2013-11-22 19:57:52 +01:00
|
|
|
ydl.print_debug_header()
|
2013-11-17 21:05:14 +01:00
|
|
|
ydl.add_default_info_extractors()
|
|
|
|
|
|
|
|
# PostProcessors
|
|
|
|
# Add the metadata pp first, the other pps will copy it
|
|
|
|
if opts.addmetadata:
|
|
|
|
ydl.add_post_processor(FFmpegMetadataPP())
|
|
|
|
if opts.extractaudio:
|
|
|
|
ydl.add_post_processor(FFmpegExtractAudioPP(preferredcodec=opts.audioformat, preferredquality=opts.audioquality, nopostoverwrites=opts.nopostoverwrites))
|
|
|
|
if opts.recodevideo:
|
|
|
|
ydl.add_post_processor(FFmpegVideoConvertor(preferedformat=opts.recodevideo))
|
|
|
|
if opts.embedsubtitles:
|
|
|
|
ydl.add_post_processor(FFmpegEmbedSubtitlePP(subtitlesformat=opts.subtitlesformat))
|
2014-01-02 07:47:28 -05:00
|
|
|
if opts.xattrs:
|
|
|
|
ydl.add_post_processor(XAttrMetadataPP())
|
2014-02-22 13:55:51 +01:00
|
|
|
if opts.embedthumbnail:
|
2014-02-22 18:31:54 +01:00
|
|
|
if not opts.addmetadata:
|
|
|
|
ydl.add_post_processor(FFmpegAudioFixPP())
|
2014-02-22 13:55:51 +01:00
|
|
|
ydl.add_post_processor(AtomicParsleyPP())
|
2013-11-17 21:05:14 +01:00
|
|
|
|
|
|
|
# Update version
|
|
|
|
if opts.update_self:
|
|
|
|
update_self(ydl.to_screen, opts.verbose)
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
return
|
2013-11-17 21:05:14 +01:00
|
|
|
|
|
|
|
# Maybe do nothing
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if not (all_urls or opts.load_info_filename):
|
|
|
|
parser.error(u'you must provide at least one URL')
|
2012-11-28 02:04:46 +01:00
|
|
|
|
2013-11-17 21:05:14 +01:00
|
|
|
try:
|
#Cleanup of `youtube-dl/__init__.py`
* the list of contributors is now in a separate file, `AUTHORS`. Why? Because this is meta-information which applies to the entire project, not just one particular module. Also, this file can and should be extended to indicate the authors' different roles (owner, maintainer, contributor, etc). Many successful projects follow this layout, e.g. [django](https://github.com/django/django/blob/master/AUTHORS) and [Swift](https://github.com/openstack/swift). We should adopt it as well.
* Argument parsing has been extracted to `configuration.py` and the names have been changed to follow PEP-8. Unnecessarily complicated boolean conditions have been simplified
* unused imports have been removed
## TESTING
I did my best not to introduce any bugs in the process, but it doesn't seem we have any tests at all for the command-line interface and option parsing, so this will require thorough review! I'm looking forward to any comments and improvements, and please let me know if I broke `devscripts/bash-completion.py` or not.
2014-05-26 21:05:25 +10:00
|
|
|
if opts.load_info_filename:
|
2013-11-22 14:57:53 +01:00
|
|
|
retcode = ydl.download_with_info_file(opts.load_info_filename)
|
|
|
|
else:
|
|
|
|
retcode = ydl.download(all_urls)
|
2013-11-17 21:05:14 +01:00
|
|
|
except MaxDownloadsReached:
|
|
|
|
ydl.to_screen(u'--max-download limit reached, aborting.')
|
|
|
|
retcode = 101
|
2012-11-28 02:04:46 +01:00
|
|
|
|
|
|
|
sys.exit(retcode)
|
2011-11-21 19:59:59 +01:00
|
|
|
|
2013-10-07 18:50:26 +02:00
|
|
|
|
2013-04-16 19:26:48 +02:00
|
|
|
def main(argv=None):
|
2012-11-28 02:04:46 +01:00
|
|
|
try:
|
2013-04-16 19:26:48 +02:00
|
|
|
_real_main(argv)
|
2012-11-28 02:04:46 +01:00
|
|
|
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')
|