diff options
| -rw-r--r-- | test/test_dailymotion_subtitles.py | 13 | ||||
| -rw-r--r-- | test/test_youtube_subtitles.py | 13 | ||||
| -rw-r--r-- | youtube_dl/YoutubeDL.py | 2 | ||||
| -rw-r--r-- | youtube_dl/__init__.py | 12 | ||||
| -rw-r--r-- | youtube_dl/extractor/subtitles.py | 33 | ||||
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 2 | 
6 files changed, 49 insertions, 26 deletions
| diff --git a/test/test_dailymotion_subtitles.py b/test/test_dailymotion_subtitles.py index efc4e574f..bcd9f79f6 100644 --- a/test/test_dailymotion_subtitles.py +++ b/test/test_dailymotion_subtitles.py @@ -36,20 +36,20 @@ class TestDailymotionSubtitles(unittest.TestCase):          self.assertEqual(md5(subtitles['en']), '976553874490cba125086bbfea3ff76f')      def test_subtitles_lang(self):          self.DL.params['writesubtitles'] = True -        self.DL.params['subtitleslang'] = 'fr' +        self.DL.params['subtitleslangs'] = ['fr']          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['fr']), '594564ec7d588942e384e920e5341792')      def test_allsubtitles(self):          self.DL.params['allsubtitles'] = True          subtitles = self.getSubtitles()          self.assertEqual(len(subtitles.keys()), 5) -    def test_list_subtitles(self): #ojo +    def test_list_subtitles(self):          self.DL.params['listsubtitles'] = True          info_dict = self.getInfoDict()          self.assertEqual(info_dict, None)      def test_automatic_captions(self):          self.DL.params['writeautomaticsub'] = True -        self.DL.params['subtitleslang'] = 'en' +        self.DL.params['subtitleslang'] = ['en']          subtitles = self.getSubtitles()          self.assertTrue(len(subtitles.keys()) == 0)      def test_nosubtitles(self): @@ -57,6 +57,13 @@ class TestDailymotionSubtitles(unittest.TestCase):          self.DL.params['allsubtitles'] = True          subtitles = self.getSubtitles()          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__':      unittest.main() diff --git a/test/test_youtube_subtitles.py b/test/test_youtube_subtitles.py index e40243077..5632871ac 100644 --- a/test/test_youtube_subtitles.py +++ b/test/test_youtube_subtitles.py @@ -37,7 +37,7 @@ class TestYoutubeSubtitles(unittest.TestCase):          self.assertEqual(md5(subtitles['en']), '4cd9278a35ba2305f47354ee13472260')      def test_youtube_subtitles_lang(self):          self.DL.params['writesubtitles'] = True -        self.DL.params['subtitleslang'] = 'it' +        self.DL.params['subtitleslangs'] = ['it']          subtitles = self.getSubtitles()          self.assertEqual(md5(subtitles['it']), '164a51f16f260476a05b50fe4c2f161d')      def test_youtube_allsubtitles(self): @@ -61,7 +61,7 @@ class TestYoutubeSubtitles(unittest.TestCase):      def test_youtube_automatic_captions(self):          self.url = '8YoUxe5ncPo'          self.DL.params['writeautomaticsub'] = True -        self.DL.params['subtitleslang'] = 'it' +        self.DL.params['subtitleslangs'] = ['it']          subtitles = self.getSubtitles()          self.assertTrue(subtitles['it'] is not None)      def test_youtube_nosubtitles(self): @@ -69,7 +69,14 @@ class TestYoutubeSubtitles(unittest.TestCase):          self.DL.params['allsubtitles'] = True          subtitles = self.getSubtitles()          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__':      unittest.main() diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py index 1fd610a6e..e9f29e680 100644 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -76,7 +76,7 @@ class YoutubeDL(object):      allsubtitles:      Downloads all the subtitles of the video      listsubtitles:     Lists all available subtitles for the video      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      daterange:         A DateRange object, download only if the upload_date is in the range.      skip_download:     Skip the actual download of the video file diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 5d686a928..2c2fd441c 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -83,6 +83,9 @@ def parseOpts(overrideArguments=None):          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():          columns = os.environ.get('COLUMNS', None)          if columns: @@ -203,9 +206,10 @@ def parseOpts(overrideArguments=None):      subtitles.add_option('--sub-format',              action='store', dest='subtitlesformat', metavar='FORMAT',              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',              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,          'listsubtitles': opts.listsubtitles,          'subtitlesformat': opts.subtitlesformat, -        'subtitleslang': opts.subtitleslang, +        'subtitleslangs': opts.subtitleslangs,          'matchtitle': decodeOption(opts.matchtitle),          'rejecttitle': decodeOption(opts.rejecttitle),          'max_downloads': opts.max_downloads, diff --git a/youtube_dl/extractor/subtitles.py b/youtube_dl/extractor/subtitles.py index caacea5fe..c10cdf266 100644 --- a/youtube_dl/extractor/subtitles.py +++ b/youtube_dl/extractor/subtitles.py @@ -21,24 +21,29 @@ class SubtitlesIE(InfoExtractor):      def _extract_subtitles(self, video_id):          """ 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 {} +        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 = {} -        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)              if subtitle:                  subtitles[sub_lang] = subtitle diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 370cc64cc..b3400df0a 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -160,7 +160,7 @@ class YoutubeSubtitlesIE(SubtitlesIE):      def _request_automatic_caption(self, video_id, webpage):          """We need the webpage for getting the captions url, pass it as an             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')          self.to_screen(u'%s: Looking for automatic captions' % video_id)          mobj = re.search(r';ytplayer.config = ({.*?});', webpage) | 
