]> jfr.im git - yt-dlp.git/blame - test/test_subtitles.py
[npo] Convert to new subtitles system
[yt-dlp.git] / test / test_subtitles.py
CommitLineData
ae84f879 1#!/usr/bin/env python
a0f59cdc 2from __future__ import unicode_literals
ae84f879
JMF
3
4# Allow direct execution
5import os
6import sys
7import unittest
8sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
9
d0efb9ec 10from test.helper import FakeYDL, md5
ae84f879
JMF
11
12
13from youtube_dl.extractor import (
b4bcffef 14 BlipTVIE,
ae84f879
JMF
15 YoutubeIE,
16 DailymotionIE,
17 TEDIE,
4edff4cf 18 VimeoIE,
7bc8780c 19 WallaIE,
0b54a5b1 20 CeskaTelevizeIE,
311c3938 21 LyndaIE,
b9b42f2e 22 NPOIE,
ae84f879
JMF
23)
24
25
26class BaseTestSubtitles(unittest.TestCase):
27 url = None
28 IE = None
5f6a1245 29
ae84f879
JMF
30 def setUp(self):
31 self.DL = FakeYDL()
a504ced0
JMF
32 self.ie = self.IE()
33 self.DL.add_info_extractor(self.ie)
ae84f879
JMF
34
35 def getInfoDict(self):
a504ced0 36 info_dict = self.DL.extract_info(self.url, download=False)
ae84f879
JMF
37 return info_dict
38
39 def getSubtitles(self):
40 info_dict = self.getInfoDict()
c84dd8a9 41 subtitles = info_dict['requested_subtitles']
a504ced0
JMF
42 if not subtitles:
43 return subtitles
44 for sub_info in subtitles.values():
45 if sub_info.get('data') is None:
46 uf = self.DL.urlopen(sub_info['url'])
47 sub_info['data'] = uf.read().decode('utf-8')
48 return dict((l, sub_info['data']) for l, sub_info in subtitles.items())
ae84f879
JMF
49
50
51class TestYoutubeSubtitles(BaseTestSubtitles):
52 url = 'QRS8MkLhQmM'
53 IE = YoutubeIE
54
ae84f879
JMF
55 def test_youtube_subtitles(self):
56 self.DL.params['writesubtitles'] = True
57 subtitles = self.getSubtitles()
58 self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')
59
60 def test_youtube_subtitles_lang(self):
61 self.DL.params['writesubtitles'] = True
62 self.DL.params['subtitleslangs'] = ['it']
63 subtitles = self.getSubtitles()
64 self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')
65
66 def test_youtube_allsubtitles(self):
67 self.DL.params['writesubtitles'] = True
68 self.DL.params['allsubtitles'] = True
69 subtitles = self.getSubtitles()
70 self.assertEqual(len(subtitles.keys()), 13)
71
72 def test_youtube_subtitles_sbv_format(self):
73 self.DL.params['writesubtitles'] = True
74 self.DL.params['subtitlesformat'] = 'sbv'
75 subtitles = self.getSubtitles()
76 self.assertEqual(md5(subtitles['en']), '13aeaa0c245a8bed9a451cb643e3ad8b')
77
78 def test_youtube_subtitles_vtt_format(self):
79 self.DL.params['writesubtitles'] = True
80 self.DL.params['subtitlesformat'] = 'vtt'
81 subtitles = self.getSubtitles()
4e0084d9 82 self.assertEqual(md5(subtitles['en']), '3cb210999d3e021bd6c7f0ea751eab06')
ae84f879
JMF
83
84 def test_youtube_list_subtitles(self):
a0f59cdc 85 self.DL.expect_warning('Video doesn\'t have automatic captions')
ae84f879
JMF
86 self.DL.params['listsubtitles'] = True
87 info_dict = self.getInfoDict()
88 self.assertEqual(info_dict, None)
89
90 def test_youtube_automatic_captions(self):
91 self.url = '8YoUxe5ncPo'
92 self.DL.params['writeautomaticsub'] = True
93 self.DL.params['subtitleslangs'] = ['it']
94 subtitles = self.getSubtitles()
95 self.assertTrue(subtitles['it'] is not None)
96
7d900ef1
JMF
97 def test_youtube_translated_subtitles(self):
98 # This video has a subtitles track, which can be translated
99 self.url = 'Ky9eprVWzlI'
100 self.DL.params['writeautomaticsub'] = True
101 self.DL.params['subtitleslangs'] = ['it']
102 subtitles = self.getSubtitles()
103 self.assertTrue(subtitles['it'] is not None)
104
ae84f879 105 def test_youtube_nosubtitles(self):
a0f59cdc 106 self.DL.expect_warning('video doesn\'t have subtitles')
345e3783 107 self.url = 'n5BB19UTcdA'
ae84f879
JMF
108 self.DL.params['writesubtitles'] = True
109 self.DL.params['allsubtitles'] = True
110 subtitles = self.getSubtitles()
111 self.assertEqual(len(subtitles), 0)
112
113 def test_youtube_multiple_langs(self):
114 self.url = 'QRS8MkLhQmM'
115 self.DL.params['writesubtitles'] = True
116 langs = ['it', 'fr', 'de']
117 self.DL.params['subtitleslangs'] = langs
118 subtitles = self.getSubtitles()
119 for lang in langs:
a0f59cdc 120 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879
JMF
121
122
123class TestDailymotionSubtitles(BaseTestSubtitles):
124 url = 'http://www.dailymotion.com/video/xczg00'
125 IE = DailymotionIE
126
ae84f879
JMF
127 def test_subtitles(self):
128 self.DL.params['writesubtitles'] = True
129 subtitles = self.getSubtitles()
130 self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')
131
132 def test_subtitles_lang(self):
133 self.DL.params['writesubtitles'] = True
134 self.DL.params['subtitleslangs'] = ['fr']
135 subtitles = self.getSubtitles()
136 self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')
137
138 def test_allsubtitles(self):
139 self.DL.params['writesubtitles'] = True
140 self.DL.params['allsubtitles'] = True
141 subtitles = self.getSubtitles()
8fb474fb 142 self.assertTrue(len(subtitles.keys()) >= 6)
ae84f879 143
ae84f879 144 def test_nosubtitles(self):
a0f59cdc 145 self.DL.expect_warning('video doesn\'t have subtitles')
ae84f879
JMF
146 self.url = 'http://www.dailymotion.com/video/x12u166_le-zapping-tele-star-du-08-aout-2013_tv'
147 self.DL.params['writesubtitles'] = True
148 self.DL.params['allsubtitles'] = True
149 subtitles = self.getSubtitles()
150 self.assertEqual(len(subtitles), 0)
151
152 def test_multiple_langs(self):
153 self.DL.params['writesubtitles'] = True
154 langs = ['es', 'fr', 'de']
155 self.DL.params['subtitleslangs'] = langs
156 subtitles = self.getSubtitles()
157 for lang in langs:
a0f59cdc 158 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879
JMF
159
160
161class TestTedSubtitles(BaseTestSubtitles):
162 url = 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html'
163 IE = TEDIE
164
165 def test_no_writesubtitles(self):
166 subtitles = self.getSubtitles()
a504ced0 167 self.assertFalse(subtitles)
ae84f879
JMF
168
169 def test_subtitles(self):
170 self.DL.params['writesubtitles'] = True
171 subtitles = self.getSubtitles()
26dca166 172 self.assertEqual(md5(subtitles['en']), '4262c1665ff928a2dada178f62cb8d14')
ae84f879
JMF
173
174 def test_subtitles_lang(self):
175 self.DL.params['writesubtitles'] = True
176 self.DL.params['subtitleslangs'] = ['fr']
177 subtitles = self.getSubtitles()
26dca166 178 self.assertEqual(md5(subtitles['fr']), '66a63f7f42c97a50f8c0e90bc7797bb5')
ae84f879
JMF
179
180 def test_allsubtitles(self):
181 self.DL.params['writesubtitles'] = True
182 self.DL.params['allsubtitles'] = True
183 subtitles = self.getSubtitles()
0321213c 184 self.assertTrue(len(subtitles.keys()) >= 28)
ae84f879
JMF
185
186 def test_list_subtitles(self):
ae84f879
JMF
187 self.DL.params['listsubtitles'] = True
188 info_dict = self.getInfoDict()
189 self.assertEqual(info_dict, None)
190
ae84f879
JMF
191 def test_multiple_langs(self):
192 self.DL.params['writesubtitles'] = True
193 langs = ['es', 'fr', 'de']
194 self.DL.params['subtitleslangs'] = langs
195 subtitles = self.getSubtitles()
196 for lang in langs:
a0f59cdc 197 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879 198
b4bcffef
PH
199
200class TestBlipTVSubtitles(BaseTestSubtitles):
201 url = 'http://blip.tv/a/a-6603250'
202 IE = BlipTVIE
203
204 def test_list_subtitles(self):
b4bcffef
PH
205 self.DL.params['listsubtitles'] = True
206 info_dict = self.getInfoDict()
207 self.assertEqual(info_dict, None)
208
209 def test_allsubtitles(self):
b4bcffef
PH
210 self.DL.params['writesubtitles'] = True
211 self.DL.params['allsubtitles'] = True
212 subtitles = self.getSubtitles()
213 self.assertEqual(set(subtitles.keys()), set(['en']))
214 self.assertEqual(md5(subtitles['en']), '5b75c300af65fe4476dff79478bb93e4')
215
216
4edff4cf
S
217class TestVimeoSubtitles(BaseTestSubtitles):
218 url = 'http://vimeo.com/76979871'
219 IE = VimeoIE
b0268cb6 220
4edff4cf
S
221 def test_subtitles(self):
222 self.DL.params['writesubtitles'] = True
223 subtitles = self.getSubtitles()
36e7a4ca 224 self.assertEqual(md5(subtitles['en']), '8062383cf4dec168fc40a088aa6d5888')
4edff4cf
S
225
226 def test_subtitles_lang(self):
227 self.DL.params['writesubtitles'] = True
228 self.DL.params['subtitleslangs'] = ['fr']
229 subtitles = self.getSubtitles()
230 self.assertEqual(md5(subtitles['fr']), 'b6191146a6c5d3a452244d853fde6dc8')
231
232 def test_allsubtitles(self):
233 self.DL.params['writesubtitles'] = True
234 self.DL.params['allsubtitles'] = True
235 subtitles = self.getSubtitles()
236 self.assertEqual(set(subtitles.keys()), set(['de', 'en', 'es', 'fr']))
237
4edff4cf 238 def test_nosubtitles(self):
a0f59cdc 239 self.DL.expect_warning('video doesn\'t have subtitles')
4edff4cf
S
240 self.url = 'http://vimeo.com/56015672'
241 self.DL.params['writesubtitles'] = True
242 self.DL.params['allsubtitles'] = True
243 subtitles = self.getSubtitles()
244 self.assertEqual(len(subtitles), 0)
245
246 def test_multiple_langs(self):
247 self.DL.params['writesubtitles'] = True
248 langs = ['es', 'fr', 'de']
249 self.DL.params['subtitleslangs'] = langs
250 subtitles = self.getSubtitles()
251 for lang in langs:
a0f59cdc 252 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
4edff4cf
S
253
254
0ca41c3d 255class TestWallaSubtitles(BaseTestSubtitles):
7bc8780c
S
256 url = 'http://vod.walla.co.il/movie/2705958/the-yes-men'
257 IE = WallaIE
258
259 def test_list_subtitles(self):
a0f59cdc 260 self.DL.expect_warning('Automatic Captions not supported by this server')
7bc8780c
S
261 self.DL.params['listsubtitles'] = True
262 info_dict = self.getInfoDict()
263 self.assertEqual(info_dict, None)
264
265 def test_allsubtitles(self):
a0f59cdc 266 self.DL.expect_warning('Automatic Captions not supported by this server')
7bc8780c
S
267 self.DL.params['writesubtitles'] = True
268 self.DL.params['allsubtitles'] = True
269 subtitles = self.getSubtitles()
270 self.assertEqual(set(subtitles.keys()), set(['heb']))
271 self.assertEqual(md5(subtitles['heb']), 'e758c5d7cb982f6bef14f377ec7a3920')
272
273 def test_nosubtitles(self):
a0f59cdc 274 self.DL.expect_warning('video doesn\'t have subtitles')
7bc8780c
S
275 self.url = 'http://vod.walla.co.il/movie/2642630/one-direction-all-for-one'
276 self.DL.params['writesubtitles'] = True
277 self.DL.params['allsubtitles'] = True
278 subtitles = self.getSubtitles()
279 self.assertEqual(len(subtitles), 0)
280
281
0b54a5b1
S
282class TestCeskaTelevizeSubtitles(BaseTestSubtitles):
283 url = 'http://www.ceskatelevize.cz/ivysilani/10600540290-u6-uzasny-svet-techniky'
284 IE = CeskaTelevizeIE
285
286 def test_list_subtitles(self):
287 self.DL.expect_warning('Automatic Captions not supported by this server')
288 self.DL.params['listsubtitles'] = True
289 info_dict = self.getInfoDict()
290 self.assertEqual(info_dict, None)
291
292 def test_allsubtitles(self):
293 self.DL.expect_warning('Automatic Captions not supported by this server')
294 self.DL.params['writesubtitles'] = True
295 self.DL.params['allsubtitles'] = True
296 subtitles = self.getSubtitles()
297 self.assertEqual(set(subtitles.keys()), set(['cs']))
8fb474fb 298 self.assertTrue(len(subtitles['cs']) > 20000)
0b54a5b1
S
299
300 def test_nosubtitles(self):
301 self.DL.expect_warning('video doesn\'t have subtitles')
302 self.url = 'http://www.ceskatelevize.cz/ivysilani/ivysilani/10441294653-hyde-park-civilizace/214411058091220'
303 self.DL.params['writesubtitles'] = True
304 self.DL.params['allsubtitles'] = True
305 subtitles = self.getSubtitles()
306 self.assertEqual(len(subtitles), 0)
307
308
311c3938
JMF
309class TestLyndaSubtitles(BaseTestSubtitles):
310 url = 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html'
311 IE = LyndaIE
312
313 def test_allsubtitles(self):
314 self.DL.params['writesubtitles'] = True
315 self.DL.params['allsubtitles'] = True
316 subtitles = self.getSubtitles()
317 self.assertEqual(set(subtitles.keys()), set(['en']))
318 self.assertEqual(md5(subtitles['en']), '09bbe67222259bed60deaa26997d73a7')
319
320
b9b42f2e
JMF
321class TestNPOSubtitles(BaseTestSubtitles):
322 url = 'http://www.npo.nl/nos-journaal/28-08-2014/POW_00722860'
323 IE = NPOIE
324
325 def test_allsubtitles(self):
326 self.DL.params['writesubtitles'] = True
327 self.DL.params['allsubtitles'] = True
328 subtitles = self.getSubtitles()
329 self.assertEqual(set(subtitles.keys()), set(['nl']))
330 self.assertEqual(md5(subtitles['nl']), 'fc6435027572b63fb4ab143abd5ad3f4')
331
332
ae84f879
JMF
333if __name__ == '__main__':
334 unittest.main()