ytdl-org/youtube-dl · error · ExtractorError

err.msg

Error message

err.msg

What it means

Raised while probing the legacy 'smile' (FLV/SWF) stream: FFmpegPostProcessor.get_metadata_object() throws a PostProcessingError and its .msg is re-raised as an expected ExtractorError. The underlying message almost always comes from ffprobe — most commonly that the ffprobe/ffmpeg binary is missing or not executable. It is expected=True only in the wrapping sense; the root cause is local environment.

Source

Thrown at youtube_dl/extractor/niconico.py:457

        # Get flv/swf info
        timestamp = None
        video_real_url = try_get(api_data, lambda x: x['video']['smileInfo']['url'])
        if video_real_url:
            is_economy = video_real_url.endswith('low')

            if is_economy:
                self.report_warning('Site is currently in economy mode! You will only have access to lower quality streams')

            # Invoking ffprobe to determine resolution
            pp = FFmpegPostProcessor(self._downloader)
            cookies = self._get_cookies('https://nicovideo.jp').output(header='', sep='; path=/; domain=nicovideo.jp;\n')

            self.to_screen('%s: %s' % (video_id, 'Checking smile format with ffprobe'))

            try:
                metadata = pp.get_metadata_object(video_real_url, ['-cookies', cookies])
            except PostProcessingError as err:
                raise ExtractorError(err.msg, expected=True)

            v_stream = a_stream = {}

            # Some complex swf files doesn't have video stream (e.g. nm4809023)
            for stream in metadata['streams']:
                if stream['codec_type'] == 'video':
                    v_stream = stream
                elif stream['codec_type'] == 'audio':
                    a_stream = stream

            # Community restricted videos seem to have issues with the thumb API not returning anything at all
            filesize = int(
                (get_video_info_xml('size_high') if not is_economy else get_video_info_xml('size_low'))
                or metadata['format']['size']
            )
            extension = (
                get_video_info_xml('movie_type')
                or 'mp4' if 'mp4' in metadata['format']['format_name'] else metadata['format']['format_name']

View on GitHub (pinned to 956b8c5855)

Solutions

  1. Install ffmpeg (which bundles ffprobe) or point youtube-dl at it: --ffmpeg-location <path>.
  2. Verify with 'ffprobe -version' that ffprobe runs and is a recent build.
  3. Re-login and refresh cookies if the probe URL itself is being rejected (expired session).

Example fix

# before: err.msg like 'ffprobe not found'
youtube-dl 'https://www.nicovideo.jp/watch/sm9'

# after
 youtube-dl --ffmpeg-location /usr/local/bin/ffmpeg 'https://www.nicovideo.jp/watch/sm9'
# or: brew install ffmpeg / apt install ffmpeg
Defensive patterns

Strategy: validation

Validate before calling

import shutil, subprocess
ffprobe = shutil.which('ffprobe')
if not ffprobe:
    raise SystemExit('install ffmpeg/ffprobe before downloading legacy niconico videos')
subprocess.run([ffprobe, '-version'], check=True)

Try / catch

except ExtractorError as e:
    if 'ffprobe' in str(e) or 'ffmpeg' in str(e).lower():
        fix_ffmpeg_env()  # install or set --ffmpeg-location, then retry
    else:
        raise

Prevention

When it happens

Trigger: The watch API supplies a smileInfo.url, the extractor invokes ffprobe with session cookies to determine codec streams, and get_metadata_object raises PostProcessingError (ffprobe not found, probe failure, or unreadable stream).

Common situations: ffmpeg/ffprobe not installed or not on PATH (the classic cause); ffprobe version too old for the stream; session cookies expired so the probe URL returns an error page.

Related errors


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