diff options
author | Sergey M․ <dstftw@gmail.com> | 2020-12-09 03:40:02 +0700 |
---|---|---|
committer | Sergey M․ <dstftw@gmail.com> | 2020-12-09 03:40:02 +0700 |
commit | e00b8f60d4ad662d1737e80f154f7afeb738494c (patch) | |
tree | be1babb13f84e59f0ed7b0e5d42e233d1b4b1b8b | |
parent | 644c3ef886c3e7c4974658202c2761cc6570f93a (diff) |
[youtube:tab] Delegate inline playlists to tab-based playlists (closes #27298)
-rw-r--r-- | youtube_dl/extractor/youtube.py | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 438a93b17..a3f75b626 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -2688,6 +2688,10 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor): # no longer available? 'url': 'https://www.youtube.com/feed/recommended', 'only_matching': True, + }, { + # inline playlist with not always working continuations + 'url': 'https://www.youtube.com/watch?v=UC6u0Tct-Fo&list=PL36D642111D65BE7C', + 'only_matching': True, } # TODO # { @@ -3099,10 +3103,20 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor): playlist.update(self._extract_uploader(data)) return playlist - def _extract_from_playlist(self, item_id, data, playlist): + def _extract_from_playlist(self, item_id, url, data, playlist): title = playlist.get('title') or try_get( data, lambda x: x['titleText']['simpleText'], compat_str) playlist_id = playlist.get('playlistId') or item_id + # Inline playlist rendition continuation does not always work + # at Youtube side, so delegating regular tab-based playlist URL + # processing whenever possible. + playlist_url = urljoin(url, try_get( + playlist, lambda x: x['endpoint']['commandMetadata']['webCommandMetadata']['url'], + compat_str)) + if playlist_url and playlist_url != url: + return self.url_result( + playlist_url, ie=YoutubeTabIE.ie_key(), video_id=playlist_id, + video_title=title) return self.playlist_result( self._playlist_entries(playlist), playlist_id=playlist_id, playlist_title=title) @@ -3132,7 +3146,7 @@ class YoutubeTabIE(YoutubeBaseInfoExtractor): playlist = try_get( data, lambda x: x['contents']['twoColumnWatchNextResults']['playlist']['playlist'], dict) if playlist: - return self._extract_from_playlist(item_id, data, playlist) + return self._extract_from_playlist(item_id, url, data, playlist) # Fallback to video extraction if no playlist alike page is recognized. # First check for the current video then try the v attribute of URL query. video_id = try_get( |