diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/helper.py | 47 | ||||
| -rw-r--r-- | test/test_YoutubeDL.py | 133 | ||||
| -rw-r--r-- | test/test_age_restriction.py | 10 | ||||
| -rw-r--r-- | test/test_all_urls.py | 16 | ||||
| -rw-r--r-- | test/test_dailymotion_subtitles.py | 16 | ||||
| -rw-r--r-- | test/test_download.py | 100 | ||||
| -rw-r--r-- | test/test_playlists.py | 13 | ||||
| -rw-r--r-- | test/test_utils.py | 28 | ||||
| -rw-r--r-- | test/test_write_annotations.py | 36 | ||||
| -rw-r--r-- | test/test_write_info_json.py | 32 | ||||
| -rw-r--r-- | test/test_youtube_lists.py | 24 | ||||
| -rw-r--r-- | test/test_youtube_signature.py | 16 | ||||
| -rw-r--r-- | test/test_youtube_subtitles.py | 27 | 
13 files changed, 357 insertions, 141 deletions
| diff --git a/test/helper.py b/test/helper.py index ad1b74dd3..d7bf7a828 100644 --- a/test/helper.py +++ b/test/helper.py @@ -1,22 +1,29 @@  import errno  import io +import hashlib  import json  import os.path  import re  import types +import sys  import youtube_dl.extractor -from youtube_dl import YoutubeDL, YoutubeDLHandler -from youtube_dl.utils import ( -    compat_cookiejar, -    compat_urllib_request, -) +from youtube_dl import YoutubeDL +from youtube_dl.utils import preferredencoding -youtube_dl._setup_opener(timeout=10) -PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") -with io.open(PARAMETERS_FILE, encoding='utf-8') as pf: -    parameters = json.load(pf) +def global_setup(): +    youtube_dl._setup_opener(timeout=10) + + +def get_params(override=None): +    PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), +                                   "parameters.json") +    with io.open(PARAMETERS_FILE, encoding='utf-8') as pf: +        parameters = json.load(pf) +    if override: +        parameters.update(override) +    return parameters  def try_rm(filename): @@ -28,11 +35,26 @@ def try_rm(filename):              raise +def report_warning(message): +    ''' +    Print the message to stderr, it will be prefixed with 'WARNING:' +    If stderr is a tty file the 'WARNING:' will be colored +    ''' +    if sys.stderr.isatty() and os.name != 'nt': +        _msg_header = u'\033[0;33mWARNING:\033[0m' +    else: +        _msg_header = u'WARNING:' +    output = u'%s %s\n' % (_msg_header, message) +    if 'b' in getattr(sys.stderr, 'mode', '') or sys.version_info[0] < 3: +        output = output.encode(preferredencoding()) +    sys.stderr.write(output) + +  class FakeYDL(YoutubeDL): -    def __init__(self): +    def __init__(self, override=None):          # Different instances of the downloader can't share the same dictionary          # some test set the "sublang" parameter, which would break the md5 checks. -        params = dict(parameters) +        params = get_params(override=override)          super(FakeYDL, self).__init__(params)          self.result = [] @@ -62,3 +84,6 @@ def get_testcases():          for t in getattr(ie, '_TESTS', []):              t['name'] = type(ie).__name__[:-len('IE')]              yield t + + +md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest() diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py new file mode 100644 index 000000000..ffebb4ae5 --- /dev/null +++ b/test/test_YoutubeDL.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python + +# Allow direct execution +import os +import sys +import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import FakeYDL + + +class YDL(FakeYDL): +    def __init__(self, *args, **kwargs): +        super(YDL, self).__init__(*args, **kwargs) +        self.downloaded_info_dicts = [] +        self.msgs = [] + +    def process_info(self, info_dict): +        self.downloaded_info_dicts.append(info_dict) + +    def to_screen(self, msg): +        self.msgs.append(msg) + + +class TestFormatSelection(unittest.TestCase): +    def test_prefer_free_formats(self): +        # Same resolution => download webm +        ydl = YDL() +        ydl.params['prefer_free_formats'] = True +        formats = [ +            {u'ext': u'webm', u'height': 460}, +            {u'ext': u'mp4',  u'height': 460}, +        ] +        info_dict = {u'formats': formats, u'extractor': u'test'} +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'ext'], u'webm') + +        # Different resolution => download best quality (mp4) +        ydl = YDL() +        ydl.params['prefer_free_formats'] = True +        formats = [ +            {u'ext': u'webm', u'height': 720}, +            {u'ext': u'mp4', u'height': 1080}, +        ] +        info_dict[u'formats'] = formats +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'ext'], u'mp4') + +        # No prefer_free_formats => keep original formats order +        ydl = YDL() +        ydl.params['prefer_free_formats'] = False +        formats = [ +            {u'ext': u'webm', u'height': 720}, +            {u'ext': u'flv', u'height': 720}, +        ] +        info_dict[u'formats'] = formats +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'ext'], u'flv') + +    def test_format_limit(self): +        formats = [ +            {u'format_id': u'meh', u'url': u'http://example.com/meh'}, +            {u'format_id': u'good', u'url': u'http://example.com/good'}, +            {u'format_id': u'great', u'url': u'http://example.com/great'}, +            {u'format_id': u'excellent', u'url': u'http://example.com/exc'}, +        ] +        info_dict = { +            u'formats': formats, u'extractor': u'test', 'id': 'testvid'} + +        ydl = YDL() +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'format_id'], u'excellent') + +        ydl = YDL({'format_limit': 'good'}) +        assert ydl.params['format_limit'] == 'good' +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'format_id'], u'good') + +        ydl = YDL({'format_limit': 'great', 'format': 'all'}) +        ydl.process_ie_result(info_dict) +        self.assertEqual(ydl.downloaded_info_dicts[0][u'format_id'], u'meh') +        self.assertEqual(ydl.downloaded_info_dicts[1][u'format_id'], u'good') +        self.assertEqual(ydl.downloaded_info_dicts[2][u'format_id'], u'great') +        self.assertTrue('3' in ydl.msgs[0]) + +        ydl = YDL() +        ydl.params['format_limit'] = 'excellent' +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded[u'format_id'], u'excellent') + +    def test_format_selection(self): +        formats = [ +            {u'format_id': u'35', u'ext': u'mp4'}, +            {u'format_id': u'45', u'ext': u'webm'}, +            {u'format_id': u'47', u'ext': u'webm'}, +            {u'format_id': u'2', u'ext': u'flv'}, +        ] +        info_dict = {u'formats': formats, u'extractor': u'test'} + +        ydl = YDL({'format': u'20/47'}) +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded['format_id'], u'47') + +        ydl = YDL({'format': u'20/71/worst'}) +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded['format_id'], u'35') + +        ydl = YDL() +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded['format_id'], u'2') + +        ydl = YDL({'format': u'webm/mp4'}) +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded['format_id'], u'47') + +        ydl = YDL({'format': u'3gp/40/mp4'}) +        ydl.process_ie_result(info_dict) +        downloaded = ydl.downloaded_info_dicts[0] +        self.assertEqual(downloaded['format_id'], u'35') + + +if __name__ == '__main__': +    unittest.main() diff --git a/test/test_age_restriction.py b/test/test_age_restriction.py index ec3e30572..d500c6edc 100644 --- a/test/test_age_restriction.py +++ b/test/test_age_restriction.py @@ -1,14 +1,16 @@  #!/usr/bin/env python +# Allow direct execution +import os  import sys  import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import global_setup, try_rm +global_setup() -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  from youtube_dl import YoutubeDL -from .helper import try_rm  def _download_restricted(url, filename, age): diff --git a/test/test_all_urls.py b/test/test_all_urls.py index b28ad000b..56e5f80e1 100644 --- a/test/test_all_urls.py +++ b/test/test_all_urls.py @@ -1,14 +1,20 @@  #!/usr/bin/env python +# Allow direct execution +import os  import sys  import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from youtube_dl.extractor import YoutubeIE, YoutubePlaylistIE, YoutubeChannelIE, JustinTVIE, gen_extractors -from .helper import get_testcases +from test.helper import get_testcases + +from youtube_dl.extractor import ( +    gen_extractors, +    JustinTVIE, +    YoutubeIE, +) +  class TestAllURLsMatching(unittest.TestCase):      def setUp(self): diff --git a/test/test_dailymotion_subtitles.py b/test/test_dailymotion_subtitles.py index e655d280d..ba3580ea4 100644 --- a/test/test_dailymotion_subtitles.py +++ b/test/test_dailymotion_subtitles.py @@ -1,18 +1,16 @@  #!/usr/bin/env python +# Allow direct execution +import os  import sys  import unittest -import hashlib +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from test.helper import FakeYDL, global_setup, md5 +global_setup() -from youtube_dl.extractor import DailymotionIE -from youtube_dl.utils import * -from .helper import FakeYDL -md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest() +from youtube_dl.extractor import DailymotionIE  class TestDailymotionSubtitles(unittest.TestCase):      def setUp(self): @@ -24,7 +22,7 @@ class TestDailymotionSubtitles(unittest.TestCase):          return info_dict      def getSubtitles(self):          info_dict = self.getInfoDict() -        return info_dict[0]['subtitles'] +        return info_dict['subtitles']      def test_no_writesubtitles(self):          subtitles = self.getSubtitles()          self.assertEqual(subtitles, None) diff --git a/test/test_download.py b/test/test_download.py index 68da4d984..dfb04d010 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -1,26 +1,39 @@  #!/usr/bin/env python +# Allow direct execution +import os +import sys +import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import ( +    get_params, +    get_testcases, +    global_setup, +    try_rm, +    md5, +    report_warning +) +global_setup() + +  import hashlib  import io -import os  import json -import unittest -import sys  import socket -import binascii - -# Allow direct execution -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  import youtube_dl.YoutubeDL -from youtube_dl.utils import * - -PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") +from youtube_dl.utils import ( +    compat_str, +    compat_urllib_error, +    compat_HTTPError, +    DownloadError, +    ExtractorError, +    UnavailableVideoError, +)  RETRIES = 3 -md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest() -  class YoutubeDL(youtube_dl.YoutubeDL):      def __init__(self, *args, **kwargs):          self.to_stderr = self.to_screen @@ -37,18 +50,12 @@ def _file_md5(fn):      with open(fn, 'rb') as f:          return hashlib.md5(f.read()).hexdigest() -import test.helper as helper  # Set up remaining global configuration -from .helper import get_testcases, try_rm  defs = get_testcases() -with io.open(PARAMETERS_FILE, encoding='utf-8') as pf: -    parameters = json.load(pf) -  class TestDownload(unittest.TestCase):      maxDiff = None      def setUp(self): -        self.parameters = parameters          self.defs = defs  ### Dynamically generate tests @@ -61,15 +68,17 @@ def generator(test_case):          if not ie._WORKING:              print_skipping('IE marked as not _WORKING')              return -        if 'playlist' not in test_case and not test_case['file']: -            print_skipping('No output file specified') -            return +        if 'playlist' not in test_case: +            info_dict = test_case.get('info_dict', {}) +            if not test_case.get('file') and not (info_dict.get('id') and info_dict.get('ext')): +                print_skipping('The output file cannot be know, the "file" ' +                    'key is missing or the info_dict is incomplete') +                return          if 'skip' in test_case:              print_skipping(test_case['skip'])              return -        params = self.parameters.copy() -        params.update(test_case.get('params', {})) +        params = get_params(test_case.get('params', {}))          ydl = YoutubeDL(params)          ydl.add_default_info_extractors() @@ -79,35 +88,47 @@ def generator(test_case):                  finished_hook_called.add(status['filename'])          ydl.fd.add_progress_hook(_hook) +        def get_tc_filename(tc): +            return tc.get('file') or ydl.prepare_filename(tc.get('info_dict', {})) +          test_cases = test_case.get('playlist', [test_case]) -        for tc in test_cases: -            try_rm(tc['file']) -            try_rm(tc['file'] + '.part') -            try_rm(tc['file'] + '.info.json') +        def try_rm_tcs_files(): +            for tc in test_cases: +                tc_filename = get_tc_filename(tc) +                try_rm(tc_filename) +                try_rm(tc_filename + '.part') +                try_rm(tc_filename + '.info.json') +        try_rm_tcs_files()          try: -            for retry in range(1, RETRIES + 1): +            try_num = 1 +            while True:                  try:                      ydl.download([test_case['url']])                  except (DownloadError, ExtractorError) as err: -                    if retry == RETRIES: raise -                      # Check if the exception is not a network related one -                    if not err.exc_info[0] in (compat_urllib_error.URLError, socket.timeout, UnavailableVideoError): +                    if not err.exc_info[0] in (compat_urllib_error.URLError, socket.timeout, UnavailableVideoError) or (err.exc_info[0] == compat_HTTPError and err.exc_info[1].code == 503):                          raise -                    print('Retrying: {0} failed tries\n\n##########\n\n'.format(retry)) +                    if try_num == RETRIES: +                        report_warning(u'Failed due to network errors, skipping...') +                        return + +                    print('Retrying: {0} failed tries\n\n##########\n\n'.format(try_num)) + +                    try_num += 1                  else:                      break              for tc in test_cases: +                tc_filename = get_tc_filename(tc)                  if not test_case.get('params', {}).get('skip_download', False): -                    self.assertTrue(os.path.exists(tc['file']), msg='Missing file ' + tc['file']) -                    self.assertTrue(tc['file'] in finished_hook_called) -                self.assertTrue(os.path.exists(tc['file'] + '.info.json')) +                    self.assertTrue(os.path.exists(tc_filename), msg='Missing file ' + tc_filename) +                    self.assertTrue(tc_filename in finished_hook_called) +                self.assertTrue(os.path.exists(tc_filename + '.info.json'))                  if 'md5' in tc: -                    md5_for_file = _file_md5(tc['file']) +                    md5_for_file = _file_md5(tc_filename)                      self.assertEqual(md5_for_file, tc['md5']) -                with io.open(tc['file'] + '.info.json', encoding='utf-8') as infof: +                with io.open(tc_filename + '.info.json', encoding='utf-8') as infof:                      info_dict = json.load(infof)                  for (info_field, expected) in tc.get('info_dict', {}).items():                      if isinstance(expected, compat_str) and expected.startswith('md5:'): @@ -128,10 +149,7 @@ def generator(test_case):                  for key in ('id', 'url', 'title', 'ext'):                      self.assertTrue(key in info_dict.keys() and info_dict[key])          finally: -            for tc in test_cases: -                try_rm(tc['file']) -                try_rm(tc['file'] + '.part') -                try_rm(tc['file'] + '.info.json') +            try_rm_tcs_files()      return test_template diff --git a/test/test_playlists.py b/test/test_playlists.py index 108a4d63b..d6a8d56df 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -1,13 +1,16 @@  #!/usr/bin/env python  # encoding: utf-8 -import sys -import unittest -import json  # Allow direct execution  import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +import sys +import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import FakeYDL, global_setup +global_setup() +  from youtube_dl.extractor import (      DailymotionPlaylistIE, @@ -18,9 +21,7 @@ from youtube_dl.extractor import (      LivestreamIE,      NHLVideocenterIE,  ) -from youtube_dl.utils import * -from .helper import FakeYDL  class TestPlaylists(unittest.TestCase):      def assertIsPlaylist(self, info): diff --git a/test/test_utils.py b/test/test_utils.py index f2c03d421..f3fbff042 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -1,14 +1,15 @@  #!/usr/bin/env python +# coding: utf-8 -# Various small unit tests - +# Allow direct execution +import os  import sys  import unittest -import xml.etree.ElementTree +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# Various small unit tests +import xml.etree.ElementTree  #from youtube_dl.utils import htmlentity_transform  from youtube_dl.utils import ( @@ -21,6 +22,8 @@ from youtube_dl.utils import (      find_xpath_attr,      get_meta_content,      xpath_with_ns, +    smuggle_url, +    unsmuggle_url,  )  if sys.version_info < (3, 0): @@ -155,5 +158,18 @@ class TestUtil(unittest.TestCase):          self.assertEqual(find('media:song/media:author').text, u'The Author')          self.assertEqual(find('media:song/url').text, u'http://server.com/download.mp3') +    def test_smuggle_url(self): +        data = {u"ö": u"ö", u"abc": [3]} +        url = 'https://foo.bar/baz?x=y#a' +        smug_url = smuggle_url(url, data) +        unsmug_url, unsmug_data = unsmuggle_url(smug_url) +        self.assertEqual(url, unsmug_url) +        self.assertEqual(data, unsmug_data) + +        res_url, res_data = unsmuggle_url(url) +        self.assertEqual(res_url, url) +        self.assertEqual(res_data, None) + +  if __name__ == '__main__':      unittest.main() diff --git a/test/test_write_annotations.py b/test/test_write_annotations.py index ba7a9f50a..35defb895 100644 --- a/test/test_write_annotations.py +++ b/test/test_write_annotations.py @@ -1,39 +1,37 @@  #!/usr/bin/env python  # coding: utf-8 -import xml.etree.ElementTree +# Allow direct execution  import os  import sys  import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from test.helper import get_params, global_setup, try_rm +global_setup() + + +import io + +import xml.etree.ElementTree  import youtube_dl.YoutubeDL  import youtube_dl.extractor -from youtube_dl.utils import * -from .helper import try_rm - -PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") -# General configuration (from __init__, not very elegant...) -jar = compat_cookiejar.CookieJar() -cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) -proxy_handler = compat_urllib_request.ProxyHandler() -opener = compat_urllib_request.build_opener(proxy_handler, cookie_processor, YoutubeDLHandler()) -compat_urllib_request.install_opener(opener)  class YoutubeDL(youtube_dl.YoutubeDL):      def __init__(self, *args, **kwargs):          super(YoutubeDL, self).__init__(*args, **kwargs)          self.to_stderr = self.to_screen -with io.open(PARAMETERS_FILE, encoding='utf-8') as pf: -    params = json.load(pf) -params['writeannotations'] = True -params['skip_download'] = True -params['writeinfojson'] = False -params['format'] = 'flv' +params = get_params({ +    'writeannotations': True, +    'skip_download': True, +    'writeinfojson': False, +    'format': 'flv', +}) + +  TEST_ID = 'gr51aVj-mLg'  ANNOTATIONS_FILE = TEST_ID + '.flv.annotations.xml' diff --git a/test/test_write_info_json.py b/test/test_write_info_json.py index de6d5180f..a5b6f6972 100644 --- a/test/test_write_info_json.py +++ b/test/test_write_info_json.py @@ -1,37 +1,34 @@  #!/usr/bin/env python  # coding: utf-8 -import json +# Allow direct execution  import os  import sys  import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from test.helper import get_params, global_setup +global_setup() + + +import io +import json  import youtube_dl.YoutubeDL  import youtube_dl.extractor -from youtube_dl.utils import * - -PARAMETERS_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "parameters.json") -# General configuration (from __init__, not very elegant...) -jar = compat_cookiejar.CookieJar() -cookie_processor = compat_urllib_request.HTTPCookieProcessor(jar) -proxy_handler = compat_urllib_request.ProxyHandler() -opener = compat_urllib_request.build_opener(proxy_handler, cookie_processor, YoutubeDLHandler()) -compat_urllib_request.install_opener(opener)  class YoutubeDL(youtube_dl.YoutubeDL):      def __init__(self, *args, **kwargs):          super(YoutubeDL, self).__init__(*args, **kwargs)          self.to_stderr = self.to_screen -with io.open(PARAMETERS_FILE, encoding='utf-8') as pf: -    params = json.load(pf) -params['writeinfojson'] = True -params['skip_download'] = True -params['writedescription'] = True +params = get_params({ +    'writeinfojson': True, +    'skip_download': True, +    'writedescription': True, +}) +  TEST_ID = 'BaW_jenozKc'  INFO_JSON_FILE = TEST_ID + '.mp4.info.json' @@ -42,6 +39,7 @@ This is a test video for youtube-dl.  For more information, contact phihag@phihag.de .''' +  class TestInfoJSON(unittest.TestCase):      def setUp(self):          # Clear old files diff --git a/test/test_youtube_lists.py b/test/test_youtube_lists.py index 0b5c79030..4b7a7847b 100644 --- a/test/test_youtube_lists.py +++ b/test/test_youtube_lists.py @@ -1,20 +1,26 @@  #!/usr/bin/env python +# Allow direct execution +import os  import sys  import unittest -import json +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import FakeYDL, global_setup +global_setup() -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from youtube_dl.extractor import YoutubeUserIE, YoutubePlaylistIE, YoutubeIE, YoutubeChannelIE, YoutubeShowIE -from youtube_dl.utils import * +from youtube_dl.extractor import ( +    YoutubeUserIE, +    YoutubePlaylistIE, +    YoutubeIE, +    YoutubeChannelIE, +    YoutubeShowIE, +) -from .helper import FakeYDL  class TestYoutubeLists(unittest.TestCase): -    def assertIsPlaylist(self,info): +    def assertIsPlaylist(self, info):          """Make sure the info has '_type' set to 'playlist'"""          self.assertEqual(info['_type'], 'playlist') @@ -100,7 +106,7 @@ class TestYoutubeLists(unittest.TestCase):          dl = FakeYDL()          ie = YoutubeShowIE(dl)          result = ie.extract('http://www.youtube.com/show/airdisasters') -        self.assertTrue(len(result) >= 4) +        self.assertTrue(len(result) >= 3)  if __name__ == '__main__':      unittest.main() diff --git a/test/test_youtube_signature.py b/test/test_youtube_signature.py index 5007d9a16..5e1ff5eb0 100644 --- a/test/test_youtube_signature.py +++ b/test/test_youtube_signature.py @@ -1,14 +1,18 @@  #!/usr/bin/env python -import io -import re -import string +# Allow direct execution +import os  import sys  import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from test.helper import global_setup +global_setup() + + +import io +import re +import string  from youtube_dl.extractor import YoutubeIE  from youtube_dl.utils import compat_str, compat_urlretrieve diff --git a/test/test_youtube_subtitles.py b/test/test_youtube_subtitles.py index 07850385e..00430a338 100644 --- a/test/test_youtube_subtitles.py +++ b/test/test_youtube_subtitles.py @@ -1,69 +1,79 @@  #!/usr/bin/env python +# Allow direct execution +import os  import sys  import unittest -import hashlib +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import FakeYDL, global_setup, md5 +global_setup() -# Allow direct execution -import os -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))  from youtube_dl.extractor import YoutubeIE -from youtube_dl.utils import * -from .helper import FakeYDL -md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest()  class TestYoutubeSubtitles(unittest.TestCase):      def setUp(self):          self.DL = FakeYDL()          self.url = 'QRS8MkLhQmM' +      def getInfoDict(self):          IE = YoutubeIE(self.DL)          info_dict = IE.extract(self.url)          return info_dict +      def getSubtitles(self):          info_dict = self.getInfoDict() -        return info_dict[0]['subtitles']         +        return info_dict[0]['subtitles'] +      def test_youtube_no_writesubtitles(self):          self.DL.params['writesubtitles'] = False          subtitles = self.getSubtitles()          self.assertEqual(subtitles, None) +      def test_youtube_subtitles(self):          self.DL.params['writesubtitles'] = True          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260') +      def test_youtube_subtitles_lang(self):          self.DL.params['writesubtitles'] = True          self.DL.params['subtitleslangs'] = ['it']          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d') +      def test_youtube_allsubtitles(self):          self.DL.params['writesubtitles'] = True          self.DL.params['allsubtitles'] = True          subtitles = self.getSubtitles()          self.assertEqual(len(subtitles.keys()), 13) +      def test_youtube_subtitles_sbv_format(self):          self.DL.params['writesubtitles'] = True          self.DL.params['subtitlesformat'] = 'sbv'          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['en']), '13aeaa0c245a8bed9a451cb643e3ad8b') +      def test_youtube_subtitles_vtt_format(self):          self.DL.params['writesubtitles'] = True          self.DL.params['subtitlesformat'] = 'vtt'          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['en']), '356cdc577fde0c6783b9b822e7206ff7') +      def test_youtube_list_subtitles(self):          self.DL.expect_warning(u'Video doesn\'t have automatic captions')          self.DL.params['listsubtitles'] = True          info_dict = self.getInfoDict()          self.assertEqual(info_dict, None) +      def test_youtube_automatic_captions(self):          self.url = '8YoUxe5ncPo'          self.DL.params['writeautomaticsub'] = True          self.DL.params['subtitleslangs'] = ['it']          subtitles = self.getSubtitles()          self.assertTrue(subtitles['it'] is not None) +      def test_youtube_nosubtitles(self):          self.DL.expect_warning(u'video doesn\'t have subtitles')          self.url = 'sAjKT8FhjI8' @@ -71,6 +81,7 @@ class TestYoutubeSubtitles(unittest.TestCase):          self.DL.params['allsubtitles'] = True          subtitles = self.getSubtitles()          self.assertEqual(len(subtitles), 0) +      def test_youtube_multiple_langs(self):          self.url = 'QRS8MkLhQmM'          self.DL.params['writesubtitles'] = True | 
