diff options
| -rw-r--r-- | youtube_dl/extractor/extractors.py | 1 | ||||
| -rw-r--r-- | youtube_dl/extractor/youtube.py | 55 | 
2 files changed, 36 insertions, 20 deletions
| diff --git a/youtube_dl/extractor/extractors.py b/youtube_dl/extractor/extractors.py index 03aff1d52..575b4b36f 100644 --- a/youtube_dl/extractor/extractors.py +++ b/youtube_dl/extractor/extractors.py @@ -1520,6 +1520,7 @@ from .youtube import (      YoutubeSubscriptionsIE,      YoutubeTruncatedIDIE,      YoutubeTruncatedURLIE, +    YoutubeYtBeIE,      YoutubeYtUserIE,      YoutubeWatchLaterIE,  ) diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index b796f58b2..b8219a0ad 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -3139,8 +3139,7 @@ class YoutubePlaylistIE(InfoExtractor):                          (?:                              (?:                                  youtube(?:kids)?\.com| -                                invidio\.us| -                                youtu\.be +                                invidio\.us                              )                              /.*?\?.*?\blist=                          )? @@ -3185,6 +3184,32 @@ class YoutubePlaylistIE(InfoExtractor):              'uploader_id': 'UC21nz3_MesPLqtDqwdvnoxA',          }      }, { +        'url': 'TLGGrESM50VT6acwMjAyMjAxNw', +        'only_matching': True, +    }, { +        # music album playlist +        'url': 'OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhM', +        'only_matching': True, +    }] + +    @classmethod +    def suitable(cls, url): +        return False if YoutubeTabIE.suitable(url) else super( +            YoutubePlaylistIE, cls).suitable(url) + +    def _real_extract(self, url): +        playlist_id = self._match_id(url) +        qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) +        if not qs: +            qs = {'list': playlist_id} +        return self.url_result( +            update_url_query('https://www.youtube.com/playlist', qs), +            ie=YoutubeTabIE.ie_key(), video_id=playlist_id) + + +class YoutubeYtBeIE(InfoExtractor): +    _VALID_URL = r'https?://youtu\.be/(?P<id>[0-9A-Za-z_-]{11})/*?.*?\blist=(?P<playlist_id>%(playlist_id)s)' % {'playlist_id': YoutubeBaseInfoExtractor._PLAYLIST_ID_RE} +    _TESTS = [{          'url': 'https://youtu.be/yeWKywCrFtk?list=PL2qgrgXsNUG5ig9cat4ohreBjYLAPC0J5',          'info_dict': {              'id': 'yeWKywCrFtk', @@ -3207,28 +3232,18 @@ class YoutubePlaylistIE(InfoExtractor):      }, {          'url': 'https://youtu.be/uWyaPkt-VOI?list=PL9D9FC436B881BA21',          'only_matching': True, -    }, { -        'url': 'TLGGrESM50VT6acwMjAyMjAxNw', -        'only_matching': True, -    }, { -        # music album playlist -        'url': 'OLAK5uy_m4xAFdmMC5rX3Ji3g93pQe3hqLZw_9LhM', -        'only_matching': True,      }] -    @classmethod -    def suitable(cls, url): -        return False if YoutubeTabIE.suitable(url) else super( -            YoutubePlaylistIE, cls).suitable(url) -      def _real_extract(self, url): -        playlist_id = self._match_id(url) -        qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query) -        if not qs: -            qs = {'list': playlist_id} +        mobj = re.match(self._VALID_URL, url) +        video_id = mobj.group('id') +        playlist_id = mobj.group('playlist_id')          return self.url_result( -            update_url_query('https://www.youtube.com/playlist', qs), -            ie=YoutubeTabIE.ie_key(), video_id=playlist_id) +            update_url_query('https://www.youtube.com/watch', { +                'v': video_id, +                'list': playlist_id, +                'feature': 'youtu.be', +            }), ie=YoutubeTabIE.ie_key(), video_id=playlist_id)  class YoutubeYtUserIE(InfoExtractor): | 
