{"record":{"id":"9e4a2d47d5398cce","repo":"ytdl-org/youtube-dl","slug":"atomicparsley-was-not-found-please-install","errorCode":null,"errorMessage":"AtomicParsley was not found. Please install.","messagePattern":"AtomicParsley was not found\\. Please install\\.","errorType":"exception","errorClass":"EmbedThumbnailPPError","httpStatus":null,"severity":"error","filePath":"youtube_dl/postprocessor/embedthumbnail.py","lineNumber":100,"sourceCode":"                '-c', 'copy', '-map', '0', '-map', '1',\n                '-metadata:s:v', 'title=\"Album cover\"', '-metadata:s:v', 'comment=\"Cover (Front)\"']\n\n            self._downloader.to_screen('[ffmpeg] Adding thumbnail to \"%s\"' % filename)\n\n            self.run_ffmpeg_multiple_files([filename, thumbnail_filename], temp_filename, options)\n\n            if not self._already_have_thumbnail:\n                os.remove(encodeFilename(thumbnail_filename))\n            os.remove(encodeFilename(filename))\n            os.rename(encodeFilename(temp_filename), encodeFilename(filename))\n\n        elif info['ext'] in ['m4a', 'mp4']:\n            atomicparsley = next((x\n                                  for x in ['AtomicParsley', 'atomicparsley']\n                                  if check_executable(x, ['-v'])), None)\n\n            if atomicparsley is None:\n                raise EmbedThumbnailPPError('AtomicParsley was not found. Please install.')\n\n            cmd = [encodeFilename(atomicparsley, True),\n                   encodeFilename(filename, True),\n                   encodeArgument('--artwork'),\n                   encodeFilename(thumbnail_filename, True),\n                   encodeArgument('-o'),\n                   encodeFilename(temp_filename, True)]\n\n            self._downloader.to_screen('[atomicparsley] Adding thumbnail to \"%s\"' % filename)\n\n            if self._downloader.params.get('verbose', False):\n                self._downloader.to_screen('[debug] AtomicParsley command line: %s' % shell_quote(cmd))\n\n            p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)\n            stdout, stderr = process_communicate_or_kill(p)\n\n            if p.returncode != 0:\n                msg = stderr.decode('utf-8', 'replace').strip()","sourceCodeStart":82,"sourceCodeEnd":118,"githubUrl":"https://github.com/ytdl-org/youtube-dl/blob/956b8c585591b401a543e409accb163eeaaa1193/youtube_dl/postprocessor/embedthumbnail.py#L82-L118","documentation":"Raised by EmbedThumbnailPP when the file is m4a/mp4 (the AtomicParsley branch) and neither 'AtomicParsley' nor 'atomicparsley' is executable on PATH (checked by running it with -v). Embedding a thumbnail into an MP4 container requires that external tool, so its absence is fatal for this post-processor.","triggerScenarios":"Running with --embed-thumbnail on an mp4/m4a download on a machine without AtomicParsley installed; or with an AtomicParsley that exists but is not executable/crashes on -v so check_executable fails.","commonSituations":"Fresh CI containers or minimal servers where only ffmpeg is installed; macOS Homebrew renaming (atomicparsley formula) leaving a non-executable binary; PATH not including the directory where AtomicParsley lives.","solutions":["Install AtomicParsley (Debian/Ubuntu: apt install atomicparsley; macOS: brew install atomicparsley) and confirm 'AtomicParsley -v' runs","If already installed, ensure the binary is on PATH and executable (chmod +x)","Alternatively switch to yt-dlp, which embeds mp4 thumbnails via ffmpeg and needs no extra binary","If you only need thumbnails in audio, download mp3 (uses mutagen ffmpeg path, no AtomicParsley needed)"],"exampleFix":"# before: fails with 'AtomicParsley was not found'\nyoutube-dl --embed-thumbnail https://example.com/video.mp4\n# after\nsudo apt-get install atomicparsley\nyoutube-dl --embed-thumbnail https://example.com/video.mp4","handlingStrategy":"validation","validationCode":"import shutil\n\ndef can_embed_mp4_thumbnail():\n    return shutil.which('AtomicParsley') is not None or shutil.which('atomicparsley') is not None\n\nif not can_embed_mp4_thumbnail():\n    options['embedthumbnail'] = False  # skip instead of failing the whole job","typeGuard":null,"tryCatchPattern":"try:\n    ydl.download([url])\nexcept PostProcessingError as e:\n    if 'AtomicParsley was not found' in str(e):\n        log.warning('Skipping thumbnail embed for %s', url)  # download itself succeeded","preventionTips":["Pre-install AtomicParsley in images/hosts that use --embed-thumbnail with mp4/m4a","Smoke-test 'AtomicParsley -v' during environment provisioning","Consider yt-dlp, which embeds mp4 thumbnails via ffmpeg without extra binaries"],"tags":["embed-thumbnail","atomicparsley","dependency","postprocessor"],"backgroundTag":null,"analyzedSha":"956b8c585591b401a543e409accb163eeaaa1193","analyzedAt":"2026-08-14T18:59:47.863Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}