1
0
mirror of https://github.com/yt-dlp/yt-dlp.git synced 2025-06-28 09:28:33 +00:00

feat: playlist extractor

This commit is contained in:
DarkCat09 2025-03-21 23:50:30 +04:00
parent 66994d979e
commit 2d24666915
No known key found for this signature in database

View File

@ -776,8 +776,6 @@ def _real_extract(self, url):
track_id = mobj.group('track_id') track_id = mobj.group('track_id')
playlist_id = mobj.group('playlist_id') playlist_id = mobj.group('playlist_id')
# TODO: playlist
if track_id: if track_id:
webpage = self._download_webpage(url, track_id) webpage = self._download_webpage(url, track_id)
data_exec = extract_attributes( data_exec = extract_attributes(
@ -819,6 +817,55 @@ def _real_extract(self, url):
}], }],
} }
elif playlist_id:
playlist = self._download_payload('al_audio', playlist_id, {
'act': 'load_section',
'access_hash': '', # TODO: unnecessary, but it's better to parse from url if access_hash is present
'claim': '0',
'context': '',
'from_id': self._parse_vk_id(), # TODO: or '0'
'is_loading_all': '1',
'is_preload': '0',
'offset': '0',
'owner_id': '',
'playlist_id': '',
'ref': '',
'type': 'playlist',
})
meta = self._parse_json(playlist, playlist_id)[0]
tracks = meta['list']
entries = []
for ent in tracks:
# XXX: repeating code
# meta-parsers for track and playlist items should be unified
title = ent[3]
artist = ent[4]
track_id = f'{ent[1]}_{ent[0]}'
audio_url = f'https://vk.com/audio{track_id}'
entries.append(self.url_result(
audio_url, VKMusicIE, track_id,
join_nonempty(artist, title, delim=' - '),
track=title, artist=artist, uploader=artist,
duration=int_or_none(ent[5]),
thumbnails=[meta[14]]
))
artist = meta.get('authorName')
thumbnail = meta.get('coverUrl')
return self.playlist_result(
entries, playlist_id,
meta.get('title'), # TODO: maybe also "artist - title"?
meta.get('description'),
uploader=artist, artist=artist,
thumbnails=[thumbnail] if thumbnail else None,
# TODO: there are even more useful metadata
)
class VKPlayBaseIE(InfoExtractor): class VKPlayBaseIE(InfoExtractor):
_BASE_URL_RE = r'https?://(?:vkplay\.live|live\.vk(?:play|video)\.ru)/' _BASE_URL_RE = r'https?://(?:vkplay\.live|live\.vk(?:play|video)\.ru)/'