]> jfr.im git - yt-dlp.git/blame - test/test_subtitles.py
[youtube] Extract UL playlists as mixes (Closes #5040)
[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,
0af25f78 23 ComedyCentralIE,
01561da1 24 NRKTVIE,
afbdd3ac 25 RaiIE,
4f7cea6c 26 VikiIE,
8807f127 27 ThePlatformIE,
ae84f879
JMF
28)
29
30
31class BaseTestSubtitles(unittest.TestCase):
32 url = None
33 IE = None
5f6a1245 34
ae84f879
JMF
35 def setUp(self):
36 self.DL = FakeYDL()
a504ced0
JMF
37 self.ie = self.IE()
38 self.DL.add_info_extractor(self.ie)
ae84f879
JMF
39
40 def getInfoDict(self):
a504ced0 41 info_dict = self.DL.extract_info(self.url, download=False)
ae84f879
JMF
42 return info_dict
43
44 def getSubtitles(self):
45 info_dict = self.getInfoDict()
c84dd8a9 46 subtitles = info_dict['requested_subtitles']
a504ced0
JMF
47 if not subtitles:
48 return subtitles
49 for sub_info in subtitles.values():
50 if sub_info.get('data') is None:
51 uf = self.DL.urlopen(sub_info['url'])
52 sub_info['data'] = uf.read().decode('utf-8')
53 return dict((l, sub_info['data']) for l, sub_info in subtitles.items())
ae84f879
JMF
54
55
56class TestYoutubeSubtitles(BaseTestSubtitles):
57 url = 'QRS8MkLhQmM'
58 IE = YoutubeIE
59
ae84f879
JMF
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)
b7bb76df
JMF
65 self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')
66 self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')
67 for lang in ['it', 'fr', 'de']:
68 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879
JMF
69
70 def test_youtube_subtitles_sbv_format(self):
71 self.DL.params['writesubtitles'] = True
72 self.DL.params['subtitlesformat'] = 'sbv'
73 subtitles = self.getSubtitles()
74 self.assertEqual(md5(subtitles['en']), '13aeaa0c245a8bed9a451cb643e3ad8b')
75
76 def test_youtube_subtitles_vtt_format(self):
77 self.DL.params['writesubtitles'] = True
78 self.DL.params['subtitlesformat'] = 'vtt'
79 subtitles = self.getSubtitles()
4e0084d9 80 self.assertEqual(md5(subtitles['en']), '3cb210999d3e021bd6c7f0ea751eab06')
ae84f879 81
ae84f879
JMF
82 def test_youtube_automatic_captions(self):
83 self.url = '8YoUxe5ncPo'
84 self.DL.params['writeautomaticsub'] = True
85 self.DL.params['subtitleslangs'] = ['it']
86 subtitles = self.getSubtitles()
87 self.assertTrue(subtitles['it'] is not None)
88
7d900ef1
JMF
89 def test_youtube_translated_subtitles(self):
90 # This video has a subtitles track, which can be translated
91 self.url = 'Ky9eprVWzlI'
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
ae84f879 97 def test_youtube_nosubtitles(self):
a0f59cdc 98 self.DL.expect_warning('video doesn\'t have subtitles')
345e3783 99 self.url = 'n5BB19UTcdA'
ae84f879
JMF
100 self.DL.params['writesubtitles'] = True
101 self.DL.params['allsubtitles'] = True
102 subtitles = self.getSubtitles()
4d171848 103 self.assertFalse(subtitles)
ae84f879 104
ae84f879
JMF
105
106class TestDailymotionSubtitles(BaseTestSubtitles):
107 url = 'http://www.dailymotion.com/video/xczg00'
108 IE = DailymotionIE
109
ae84f879
JMF
110 def test_allsubtitles(self):
111 self.DL.params['writesubtitles'] = True
112 self.DL.params['allsubtitles'] = True
113 subtitles = self.getSubtitles()
8fb474fb 114 self.assertTrue(len(subtitles.keys()) >= 6)
b7bb76df
JMF
115 self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')
116 self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')
117 for lang in ['es', 'fr', 'de']:
118 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879 119
ae84f879 120 def test_nosubtitles(self):
a0f59cdc 121 self.DL.expect_warning('video doesn\'t have subtitles')
ae84f879
JMF
122 self.url = 'http://www.dailymotion.com/video/x12u166_le-zapping-tele-star-du-08-aout-2013_tv'
123 self.DL.params['writesubtitles'] = True
124 self.DL.params['allsubtitles'] = True
125 subtitles = self.getSubtitles()
4d171848 126 self.assertFalse(subtitles)
ae84f879 127
ae84f879
JMF
128
129class TestTedSubtitles(BaseTestSubtitles):
130 url = 'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html'
131 IE = TEDIE
132
ae84f879
JMF
133 def test_allsubtitles(self):
134 self.DL.params['writesubtitles'] = True
135 self.DL.params['allsubtitles'] = True
136 subtitles = self.getSubtitles()
0321213c 137 self.assertTrue(len(subtitles.keys()) >= 28)
b7bb76df
JMF
138 self.assertEqual(md5(subtitles['en']), '4262c1665ff928a2dada178f62cb8d14')
139 self.assertEqual(md5(subtitles['fr']), '66a63f7f42c97a50f8c0e90bc7797bb5')
140 for lang in ['es', 'fr', 'de']:
a0f59cdc 141 self.assertTrue(subtitles.get(lang) is not None, 'Subtitles for \'%s\' not extracted' % lang)
ae84f879 142
b4bcffef
PH
143
144class TestBlipTVSubtitles(BaseTestSubtitles):
145 url = 'http://blip.tv/a/a-6603250'
146 IE = BlipTVIE
147
b4bcffef 148 def test_allsubtitles(self):
b4bcffef
PH
149 self.DL.params['writesubtitles'] = True
150 self.DL.params['allsubtitles'] = True
151 subtitles = self.getSubtitles()
152 self.assertEqual(set(subtitles.keys()), set(['en']))
153 self.assertEqual(md5(subtitles['en']), '5b75c300af65fe4476dff79478bb93e4')
154
155
4edff4cf
S
156class TestVimeoSubtitles(BaseTestSubtitles):
157 url = 'http://vimeo.com/76979871'
158 IE = VimeoIE
b0268cb6 159
4edff4cf
S
160 def test_allsubtitles(self):
161 self.DL.params['writesubtitles'] = True
162 self.DL.params['allsubtitles'] = True
163 subtitles = self.getSubtitles()
164 self.assertEqual(set(subtitles.keys()), set(['de', 'en', 'es', 'fr']))
b7bb76df
JMF
165 self.assertEqual(md5(subtitles['en']), '8062383cf4dec168fc40a088aa6d5888')
166 self.assertEqual(md5(subtitles['fr']), 'b6191146a6c5d3a452244d853fde6dc8')
4edff4cf 167
4edff4cf 168 def test_nosubtitles(self):
a0f59cdc 169 self.DL.expect_warning('video doesn\'t have subtitles')
4edff4cf
S
170 self.url = 'http://vimeo.com/56015672'
171 self.DL.params['writesubtitles'] = True
172 self.DL.params['allsubtitles'] = True
173 subtitles = self.getSubtitles()
4d171848 174 self.assertFalse(subtitles)
4edff4cf 175
4edff4cf 176
0ca41c3d 177class TestWallaSubtitles(BaseTestSubtitles):
7bc8780c
S
178 url = 'http://vod.walla.co.il/movie/2705958/the-yes-men'
179 IE = WallaIE
180
7bc8780c 181 def test_allsubtitles(self):
a0f59cdc 182 self.DL.expect_warning('Automatic Captions not supported by this server')
7bc8780c
S
183 self.DL.params['writesubtitles'] = True
184 self.DL.params['allsubtitles'] = True
185 subtitles = self.getSubtitles()
186 self.assertEqual(set(subtitles.keys()), set(['heb']))
187 self.assertEqual(md5(subtitles['heb']), 'e758c5d7cb982f6bef14f377ec7a3920')
188
189 def test_nosubtitles(self):
a0f59cdc 190 self.DL.expect_warning('video doesn\'t have subtitles')
7bc8780c
S
191 self.url = 'http://vod.walla.co.il/movie/2642630/one-direction-all-for-one'
192 self.DL.params['writesubtitles'] = True
193 self.DL.params['allsubtitles'] = True
194 subtitles = self.getSubtitles()
4d171848 195 self.assertFalse(subtitles)
7bc8780c
S
196
197
0b54a5b1
S
198class TestCeskaTelevizeSubtitles(BaseTestSubtitles):
199 url = 'http://www.ceskatelevize.cz/ivysilani/10600540290-u6-uzasny-svet-techniky'
200 IE = CeskaTelevizeIE
201
0b54a5b1
S
202 def test_allsubtitles(self):
203 self.DL.expect_warning('Automatic Captions not supported by this server')
204 self.DL.params['writesubtitles'] = True
205 self.DL.params['allsubtitles'] = True
206 subtitles = self.getSubtitles()
207 self.assertEqual(set(subtitles.keys()), set(['cs']))
8fb474fb 208 self.assertTrue(len(subtitles['cs']) > 20000)
0b54a5b1
S
209
210 def test_nosubtitles(self):
211 self.DL.expect_warning('video doesn\'t have subtitles')
212 self.url = 'http://www.ceskatelevize.cz/ivysilani/ivysilani/10441294653-hyde-park-civilizace/214411058091220'
213 self.DL.params['writesubtitles'] = True
214 self.DL.params['allsubtitles'] = True
215 subtitles = self.getSubtitles()
4d171848 216 self.assertFalse(subtitles)
0b54a5b1
S
217
218
311c3938
JMF
219class TestLyndaSubtitles(BaseTestSubtitles):
220 url = 'http://www.lynda.com/Bootstrap-tutorials/Using-exercise-files/110885/114408-4.html'
221 IE = LyndaIE
222
223 def test_allsubtitles(self):
224 self.DL.params['writesubtitles'] = True
225 self.DL.params['allsubtitles'] = True
226 subtitles = self.getSubtitles()
227 self.assertEqual(set(subtitles.keys()), set(['en']))
228 self.assertEqual(md5(subtitles['en']), '09bbe67222259bed60deaa26997d73a7')
229
230
b9b42f2e
JMF
231class TestNPOSubtitles(BaseTestSubtitles):
232 url = 'http://www.npo.nl/nos-journaal/28-08-2014/POW_00722860'
233 IE = NPOIE
234
235 def test_allsubtitles(self):
236 self.DL.params['writesubtitles'] = True
237 self.DL.params['allsubtitles'] = True
238 subtitles = self.getSubtitles()
239 self.assertEqual(set(subtitles.keys()), set(['nl']))
240 self.assertEqual(md5(subtitles['nl']), 'fc6435027572b63fb4ab143abd5ad3f4')
241
242
0af25f78
JMF
243class TestMTVSubtitles(BaseTestSubtitles):
244 url = 'http://www.cc.com/video-clips/kllhuv/stand-up-greg-fitzsimmons--uncensored---too-good-of-a-mother'
245 IE = ComedyCentralIE
246
247 def getInfoDict(self):
248 return super(TestMTVSubtitles, self).getInfoDict()['entries'][0]
249
250 def test_allsubtitles(self):
251 self.DL.params['writesubtitles'] = True
252 self.DL.params['allsubtitles'] = True
253 subtitles = self.getSubtitles()
254 self.assertEqual(set(subtitles.keys()), set(['en']))
255 self.assertEqual(md5(subtitles['en']), 'b9f6ca22a6acf597ec76f61749765e65')
256
257
01561da1
JMF
258class TestNRKSubtitles(BaseTestSubtitles):
259 url = 'http://tv.nrk.no/serie/ikke-gjoer-dette-hjemme/DMPV73000411/sesong-2/episode-1'
260 IE = NRKTVIE
261
262 def test_allsubtitles(self):
263 self.DL.params['writesubtitles'] = True
264 self.DL.params['allsubtitles'] = True
265 subtitles = self.getSubtitles()
266 self.assertEqual(set(subtitles.keys()), set(['no']))
267 self.assertEqual(md5(subtitles['no']), '1d221e6458c95c5494dcd38e6a1f129a')
268
269
afbdd3ac
JMF
270class TestRaiSubtitles(BaseTestSubtitles):
271 url = 'http://www.rai.tv/dl/RaiTV/programmi/media/ContentItem-cb27157f-9dd0-4aee-b788-b1f67643a391.html'
272 IE = RaiIE
273
274 def test_allsubtitles(self):
275 self.DL.params['writesubtitles'] = True
276 self.DL.params['allsubtitles'] = True
277 subtitles = self.getSubtitles()
278 self.assertEqual(set(subtitles.keys()), set(['it']))
279 self.assertEqual(md5(subtitles['it']), 'b1d90a98755126b61e667567a1f6680a')
280
281
4f7cea6c
JMF
282class TestVikiSubtitles(BaseTestSubtitles):
283 url = 'http://www.viki.com/videos/1060846v-punch-episode-18'
284 IE = VikiIE
285
286 def test_allsubtitles(self):
287 self.DL.params['writesubtitles'] = True
288 self.DL.params['allsubtitles'] = True
289 subtitles = self.getSubtitles()
290 self.assertEqual(set(subtitles.keys()), set(['en']))
80970e53 291 self.assertEqual(md5(subtitles['en']), '53cb083a5914b2d84ef1ab67b880d18a')
4f7cea6c
JMF
292
293
8807f127
JMF
294class TestThePlatformSubtitles(BaseTestSubtitles):
295 # from http://www.3playmedia.com/services-features/tools/integrations/theplatform/
296 # (see http://theplatform.com/about/partners/type/subtitles-closed-captioning/)
297 url = 'theplatform:JFUjUE1_ehvq'
298 IE = ThePlatformIE
299
300 def test_allsubtitles(self):
301 self.DL.params['writesubtitles'] = True
302 self.DL.params['allsubtitles'] = True
303 subtitles = self.getSubtitles()
304 self.assertEqual(set(subtitles.keys()), set(['en']))
305 self.assertEqual(md5(subtitles['en']), '97e7670cbae3c4d26ae8bcc7fdd78d4b')
306
307
ae84f879
JMF
308if __name__ == '__main__':
309 unittest.main()