ytdl-org/youtube-dl · error · ExtractorError
QQ Music said: error %d in fetching playlist info
Error message
QQ Music said: error %d in fetching playlist info
What it means
QQPlaylistIE._real_extract raises ExtractorError('QQ Music said: error %d in fetching playlist info' % code, expected=True) when the playlist API (fcg_ucc_getcdinfo_by_ids_cp.fcg, parsed via strip_jsonp) returns an empty cdlist array AND the response contains a non-zero/falsy-safe 'code' field. The numeric code is QQ Music's own server error code for the failed dissid lookup.
Source
Thrown at youtube_dl/extractor/qqmusic.py:357
'info_dict': {
'id': '1374105607',
'title': '易入人心的华语民谣',
'description': '民谣的歌曲易于传唱、、歌词朗朗伤口、旋律简单温馨。属于那种才入耳孔。却上心头的感觉。没有太多的复杂情绪。简单而直接地表达乐者的情绪,就是这样的简单才易入人心。',
},
'playlist_count': 20,
}]
def _real_extract(self, url):
list_id = self._match_id(url)
list_json = self._download_json(
'http://i.y.qq.com/qzone-music/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg',
list_id, 'Download list page',
query={'type': 1, 'json': 1, 'utf8': 1, 'onlysong': 0, 'disstid': list_id},
transform_source=strip_jsonp)
if not len(list_json.get('cdlist', [])):
if list_json.get('code'):
raise ExtractorError(
'QQ Music said: error %d in fetching playlist info' % list_json['code'],
expected=True)
raise ExtractorError('Unable to get playlist info')
cdlist = list_json['cdlist'][0]
entries = [self.url_result(
'https://y.qq.com/n/yqq/song/' + song['songmid'] + '.html', 'QQMusic', song['songmid'])
for song in cdlist['songlist']]
list_name = cdlist.get('dissname')
list_description = clean_html(unescapeHTML(cdlist.get('desc')))
return self.playlist_result(entries, list_id, list_name, list_description)
View on GitHub (pinned to 956b8c5855)
Solutions
- Open the playlist URL (https://y.qq.com/n/yqq/playlist/<id>.html) in a browser to confirm it still exists.
- If the code indicates region restriction, access via a CN egress point.
- Re-copy the playlist URL from QQ Music to rule out ID transcription errors.
- Skip the dead playlist in batch jobs and proceed.
Defensive patterns
Strategy: try-catch
Try / catch
try:
info = ydl.extract_info(url)
except ExtractorError as e:
if 'error' in str(e) and 'fetching playlist info' in str(e):
mark_dead(url) # server rejected the disstid Prevention
- Validate playlist ids by opening the y.qq.com page before batch jobs.
- Record the numeric QQ error code in logs to classify deletions vs region blocks.
- Do not retry — the server-side verdict for that disstid is stable.
When it happens
Trigger: Requesting a y.qq.com playlist URL whose disstid does not exist, was deleted, or is region-blocked; the JSONP endpoint returns {'code': <n>, 'cdlist': []}. Only raised when code is truthy — otherwise the generic 'Unable to get playlist info' path fires.
Common situations: Copied playlist IDs from old shares after the playlist was removed; playlists restricted to mainland-China IPs; ID typo in hand-built URLs.
Related errors
- Course %s does not exist
- %s: No songs found, try using proxy
- Unable to get playlist info
- No chapters found for course %s
- YouTube said: %s
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/1e9a7b0e3c95d9e0.
Report an issue: GitHub.