|
|
|
@ -1,8 +1,9 @@
|
|
|
|
|
# coding: utf-8
|
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
|
|
import re
|
|
|
|
|
import hashlib
|
|
|
|
|
import itertools
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
from .common import InfoExtractor
|
|
|
|
|
from ..compat import compat_str
|
|
|
|
@ -209,17 +210,27 @@ class YandexMusicPlaylistBaseIE(YandexMusicBaseIE):
|
|
|
|
|
missing_track_ids = [
|
|
|
|
|
track_id for track_id in track_ids
|
|
|
|
|
if track_id not in present_track_ids]
|
|
|
|
|
missing_tracks = self._call_api(
|
|
|
|
|
'track-entries', tld, url, item_id,
|
|
|
|
|
'Downloading missing tracks JSON', {
|
|
|
|
|
'entries': ','.join(missing_track_ids),
|
|
|
|
|
'lang': tld,
|
|
|
|
|
'external-domain': 'music.yandex.%s' % tld,
|
|
|
|
|
'overembed': 'false',
|
|
|
|
|
'strict': 'true',
|
|
|
|
|
})
|
|
|
|
|
if missing_tracks:
|
|
|
|
|
tracks.extend(missing_tracks)
|
|
|
|
|
# Request missing tracks in chunks to avoid exceeding max HTTP header size,
|
|
|
|
|
# see https://github.com/ytdl-org/youtube-dl/issues/27355
|
|
|
|
|
_TRACKS_PER_CHUNK = 250
|
|
|
|
|
for chunk_num in itertools.count(0):
|
|
|
|
|
start = chunk_num * _TRACKS_PER_CHUNK
|
|
|
|
|
end = start + _TRACKS_PER_CHUNK
|
|
|
|
|
missing_track_ids_req = missing_track_ids[start:end]
|
|
|
|
|
assert missing_track_ids_req
|
|
|
|
|
missing_tracks = self._call_api(
|
|
|
|
|
'track-entries', tld, url, item_id,
|
|
|
|
|
'Downloading missing tracks JSON chunk %d' % (chunk_num + 1), {
|
|
|
|
|
'entries': ','.join(missing_track_ids_req),
|
|
|
|
|
'lang': tld,
|
|
|
|
|
'external-domain': 'music.yandex.%s' % tld,
|
|
|
|
|
'overembed': 'false',
|
|
|
|
|
'strict': 'true',
|
|
|
|
|
})
|
|
|
|
|
if missing_tracks:
|
|
|
|
|
tracks.extend(missing_tracks)
|
|
|
|
|
if end >= len(missing_track_ids):
|
|
|
|
|
break
|
|
|
|
|
|
|
|
|
|
return tracks
|
|
|
|
|
|
|
|
|
|