ytdl-org/youtube-dl · error · ExtractorError
%s reports error: %s
Error message
%s reports error: %s
What it means
Raised by NiconicoIE for any video info XML error code other than DELETED, NOT_FOUND, or COMMUNITY — an unclassified site-side error. The raw code string is appended so users can see what Niconico reported. Not marked expected=True, because the set of possible codes is open-ended.
Source
Thrown at youtube_dl/extractor/niconico.py:422
items = [items]
for item in items:
ret = xpath_text(video_info_xml, './/' + item)
if ret:
return ret
if get_video_info_xml('error'):
error_code = get_video_info_xml('code')
if error_code == 'DELETED':
raise ExtractorError('The video has been deleted.',
expected=True)
elif error_code == 'NOT_FOUND':
raise ExtractorError('The video is not found.',
expected=True)
elif error_code == 'COMMUNITY':
self.to_screen('%s: The video is community members only.' % video_id)
else:
raise ExtractorError('%s reports error: %s' % (self.IE_NAME, error_code))
# Start extracting video formats
formats = []
# Get HTML5 videos info
quality_info = try_get(api_data, lambda x: x['media']['delivery']['movie'])
if not quality_info:
raise ExtractorError('The video can\'t be downloaded', expected=True)
for audio_quality in quality_info.get('audios') or {}:
for video_quality in quality_info.get('videos') or {}:
if not audio_quality.get('isAvailable') or not video_quality.get('isAvailable'):
continue
formats.append(self._extract_format_for_quality(
api_data, video_id, audio_quality, video_quality))
# Get flv/swf info
timestamp = NoneView on GitHub (pinned to 956b8c5855)
Solutions
- Inspect the reported code string: login-related codes mean passing cookies (--cookies / --cookies-from-browser, ideally of a premium account).
- Retry later if the code looks transient (server maintenance).
- Update youtube-dl / yt-dlp so newly seen codes get proper handling and messages.
Example fix
# before youtube-dl 'https://www.nicovideo.jp/watch/sm12345678' # after (member-only video) youtube-dl --cookies-from-browser firefox 'https://www.nicovideo.jp/watch/sm12345678'
Defensive patterns
Strategy: try-catch
Validate before calling
import requests, re
xml = requests.get(f'https://ext.nicovideo.jp/api/getthumbinfo/{video_id}').text
m = re.search(r'<code>(\w+)</code>', xml)
if m and m.group(1) not in ('DELETED', 'NOT_FOUND', 'COMMUNITY'):
print('unclassified niconico error:', m.group(1)) Try / catch
except ExtractorError as e:
m = re.search(r'reports error: (\w+)', str(e))
if m:
code = m.group(1)
if 'LOGIN' in code or 'PREMIUM' in code:
retry_with_cookies(url)
else:
log_unknown_code(code, url) # candidate for upstream patch
else:
raise Prevention
- Keep a mapping of known niconico error codes to actions (login, retry, give up).
- Report unmapped codes upstream so future versions handle them explicitly.
- Maintain a logged-in cookie jar for member/premium content.
When it happens
Trigger: getthumbinfo XML has a non-empty <error> whose <code> is not one of the three handled values (e.g. 'LOGIN_REQUIRED', 'COMMUNITY_ONLY' variants, or new codes added by the site).
Common situations: Premium/member-only videos; temporary Niconico maintenance codes; new error codes introduced after the extractor was written. The literal code tells you which case you have.
Related errors
- The video can't be downloaded
- Unable to log in
- The video is not available, Facebook said: "%s"
- Cannot download file. Are you logged in?
- This video is only available via cable service provider subs
AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14).
Data as JSON: /api/errors/52601a7e070ea958.
Report an issue: GitHub.