浏览代码

[subtitles] fixed multiple subtitles language separated by comma after merge

As mentioned in the pull request, I forgot to include this changes.
https://github.com/rg3/youtube-dl/commit/aa6a10c44a8e2e86f709c5301f9ea6ac3f01f002
Ismael Mejia 12 年之前
父节点
当前提交
d6e203b3dc

+ 10 - 3
test/test_dailymotion_subtitles.py

@@ -36,20 +36,20 @@ class TestDailymotionSubtitles(unittest.TestCase):
         self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')
         self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')
     def test_subtitles_lang(self):
     def test_subtitles_lang(self):
         self.DL.params['writesubtitles'] = True
         self.DL.params['writesubtitles'] = True
-        self.DL.params['subtitleslang'] = 'fr'
+        self.DL.params['subtitleslangs'] = ['fr']
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')
         self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')
     def test_allsubtitles(self):
     def test_allsubtitles(self):
         self.DL.params['allsubtitles'] = True
         self.DL.params['allsubtitles'] = True
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertEqual(len(subtitles.keys()), 5)
         self.assertEqual(len(subtitles.keys()), 5)
-    def test_list_subtitles(self): #ojo
+    def test_list_subtitles(self):
         self.DL.params['listsubtitles'] = True
         self.DL.params['listsubtitles'] = True
         info_dict = self.getInfoDict()
         info_dict = self.getInfoDict()
         self.assertEqual(info_dict, None)
         self.assertEqual(info_dict, None)
     def test_automatic_captions(self):
     def test_automatic_captions(self):
         self.DL.params['writeautomaticsub'] = True
         self.DL.params['writeautomaticsub'] = True
-        self.DL.params['subtitleslang'] = 'en'
+        self.DL.params['subtitleslang'] = ['en']
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertTrue(len(subtitles.keys()) == 0)
         self.assertTrue(len(subtitles.keys()) == 0)
     def test_nosubtitles(self):
     def test_nosubtitles(self):
@@ -57,6 +57,13 @@ class TestDailymotionSubtitles(unittest.TestCase):
         self.DL.params['allsubtitles'] = True
         self.DL.params['allsubtitles'] = True
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertEqual(len(subtitles), 0)
         self.assertEqual(len(subtitles), 0)
+    def test_multiple_langs(self):
+        self.DL.params['writesubtitles'] = True
+        langs = ['es', 'fr', 'de']
+        self.DL.params['subtitleslangs'] = langs
+        subtitles = self.getSubtitles()
+        for lang in langs:
+            self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang)
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
     unittest.main()
     unittest.main()

+ 10 - 3
test/test_youtube_subtitles.py

@@ -37,7 +37,7 @@ class TestYoutubeSubtitles(unittest.TestCase):
         self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')
         self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')
     def test_youtube_subtitles_lang(self):
     def test_youtube_subtitles_lang(self):
         self.DL.params['writesubtitles'] = True
         self.DL.params['writesubtitles'] = True
-        self.DL.params['subtitleslang'] = 'it'
+        self.DL.params['subtitleslangs'] = ['it']
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')
         self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')
     def test_youtube_allsubtitles(self):
     def test_youtube_allsubtitles(self):
@@ -61,7 +61,7 @@ class TestYoutubeSubtitles(unittest.TestCase):
     def test_youtube_automatic_captions(self):
     def test_youtube_automatic_captions(self):
         self.url = '8YoUxe5ncPo'
         self.url = '8YoUxe5ncPo'
         self.DL.params['writeautomaticsub'] = True
         self.DL.params['writeautomaticsub'] = True
-        self.DL.params['subtitleslang'] = 'it'
+        self.DL.params['subtitleslangs'] = ['it']
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertTrue(subtitles['it'] is not None)
         self.assertTrue(subtitles['it'] is not None)
     def test_youtube_nosubtitles(self):
     def test_youtube_nosubtitles(self):
