diff options
| -rw-r--r-- | test/parameters.json | 3 | ||||
| -rw-r--r-- | test/test_youtube_subtitles.py | 7 | ||||
| -rw-r--r-- | youtube_dl/FileDownloader.py | 1 | ||||
| -rwxr-xr-x | youtube_dl/InfoExtractors.py | 26 | ||||
| -rw-r--r-- | youtube_dl/__init__.py | 4 | 
5 files changed, 33 insertions, 8 deletions
| diff --git a/test/parameters.json b/test/parameters.json index 750b1c96e..96998b5c3 100644 --- a/test/parameters.json +++ b/test/parameters.json @@ -39,5 +39,6 @@      "writeinfojson": true,       "writesubtitles": false,      "onlysubtitles": false, -    "allsubtitles": false +    "allsubtitles": false, +    "listssubtitles": false  } diff --git a/test/test_youtube_subtitles.py b/test/test_youtube_subtitles.py index 94adc4555..30f2246dd 100644 --- a/test/test_youtube_subtitles.py +++ b/test/test_youtube_subtitles.py @@ -43,6 +43,7 @@ class TestYoutubeSubtitles(unittest.TestCase):          DL.params['allsubtitles'] = False          DL.params['writesubtitles'] = False          DL.params['subtitlesformat'] = 'srt' +        DL.params['listsubtitles'] = False      def test_youtube_no_subtitles(self):          DL = FakeDownloader()          DL.params['writesubtitles'] = False @@ -88,6 +89,12 @@ class TestYoutubeSubtitles(unittest.TestCase):          info_dict = IE.extract('QRS8MkLhQmM')          sub = info_dict[0]['subtitles'][0]          self.assertEqual(md5(sub[2]), '13aeaa0c245a8bed9a451cb643e3ad8b') +    def test_youtube_list_subtitles(self): +        DL = FakeDownloader() +        DL.params['listsubtitles'] = True +        IE = YoutubeIE(DL) +        info_dict = IE.extract('QRS8MkLhQmM') +        self.assertEqual(info_dict, None)  if __name__ == '__main__':      unittest.main() diff --git a/youtube_dl/FileDownloader.py b/youtube_dl/FileDownloader.py index a041e1219..164d25e54 100644 --- a/youtube_dl/FileDownloader.py +++ b/youtube_dl/FileDownloader.py @@ -81,6 +81,7 @@ class FileDownloader(object):      writesubtitles:    Write the video subtitles to a file      onlysubtitles:     Downloads only the subtitles of the video      allsubtitles:      Downloads all the subtitles of the video +    listsubtitles:     Lists all available subtitles for the video      subtitlesformat:   Subtitle format [sbv/srt] (default=srt)      subtitleslang:     Language of the subtitles to download      test:              Download only first bytes to test the downloader. diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index 62522bb6c..ff1fab773 100755 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -214,11 +214,16 @@ class YoutubeIE(InfoExtractor):      def report_video_subtitles_download(self, video_id):          """Report attempt to download video info webpage.""" -        self._downloader.to_screen(u'[youtube] %s: Downloading video subtitles' % video_id) +        self._downloader.to_screen(u'[youtube] %s: Checking available subtitles' % video_id) -    def report_video_subtitles_request(self, video_id, lang): +    def report_video_subtitles_request(self, video_id, sub_lang, format):          """Report attempt to download video info webpage.""" -        self._downloader.to_screen(u'[youtube] %s: Downloading video subtitles for lang: %s' % (video_id,lang)) +        self._downloader.to_screen(u'[youtube] %s: Downloading video subtitles for %s.%s' % (video_id, sub_lang, format)) + +    def report_video_subtitles_available(self, video_id, sub_lang_list): +        """Report available subtitles.""" +        sub_lang = ",".join(list(sub_lang_list.keys())) +        self._downloader.to_screen(u'[youtube] %s: Available subtitles for video: %s' % (video_id, sub_lang))      def report_information_extraction(self, video_id):          """Report attempt to extract video information.""" @@ -233,6 +238,7 @@ class YoutubeIE(InfoExtractor):          self._downloader.to_screen(u'[youtube] RTMP download detected')      def _get_available_subtitles(self, video_id): +        self.report_video_subtitles_download(video_id)          request = compat_urllib_request.Request('http://video.google.com/timedtext?hl=en&type=list&v=%s' % video_id)          try:              sub_list = compat_urllib_request.urlopen(request).read().decode('utf-8') @@ -241,11 +247,15 @@ class YoutubeIE(InfoExtractor):          sub_lang_list = re.findall(r'name="([^"]*)"[^>]+lang_code="([\w\-]+)"', sub_list)          sub_lang_list = dict((l[1], l[0]) for l in sub_lang_list)          if not sub_lang_list: -            return (u'WARNING: video has no closed captions', None) +            return (u'WARNING: video doesn\'t have download', None)          return sub_lang_list +    def _list_available_subtitles(self, video_id): +        sub_lang_list = self._get_available_subtitles(video_id) +        self.report_video_subtitles_available(video_id, sub_lang_list) +      def _request_subtitle(self, sub_lang, sub_name, video_id, format): -        self.report_video_subtitles_request(video_id, sub_lang) +        self.report_video_subtitles_request(video_id, sub_lang, format)          params = compat_urllib_parse.urlencode({              'lang': sub_lang,              'name': sub_name, @@ -262,7 +272,6 @@ class YoutubeIE(InfoExtractor):          return (None, sub_lang, sub)      def _extract_subtitle(self, video_id): -        self.report_video_subtitles_download(video_id)          sub_lang_list = self._get_available_subtitles(video_id)          sub_format = self._downloader.params.get('subtitlesformat')          if self._downloader.params.get('subtitleslang', False): @@ -278,7 +287,6 @@ class YoutubeIE(InfoExtractor):          return [subtitle]      def _extract_all_subtitles(self, video_id): -        self.report_video_subtitles_download(video_id)          sub_lang_list = self._get_available_subtitles(video_id)          sub_format = self._downloader.params.get('subtitlesformat')          subtitles = [] @@ -523,6 +531,10 @@ class YoutubeIE(InfoExtractor):                  if sub_error:                      self._downloader.trouble(sub_error) +        if self._downloader.params.get('listsubtitles', False): +            sub_lang_list = self._list_available_subtitles(video_id) +            return +          if 'length_seconds' not in video_info:              self._downloader.trouble(u'WARNING: unable to extract video duration')              video_duration = '' diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 914d030a3..e5a7469af 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -182,6 +182,9 @@ def parseOpts():      video_format.add_option('--all-subs',              action='store_true', dest='allsubtitles',              help='downloads all the available subtitles of the video (currently youtube only)', default=False) +    video_format.add_option('--list-subs', +            action='store_true', dest='listsubtitles', +            help='lists all available subtitles for the video (currently youtube only)', default=False)      video_format.add_option('--sub-format',              action='store', dest='subtitlesformat', metavar='LANG',              help='subtitle format [srt/sbv] (default=srt) (currently youtube only)', default='srt') @@ -461,6 +464,7 @@ def _real_main():          'writesubtitles': opts.writesubtitles,          'onlysubtitles': opts.onlysubtitles,          'allsubtitles': opts.allsubtitles, +        'listsubtitles': opts.listsubtitles,          'subtitlesformat': opts.subtitlesformat,          'subtitleslang': opts.subtitleslang,          'matchtitle': decodeOption(opts.matchtitle), | 
