| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | #!/usr/bin/env python | 
					
						
							|  |  |  | # coding: utf-8 | 
					
						
							| 
									
										
										
										
											2014-11-26 20:01:20 +01:00
										 |  |  | from __future__ import unicode_literals | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 19:42:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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' | 
					
						
							| 
									
										
										
										
											2015-09-07 07:09:55 +01:00
										 |  |  | ANNOTATIONS_FILE = TEST_ID + '.annotations.xml' | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | EXPECTED_ANNOTATIONS = ['Speech bubble', 'Note', 'Title', 'Spotlight', 'Label'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | class TestAnnotations(unittest.TestCase): | 
					
						
							|  |  |  |     def setUp(self): | 
					
						
							|  |  |  |         # Clear old files | 
					
						
							|  |  |  |         self.tearDown() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_info_json(self): | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |         expected = list(EXPECTED_ANNOTATIONS)  # Two annotations could have the same text. | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  |         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: | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |             annoxml = xml.etree.ElementTree.parse(annof) | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  |         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') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |         # Not all the annotations have TEXT children and the annotations are returned unsorted. | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  |         for a in annotations: | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |             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 | 
					
						
							| 
									
										
										
										
											2016-01-10 16:17:47 +01:00
										 |  |  |                 # remove the first occurrence, there could be more than one annotation with the same text | 
					
						
							| 
									
										
										
										
											2014-11-23 20:41:03 +01:00
										 |  |  |                 expected.remove(text) | 
					
						
							|  |  |  |         # We should have seen (and removed) all the expected annotation texts. | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  |         self.assertEqual(len(expected), 0, 'Not all expected annotations were found.') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def tearDown(self): | 
					
						
							|  |  |  |         try_rm(ANNOTATIONS_FILE) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-17 19:42:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-14 16:18:58 +11:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  |     unittest.main() |