3 # Allow direct execution
7 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9 from test.helper import FakeYDL
10 from youtube_dl import YoutubeDL
11 from youtube_dl.extractor import YoutubeIE
15 def __init__(self, *args, **kwargs):
16 super(YDL, self).__init__(*args, **kwargs)
17 self.downloaded_info_dicts = []
20 def process_info(self, info_dict):
21 self.downloaded_info_dicts.append(info_dict)
23 def to_screen(self, msg):
27 class TestFormatSelection(unittest.TestCase):
28 def test_prefer_free_formats(self):
29 # Same resolution => download webm
31 ydl.params['prefer_free_formats'] = True
33 {u'ext': u'webm', u'height': 460},
34 {u'ext': u'mp4', u'height': 460},
36 info_dict = {u'formats': formats, u'extractor': u'test'}
38 yie._sort_formats(info_dict['formats'])
39 ydl.process_ie_result(info_dict)
40 downloaded = ydl.downloaded_info_dicts[0]
41 self.assertEqual(downloaded[u'ext'], u'webm')
43 # Different resolution => download best quality (mp4)
45 ydl.params['prefer_free_formats'] = True
47 {u'ext': u'webm', u'height': 720},
48 {u'ext': u'mp4', u'height': 1080},
50 info_dict[u'formats'] = formats
52 yie._sort_formats(info_dict['formats'])
53 ydl.process_ie_result(info_dict)
54 downloaded = ydl.downloaded_info_dicts[0]
55 self.assertEqual(downloaded[u'ext'], u'mp4')
57 # No prefer_free_formats => prefer mp4 and flv for greater compatibilty
59 ydl.params['prefer_free_formats'] = False
61 {u'ext': u'webm', u'height': 720},
62 {u'ext': u'mp4', u'height': 720},
63 {u'ext': u'flv', u'height': 720},
65 info_dict[u'formats'] = formats
67 yie._sort_formats(info_dict['formats'])
68 ydl.process_ie_result(info_dict)
69 downloaded = ydl.downloaded_info_dicts[0]
70 self.assertEqual(downloaded[u'ext'], u'mp4')
73 ydl.params['prefer_free_formats'] = False
75 {u'ext': u'flv', u'height': 720},
76 {u'ext': u'webm', u'height': 720},
78 info_dict[u'formats'] = formats
80 yie._sort_formats(info_dict['formats'])
81 ydl.process_ie_result(info_dict)
82 downloaded = ydl.downloaded_info_dicts[0]
83 self.assertEqual(downloaded[u'ext'], u'flv')
85 def test_format_limit(self):
87 {u'format_id': u'meh', u'url': u'http://example.com/meh', 'preference': 1},
88 {u'format_id': u'good', u'url': u'http://example.com/good', 'preference': 2},
89 {u'format_id': u'great', u'url': u'http://example.com/great', 'preference': 3},
90 {u'format_id': u'excellent', u'url': u'http://example.com/exc', 'preference': 4},
93 u'formats': formats, u'extractor': u'test', 'id': 'testvid'}
96 ydl.process_ie_result(info_dict)
97 downloaded = ydl.downloaded_info_dicts[0]
98 self.assertEqual(downloaded[u'format_id'], u'excellent')
100 ydl = YDL({'format_limit': 'good'})
101 assert ydl.params['format_limit'] == 'good'
102 ydl.process_ie_result(info_dict.copy())
103 downloaded = ydl.downloaded_info_dicts[0]
104 self.assertEqual(downloaded[u'format_id'], u'good')
106 ydl = YDL({'format_limit': 'great', 'format': 'all'})
107 ydl.process_ie_result(info_dict.copy())
108 self.assertEqual(ydl.downloaded_info_dicts[0][u'format_id'], u'meh')
109 self.assertEqual(ydl.downloaded_info_dicts[1][u'format_id'], u'good')
110 self.assertEqual(ydl.downloaded_info_dicts[2][u'format_id'], u'great')
111 self.assertTrue('3' in ydl.msgs[0])
114 ydl.params['format_limit'] = 'excellent'
115 ydl.process_ie_result(info_dict.copy())
116 downloaded = ydl.downloaded_info_dicts[0]
117 self.assertEqual(downloaded[u'format_id'], u'excellent')
119 def test_format_selection(self):
121 {u'format_id': u'35', u'ext': u'mp4', 'preference': 1},
122 {u'format_id': u'45', u'ext': u'webm', 'preference': 2},
123 {u'format_id': u'47', u'ext': u'webm', 'preference': 3},
124 {u'format_id': u'2', u'ext': u'flv', 'preference': 4},
126 info_dict = {u'formats': formats, u'extractor': u'test'}
128 ydl = YDL({'format': u'20/47'})
129 ydl.process_ie_result(info_dict.copy())
130 downloaded = ydl.downloaded_info_dicts[0]
131 self.assertEqual(downloaded['format_id'], u'47')
133 ydl = YDL({'format': u'20/71/worst'})
134 ydl.process_ie_result(info_dict.copy())
135 downloaded = ydl.downloaded_info_dicts[0]
136 self.assertEqual(downloaded['format_id'], u'35')
139 ydl.process_ie_result(info_dict.copy())
140 downloaded = ydl.downloaded_info_dicts[0]
141 self.assertEqual(downloaded['format_id'], u'2')
143 ydl = YDL({'format': u'webm/mp4'})
144 ydl.process_ie_result(info_dict.copy())
145 downloaded = ydl.downloaded_info_dicts[0]
146 self.assertEqual(downloaded['format_id'], u'47')
148 ydl = YDL({'format': u'3gp/40/mp4'})
149 ydl.process_ie_result(info_dict.copy())
150 downloaded = ydl.downloaded_info_dicts[0]
151 self.assertEqual(downloaded['format_id'], u'35')
153 def test_format_selection_audio(self):
155 {u'format_id': u'audio-low', u'ext': u'webm', 'preference': 1, 'vcodec': 'none'},
156 {u'format_id': u'audio-mid', u'ext': u'webm', 'preference': 2, 'vcodec': 'none'},
157 {u'format_id': u'audio-high', u'ext': u'flv', 'preference': 3, 'vcodec': 'none'},
158 {u'format_id': u'vid', u'ext': u'mp4', 'preference': 4},
160 info_dict = {u'formats': formats, u'extractor': u'test'}
162 ydl = YDL({'format': u'bestaudio'})
163 ydl.process_ie_result(info_dict.copy())
164 downloaded = ydl.downloaded_info_dicts[0]
165 self.assertEqual(downloaded['format_id'], u'audio-high')
167 ydl = YDL({'format': u'worstaudio'})
168 ydl.process_ie_result(info_dict.copy())
169 downloaded = ydl.downloaded_info_dicts[0]
170 self.assertEqual(downloaded['format_id'], u'audio-low')
173 {u'format_id': u'vid-low', u'ext': u'mp4', 'preference': 1},
174 {u'format_id': u'vid-high', u'ext': u'mp4', 'preference': 2},
176 info_dict = {u'formats': formats, u'extractor': u'test'}
178 ydl = YDL({'format': u'bestaudio/worstaudio/best'})
179 ydl.process_ie_result(info_dict.copy())
180 downloaded = ydl.downloaded_info_dicts[0]
181 self.assertEqual(downloaded['format_id'], u'vid-high')
183 def test_youtube_format_selection(self):
185 '38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '36', '17', '13',
186 # Apple HTTP Live Streaming
187 '96', '95', '94', '93', '92', '132', '151',
189 '85', '84', '102', '83', '101', '82', '100',
191 '138', '137', '248', '136', '247', '135', '246',
192 '245', '244', '134', '243', '133', '242', '160',
194 '141', '172', '140', '139', '171',
197 for f1id, f2id in zip(order, order[1:]):
198 f1 = YoutubeIE._formats[f1id].copy()
199 f1['format_id'] = f1id
200 f2 = YoutubeIE._formats[f2id].copy()
201 f2['format_id'] = f2id
203 info_dict = {'formats': [f1, f2], 'extractor': 'youtube'}
206 yie._sort_formats(info_dict['formats'])
207 ydl.process_ie_result(info_dict)
208 downloaded = ydl.downloaded_info_dicts[0]
209 self.assertEqual(downloaded['format_id'], f1id)
211 info_dict = {'formats': [f2, f1], 'extractor': 'youtube'}
214 yie._sort_formats(info_dict['formats'])
215 ydl.process_ie_result(info_dict)
216 downloaded = ydl.downloaded_info_dicts[0]
217 self.assertEqual(downloaded['format_id'], f1id)
219 def test_add_extra_info(self):
225 'playlist': 'funny videos',
227 YDL.add_extra_info(test_dict, extra_info)
228 self.assertEqual(test_dict['extractor'], 'Foo')
229 self.assertEqual(test_dict['playlist'], 'funny videos')
231 def test_prepare_filename(self):
238 ydl = YoutubeDL({'outtmpl': templ})
239 return ydl.prepare_filename(info)
240 self.assertEqual(fname(u'%(id)s.%(ext)s'), u'1234.mp4')
241 self.assertEqual(fname(u'%(id)s-%(width)s.%(ext)s'), u'1234-NA.mp4')
242 # Replace missing fields with 'NA'
243 self.assertEqual(fname(u'%(uploader_date)s-%(id)s.%(ext)s'), u'NA-1234.mp4')
246 if __name__ == '__main__':