]> git.bitcoin.ninja Git - youtube-dl/commitdiff
Merge pull request #3180 from hakatashi/niconico-without-authentication
authorSergey M. <dstftw@gmail.com>
Fri, 4 Jul 2014 15:25:05 +0000 (22:25 +0700)
committerSergey M. <dstftw@gmail.com>
Fri, 4 Jul 2014 15:25:05 +0000 (22:25 +0700)
[niconico] Download without authentication

1  2 
youtube_dl/extractor/niconico.py

index 31f60041cf7c5958f6b770a51e3d6cccee79fc3b,ba7464cb8786e988fdeb5af7b14eeb3c73a07032..d981312711aa31796bb2a33ddf9f5f4fbcd00737
@@@ -8,10 -8,10 +8,10 @@@ from ..utils import 
      compat_urllib_parse,
      compat_urllib_request,
      compat_urlparse,
 -    compat_str,
 -
      ExtractorError,
      unified_strdate,
 +    parse_duration,
 +    int_or_none,
  )
  
  
@@@ -30,7 -30,6 +30,7 @@@ class NiconicoIE(InfoExtractor)
              'uploader_id': '2698420',
              'upload_date': '20131123',
              'description': '(c) copyright 2008, Blender Foundation / www.bigbuckbunny.org',
 +            'duration': 33,
          },
          'params': {
              'username': 'ydl.niconico@gmail.com',
          },
      }
  
 -    _VALID_URL = r'^https?://(?:www\.|secure\.)?nicovideo\.jp/watch/([a-z][a-z][0-9]+)(?:.*)$'
 +    _VALID_URL = r'https?://(?:www\.|secure\.)?nicovideo\.jp/watch/((?:[a-z]{2})?[0-9]+)'
      _NETRC_MACHINE = 'niconico'
+     # Determine whether the downloader uses authentication to download video
+     _AUTHENTICATE = False
  
      def _real_initialize(self):
-         self._login()
+         if self._downloader.params.get('username', None) is not None:
+             self._AUTHENTICATE = True
+         if self._AUTHENTICATE:
+             self._login()
  
      def _login(self):
          (username, password) = self._get_login_info()
-         if username is None:
-             # Login is required
-             raise ExtractorError('No login info available, needed for using %s.' % self.IE_NAME, expected=True)
  
          # Log in
          login_form_strs = {
              'http://ext.nicovideo.jp/api/getthumbinfo/' + video_id, video_id,
              note='Downloading video info page')
  
-         # Get flv info
-         flv_info_webpage = self._download_webpage(
-             'http://flapi.nicovideo.jp/api/getflv?v=' + video_id,
-             video_id, 'Downloading flv info')
+         if self._AUTHENTICATE:
+             # Get flv info
+             flv_info_webpage = self._download_webpage(
+                 'http://flapi.nicovideo.jp/api/getflv?v=' + video_id,
+                 video_id, 'Downloading flv info')
+         else:
+             # Get external player info
+             ext_player_info = self._download_webpage(
+                 'http://ext.nicovideo.jp/thumb_watch/' + video_id, video_id)
+             thumb_play_key = self._search_regex(
+                 r'\'thumbPlayKey\'\s*:\s*\'(.*?)\'', ext_player_info, 'thumbPlayKey')
+             # Get flv info
+             flv_info_data = compat_urllib_parse.urlencode({
+                 'k': thumb_play_key,
+                 'v': video_id
+             })
+             flv_info_request = compat_urllib_request.Request(
+                 'http://ext.nicovideo.jp/thumb_watch', flv_info_data,
+                 {'Content-Type': 'application/x-www-form-urlencoded'})
+             flv_info_webpage = self._download_webpage(
+                 flv_info_request, video_id,
+                 note='Downloading flv info', errnote='Unable to download flv info')
          video_real_url = compat_urlparse.parse_qs(flv_info_webpage)['url'][0]
  
          # Start extracting information
 -        video_title = video_info.find('.//title').text
 -        video_extension = video_info.find('.//movie_type').text
 -        video_format = video_extension.upper()
 -        video_thumbnail = video_info.find('.//thumbnail_url').text
 -        video_description = video_info.find('.//description').text
 -        video_uploader_id = video_info.find('.//user_id').text
 -        video_upload_date = unified_strdate(video_info.find('.//first_retrieve').text.split('+')[0])
 -        video_view_count = video_info.find('.//view_counter').text
 -        video_webpage_url = video_info.find('.//watch_url').text
 -
 -        # uploader
 -        video_uploader = video_uploader_id
 -        url = 'http://seiga.nicovideo.jp/api/user/info?id=' + video_uploader_id
 -        try:
 -            user_info = self._download_xml(
 -                url, video_id, note='Downloading user information')
 -            video_uploader = user_info.find('.//nickname').text
 -        except ExtractorError as err:
 -            self._downloader.report_warning('Unable to download user info webpage: %s' % compat_str(err))
 +        title = video_info.find('.//title').text
 +        extension = video_info.find('.//movie_type').text
 +        video_format = extension.upper()
 +        thumbnail = video_info.find('.//thumbnail_url').text
 +        description = video_info.find('.//description').text
 +        upload_date = unified_strdate(video_info.find('.//first_retrieve').text.split('+')[0])
 +        view_count = int_or_none(video_info.find('.//view_counter').text)
 +        comment_count = int_or_none(video_info.find('.//comment_num').text)
 +        duration = parse_duration(video_info.find('.//length').text)
 +        webpage_url = video_info.find('.//watch_url').text
 +
 +        if video_info.find('.//ch_id') is not None:
 +            uploader_id = video_info.find('.//ch_id').text
 +            uploader = video_info.find('.//ch_name').text
 +        elif video_info.find('.//user_id') is not None:
 +            uploader_id = video_info.find('.//user_id').text
 +            uploader = video_info.find('.//user_nickname').text
 +        else:
 +            uploader_id = uploader = None
  
          return {
              'id': video_id,
              'url': video_real_url,
 -            'title': video_title,
 -            'ext': video_extension,
 +            'title': title,
 +            'ext': extension,
              'format': video_format,
 -            'thumbnail': video_thumbnail,
 -            'description': video_description,
 -            'uploader': video_uploader,
 -            'upload_date': video_upload_date,
 -            'uploader_id': video_uploader_id,
 -            'view_count': video_view_count,
 -            'webpage_url': video_webpage_url,
 +            'thumbnail': thumbnail,
 +            'description': description,
 +            'uploader': uploader,
 +            'upload_date': upload_date,
 +            'uploader_id': uploader_id,
 +            'view_count': view_count,
 +            'comment_count': comment_count,
 +            'duration': duration,
 +            'webpage_url': webpage_url,
          }