]>
Commit | Line | Data |
---|---|---|
953e32b2 IM |
1 | import socket |
2 | ||
3 | from .common import InfoExtractor | |
4 | ||
5 | from ..utils import ( | |
6 | compat_http_client, | |
7 | compat_urllib_error, | |
8 | compat_urllib_request, | |
9 | compat_str, | |
10 | ) | |
11 | ||
12 | ||
13 | class SubtitlesIE(InfoExtractor): | |
14 | ||
69df680b IM |
15 | def _list_available_subtitles(self, video_id): |
16 | """ outputs the available subtitles for the video """ | |
17 | sub_lang_list = self._get_available_subtitles(video_id) | |
953e32b2 | 18 | sub_lang = ",".join(list(sub_lang_list.keys())) |
8377574c IM |
19 | self.to_screen(u'%s: Available subtitles for video: %s' % |
20 | (video_id, sub_lang)) | |
953e32b2 | 21 | |
953e32b2 | 22 | def _extract_subtitles(self, video_id): |
69df680b | 23 | """ returns {sub_lang: sub} or {} if subtitles not found """ |
953e32b2 | 24 | sub_lang_list = self._get_available_subtitles(video_id) |
8377574c | 25 | if not sub_lang_list: # error, it didn't get the available subtitles |
953e32b2 | 26 | return {} |
8377574c | 27 | |
953e32b2 IM |
28 | if self._downloader.params.get('writesubtitles', False): |
29 | if self._downloader.params.get('subtitleslang', False): | |
30 | sub_lang = self._downloader.params.get('subtitleslang') | |
31 | elif 'en' in sub_lang_list: | |
32 | sub_lang = 'en' | |
33 | else: | |
34 | sub_lang = list(sub_lang_list.keys())[0] | |
35 | if not sub_lang in sub_lang_list: | |
36 | self._downloader.report_warning(u'no closed captions found in the specified language "%s"' % sub_lang) | |
37 | return {} | |
38 | sub_lang_list = {sub_lang: sub_lang_list[sub_lang]} | |
8377574c | 39 | |
953e32b2 | 40 | subtitles = {} |
8377574c IM |
41 | for sub_lang, url in sub_lang_list.iteritems(): |
42 | subtitle = self._request_subtitle_url(sub_lang, url) | |
953e32b2 IM |
43 | if subtitle: |
44 | subtitles[sub_lang] = subtitle | |
45 | return subtitles | |
46 | ||
8377574c | 47 | def _request_subtitle_url(self, sub_lang, url): |
69df680b | 48 | """ makes the http request for the subtitle """ |
953e32b2 IM |
49 | try: |
50 | sub = compat_urllib_request.urlopen(url).read().decode('utf-8') | |
51 | except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err: | |
52 | self._downloader.report_warning(u'unable to download video subtitles for %s: %s' % (sub_lang, compat_str(err))) | |
53 | return | |
54 | if not sub: | |
55 | self._downloader.report_warning(u'Did not fetch video subtitles') | |
56 | return | |
57 | return sub | |
58 | ||
59 | def _get_available_subtitles(self, video_id): | |
69df680b IM |
60 | """ returns {sub_lang: url} or {} if not available """ |
61 | """ Must be redefined by the subclasses """ | |
953e32b2 IM |
62 | pass |
63 | ||
64 | def _request_automatic_caption(self, video_id, webpage): | |
69df680b IM |
65 | """ returns {sub_lang: sub} or {} if not available """ |
66 | """ Must be redefined by the subclasses """ | |
953e32b2 | 67 | pass |
69df680b IM |
68 | |
69 | ||
70 | class NoAutoSubtitlesIE(SubtitlesIE): | |
71 | """ A subtitle class for the servers that don't support auto-captions""" | |
72 | ||
73 | def _request_automatic_caption(self, video_id, webpage): | |
74 | self._downloader.report_warning(u'Automatic Captions not supported by this server') | |
75 | return {} |