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