@@ -69,7 +69,14 @@ class TestYoutubeSubtitles(unittest.TestCase):
         self.DL.params['allsubtitles'] = True
         self.DL.params['allsubtitles'] = True
         subtitles = self.getSubtitles()
         subtitles = self.getSubtitles()
         self.assertEqual(len(subtitles), 0)
         self.assertEqual(len(subtitles), 0)
-
+    def test_youtube_multiple_langs(self):
+        self.url = 'QRS8MkLhQmM'
+        self.DL.params['writesubtitles'] = True
+        langs = ['it', 'fr', 'de']
+        self.DL.params['subtitleslangs'] = langs
+        subtitles = self.getSubtitles()
+        for lang in langs:
+            self.assertTrue(subtitles.get(lang) is not None, u'Subtitles for \'%s\' not extracted' % lang)
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
     unittest.main()
     unittest.main()

+ 1 - 1
youtube_dl/YoutubeDL.py

@@ -76,7 +76,7 @@ class YoutubeDL(object):
     allsubtitles:      Downloads all the subtitles of the video
     allsubtitles:      Downloads all the subtitles of the video
     listsubtitles:     Lists all available subtitles for the video
     listsubtitles:     Lists all available subtitles for the video
     subtitlesformat:   Subtitle format [srt/sbv/vtt] (default=srt)
     subtitlesformat:   Subtitle format [srt/sbv/vtt] (default=srt)
-    subtitleslang:     Language of the subtitles to download
+    subtitleslangs:     Language of the subtitles to download
     keepvideo:         Keep the video file after post-processing
     keepvideo:         Keep the video file after post-processing
     daterange:         A DateRange object, download only if the upload_date is in the range.
     daterange:         A DateRange object, download only if the upload_date is in the range.
     skip_download:     Skip the actual download of the video file
     skip_download:     Skip the actual download of the video file

+ 8 - 4
youtube_dl/__init__.py

@@ -83,6 +83,9 @@ def parseOpts(overrideArguments=None):
 
 
         return "".join(opts)
         return "".join(opts)
 
 
+    def _comma_separated_values_options_callback(option, opt_str, value, parser):
+        setattr(parser.values, option.dest, value.split(','))
+
     def _find_term_columns():
     def _find_term_columns():
         columns = os.environ.get('COLUMNS', None)
         columns = os.environ.get('COLUMNS', None)
         if columns:
         if columns:
@@ -203,9 +206,10 @@ def parseOpts(overrideArguments=None):
     subtitles.add_option('--sub-format',
     subtitles.add_option('--sub-format',
             action='store', dest='subtitlesformat', metavar='FORMAT',
             action='store', dest='subtitlesformat', metavar='FORMAT',
             help='subtitle format (default=srt) ([sbv/vtt] youtube only)', default='srt')
             help='subtitle format (default=srt) ([sbv/vtt] youtube only)', default='srt')
-    subtitles.add_option('--sub-lang', '--srt-lang',
-            action='store', dest='subtitleslang', metavar='LANG',
-            help='language of the subtitles to download (optional) use IETF language tags like \'en\'')
+    subtitles.add_option('--sub-lang', '--sub-langs', '--srt-lang',
+            action='callback', dest='subtitleslangs', metavar='LANGS', type='str',
+            default=[], callback=_comma_separated_values_options_callback,
+            help='languages of the subtitles to download (optional) separated by commas, use IETF language tags like \'en,pt\'')
 
 
     downloader.add_option('-r', '--rate-limit',
     downloader.add_option('-r', '--rate-limit',
             dest='ratelimit', metavar='LIMIT', help='maximum download rate (e.g. 50k or 44.6m)')
             dest='ratelimit', metavar='LIMIT', help='maximum download rate (e.g. 50k or 44.6m)')
@@ -570,7 +574,7 @@ def _real_main(argv=None):
         'allsubtitles': opts.allsubtitles,
         'allsubtitles': opts.allsubtitles,
         'listsubtitles': opts.listsubtitles,
         'listsubtitles': opts.listsubtitles,
         'subtitlesformat': opts.subtitlesformat,
         'subtitlesformat': opts.subtitlesformat,
