Skip to content

Downloads fail with "Requested format is not available" error #2623

@ElGuayaba

Description

@ElGuayaba

System OS

MacOS

Python Version

3.13 (CPython)

Install Source

Other

Install version / commit hash

v4.4.3

Expected Behavior vs Actual Behavior

Expected Behavior:
The song should download successfully and be saved with metadata.

Actual Behavior:
The download fails with a format availability error, preventing any songs from being downloaded.

Steps to reproduce - Ensure to include actual links!

  1. install spotdl with yt-dlp v2025.09.26
  2. run spotdl download "https://open.spotify.com/track/<TRACK_ID>"
  3. The download will fail. Traceback below.

Traceback

ERROR    asyncio_0 - Traceback (most recent call last):                                                                         progress_handler.py:358
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1645, in wrapper                         
                        return func(self, *args, **kwargs)                                                                                                        
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1801, in                                 
                    __extract_info                                                                                                                                
                        return self.process_ie_result(ie_result, download, extra_info)                                                                            
                               ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                            
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1860, in                                 
                    process_ie_result                                                                                                                             
                        ie_result = self.process_video_result(ie_result, download=download)                                                                       
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 3000, in                                 
                    process_video_result                                                                                                                          
                        raise ExtractorError(                                                                                                                     
                            'Requested format is not available. Use --list-formats for a list of available formats',                                              
                            expected=True, video_id=info_dict['id'], ie=info_dict['extractor'])                                                                   
                    yt_dlp.utils.ExtractorError:  CXQM5sGNA6E: Requested format is not available. Use --list-formats for a list of                                
                    available formats                                                                                                                             
                                                                                                                                                                  
                    During handling of the above exception, another exception occurred:                                                                           
                                                                                                                                                                  
                    Traceback (most recent call last):                                                                                                            
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py", line 391,                          
                    in get_download_metadata                                                                                                                      
                        data = self.audio_handler.extract_info(url, download=download)                                                                            
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1634, in                                 
                    extract_info                                                                                                                                  
                        return self.__extract_info(url, self.get_info_extractor(key), download, extra_info, process)                                              
                               ~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                              
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1663, in wrapper                         
                        self.report_error(str(e), e.format_traceback())                                                                                           
                        ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                                                                           
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1103, in                                 
                    report_error                                                                                                                                  
                        self.trouble(f'{self._format_err("ERROR:", self.Styles.ERROR)} {message}', *args, **kwargs)                                               
                        ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^                                               
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 1022, in trouble                         
                        self.to_stderr(message)                                                                                                                   
                        ~~~~~~~~~~~~~~^^^^^^^^^                                                                                                                   
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py", line 956, in to_stderr                        
                        self.params['logger'].error(message)                                                                                                      
                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^                                                                                                      
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py", line 57, in                        
                    error                                                                                                                                         
                        raise AudioProviderError(msg)                                                                                                             
                    spotdl.providers.audio.base.AudioProviderError: ERROR:  CXQM5sGNA6E: Requested format is not available. Use                                   
                    --list-formats for a list of available formats                                                                                                
                                                                                                                                                                  
                    The above exception was the direct cause of the following exception:                                                                          
                                                                                                                                                                  
                    Traceback (most recent call last):                                                                                                            
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/download/downloader.py", line 678, in                        
                    search_and_download                                                                                                                           
                        download_info = audio_downloader.get_download_metadata(                                                                                   
                            download_url, download=True                                                                                                           
                        )                                                                                                                                         
                      File "/Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py", line 397,                          
                    in get_download_metadata                                                                                                                      
                        raise AudioProviderError(f"YT-DLP download error - {url}") from exception                                                                 
                    spotdl.providers.audio.base.AudioProviderError: YT-DLP download error - https://music.youtube.com/watch?v=CXQM5sGNA6E                         
                                                                                                                                                                  
                    ╭──────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1645 in wrapper              │                        
                    │                                                                                                                    │                        
                    │   1642 │   │   def wrapper(self, *args, **kwargs):                                                                 │                        
                    │   1643 │   │   │   while True:                                                                                     │                        
                    │   1644 │   │   │   │   try:                                                                                        │                        
                    │ ❱ 1645 │   │   │   │   │   return func(self, *args, **kwargs)                                                      │                        
                    │   1646 │   │   │   │   except (CookieLoadError, DownloadCancelled, LazyList.IndexError,                            │                        
                    │        PagedList.IndexError):                                                                                      │                        
                    │   1647 │   │   │   │   │   raise                                                                                   │                        
                    │   1648 │   │   │   │   except ReExtractInfo as e:                                                                  │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1801 in __extract_info       │                        
                    │                                                                                                                    │                        
                    │   1798 │   │   self.add_default_extra_info(ie_result, ie, url)                                                     │                        
                    │   1799 │   │   if process:                                                                                         │                        
                    │   1800 │   │   │   self._wait_for_video(ie_result)                                                                 │                        
                    │ ❱ 1801 │   │   │   return self.process_ie_result(ie_result, download, extra_info)                                  │                        
                    │   1802 │   │   else:                                                                                               │                        
                    │   1803 │   │   │   return ie_result                                                                                │                        
                    │   1804                                                                                                             │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1860 in process_ie_result    │                        
                    │                                                                                                                    │                        
                    │   1857 │   │                                                                                                       │                        
                    │   1858 │   │   if result_type == 'video':                                                                          │                        
                    │   1859 │   │   │   self.add_extra_info(ie_result, extra_info)                                                      │                        
                    │ ❱ 1860 │   │   │   ie_result = self.process_video_result(ie_result, download=download)                             │                        
                    │   1861 │   │   │   self._raise_pending_errors(ie_result)                                                           │                        
                    │   1862 │   │   │   additional_urls = (ie_result or {}).get('additional_urls')                                      │                        
                    │   1863 │   │   │   if additional_urls:                                                                             │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:3000 in process_video_result │                        
                    │                                                                                                                    │                        
                    │   2997 │   │                                                                                                       │                        
                    │   2998 │   │   if not formats_to_download:                                                                         │                        
                    │   2999 │   │   │   if not self.params.get('ignore_no_formats_error'):                                              │                        
                    │ ❱ 3000 │   │   │   │   raise ExtractorError(                                                                       │                        
                    │   3001 │   │   │   │   │   'Requested format is not available. Use --list-formats for a list of                    │                        
                    │        available formats',                                                                                         │                        
                    │   3002 │   │   │   │   │   expected=True, video_id=info_dict['id'], ie=info_dict['extractor'])                     │                        
                    │   3003 │   │   │   self.report_warning('Requested format is not available')                                        │                        
                    ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                        
                    ExtractorError: [youtube] CXQM5sGNA6E: Requested format is not available. Use --list-formats for a list of available                          
                    formats                                                                                                                                       
                                                                                                                                                                  
                    During handling of the above exception, another exception occurred:                                                                           
                                                                                                                                                                  
                    ╭──────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py:391 in            │                        
                    │ get_download_metadata                                                                                              │                        
                    │                                                                                                                    │                        
                    │   388 │   │   """                                                                                                  │                        
                    │   389 │   │                                                                                                        │                        
                    │   390 │   │   try:                                                                                                 │                        
                    │ ❱ 391 │   │   │   data = self.audio_handler.extract_info(url, download=download)                                   │                        
                    │   392 │   │   │                                                                                                    │                        
                    │   393 │   │   │   if data:                                                                                         │                        
                    │   394 │   │   │   │   return data                                                                                  │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1634 in extract_info         │                        
                    │                                                                                                                    │                        
                    │   1631 │   │   │   │   if self.params.get('break_on_existing', False):                                             │                        
                    │   1632 │   │   │   │   │   raise ExistingVideoReached                                                              │                        
                    │   1633 │   │   │   │   break                                                                                       │                        
                    │ ❱ 1634 │   │   │   return self.__extract_info(url, self.get_info_extractor(key), download,                         │                        
                    │        extra_info, process)                                                                                        │                        
                    │   1635 │   │   else:                                                                                               │                        
                    │   1636 │   │   │   extractors_restricted = self.params.get('allowed_extractors') not in (None,                     │                        
                    │        ['default'])                                                                                                │                        
                    │   1637 │   │   │   self.report_error(f'No suitable extractor{format_field(ie_key, None, "                          │                        
                    │        (%s)")} found for URL {url}',                                                                               │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1663 in wrapper              │                        
                    │                                                                                                                    │                        
                    │   1660 │   │   │   │   │   msg += '\nYou might want to use a VPN or a proxy server (with                           │                        
                    │        --proxy) to workaround.'                                                                                    │                        
                    │   1661 │   │   │   │   │   self.report_error(msg)                                                                  │                        
                    │   1662 │   │   │   │   except ExtractorError as e:  # An error we somewhat expected                                │                        
                    │ ❱ 1663 │   │   │   │   │   self.report_error(str(e), e.format_traceback())                                         │                        
                    │   1664 │   │   │   │   except Exception as e:                                                                      │                        
                    │   1665 │   │   │   │   │   if self.params.get('ignoreerrors'):                                                     │                        
                    │   1666 │   │   │   │   │   │   self.report_error(str(e),                                                           │                        
                    │        tb=encode_compat_str(traceback.format_exc()))                                                               │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1103 in report_error         │                        
                    │                                                                                                                    │                        
                    │   1100 │   │   Do the same as trouble, but prefixes the message with 'ERROR:', colored                             │                        
                    │   1101 │   │   in red if stderr is a tty file.                                                                     │                        
                    │   1102 │   │   """                                                                                                 │                        
                    │ ❱ 1103 │   │   self.trouble(f'{self._format_err("ERROR:", self.Styles.ERROR)} {message}',                          │                        
                    │        *args, **kwargs)                                                                                            │                        
                    │   1104 │                                                                                                           │                        
                    │   1105 │   def write_debug(self, message, only_once=False):                                                        │                        
                    │   1106 │   │   """Log debug message or Print message to stderr"""                                                  │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:1022 in trouble              │                        
                    │                                                                                                                    │                        
                    │   1019 │   │   @param is_error    Whether to raise error according to ignorerrors                                  │                        
                    │   1020 │   │   """                                                                                                 │                        
                    │   1021 │   │   if message is not None:                                                                             │                        
                    │ ❱ 1022 │   │   │   self.to_stderr(message)                                                                         │                        
                    │   1023 │   │   if self.params.get('verbose'):                                                                      │                        
                    │   1024 │   │   │   if tb is None:                                                                                  │                        
                    │   1025 │   │   │   │   if sys.exc_info()[0]:  # if .trouble has been called from an except                         │                        
                    │        block                                                                                                       │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/yt_dlp/YoutubeDL.py:956 in to_stderr             │                        
                    │                                                                                                                    │                        
                    │    953 │   │   """Print message to stderr"""                                                                       │                        
                    │    954 │   │   assert isinstance(message, str)                                                                     │                        
                    │    955 │   │   if self.params.get('logger'):                                                                       │                        
                    │ ❱  956 │   │   │   self.params['logger'].error(message)                                                            │                        
                    │    957 │   │   else:                                                                                               │                        
                    │    958 │   │   │   self._write_string(f'{self._bidi_workaround(message)}\n',                                       │                        
                    │        self._out_files.error, only_once=only_once)                                                                 │                        
                    │    959                                                                                                             │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py:57 in error       │                        
                    │                                                                                                                    │                        
                    │    54 │   │   YTDL uses this to print errors.                                                                      │                        
                    │    55 │   │   """                                                                                                  │                        
                    │    56 │   │                                                                                                        │                        
                    │ ❱  57 │   │   raise AudioProviderError(msg)                                                                        │                        
                    │    58                                                                                                              │                        
                    │    59                                                                                                              │                        
                    │    60 ISRC_REGEX = re.compile(r"^[A-Z]{2}-?\w{3}-?\d{2}-?\d{5}$")                                                  │                        
                    ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                        
                    AudioProviderError: ERROR: [youtube] CXQM5sGNA6E: Requested format is not available. Use --list-formats for a list of                         
                    available formats                                                                                                                             
                                                                                                                                                                  
                    The above exception was the direct cause of the following exception:                                                                          
                                                                                                                                                                  
                    ╭──────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────╮                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/download/downloader.py:678 in             │                        
                    │ search_and_download                                                                                                │                        
                    │                                                                                                                    │                        
                    │   675 │   │   │   │   display_progress_tracker.yt_dlp_progress_hook                                                │                        
                    │   676 │   │   │   )                                                                                                │                        
                    │   677 │   │   │                                                                                                    │                        
                    │ ❱ 678 │   │   │   download_info = audio_downloader.get_download_metadata(                                          │                        
                    │   679 │   │   │   │   download_url, download=True                                                                  │                        
                    │   680 │   │   │   )                                                                                                │                        
                    │   681                                                                                                              │                        
                    │                                                                                                                    │                        
                    │ /Users/jose/.local/pipx/venvs/spotdl/lib/python3.13/site-packages/spotdl/providers/audio/base.py:397 in            │                        
                    │ get_download_metadata                                                                                              │                        
                    │                                                                                                                    │                        
                    │   394 │   │   │   │   return data                                                                                  │                        
                    │   395 │   │   except Exception as exception:                                                                       │                        
                    │   396 │   │   │   logger.debug(exception)                                                                          │                        
                    │ ❱ 397 │   │   │   raise AudioProviderError(f"YT-DLP download error - {url}") from exception                        │                        
                    │   398 │   │                                                                                                        │                        
                    │   399 │   │   raise AudioProviderError(f"No metadata found for the provided url {url}")                            │                        
                    │   400                                                                                                              │                        
                    ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                        
                    AudioProviderError: YT-DLP download error - https://music.youtube.com/watch?v=CXQM5sGNA6E

Other details

Issue seems to be fixed by updating yt-dlp to v2026.3.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    BugUnexpected problem or unintended behavior that needs to be fixed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions