2014-11-16 15:17:48 +01:00
|
|
|
#!/usr/bin/env python
|
2015-03-24 16:39:46 +01:00
|
|
|
# coding: utf-8
|
|
|
|
|
2014-11-16 15:17:48 +01:00
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
2012-12-01 15:52:34 +01:00
|
|
|
import unittest
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import os
|
|
|
|
import subprocess
|
2015-04-04 19:21:50 +06:00
|
|
|
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
|
|
|
|
|
|
|
from youtube_dl.utils import encodeArgument
|
Add CLI options to filter usable extractors
Add `--enable-extractors` and `--disable-extractors` options, which make
it possible to restrict the set of extractors to be considered when
downloading. This is useful to handle URLs that match multiple
extractors (although this should be rare), or only using particular
modes of some extractors (for example, only live videos for Twitch,
enabling only `twitch:stream`).
Both options can be specified multiple times, and each argument is
interpreted as a comma-separated list of fnmatch patterns, to allow the
use of wildcards. Comparisons to extractor names are case-insensitive.
The order of the arguments is not relevant - matching always proceeds as
follows:
- Initialize the set of considered extractors to all available
- If --enable-extractors is specified, remove all extractors that
*don't* match those patterns from consideration
- If --disable-extractors is specified, remove all extractors that *do*
match those patterns from consideration
- If --age-limit is specified, remove all extractors that are not
suitable from consideration
Therefore, disables and the age limit take precedence over enables.
2016-09-17 23:29:55 -03:00
|
|
|
from youtube_dl.extractor import gen_extractors, get_info_extractor
|
2012-12-01 15:52:34 +01:00
|
|
|
|
|
|
|
rootDir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
|
|
|
2014-11-16 15:17:48 +01:00
|
|
|
|
2012-12-01 15:52:34 +01:00
|
|
|
try:
|
|
|
|
_DEV_NULL = subprocess.DEVNULL
|
|
|
|
except AttributeError:
|
|
|
|
_DEV_NULL = open(os.devnull, 'wb')
|
|
|
|
|
2014-11-16 15:17:48 +01:00
|
|
|
|
2012-12-01 15:52:34 +01:00
|
|
|
class TestExecution(unittest.TestCase):
|
|
|
|
def test_import(self):
|
|
|
|
subprocess.check_call([sys.executable, '-c', 'import youtube_dl'], cwd=rootDir)
|
|
|
|
|
|
|
|
def test_module_exec(self):
|
2014-11-16 15:17:48 +01:00
|
|
|
if sys.version_info >= (2, 7): # Python 2.6 doesn't support package execution
|
2012-12-01 15:52:34 +01:00
|
|
|
subprocess.check_call([sys.executable, '-m', 'youtube_dl', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
|
|
|
|
|
|
|
def test_main_exec(self):
|
|
|
|
subprocess.check_call([sys.executable, 'youtube_dl/__main__.py', '--version'], cwd=rootDir, stdout=_DEV_NULL)
|
|
|
|
|
2015-03-24 16:39:46 +01:00
|
|
|
def test_cmdline_umlauts(self):
|
|
|
|
p = subprocess.Popen(
|
2015-04-04 19:21:50 +06:00
|
|
|
[sys.executable, 'youtube_dl/__main__.py', encodeArgument('ä'), '--version'],
|
2015-03-24 16:39:46 +01:00
|
|
|
cwd=rootDir, stdout=_DEV_NULL, stderr=subprocess.PIPE)
|
|
|
|
_, stderr = p.communicate()
|
|
|
|
self.assertFalse(stderr)
|
|
|
|
|
Add CLI options to filter usable extractors
Add `--enable-extractors` and `--disable-extractors` options, which make
it possible to restrict the set of extractors to be considered when
downloading. This is useful to handle URLs that match multiple
extractors (although this should be rare), or only using particular
modes of some extractors (for example, only live videos for Twitch,
enabling only `twitch:stream`).
Both options can be specified multiple times, and each argument is
interpreted as a comma-separated list of fnmatch patterns, to allow the
use of wildcards. Comparisons to extractor names are case-insensitive.
The order of the arguments is not relevant - matching always proceeds as
follows:
- Initialize the set of considered extractors to all available
- If --enable-extractors is specified, remove all extractors that
*don't* match those patterns from consideration
- If --disable-extractors is specified, remove all extractors that *do*
match those patterns from consideration
- If --age-limit is specified, remove all extractors that are not
suitable from consideration
Therefore, disables and the age limit take precedence over enables.
2016-09-17 23:29:55 -03:00
|
|
|
ALL_EXTRACTORS = [ie.IE_NAME for ie in gen_extractors() if ie._WORKING]
|
|
|
|
EXTRACTOR_CASES = {
|
|
|
|
'unrestricted': {
|
|
|
|
'result': ALL_EXTRACTORS
|
|
|
|
},
|
|
|
|
'enable_all': {
|
|
|
|
'enable': '*',
|
|
|
|
'result': ALL_EXTRACTORS
|
|
|
|
},
|
|
|
|
'disable_all': {
|
|
|
|
'disable': '*',
|
|
|
|
'result': []
|
|
|
|
},
|
|
|
|
'enable_disable_all': {
|
|
|
|
'enable': '*',
|
|
|
|
'disable': '*',
|
|
|
|
'result': []
|
|
|
|
},
|
|
|
|
'enable_some': {
|
|
|
|
'enable': 'youtube,youporn',
|
|
|
|
'result': ['youtube', 'YouPorn']
|
|
|
|
},
|
|
|
|
'enable_and_filter': {
|
|
|
|
'enable': 'twitch:*',
|
|
|
|
'disable': 'twitch:stream',
|
|
|
|
'result': [ie for ie in ALL_EXTRACTORS if ie.startswith('twitch:') and ie != 'twitch:stream']
|
|
|
|
},
|
|
|
|
'enable_age_restricted': {
|
|
|
|
'enable': 'youporn',
|
|
|
|
'age_limit': 16,
|
|
|
|
'result': []
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
def gen_extractor_case(case):
|
|
|
|
enable = case.get('enable')
|
|
|
|
disable = case.get('disable')
|
|
|
|
age_limit = case.get('age_limit')
|
|
|
|
result = case['result']
|
|
|
|
|
|
|
|
def template(self):
|
|
|
|
args = [sys.executable, 'youtube_dl/__main__.py', '--list-extractors']
|
|
|
|
if enable:
|
|
|
|
args.extend(['--enable-extractors', enable])
|
|
|
|
if disable:
|
|
|
|
args.extend(['--disable-extractors', disable])
|
|
|
|
if age_limit:
|
|
|
|
args.extend(['--age-limit', str(age_limit)])
|
|
|
|
|
|
|
|
out = subprocess.check_output(args, cwd=rootDir, stderr=_DEV_NULL).decode('utf-8')
|
|
|
|
extractors = filter(lambda e: e and 'BROKEN' not in e, out.split('\n'))
|
|
|
|
self.assertItemsEqual(extractors, result)
|
|
|
|
|
|
|
|
return template
|
|
|
|
|
|
|
|
class TestExtractorSelection(unittest.TestCase):
|
|
|
|
pass
|
|
|
|
|
|
|
|
for name, case in EXTRACTOR_CASES.items():
|
|
|
|
test_method = gen_extractor_case(case)
|
|
|
|
test_name = str('test_' + name)
|
|
|
|
test_method.__name__ = test_name
|
|
|
|
setattr(TestExtractorSelection, test_name, test_method)
|
|
|
|
del test_method
|
|
|
|
|
2012-12-01 15:52:34 +01:00
|
|
|
if __name__ == '__main__':
|
|
|
|
unittest.main()
|