|
|
|
@ -1153,13 +1153,13 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
| p/
|
|
|
|
|
)
|
|
|
|
|
(
|
|
|
|
|
(?:PL|LL|EC|UU|FL|RD)?[0-9A-Za-z-_]{10,}
|
|
|
|
|
(?:PL|LL|EC|UU|FL|RD|UL)?[0-9A-Za-z-_]{10,}
|
|
|
|
|
# Top tracks, they can also include dots
|
|
|
|
|
|(?:MC)[\w\.]*
|
|
|
|
|
)
|
|
|
|
|
.*
|
|
|
|
|
|
|
|
|
|
|
((?:PL|LL|EC|UU|FL|RD)[0-9A-Za-z-_]{10,})
|
|
|
|
|
((?:PL|LL|EC|UU|FL|RD|UL)[0-9A-Za-z-_]{10,})
|
|
|
|
|
)"""
|
|
|
|
|
_TEMPLATE_URL = 'https://www.youtube.com/playlist?list=%s'
|
|
|
|
|
_VIDEO_RE = r'href="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})&[^"]*?index=(?P<index>\d+)'
|
|
|
|
@ -1244,7 +1244,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
for vid_id in ids]
|
|
|
|
|
|
|
|
|
|
def _extract_mix(self, playlist_id):
|
|
|
|
|
# The mixes are generated from a a single video
|
|
|
|
|
# The mixes are generated from a single video
|
|
|
|
|
# the id of the playlist is just 'RD' + video_id
|
|
|
|
|
url = 'https://youtube.com/watch?v=%s&list=%s' % (playlist_id[-11:], playlist_id)
|
|
|
|
|
webpage = self._download_webpage(
|
|
|
|
@ -1280,7 +1280,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor):
|
|
|
|
|
else:
|
|
|
|
|
self.to_screen('Downloading playlist %s - add --no-playlist to just download video %s' % (playlist_id, video_id))
|
|
|
|
|
|
|
|
|
|
if playlist_id.startswith('RD'):
|
|
|
|
|
if playlist_id.startswith('RD') or playlist_id.startswith('UL'):
|
|
|
|
|
# Mixes require a custom extraction process
|
|
|
|
|
return self._extract_mix(playlist_id)
|
|
|
|
|
|
|
|
|
|