Skip to content

Commit

Permalink
[yandexmusic:playlist] Request missing tracks in chunks (closes #27355,
Browse files Browse the repository at this point in the history
closes #28184)
  • Loading branch information
dstftw committed Feb 16, 2021
1 parent 646052e commit a363fb5
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions youtube_dl/extractor/yandexmusic.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -209,17 +210,27 @@ def _extract_tracks(self, source, item_id, url, tld):
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

Expand Down

0 comments on commit a363fb5

Please sign in to comment.