-        'subtitleslang': opts.subtitleslang,
+        'subtitleslangs': opts.subtitleslangs,
         'matchtitle': decodeOption(opts.matchtitle),
         'matchtitle': decodeOption(opts.matchtitle),
         'rejecttitle': decodeOption(opts.rejecttitle),
         'rejecttitle': decodeOption(opts.rejecttitle),
         'max_downloads': opts.max_downloads,
         'max_downloads': opts.max_downloads,

+ 19 - 14
youtube_dl/extractor/subtitles.py

@@ -21,24 +21,29 @@ class SubtitlesIE(InfoExtractor):
 
 
     def _extract_subtitles(self, video_id):
     def _extract_subtitles(self, video_id):
         """ returns {sub_lang: sub} or {} if subtitles not found """
         """ returns {sub_lang: sub} or {} if subtitles not found """
-        sub_lang_list = self._get_available_subtitles(video_id)
-        if not sub_lang_list:  # error, it didn't get the available subtitles
+        available_subs_list = self._get_available_subtitles(video_id)
+        if not available_subs_list:  # error, it didn't get the available subtitles
             return {}
             return {}
+        if self._downloader.params.get('allsubtitles', False):
+            sub_lang_list = available_subs_list
+        else:
+            if self._downloader.params.get('writesubtitles', False):
+                if self._downloader.params.get('subtitleslangs', False):
+                    requested_langs = self._downloader.params.get('subtitleslangs')
+                elif 'en' in available_subs_list:
+                    requested_langs = ['en']
+                else:
+                    requested_langs = [list(available_subs_list.keys())[0]]
 
 
-        if self._downloader.params.get('writesubtitles', False):
-            if self._downloader.params.get('subtitleslang', False):
-                sub_lang = self._downloader.params.get('subtitleslang')
-            elif 'en' in sub_lang_list:
-                sub_lang = 'en'
-            else:
-                sub_lang = list(sub_lang_list.keys())[0]
-            if not sub_lang in sub_lang_list:
-                self._downloader.report_warning(u'no closed captions found in the specified language "%s"' % sub_lang)
-                return {}
-            sub_lang_list = {sub_lang: sub_lang_list[sub_lang]}
+                sub_lang_list = {}
+                for sub_lang in requested_langs:
+                    if not sub_lang in available_subs_list:
+                        self._downloader.report_warning(u'no closed captions found in the specified language "%s"' % sub_lang)
+                        continue
+                    sub_lang_list[sub_lang] = available_subs_list[sub_lang]
 
 
         subtitles = {}
         subtitles = {}
-        for sub_lang, url in sub_lang_list.iteritems():
+        for sub_lang, url in sub_lang_list.items():
             subtitle = self._request_subtitle_url(sub_lang, url)
             subtitle = self._request_subtitle_url(sub_lang, url)
             if subtitle:
             if subtitle:
                 subtitles[sub_lang] = subtitle
                 subtitles[sub_lang] = subtitle

+ 1 - 1
youtube_dl/extractor/youtube.py

@@ -160,7 +160,7 @@ class YoutubeSubtitlesIE(SubtitlesIE):
     def _request_automatic_caption(self, video_id, webpage):
     def _request_automatic_caption(self, video_id, webpage):
         """We need the webpage for getting the captions url, pass it as an
         """We need the webpage for getting the captions url, pass it as an
            argument to speed up the process."""
            argument to speed up the process."""
-        sub_lang = self._downloader.params.get('subtitleslang') or 'en'
+        sub_lang = (self._downloader.params.get('subtitleslangs') or ['en'])[0]
         sub_format = self._downloader.params.get('subtitlesformat')
         sub_format = self._downloader.params.get('subtitlesformat')
         self.to_screen(u'%s: Looking for automatic captions' % video_id)
         self.to_screen(u'%s: Looking for automatic captions' % video_id)
         mobj = re.search(r';ytplayer.config = ({.*?});', webpage)
         mobj = re.search(r';ytplayer.config = ({.*?});', webpage)