[blip.tv] Add support for subtitles (#2274)
[youtube-dl] / test / test_subtitles.py
1 #!/usr/bin/env python
2
3 # Allow direct execution
4 import os
5 import sys
6 import unittest
7 sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
8
9 from test.helper import FakeYDL, md5
10
11
12 from youtube_dl.extractor import (
13     BlipTVIE,
14     YoutubeIE,
15     DailymotionIE,
16     TEDIE,
17 )
18
19
20 class BaseTestSubtitles(unittest.TestCase):
21     url = None
22     IE = None
23     def setUp(self):
24         self.DL = FakeYDL()
25         self.ie = self.IE(self.DL)
26
27     def getInfoDict(self):
28         info_dict = self.ie.extract(self.url)
29         return info_dict
30
31     def getSubtitles(self):
32         info_dict = self.getInfoDict()
33         return info_dict['subtitles']
34
35
36 class TestYoutubeSubtitles(BaseTestSubtitles):
37     url = 'QRS8MkLhQmM'
38     IE = YoutubeIE
39
40     def test_youtube_no_writesubtitles(self):
41         self.DL.params['writesubtitles'] = False
42         subtitles = self.getSubtitles()
43         self.assertEqual(subtitles, None)
44
45     def test_youtube_subtitles(self):
46         self.DL.params['writesubtitles'] = True
47         subtitles = self.getSubtitles()
48         self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')
49
50     def test_youtube_subtitles_lang(self):
51         self.DL.params['writesubtitles'] = True
52         self.DL.params['subtitleslangs'] = ['it']
53         subtitles = self.getSubtitles()
54         self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')
55
56     def test_youtube_allsubtitles(self):
57         self.DL.params['writesubtitles'] = True
58         self.DL.params['allsubtitles'] = True
59         subtitles = self.getSubtitles()
60         self.assertEqual(len(subtitles.keys()), 13)
61
62     def test_youtube_subtitles_sbv_format(self):
63         self.DL.params['writesubtitles'] = True
64         self.DL.params['subtitlesformat'] = 'sbv'
65         subtitles = self.getSubtitles()
66         self.assertEqual(md5(subtitles['en']), '13aeaa0c245a8bed9a451cb643e3ad8b')
67
68     def test_youtube_subtitles_vtt_format(self):
69         self.DL.params['writesubtitles'] = True
70         self.DL.params['subtitlesformat'] = 'vtt'
71         subtitles = self.getSubtitles()
72         self.assertEqual(md5(subtitles['en']), '3cb210999d3e021bd6c7f0ea751eab06')
73
74     def test_youtube_list_subtitles(self):
75         self.DL.expect_warning(u'Video doesn\'t have automatic captions')
76         self.DL.params['listsubtitles'] = True
77         info_dict = self.getInfoDict()
78         self.assertEqual(info_dict, None)
79
80     def test_youtube_automatic_captions(self):
81         self.url = '8YoUxe5ncPo'
82         self.DL.params['writeautomaticsub'] = True
83         self.DL.params['subtitleslangs'] = ['it']
84         subtitles = self.getSubtitles()
85         self.assertTrue(subtitles['it'] is not None)
86
87     def test_youtube_nosubtitles(self):
88         self.DL.expect_warning(u'video doesn\'t have subtitles')
89         self.url = 'sAjKT8FhjI8'
90         self.DL.params['writesubtitles'] = True
91         self.DL.params['allsubtitles'] = True
92         subtitles = self.getSubtitles()
93         self.assertEqual(len(subtitles), 0)
94
95     def test_youtube_multiple_langs(self):
96         self.url = 'QRS8MkLhQmM'
97         self.DL.params['writesubtitles'] = True
98         langs = ['it', 'fr', 'de']
99         self.DL.params['subtitleslangs'] = langs
100         subtitles = self.getSubtitles()
101         for lang in langs:
102             self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang)
103
104
105 class TestDailymotionSubtitles(BaseTestSubtitles):
106     url = 'http://www.dailymotion.com/video/xczg00'
107     IE = DailymotionIE
108
109     def test_no_writesubtitles(self):
110         subtitles = self.getSubtitles()
111         self.assertEqual(subtitles, None)
112
113     def test_subtitles(self):
114         self.DL.params['writesubtitles'] = True
115         subtitles = self.getSubtitles()
116         self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')
117
118     def test_subtitles_lang(self):
119         self.DL.params['writesubtitles'] = True
120         self.DL.params['subtitleslangs'] = ['fr']
121         subtitles = self.getSubtitles()
122         self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')
123
124     def test_allsubtitles(self):
125         self.DL.params['writesubtitles'] = True
126         self.DL.params['allsubtitles'] = True
127         subtitles = self.getSubtitles()
128         self.assertEqual(len(subtitles.keys()), 5)
129
130     def test_list_subtitles(self):
131         self.DL.expect_warning(u'Automatic Captions not supported by this server')
132         self.DL.params['listsubtitles'] = True
133         info_dict = self.getInfoDict()
134         self.assertEqual(info_dict, None)
135
136     def test_automatic_captions(self):
137         self.DL.expect_warning(u'Automatic Captions not supported by this server')
138         self.DL.params['writeautomaticsub'] = True
139         self.DL.params['subtitleslang'] = ['en']
140         subtitles = self.getSubtitles()
141         self.assertTrue(len(subtitles.keys()) == 0)
142
143     def test_nosubtitles(self):
144         self.DL.expect_warning(u'video doesn\'t have subtitles')
145         self.url = 'http://www.dailymotion.com/video/x12u166_le-zapping-tele-star-du-08-aout-2013_tv'
146         self.DL.params['writesubtitles'] = True
147         self.DL.params['allsubtitles'] = True
148         subtitles = self.getSubtitles()
149         self.assertEqual(len(subtitles), 0)
150
151     def test_multiple_langs(self):
152         self.DL.params['writesubtitles'] = True
153         langs = ['es', 'fr', 'de']
154         self.DL.params['subtitleslangs'] = langs
155         subtitles = self.getSubtitles()
156         for lang in langs:
157             self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang)
158
159
160 class TestTedSubtitles(BaseTestSubtitles):
161     url = 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html'
162     IE = TEDIE
163
164     def test_no_writesubtitles(self):
165         subtitles = self.getSubtitles()
166         self.assertEqual(subtitles, None)
167
168     def test_subtitles(self):
169         self.DL.params['writesubtitles'] = True
170         subtitles = self.getSubtitles()
171         self.assertEqual(md5(subtitles['en']), '4262c1665ff928a2dada178f62cb8d14')
172
173     def test_subtitles_lang(self):
174         self.DL.params['writesubtitles'] = True
175         self.DL.params['subtitleslangs'] = ['fr']
176         subtitles = self.getSubtitles()
177         self.assertEqual(md5(subtitles['fr']), '66a63f7f42c97a50f8c0e90bc7797bb5')
178
179     def test_allsubtitles(self):
180         self.DL.params['writesubtitles'] = True
181         self.DL.params['allsubtitles'] = True
182         subtitles = self.getSubtitles()
183         self.assertEqual(len(subtitles.keys()), 28)
184
185     def test_list_subtitles(self):
186         self.DL.expect_warning(u'Automatic Captions not supported by this server')
187         self.DL.params['listsubtitles'] = True
188         info_dict = self.getInfoDict()
189         self.assertEqual(info_dict, None)
190
191     def test_automatic_captions(self):
192         self.DL.expect_warning(u'Automatic Captions not supported by this server')
193         self.DL.params['writeautomaticsub'] = True
194         self.DL.params['subtitleslang'] = ['en']
195         subtitles = self.getSubtitles()
196         self.assertTrue(len(subtitles.keys()) == 0)
197
198     def test_multiple_langs(self):
199         self.DL.params['writesubtitles'] = True
200         langs = ['es', 'fr', 'de']
201         self.DL.params['subtitleslangs'] = langs
202         subtitles = self.getSubtitles()
203         for lang in langs:
204             self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang)
205
206
207 class TestBlipTVSubtitles(BaseTestSubtitles):
208     url = 'http://blip.tv/a/a-6603250'
209     IE = BlipTVIE
210
211     def test_list_subtitles(self):
212         self.DL.expect_warning(u'Automatic Captions not supported by this server')
213         self.DL.params['listsubtitles'] = True
214         info_dict = self.getInfoDict()
215         self.assertEqual(info_dict, None)
216
217     def test_allsubtitles(self):
218         self.DL.expect_warning(u'Automatic Captions not supported by this server')
219         self.DL.params['writesubtitles'] = True
220         self.DL.params['allsubtitles'] = True
221         subtitles = self.getSubtitles()
222         self.assertEqual(set(subtitles.keys()), set(['en']))
223         self.assertEqual(md5(subtitles['en']), '5b75c300af65fe4476dff79478bb93e4')
224
225
226 if __name__ == '__main__':
227     unittest.main()