diff options
Diffstat (limited to 'test/test_download.py')
| -rw-r--r-- | test/test_download.py | 210 | 
1 files changed, 121 insertions, 89 deletions
| diff --git a/test/test_download.py b/test/test_download.py index 545afb922..40d596fdf 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -1,93 +1,125 @@ -#!/usr/bin/env python2 -import unittest +#!/usr/bin/env python + +import errno  import hashlib +import io  import os  import json +import unittest +import sys +import hashlib +import socket + +# Allow direct execution +sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +import youtube_dl.FileDownloader +import youtube_dl.InfoExtractors +from 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) + +def _try_rm(filename): +    """ Remove a file if it exists """ +    try: +        os.remove(filename) +    except OSError as ose: +        if ose.errno != errno.ENOENT: +            raise + +class FileDownloader(youtube_dl.FileDownloader): +    def __init__(self, *args, **kwargs): +        self.to_stderr = self.to_screen +        self.processed_info_dicts = [] +        return youtube_dl.FileDownloader.__init__(self, *args, **kwargs) +    def process_info(self, info_dict): +        self.processed_info_dicts.append(info_dict) +        return youtube_dl.FileDownloader.process_info(self, info_dict) + +def _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 + +### Dynamically generate tests +def 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 'playlist' not in test_case and 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 = self.parameters.copy() +        params.update(test_case.get('params', {})) + +        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')()) + +        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') +        try: +            fd.download([test_case['url']]) + +            for tc in test_cases: +                if not test_case.get('params', {}).get('skip_download', False): +                    self.assertTrue(os.path.exists(tc['file'])) +                self.assertTrue(os.path.exists(tc['file'] + '.info.json')) +                if 'md5' in tc: +                    md5_for_file = _file_md5(tc['file']) +                    self.assertEqual(md5_for_file, tc['md5']) +                with io.open(tc['file'] + '.info.json', encoding='utf-8') as infof: +                    info_dict = json.load(infof) +                for (info_field, value) in tc.get('info_dict', {}).items(): +                    if value.startswith('md5:'): +                        md5_info_value = hashlib.md5(info_dict.get(info_field, '')).hexdigest() +                        self.assertEqual(value[3:], md5_info_value) +                    else: +                        self.assertEqual(value, info_dict.get(info_field)) +        finally: +            for tc in test_cases: +                _try_rm(tc['file']) +                _try_rm(tc['file'] + '.part') +                _try_rm(tc['file'] + '.info.json') + +    return test_template + +### And add them to TestDownload +for 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_method + -from youtube_dl.FileDownloader import FileDownloader -from youtube_dl.InfoExtractors  import YoutubeIE, DailymotionIE -from youtube_dl.InfoExtractors import  MetacafeIE, BlipTVIE - - -class DownloadTest(unittest.TestCase): -	PARAMETERS_FILE = "test/parameters.json" -	#calculated with md5sum: -	#md5sum (GNU coreutils) 8.19 - -	YOUTUBE_SIZE = 1993883 -	YOUTUBE_URL = "http://www.youtube.com/watch?v=BaW_jenozKc" -	YOUTUBE_FILE = "BaW_jenozKc.mp4" - -	DAILYMOTION_MD5 = "d363a50e9eb4f22ce90d08d15695bb47" -	DAILYMOTION_URL = "http://www.dailymotion.com/video/x33vw9_tutoriel-de-youtubeur-dl-des-video_tech" -	DAILYMOTION_FILE = "x33vw9.mp4" - -	METACAFE_SIZE = 5754305 -	METACAFE_URL = "http://www.metacafe.com/watch/yt-_aUehQsCQtM/the_electric_company_short_i_pbs_kids_go/" -	METACAFE_FILE = "_aUehQsCQtM.flv" - -	BLIP_MD5 = "93c24d2f4e0782af13b8a7606ea97ba7" -	BLIP_URL = "http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352" -	BLIP_FILE = "5779306.m4v" - -	XVIDEO_MD5 = "" -	XVIDEO_URL = "" -	XVIDEO_FILE = "" - - -	def test_youtube(self): -		#let's download a file from youtube -		with open(DownloadTest.PARAMETERS_FILE) as f: -			fd = FileDownloader(json.load(f)) -		fd.add_info_extractor(YoutubeIE()) -		fd.download([DownloadTest.YOUTUBE_URL]) -		self.assertTrue(os.path.exists(DownloadTest.YOUTUBE_FILE)) -		self.assertEqual(os.path.getsize(DownloadTest.YOUTUBE_FILE), DownloadTest.YOUTUBE_SIZE) - -	def test_dailymotion(self): -		with open(DownloadTest.PARAMETERS_FILE) as f: -			fd = FileDownloader(json.load(f)) -		fd.add_info_extractor(DailymotionIE()) -		fd.download([DownloadTest.DAILYMOTION_URL]) -		self.assertTrue(os.path.exists(DownloadTest.DAILYMOTION_FILE)) -		md5_down_file = md5_for_file(DownloadTest.DAILYMOTION_FILE) -		self.assertEqual(md5_down_file, DownloadTest.DAILYMOTION_MD5) - -	def test_metacafe(self): -		#this emulate a skip,to be 2.6 compatible -		with open(DownloadTest.PARAMETERS_FILE) as f: -			fd = FileDownloader(json.load(f)) -		fd.add_info_extractor(MetacafeIE()) -		fd.add_info_extractor(YoutubeIE()) -		fd.download([DownloadTest.METACAFE_URL]) -		self.assertTrue(os.path.exists(DownloadTest.METACAFE_FILE)) -		self.assertEqual(os.path.getsize(DownloadTest.METACAFE_FILE), DownloadTest.METACAFE_SIZE) - -	def test_blip(self): -		with open(DownloadTest.PARAMETERS_FILE) as f: -			fd = FileDownloader(json.load(f)) -		fd.add_info_extractor(BlipTVIE()) -		fd.download([DownloadTest.BLIP_URL]) -		self.assertTrue(os.path.exists(DownloadTest.BLIP_FILE)) -		md5_down_file = md5_for_file(DownloadTest.BLIP_FILE) -		self.assertEqual(md5_down_file, DownloadTest.BLIP_MD5) - -	def tearDown(self): -		if os.path.exists(DownloadTest.YOUTUBE_FILE): -			os.remove(DownloadTest.YOUTUBE_FILE) -		if os.path.exists(DownloadTest.DAILYMOTION_FILE): -			os.remove(DownloadTest.DAILYMOTION_FILE) -		if os.path.exists(DownloadTest.METACAFE_FILE): -			os.remove(DownloadTest.METACAFE_FILE) -		if os.path.exists(DownloadTest.BLIP_FILE): -			os.remove(DownloadTest.BLIP_FILE) - -def md5_for_file(filename, block_size=2**20): -    with open(filename) as f: -        md5 = hashlib.md5() -        while True: -            data = f.read(block_size) -            if not data: -                break -            md5.update(data) -            return md5.hexdigest() +if __name__ == '__main__': +    unittest.main() | 
