X-Git-Url: https://git.rapsys.eu/.gitweb.cgi/youtubedl/blobdiff_plain/d4ff594119bc679aa175947eb59a97bee8f966f4..402fc8d6fcee10c8f3c793e6a89cd51cc98e4712:/youtube_dl/extractor/twitch.py
diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py
index 87290d0..bbba394 100644
--- a/youtube_dl/extractor/twitch.py
+++ b/youtube_dl/extractor/twitch.py
@@ -7,13 +7,23 @@ import random
 
 from .common import InfoExtractor
 from ..compat import (
+    compat_HTTPError,
+    compat_parse_qs,
     compat_str,
-    compat_urllib_parse,
-    compat_urllib_request,
+    compat_urllib_parse_urlencode,
+    compat_urllib_parse_urlparse,
+    compat_urlparse,
 )
 from ..utils import (
+    clean_html,
     ExtractorError,
+    int_or_none,
+    js_to_json,
+    orderedSet,
+    parse_duration,
     parse_iso8601,
+    update_url_query,
+    urlencode_postdata,
 )
 
 
@@ -21,8 +31,10 @@ class TwitchBaseIE(InfoExtractor):
     _VALID_URL_BASE = r'https?://(?:www\.)?twitch\.tv'
 
     _API_BASE = 'https://api.twitch.tv'
-    _USHER_BASE = 'http://usher.twitch.tv'
-    _LOGIN_URL = 'https://secure.twitch.tv/user/login'
+    _USHER_BASE = 'https://usher.ttvnw.net'
+    _LOGIN_URL = 'http://www.twitch.tv/login'
+    _CLIENT_ID = 'jzkbprff40iqj646a697cyrvl0zt2m6'
+    _NETRC_MACHINE = 'twitch'
 
     def _handle_error(self, response):
         if not isinstance(response, dict):
@@ -33,8 +45,10 @@ class TwitchBaseIE(InfoExtractor):
                 '%s returned error: %s - %s' % (self.IE_NAME, error, response.get('message')),
                 expected=True)
 
-    def _download_json(self, url, video_id, note='Downloading JSON metadata'):
-        response = super(TwitchBaseIE, self)._download_json(url, video_id, note)
+    def _call_api(self, path, item_id, note):
+        response = self._download_json(
+            '%s/%s' % (self._API_BASE, path), item_id, note,
+            headers={'Client-ID': self._CLIENT_ID})
         self._handle_error(response)
         return response
 
@@ -46,47 +60,71 @@ class TwitchBaseIE(InfoExtractor):
         if username is None:
             return
 
-        login_page = self._download_webpage(
+        def fail(message):
+            raise ExtractorError(
+                'Unable to login. Twitch said: %s' % message, expected=True)
+
+        login_page, handle = self._download_webpage_handle(
             self._LOGIN_URL, None, 'Downloading login page')
 
-        authenticity_token = self._search_regex(
-            r']*>(?P[^<]+)", response)
-        if m:
-            raise ExtractorError(
-                'Unable to login: %s' % m.group('msg').strip(), expected=True)
+        login_form.update({
+            'username': username,
+            'password': password,
+        })
+
+        redirect_url = handle.geturl()
+
+        post_url = self._search_regex(
+            r'