3 from __future__ import unicode_literals
5 # Allow direct execution
9 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
11 from test.helper import FakeYDL
12 from youtube_dl import YoutubeDL
13 from youtube_dl.extractor import YoutubeIE
17 def __init__(self, *args, **kwargs):
18 super(YDL, self).__init__(*args, **kwargs)
19 self.downloaded_info_dicts = []
22 def process_info(self, info_dict):
23 self.downloaded_info_dicts.append(info_dict)
25 def to_screen(self, msg):
29 class TestFormatSelection(unittest.TestCase):
30 def test_prefer_free_formats(self):
31 # Same resolution => download webm
33 ydl.params['prefer_free_formats'] = True
35 {'ext': 'webm', 'height': 460},
36 {'ext': 'mp4', 'height': 460},
38 info_dict = {'formats': formats, 'extractor': 'test'}
40 yie._sort_formats(info_dict['formats'])
41 ydl.process_ie_result(info_dict)
42 downloaded = ydl.downloaded_info_dicts[0]
43 self.assertEqual(downloaded['ext'], 'webm')
45 # Different resolution => download best quality (mp4)
47 ydl.params['prefer_free_formats'] = True
49 {'ext': 'webm', 'height': 720},
50 {'ext': 'mp4', 'height': 1080},
52 info_dict['formats'] = formats
54 yie._sort_formats(info_dict['formats'])
55 ydl.process_ie_result(info_dict)
56 downloaded = ydl.downloaded_info_dicts[0]
57 self.assertEqual(downloaded['ext'], 'mp4')
59 # No prefer_free_formats => prefer mp4 and flv for greater compatibilty
61 ydl.params['prefer_free_formats'] = False
63 {'ext': 'webm', 'height': 720},
64 {'ext': 'mp4', 'height': 720},
65 {'ext': 'flv', 'height': 720},
67 info_dict['formats'] = formats
69 yie._sort_formats(info_dict['formats'])
70 ydl.process_ie_result(info_dict)
71 downloaded = ydl.downloaded_info_dicts[0]
72 self.assertEqual(downloaded['ext'], 'mp4')
75 ydl.params['prefer_free_formats'] = False
77 {'ext': 'flv', 'height': 720},
78 {'ext': 'webm', 'height': 720},
80 info_dict['formats'] = formats
82 yie._sort_formats(info_dict['formats'])
83 ydl.process_ie_result(info_dict)
84 downloaded = ydl.downloaded_info_dicts[0]
85 self.assertEqual(downloaded['ext'], 'flv')
87 def test_format_limit(self):
89 {'format_id': 'meh', 'url': 'http://example.com/meh', 'preference': 1},
90 {'format_id': 'good', 'url': 'http://example.com/good', 'preference': 2},
91 {'format_id': 'great', 'url': 'http://example.com/great', 'preference': 3},
92 {'format_id': 'excellent', 'url': 'http://example.com/exc', 'preference': 4},
95 'formats': formats, 'extractor': 'test', 'id': 'testvid'}
98 ydl.process_ie_result(info_dict)
99 downloaded = ydl.downloaded_info_dicts[0]
100 self.assertEqual(downloaded['format_id'], 'excellent')
102 ydl = YDL({'format_limit': 'good'})
103 assert ydl.params['format_limit'] == 'good'
104 ydl.process_ie_result(info_dict.copy())
105 downloaded = ydl.downloaded_info_dicts[0]
106 self.assertEqual(downloaded['format_id'], 'good')
108 ydl = YDL({'format_limit': 'great', 'format': 'all'})
109 ydl.process_ie_result(info_dict.copy())
110 self.assertEqual(ydl.downloaded_info_dicts[0]['format_id'], 'meh')
111 self.assertEqual(ydl.downloaded_info_dicts[1]['format_id'], 'good')
112 self.assertEqual(ydl.downloaded_info_dicts[2]['format_id'], 'great')
113 self.assertTrue('3' in ydl.msgs[0])
116 ydl.params['format_limit'] = 'excellent'
117 ydl.process_ie_result(info_dict.copy())
118 downloaded = ydl.downloaded_info_dicts[0]
119 self.assertEqual(downloaded['format_id'], 'excellent')
121 def test_format_selection(self):
123 {'format_id': '35', 'ext': 'mp4', 'preference': 1},
124 {'format_id': '45', 'ext': 'webm', 'preference': 2},
125 {'format_id': '47', 'ext': 'webm', 'preference': 3},
126 {'format_id': '2', 'ext': 'flv', 'preference': 4},
128 info_dict = {'formats': formats, 'extractor': 'test'}
130 ydl = YDL({'format': '20/47'})
131 ydl.process_ie_result(info_dict.copy())
132 downloaded = ydl.downloaded_info_dicts[0]
133 self.assertEqual(downloaded['format_id'], '47')
135 ydl = YDL({'format': '20/71/worst'})
136 ydl.process_ie_result(info_dict.copy())
137 downloaded = ydl.downloaded_info_dicts[0]
138 self.assertEqual(downloaded['format_id'], '35')
141 ydl.process_ie_result(info_dict.copy())
142 downloaded = ydl.downloaded_info_dicts[0]
143 self.assertEqual(downloaded['format_id'], '2')
145 ydl = YDL({'format': 'webm/mp4'})
146 ydl.process_ie_result(info_dict.copy())
147 downloaded = ydl.downloaded_info_dicts[0]
148 self.assertEqual(downloaded['format_id'], '47')
150 ydl = YDL({'format': '3gp/40/mp4'})
151 ydl.process_ie_result(info_dict.copy())
152 downloaded = ydl.downloaded_info_dicts[0]
153 self.assertEqual(downloaded['format_id'], '35')
155 def test_format_selection_audio(self):
157 {'format_id': 'audio-low', 'ext': 'webm', 'preference': 1, 'vcodec': 'none'},
158 {'format_id': 'audio-mid', 'ext': 'webm', 'preference': 2, 'vcodec': 'none'},
159 {'format_id': 'audio-high', 'ext': 'flv', 'preference': 3, 'vcodec': 'none'},
160 {'format_id': 'vid', 'ext': 'mp4', 'preference': 4},
162 info_dict = {'formats': formats, 'extractor': 'test'}
164 ydl = YDL({'format': 'bestaudio'})
165 ydl.process_ie_result(info_dict.copy())
166 downloaded = ydl.downloaded_info_dicts[0]
167 self.assertEqual(downloaded['format_id'], 'audio-high')
169 ydl = YDL({'format': 'worstaudio'})
170 ydl.process_ie_result(info_dict.copy())
171 downloaded = ydl.downloaded_info_dicts[0]
172 self.assertEqual(downloaded['format_id'], 'audio-low')
175 {'format_id': 'vid-low', 'ext': 'mp4', 'preference': 1},
176 {'format_id': 'vid-high', 'ext': 'mp4', 'preference': 2},
178 info_dict = {'formats': formats, 'extractor': 'test'}
180 ydl = YDL({'format': 'bestaudio/worstaudio/best'})
181 ydl.process_ie_result(info_dict.copy())
182 downloaded = ydl.downloaded_info_dicts[0]
183 self.assertEqual(downloaded['format_id'], 'vid-high')
185 def test_youtube_format_selection(self):
187 '38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '36', '17', '13',
188 # Apple HTTP Live Streaming
189 '96', '95', '94', '93', '92', '132', '151',
191 '85', '84', '102', '83', '101', '82', '100',
193 '138', '137', '248', '136', '247', '135', '246',
194 '245', '244', '134', '243', '133', '242', '160',
196 '141', '172', '140', '139', '171',
199 for f1id, f2id in zip(order, order[1:]):
200 f1 = YoutubeIE._formats[f1id].copy()
201 f1['format_id'] = f1id
202 f2 = YoutubeIE._formats[f2id].copy()
203 f2['format_id'] = f2id
205 info_dict = {'formats': [f1, f2], 'extractor': 'youtube'}
208 yie._sort_formats(info_dict['formats'])
209 ydl.process_ie_result(info_dict)
210 downloaded = ydl.downloaded_info_dicts[0]
211 self.assertEqual(downloaded['format_id'], f1id)
213 info_dict = {'formats': [f2, f1], 'extractor': 'youtube'}
216 yie._sort_formats(info_dict['formats'])
217 ydl.process_ie_result(info_dict)
218 downloaded = ydl.downloaded_info_dicts[0]
219 self.assertEqual(downloaded['format_id'], f1id)
221 def test_add_extra_info(self):
227 'playlist': 'funny videos',
229 YDL.add_extra_info(test_dict, extra_info)
230 self.assertEqual(test_dict['extractor'], 'Foo')
231 self.assertEqual(test_dict['playlist'], 'funny videos')
233 def test_prepare_filename(self):
240 ydl = YoutubeDL({'outtmpl': templ})
241 return ydl.prepare_filename(info)
242 self.assertEqual(fname('%(id)s.%(ext)s'), '1234.mp4')
243 self.assertEqual(fname('%(id)s-%(width)s.%(ext)s'), '1234-NA.mp4')
244 # Replace missing fields with 'NA'
245 self.assertEqual(fname('%(uploader_date)s-%(id)s.%(ext)s'), 'NA-1234.mp4')
248 if __name__ == '__main__':