| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 | #!/usr/bin/env pythonimport hashlibimport ioimport osimport jsonimport unittestimport sysimport socket# Allow direct executionsys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))import youtube_dl.FileDownloaderimport youtube_dl.InfoExtractorsfrom youtube_dl.utils import *DEF_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'tests.json')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)socket.setdefaulttimeout(300) # 5 minutes should be enough (famous last words)class FileDownloader(youtube_dl.FileDownloader):    def __init__(self, *args, **kwargs):        youtube_dl.FileDownloader.__init__(self, *args, **kwargs)        self.to_stderr = self.to_screendef _file_md5(fn):    with open(fn, 'rb') as f:        return hashlib.md5(f.read()).hexdigest()with io.open(DEF_FILE, encoding='utf-8') as deff:    defs = json.load(deff)with io.open(PARAMETERS_FILE, encoding='utf-8') as pf:    parameters = json.load(pf)class TestDownload(unittest.TestCase):    def setUp(self):        self.parameters = parameters        self.defs = defs        # Clear old files        self.tearDown()    def tearDown(self):        for fn in [ test.get('file', False) for test in self.defs ]:            if fn and os.path.exists(fn):                os.remove(fn)### Dinamically generate testsdef generator(test_case):    def test_template(self):        ie = getattr(youtube_dl.InfoExtractors, test_case['name'] + 'IE')        if not ie._WORKING:            print('Skipping: IE marked as not _WORKING')            return        if not test_case['file']:            print('Skipping: No output file specified')            return        if 'skip' in test_case:            print('Skipping: {0}'.format(test_case['skip']))            return        params = dict(self.parameters) # Duplicate it locally        for p in test_case.get('params', {}):            params[p] = test_case['params'][p]        fd = FileDownloader(params)        fd.add_info_extractor(ie())        for ien in test_case.get('add_ie', []):            fd.add_info_extractor(getattr(youtube_dl.InfoExtractors, ien + 'IE')())        fd.download([test_case['url']])        self.assertTrue(os.path.exists(test_case['file']))        if 'md5' in test_case:            md5_for_file = _file_md5(test_case['file'])            self.assertEqual(md5_for_file, test_case['md5'])    return test_template### And add them to TestDownloadfor test_case in defs:    test_method = generator(test_case)    test_method.__name__ = "test_{0}".format(test_case["name"])    setattr(TestDownload, test_method.__name__, test_method)    del test_methodif __name__ == '__main__':    unittest.main()
 |