diff options
Diffstat (limited to 'youtube_dl/extractor/fc2.py')
| -rw-r--r-- | youtube_dl/extractor/fc2.py | 58 | 
1 files changed, 55 insertions, 3 deletions
| diff --git a/youtube_dl/extractor/fc2.py b/youtube_dl/extractor/fc2.py index 81ceace53..1ccc1a964 100644 --- a/youtube_dl/extractor/fc2.py +++ b/youtube_dl/extractor/fc2.py @@ -5,6 +5,7 @@ import hashlib  from .common import InfoExtractor  from ..compat import ( +    compat_urllib_parse,      compat_urllib_request,      compat_urlparse,  ) @@ -16,7 +17,8 @@ from ..utils import (  class FC2IE(InfoExtractor):      _VALID_URL = r'^http://video\.fc2\.com/(?:[^/]+/)?content/(?P<id>[^/]+)'      IE_NAME = 'fc2' -    _TEST = { +    _NETRC_MACHINE = 'fc2' +    _TESTS = [{          'url': 'http://video.fc2.com/en/content/20121103kUan1KHs',          'md5': 'a6ebe8ebe0396518689d963774a54eb7',          'info_dict': { @@ -24,12 +26,57 @@ class FC2IE(InfoExtractor):              'ext': 'flv',              'title': 'Boxing again with Puff',          }, -    } +    }, { +        'url': 'http://video.fc2.com/en/content/20150125cEva0hDn/', +        'info_dict': { +            'id': '20150125cEva0hDn', +            'ext': 'mp4', +        }, +        'params': { +            'username': 'ytdl@yt-dl.org', +            'password': '(snip)', +            'skip': 'requires actual password' +        } +    }] + +    def _login(self): +        (username, password) = self._get_login_info() +        if username is None or password is None: +            return False + +        # Log in +        login_form_strs = { +            'email': username, +            'password': password, +            'done': 'video', +            'Submit': ' Login ', +        } + +        # Convert to UTF-8 *before* urlencode because Python 2.x's urlencode +        # chokes on unicode +        login_form = dict((k.encode('utf-8'), v.encode('utf-8')) for k, v in login_form_strs.items()) +        login_data = compat_urllib_parse.urlencode(login_form).encode('utf-8') +        request = compat_urllib_request.Request( +            'https://secure.id.fc2.com/index.php?mode=login&switch_language=en', login_data) + +        login_results = self._download_webpage(request, None, note='Logging in', errnote='Unable to log in') +        if 'mode=redirect&login=done' not in login_results: +            self.report_warning('unable to log in: bad username or password') +            return False + +        # this is also needed +        login_redir = compat_urllib_request.Request('http://id.fc2.com/?mode=redirect&login=done') +        self._download_webpage( +            login_redir, None, note='Login redirect', errnote='Login redirect failed') + +        return True      def _real_extract(self, url):          video_id = self._match_id(url) +        self._login()          webpage = self._download_webpage(url, video_id)          self._downloader.cookiejar.clear_session_cookies()  # must clear +        self._login()          title = self._og_search_title(webpage)          thumbnail = self._og_search_thumbnail(webpage) @@ -46,7 +93,12 @@ class FC2IE(InfoExtractor):          info = compat_urlparse.parse_qs(info_webpage)          if 'err_code' in info: -            raise ExtractorError('Error code: %s' % info['err_code'][0]) +            # most of the time we can still download wideo even if err_code is 403 or 602 +            self.report_warning( +                'Error code was: %s... but still trying' % info['err_code'][0]) + +        if 'filepath' not in info: +            raise ExtractorError('Cannot download file. Are you logged in?')          video_url = info['filepath'][0] + '?mid=' + info['mid'][0]          title_info = info.get('title') | 
