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 = None

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Inspect the reported code string: login-related codes mean passing cookies (--cookies / --cookies-from-browser, ideally of a premium account).
  2. Retry later if the code looks transient (server maintenance).
  3. 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

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


AI-assisted analysis of ytdl-org/youtube-dl@956b8c5855 (2026-08-14). Data as JSON: /api/errors/52601a7e070ea958. Report an issue: GitHub.