diff options
Diffstat (limited to 'youtube_dl/extractor')
| -rw-r--r-- | youtube_dl/extractor/common.py | 9 | ||||
| -rw-r--r-- | youtube_dl/extractor/indavideo.py | 2 | ||||
| -rw-r--r-- | youtube_dl/extractor/twitch.py | 27 | 
3 files changed, 28 insertions, 10 deletions
diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 402f2f436..07bd2cbe2 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -15,13 +15,14 @@ import math  from ..compat import (      compat_cookiejar,      compat_cookies, +    compat_etree_fromstring,      compat_getpass,      compat_http_client, +    compat_os_name, +    compat_str,      compat_urllib_error,      compat_urllib_parse,      compat_urlparse, -    compat_str, -    compat_etree_fromstring,  )  from ..utils import (      NO_DEFAULT, @@ -427,7 +428,7 @@ class InfoExtractor(object):              self.to_screen('Saving request to ' + filename)              # Working around MAX_PATH limitation on Windows (see              # http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx) -            if os.name == 'nt': +            if compat_os_name == 'nt':                  absfilepath = os.path.abspath(filename)                  if len(absfilepath) > 259:                      filename = '\\\\?\\' + absfilepath @@ -596,7 +597,7 @@ class InfoExtractor(object):                  if mobj:                      break -        if not self._downloader.params.get('no_color') and os.name != 'nt' and sys.stderr.isatty(): +        if not self._downloader.params.get('no_color') and compat_os_name != 'nt' and sys.stderr.isatty():              _name = '\033[0;34m%s\033[0m' % name          else:              _name = name diff --git a/youtube_dl/extractor/indavideo.py b/youtube_dl/extractor/indavideo.py index 12fb5e8e1..9622f198a 100644 --- a/youtube_dl/extractor/indavideo.py +++ b/youtube_dl/extractor/indavideo.py @@ -73,7 +73,7 @@ class IndavideoEmbedIE(InfoExtractor):              'url': self._proto_relative_url(thumbnail)          } for thumbnail in video.get('thumbnails', [])] -        tags = [tag['title'] for tag in video.get('tags', [])] +        tags = [tag['title'] for tag in video.get('tags') or []]          return {              'id': video.get('id') or video_id, diff --git a/youtube_dl/extractor/twitch.py b/youtube_dl/extractor/twitch.py index 5b8586097..8639293e3 100644 --- a/youtube_dl/extractor/twitch.py +++ b/youtube_dl/extractor/twitch.py @@ -17,6 +17,7 @@ from ..utils import (      encode_dict,      ExtractorError,      int_or_none, +    orderedSet,      parse_duration,      parse_iso8601,      sanitized_Request, @@ -281,17 +282,36 @@ class TwitchPlaylistBaseIE(TwitchBaseIE):          entries = []          offset = 0          limit = self._PAGE_LIMIT +        broken_paging_detected = False +        counter_override = None          for counter in itertools.count(1):              response = self._download_json(                  self._PLAYLIST_URL % (channel_id, offset, limit), -                channel_id, 'Downloading %s videos JSON page %d' % (self._PLAYLIST_TYPE, counter)) +                channel_id, +                'Downloading %s videos JSON page %s' +                % (self._PLAYLIST_TYPE, counter_override or counter))              page_entries = self._extract_playlist_page(response)              if not page_entries:                  break +            total = int_or_none(response.get('_total')) +            # Since the beginning of March 2016 twitch's paging mechanism +            # is completely broken on the twitch side. It simply ignores +            # a limit and returns the whole offset number of videos. +            # Working around by just requesting all videos at once. +            if not broken_paging_detected and total and len(page_entries) > limit: +                self.report_warning( +                    'Twitch paging is broken on twitch side, requesting all videos at once', +                    channel_id) +                broken_paging_detected = True +                offset = total +                counter_override = '(all at once)' +                continue              entries.extend(page_entries) +            if broken_paging_detected or total and len(page_entries) >= total: +                break              offset += limit          return self.playlist_result( -            [self.url_result(entry) for entry in set(entries)], +            [self.url_result(entry) for entry in orderedSet(entries)],              channel_id, channel_name)      def _extract_playlist_page(self, response): @@ -303,7 +323,6 @@ class TwitchPlaylistBaseIE(TwitchBaseIE):  class TwitchProfileIE(TwitchPlaylistBaseIE): -    _WORKING = False      IE_NAME = 'twitch:profile'      _VALID_URL = r'%s/(?P<id>[^/]+)/profile/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE      _PLAYLIST_TYPE = 'profile' @@ -319,7 +338,6 @@ class TwitchProfileIE(TwitchPlaylistBaseIE):  class TwitchPastBroadcastsIE(TwitchPlaylistBaseIE): -    _WORKING = False      IE_NAME = 'twitch:past_broadcasts'      _VALID_URL = r'%s/(?P<id>[^/]+)/profile/past_broadcasts/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE      _PLAYLIST_URL = TwitchPlaylistBaseIE._PLAYLIST_URL + '&broadcasts=true' @@ -336,7 +354,6 @@ class TwitchPastBroadcastsIE(TwitchPlaylistBaseIE):  class TwitchBookmarksIE(TwitchPlaylistBaseIE): -    _WORKING = False      IE_NAME = 'twitch:bookmarks'      _VALID_URL = r'%s/(?P<id>[^/]+)/profile/bookmarks/?(?:\#.*)?$' % TwitchBaseIE._VALID_URL_BASE      _PLAYLIST_URL = '%s/api/bookmark/?user=%%s&offset=%%d&limit=%%d' % TwitchBaseIE._API_BASE  | 
