| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # coding: utf-8 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 02:00:53 +02:00
										 |  |  | # Allow direct execution | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2013-10-15 02:00:53 +02:00
										 |  |  | sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-25 03:47:32 +01:00
										 |  |  | from test.helper import get_params, try_rm | 
					
						
							| 
									
										
										
										
											2013-10-15 02:00:53 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import io | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import xml.etree.ElementTree | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | import youtube_dl.YoutubeDL | 
					
						
							|  |  |  | import youtube_dl.extractor | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class YoutubeDL(youtube_dl.YoutubeDL): | 
					
						
							|  |  |  |     def __init__(self, *args, **kwargs): | 
					
						
							|  |  |  |         super(YoutubeDL, self).__init__(*args, **kwargs) | 
					
						
							|  |  |  |         self.to_stderr = self.to_screen | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 02:00:53 +02:00
										 |  |  | params = get_params({ | 
					
						
							|  |  |  |     'writeannotations': True, | 
					
						
							|  |  |  |     'skip_download': True, | 
					
						
							|  |  |  |     'writeinfojson': False, | 
					
						
							|  |  |  |     'format': 'flv', | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_ID = 'gr51aVj-mLg' | 
					
						
							|  |  |  | ANNOTATIONS_FILE = TEST_ID + '.flv.annotations.xml' | 
					
						
							|  |  |  | EXPECTED_ANNOTATIONS = ['Speech bubble', 'Note', 'Title', 'Spotlight', 'Label'] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class TestAnnotations(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         # Clear old files | 
					
						
							|  |  |  |         self.tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_info_json(self): | 
					
						
							|  |  |  |         expected = list(EXPECTED_ANNOTATIONS) #Two annotations could have the same text. | 
					
						
							|  |  |  |         ie = youtube_dl.extractor.YoutubeIE() | 
					
						
							|  |  |  |         ydl = YoutubeDL(params) | 
					
						
							|  |  |  |         ydl.add_info_extractor(ie) | 
					
						
							|  |  |  |         ydl.download([TEST_ID]) | 
					
						
							|  |  |  |         self.assertTrue(os.path.exists(ANNOTATIONS_FILE)) | 
					
						
							|  |  |  |         annoxml = None | 
					
						
							|  |  |  |         with io.open(ANNOTATIONS_FILE, 'r', encoding='utf-8') as annof: | 
					
						
							|  |  |  |                 annoxml = xml.etree.ElementTree.parse(annof) | 
					
						
							|  |  |  |         self.assertTrue(annoxml is not None, 'Failed to parse annotations XML') | 
					
						
							|  |  |  |         root = annoxml.getroot() | 
					
						
							|  |  |  |         self.assertEqual(root.tag, 'document') | 
					
						
							|  |  |  |         annotationsTag = root.find('annotations') | 
					
						
							|  |  |  |         self.assertEqual(annotationsTag.tag, 'annotations') | 
					
						
							|  |  |  |         annotations = annotationsTag.findall('annotation') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         #Not all the annotations have TEXT children and the annotations are returned unsorted. | 
					
						
							|  |  |  |         for a in annotations: | 
					
						
							|  |  |  |                 self.assertEqual(a.tag, 'annotation') | 
					
						
							|  |  |  |                 if a.get('type') == 'text': | 
					
						
							|  |  |  |                         textTag = a.find('TEXT') | 
					
						
							|  |  |  |                         text = textTag.text | 
					
						
							|  |  |  |                         self.assertTrue(text in expected) #assertIn only added in python 2.7 | 
					
						
							|  |  |  |                         #remove the first occurance, there could be more than one annotation with the same text | 
					
						
							|  |  |  |                         expected.remove(text) | 
					
						
							|  |  |  |         #We should have seen (and removed) all the expected annotation texts. | 
					
						
							|  |  |  |         self.assertEqual(len(expected), 0, 'Not all expected annotations were found.') | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         try_rm(ANNOTATIONS_FILE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |