streamrip icon indicating copy to clipboard operation
streamrip copied to clipboard

[BUG] Error when trying to download from Soundcloud

Open MichelJonkman opened this issue 1 year ago • 3 comments

Describe the bug

Trying to download from Soundcloud results in an error message, likely because downloading from Soundcloud requires an account.

Command Used

rip url https://soundcloud.com/martazedubs/takeda-no-more-martaze-vip

Debug Traceback

[16:43:40] DEBUG    Showing all debug logs                                                                                                                                                                               cli.py:102
[16:43:41] DEBUG    Current valid client_id='KuAqwbkovCcpecMXSpUILPdVD8lDlXTd' app_version='1737551533'                                                                                                            soundcloud.py:52
           DEBUG    Requesting https://api-v2.soundcloud.com/resolve with _params={'client_id': 'KuAqwbkovCcpecMXSpUILPdVD8lDlXTd', 'app_version': '1737551533', 'app_locale': 'en', 'url':                       soundcloud.py:239
                    'https://soundcloud.com/martazedubs/takeda-no-more-martaze-vip'}, headers=None
           DEBUG    Executing SELECT EXISTS(SELECT 1 FROM downloads WHERE id=?)                                                                                                                                           db.py:108
           DEBUG    Requesting https://api-v2.soundcloud.com/tracks/1696295736 with _params={'client_id': 'KuAqwbkovCcpecMXSpUILPdVD8lDlXTd', 'app_version': '1737551533', 'app_locale': 'en'}, headers=None      soundcloud.py:239
⠋ Resolving URLs...           DEBUG    infos=['1696295736', '_original_download']                                                                                                                                                    soundcloud.py:110
           DEBUG    Requesting https://api-v2.soundcloud.com/tracks/1696295736/download with _params={'client_id': 'KuAqwbkovCcpecMXSpUILPdVD8lDlXTd', 'app_version': '1737551533', 'app_locale': 'en'},          soundcloud.py:239
                    headers=None
           DEBUG    Removing dirs {'/home/michel/StreamripDownloads/__artwork'}                                                                                                                                       artwork.py:19
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
│ /home/michel/.local/bin/rip:8 in <module>                                                        │
│                                                                                                  │
│   5 from streamrip.rip import rip                                                                │
│   6 if __name__ == '__main__':                                                                   │
│   7 │   sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])                         │
│ ❱ 8 │   sys.exit(rip())                                                                          │
│   9                                                                                              │
│                                                                                                  │
│ ╭─────────────────────── locals ───────────────────────╮                                         │
│ │  re = <module 're' from '/usr/lib/python3.10/re.py'> │                                         │
│ │ rip = <HelpColorsGroup rip>                          │                                         │
│ │ sys = <module 'sys' (built-in)>                      │                                         │
│ ╰──────────────────────────────────────────────────────╯                                         │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/core.py:1157 in      │
│ __call__                                                                                         │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/core.py:1078 in main │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/core.py:1688 in      │
│ invoke                                                                                           │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/core.py:1434 in      │
│ invoke                                                                                           │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/core.py:783 in       │
│ invoke                                                                                           │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/click/decorators.py:33 in  │
│ new_func                                                                                         │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/rip/cli.py:28 in │
│ wrapper                                                                                          │
│                                                                                                  │
│    25 def coro(f):                                                                               │
│    26 │   @wraps(f)                                                                              │
│    27 │   def wrapper(*args, **kwargs):                                                          │
│ ❱  28 │   │   return asyncio.run(f(*args, **kwargs))                                             │
│    29 │                                                                                          │
│    30 │   return wrapper                                                                         │
│    31                                                                                            │
│                                                                                                  │
│ ╭─────────────────────────────────────── locals ────────────────────────────────────────╮        │
│ │   args = (<click.core.Context object at 0x7f88adf37c40>,)                             │        │
│ │      f = <function url at 0x7f88ab840dc0>                                             │        │
│ │ kwargs = {'urls': ('https://soundcloud.com/martazedubs/takeda-no-more-martaze-vip',)} │        │
│ ╰───────────────────────────────────────────────────────────────────────────────────────╯        │
│                                                                                                  │
│ /usr/lib/python3.10/asyncio/runners.py:44 in run                                                 │
│                                                                                                  │
│   41 │   │   events.set_event_loop(loop)                                                         │
│   42 │   │   if debug is not None:                                                               │
│   43 │   │   │   loop.set_debug(debug)                                                           │
│ ❱ 44 │   │   return loop.run_until_complete(main)                                                │
│   45 │   finally:                                                                                │
│   46 │   │   try:                                                                                │
│   47 │   │   │   _cancel_all_tasks(loop)                                                         │
│                                                                                                  │
│ ╭──────────────────────────────── locals ────────────────────────────────╮                       │
│ │ debug = None                                                           │                       │
│ │  loop = <_UnixSelectorEventLoop running=False closed=True debug=False> │                       │
│ │  main = <coroutine object url at 0x7f88ab80dfc0>                       │                       │
│ ╰────────────────────────────────────────────────────────────────────────╯                       │
│                                                                                                  │
│ /usr/lib/python3.10/asyncio/base_events.py:649 in run_until_complete                             │
│                                                                                                  │
│    646 │   │   if not future.done():                                                             │
│    647 │   │   │   raise RuntimeError('Event loop stopped before Future completed.')             │
│    648 │   │                                                                                     │
│ ❱  649 │   │   return future.result()                                                            │
│    650 │                                                                                         │
│    651 │   def stop(self):                                                                       │
│    652 │   │   """Stop running the event loop.                                                   │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │   future = <Task finished name='Task-1' coro=<url() done, defined at                         │ │
│ │            /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/… │ │
│ │            exception=ContentTypeError(RequestInfo(url=URL('https://api-v2.soundcloud.com/tr… │ │
│ │            method='GET', headers=<CIMultiDictProxy('Host': 'api-v2.soundcloud.com',          │ │
│ │            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101  │ │
│ │            Firefox/83.0', 'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate')>,             │ │
│ │            real_url=URL('https://api-v2.soundcloud.com/tracks/1696295736/download?client_id… │ │
│ │            (), message='Attempt to decode JSON with unexpected mimetype: ',                  │ │
│ │            headers=<CIMultiDictProxy('Content-Length': '0', 'Connection': 'keep-alive',      │ │
│ │            'x-robots-tag': 'noindex', 'Cache-Control': 'private, max-age=0',                 │ │
│ │            'referrer-policy': 'no-referrer', 'x-frame-options': 'DENY',                      │ │
│ │            'x-content-type-options': 'nosniff', 'strict-transport-security':                 │ │
│ │            'max-age=63072000', 'Server': 'am/2', 'Date': 'Wed, 22 Jan 2025 15:43:41 GMT',    │ │
│ │            'Vary': 'Origin', 'X-Cache': 'Error from cloudfront', 'Via': '1.1                 │ │
│ │            cf65dbfe06da8e543052ca7066d0e458.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop':    │ │
│ │            'AMS58-P4', 'X-Amz-Cf-Id':                                                        │ │
│ │            '2MSFAPT_99jb1Tg9FwFetrg1XpHS-BuHoDoF3Lk8ly5OQF_Pp-o-Yw==')>)>                    │ │
│ │ new_task = True                                                                              │ │
│ │     self = <_UnixSelectorEventLoop running=False closed=True debug=False>                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/rip/cli.py:167   │
│ in url                                                                                           │
│                                                                                                  │
│   164 │   │                                                                                      │
│   165 │   │   async with Main(cfg) as main:                                                      │
│   166 │   │   │   await main.add_all(urls)                                                       │
│ ❱ 167 │   │   │   await main.resolve()                                                           │
│   168 │   │   │   await main.rip()                                                               │
│   169 │   │                                                                                      │
│   170 │   │   if version_coro is not None:                                                       │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │          cfg = <streamrip.config.Config object at 0x7f88ab81ee90>                            │ │
│ │          ctx = <click.core.Context object at 0x7f88adf37c40>                                 │ │
│ │         main = <streamrip.rip.main.Main object at 0x7f88ab8d7ac0>                            │ │
│ │      updates = True                                                                          │ │
│ │         urls = ('https://soundcloud.com/martazedubs/takeda-no-more-martaze-vip',)            │ │
│ │ version_coro = <Task finished name='Task-2' coro=<latest_streamrip_version() done, defined   │ │
│ │                at                                                                            │ │
│ │                /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/stream… │ │
│ │                result=('2.0.5', None)>                                                       │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/rip/main.py:157  │
│ in resolve                                                                                       │
│                                                                                                  │
│   154 │   │   with console.status("Resolving URLs...", spinner="dots"):                          │
│   155 │   │   │   coros = [p.resolve() for p in self.pending]                                    │
│   156 │   │   │   new_media: list[Media] = [                                                     │
│ ❱ 157 │   │   │   │   m for m in await asyncio.gather(*coros) if m is not None                   │
│   158 │   │   │   ]                                                                              │
│   159 │   │                                                                                      │
│   160 │   │   self.media.extend(new_media)                                                       │
│                                                                                                  │
│ ╭─────────────────────────────── locals ───────────────────────────────╮                         │
│ │ coros = [<coroutine object PendingSingle.resolve at 0x7f88ab80fdf0>] │                         │
│ │  self = <streamrip.rip.main.Main object at 0x7f88ab8d7ac0>           │                         │
│ ╰──────────────────────────────────────────────────────────────────────╯                         │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/media/track.py:1 │
│ 85 in resolve                                                                                    │
│                                                                                                  │
│   182 │   │                                                                                      │
│   183 │   │   os.makedirs(folder, exist_ok=True)                                                 │
│   184 │   │                                                                                      │
│ ❱ 185 │   │   embedded_cover_path, downloadable = await asyncio.gather(                          │
│   186 │   │   │   self._download_cover(album.covers, folder),                                    │
│   187 │   │   │   self.client.get_downloadable(self.id, quality),                                │
│   188 │   │   )                                                                                  │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │   album = AlbumMetadata(                                                                     │ │
│ │           │   info=AlbumInfo(                                                                │ │
│ │           │   │   id=1696295736,                                                             │ │
│ │           │   │   quality=0,                                                                 │ │
│ │           │   │   container='MP3',                                                           │ │
│ │           │   │   label=None,                                                                │ │
│ │           │   │   explicit=False,                                                            │ │
│ │           │   │   sampling_rate=None,                                                        │ │
│ │           │   │   bit_depth=None,                                                            │ │
│ │           │   │   booklets=None                                                              │ │
│ │           │   ),                                                                             │ │
│ │           │   album='Unknown album',                                                         │ │
│ │           │   albumartist='MARTAZE',                                                         │ │
│ │           │   year='2023',                                                                   │ │
│ │           │   genre=['Dubstep'],                                                             │ │
│ │           │   covers=Covers(('original', None, None)                                         │ │
│ │           ('large', 'https://i1.sndcdn.com/artworks-XEBlFWzFqyB2mUHu-6ag8OQ-t500x500.jpg',   │ │
│ │           None)                                                                              │ │
│ │           ('small', None, None)                                                              │ │
│ │           ('thumbnail', None, None)),                                                        │ │
│ │           │   tracktotal=1,                                                                  │ │
│ │           │   disctotal=1,                                                                   │ │
│ │           │   albumcomposer=None,                                                            │ │
│ │           │   comment=None,                                                                  │ │
│ │           │   compilation=None,                                                              │ │
│ │           │   copyright=None,                                                                │ │
│ │           │   date='2023-12-21T19:06:43Z',                                                   │ │
│ │           │   description='Follow @martazedubs\nFollow @takeda-dubz\n\nlittle xmas gift      │ │
│ │           :3\n\n"I couldn\'t give a'+59,                                                     │ │
│ │           │   encoder=None,                                                                  │ │
│ │           │   grouping=None,                                                                 │ │
│ │           │   lyrics=None,                                                                   │ │
│ │           │   purchase_date=None                                                             │ │
│ │           )                                                                                  │ │
│ │  config = ConfigData(                                                                        │ │
│ │           │   toml={'downloads': {'folder': '/home/michel/StreamripDownloads',               │ │
│ │           'source_subdirectories': False, 'concurrency': True, 'max_connections': 50,        │ │
│ │           'requests_per_minute': 60}, 'qobuz': {'quality': 3, 'download_booklets': True,     │ │
│ │           'use_auth_token': False, 'email_or_userid': '', 'password_or_token': '', 'app_id': │ │
│ │           '', 'secrets': []}, 'tidal': {'quality': 3, 'download_videos': False, 'user_id':   │ │
│ │           191932505, 'country_code': 'NL', 'access_token':                                   │ │
│ │           'eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXNzIiwidWlkIjox… │ │
│ │           'refresh_token':                                                                   │ │
│ │           'eyJraWQiOiJoUzFKYTdVMCIsImFsZyI6IkVTNTEyIn0.eyJ0eXBlIjoibzJfcmVmcmVzaCIsInVpZCI6… │ │
│ │           'token_expiry': 1725632537.3446062}, 'deezer': {'quality': 2, 'arl': '',           │ │
│ │           'use_deezloader': True, 'deezloader_warnings': True}, 'soundcloud': {'quality': 0, │ │
│ │           'client_id': 'KuAqwbkovCcpecMXSpUILPdVD8lDlXTd', 'app_version': '1737551533'},     │ │
│ │           'youtube': {'quality': 0, 'download_videos': False, 'video_downloads_folder':      │ │
│ │           '/home/michel/StreamripDownloads/YouTubeVideos'}, 'database':                      │ │
│ │           {'downloads_enabled': True, 'downloads_path':                                      │ │
│ │           '/home/michel/.config/streamrip/downloads.db', 'failed_downloads_enabled': True,   │ │
│ │           'failed_downloads_path': '/home/michel/.config/streamrip/failed_downloads.db'},    │ │
│ │           'conversion': {'enabled': False, 'codec': 'ALAC', 'sampling_rate': 48000,          │ │
│ │           'bit_depth': 24, 'lossy_bitrate': 320}, 'qobuz_filters': {'extras': False,         │ │
│ │           'repeats': False, 'non_albums': False, 'features': False, 'non_studio_albums':     │ │
│ │           False, 'non_remaster': False}, 'artwork': {'embed': True, 'embed_size': 'large',   │ │
│ │           'embed_max_width': -1, 'save_artwork': False, 'saved_max_width': -1}, 'metadata':  │ │
│ │           {'set_playlist_to_album': True, 'renumber_playlist_tracks': True, 'exclude': []},  │ │
│ │           'filepaths': {'add_singles_to_folder': False, 'folder_format': '{albumartist} -    │ │
│ │           {title} ({year}) [{container}] [{bit_depth}B-{sampling_rate}kHz]', 'track_format': │ │
│ │           '{artist} - {title}', 'restrict_characters': False, 'truncate_to': 120}, 'lastfm': │ │
│ │           {'source': 'qobuz', 'fallback_source': ''}, 'cli': {'text_output': True,           │ │
│ │           'progress_bars': True, 'max_search_results': 100}, 'misc': {'version': '2.0.3',    │ │
│ │           'check_for_updates': True}},                                                       │ │
│ │           │   downloads=DownloadsConfig(                                                     │ │
│ │           │   │   folder='/home/michel/StreamripDownloads',                                  │ │
│ │           │   │   source_subdirectories=False,                                               │ │
│ │           │   │   concurrency=True,                                                          │ │
│ │           │   │   max_connections=50,                                                        │ │
│ │           │   │   requests_per_minute=60                                                     │ │
│ │           │   ),                                                                             │ │
│ │           │   qobuz=QobuzConfig(                                                             │ │
│ │           │   │   use_auth_token=False,                                                      │ │
│ │           │   │   email_or_userid='',                                                        │ │
│ │           │   │   password_or_token='',                                                      │ │
│ │           │   │   app_id='',                                                                 │ │
│ │           │   │   quality=3,                                                                 │ │
│ │           │   │   download_booklets=True,                                                    │ │
│ │           │   │   secrets=[]                                                                 │ │
│ │           │   ),                                                                             │ │
│ │           │   tidal=TidalConfig(                                                             │ │
│ │           │   │   user_id=191932505,                                                         │ │
│ │           │   │   country_code='NL',                                                         │ │
│ │           │   │                                                                              │ │
│ │           access_token='eyJraWQiOiJ2OU1GbFhqWSIsImFsZyI6IkVTMjU2In0.eyJ0eXBlIjoibzJfYWNjZXN… │ │
│ │           │   │                                                                              │ │
│ │           refresh_token='eyJraWQiOiJoUzFKYTdVMCIsImFsZyI6IkVTNTEyIn0.eyJ0eXBlIjoibzJfcmVmcm… │ │
│ │           │   │   token_expiry=1725632537.3446062,                                           │ │
│ │           │   │   quality=3,                                                                 │ │
│ │           │   │   download_videos=False                                                      │ │
│ │           │   ),                                                                             │ │
│ │           │   deezer=DeezerConfig(                                                           │ │
│ │           │   │   arl='',                                                                    │ │
│ │           │   │   quality=2,                                                                 │ │
│ │           │   │   use_deezloader=True,                                                       │ │
│ │           │   │   deezloader_warnings=True                                                   │ │
│ │           │   ),                                                                             │ │
│ │           │   soundcloud=SoundcloudConfig(                                                   │ │
│ │           │   │   client_id='KuAqwbkovCcpecMXSpUILPdVD8lDlXTd',                              │ │
│ │           │   │   app_version='1737551533',                                                  │ │
│ │           │   │   quality=0                                                                  │ │
│ │           │   ),                                                                             │ │
│ │           │   youtube=YoutubeConfig(                                                         │ │
│ │           │   │   video_downloads_folder='/home/michel/StreamripDownloads/YouTubeVideos',    │ │
│ │           │   │   quality=0,                                                                 │ │
│ │           │   │   download_videos=False                                                      │ │
│ │           │   ),                                                                             │ │
│ │           │   lastfm=LastFmConfig(source='qobuz', fallback_source=''),                       │ │
│ │           │   filepaths=FilepathsConfig(                                                     │ │
│ │           │   │   add_singles_to_folder=False,                                               │ │
│ │           │   │   folder_format='{albumartist} - {title} ({year}) [{container}]              │ │
│ │           [{bit_depth}B-{sampling_rate}kHz]',                                                │ │
│ │           │   │   track_format='{artist} - {title}',                                         │ │
│ │           │   │   restrict_characters=False,                                                 │ │
│ │           │   │   truncate_to=120                                                            │ │
│ │           │   ),                                                                             │ │
│ │           │   artwork=ArtworkConfig(                                                         │ │
│ │           │   │   embed=True,                                                                │ │
│ │           │   │   embed_size='large',                                                        │ │
│ │           │   │   embed_max_width=-1,                                                        │ │
│ │           │   │   save_artwork=False,                                                        │ │
│ │           │   │   saved_max_width=-1                                                         │ │
│ │           │   ),                                                                             │ │
│ │           │   metadata=MetadataConfig(                                                       │ │
│ │           │   │   set_playlist_to_album=True,                                                │ │
│ │           │   │   renumber_playlist_tracks=True,                                             │ │
│ │           │   │   exclude=[]                                                                 │ │
│ │           │   ),                                                                             │ │
│ │           │   qobuz_filters=QobuzDiscographyFilterConfig(                                    │ │
│ │           │   │   extras=False,                                                              │ │
│ │           │   │   repeats=False,                                                             │ │
│ │           │   │   non_albums=False,                                                          │ │
│ │           │   │   features=False,                                                            │ │
│ │           │   │   non_studio_albums=False,                                                   │ │
│ │           │   │   non_remaster=False                                                         │ │
│ │           │   ),                                                                             │ │
│ │           │   cli=CliConfig(text_output=True, progress_bars=True, max_search_results=100),   │ │
│ │           │   database=DatabaseConfig(                                                       │ │
│ │           │   │   downloads_enabled=True,                                                    │ │
│ │           │   │   downloads_path='/home/michel/.config/streamrip/downloads.db',              │ │
│ │           │   │   failed_downloads_enabled=True,                                             │ │
│ │           │   │   failed_downloads_path='/home/michel/.config/streamrip/failed_downloads.db' │ │
│ │           │   ),                                                                             │ │
│ │           │   conversion=ConversionConfig(                                                   │ │
│ │           │   │   enabled=False,                                                             │ │
│ │           │   │   codec='ALAC',                                                              │ │
│ │           │   │   sampling_rate=48000,                                                       │ │
│ │           │   │   bit_depth=24,                                                              │ │
│ │           │   │   lossy_bitrate=320                                                          │ │
│ │           │   ),                                                                             │ │
│ │           │   misc=MiscConfig(version='2.0.3', check_for_updates=True),                      │ │
│ │           │   _modified=False                                                                │ │
│ │           )                                                                                  │ │
│ │  folder = '/home/michel/StreamripDownloads'                                                  │ │
│ │    meta = TrackMetadata(                                                                     │ │
│ │           │   info=TrackInfo(                                                                │ │
│ │           │   │   id=1696295736,                                                             │ │
│ │           │   │   quality=0,                                                                 │ │
│ │           │   │   bit_depth=None,                                                            │ │
│ │           │   │   explicit=False,                                                            │ │
│ │           │   │   sampling_rate=None,                                                        │ │
│ │           │   │   work=None                                                                  │ │
│ │           │   ),                                                                             │ │
│ │           │   title='TAKEDA - NO MORE (MARTAZE VIP) [FREE DOWNLOAD]',                        │ │
│ │           │   album=AlbumMetadata(                                                           │ │
│ │           │   │   info=AlbumInfo(                                                            │ │
│ │           │   │   │   id=1696295736,                                                         │ │
│ │           │   │   │   quality=0,                                                             │ │
│ │           │   │   │   container='MP3',                                                       │ │
│ │           │   │   │   label=None,                                                            │ │
│ │           │   │   │   explicit=False,                                                        │ │
│ │           │   │   │   sampling_rate=None,                                                    │ │
│ │           │   │   │   bit_depth=None,                                                        │ │
│ │           │   │   │   booklets=None                                                          │ │
│ │           │   │   ),                                                                         │ │
│ │           │   │   album='Unknown album',                                                     │ │
│ │           │   │   albumartist='MARTAZE',                                                     │ │
│ │           │   │   year='2023',                                                               │ │
│ │           │   │   genre=['Dubstep'],                                                         │ │
│ │           │   │   covers=Covers(('original', None, None)                                     │ │
│ │           ('large', 'https://i1.sndcdn.com/artworks-XEBlFWzFqyB2mUHu-6ag8OQ-t500x500.jpg',   │ │
│ │           None)                                                                              │ │
│ │           ('small', None, None)                                                              │ │
│ │           ('thumbnail', None, None)),                                                        │ │
│ │           │   │   tracktotal=1,                                                              │ │
│ │           │   │   disctotal=1,                                                               │ │
│ │           │   │   albumcomposer=None,                                                        │ │
│ │           │   │   comment=None,                                                              │ │
│ │           │   │   compilation=None,                                                          │ │
│ │           │   │   copyright=None,                                                            │ │
│ │           │   │   date='2023-12-21T19:06:43Z',                                               │ │
│ │           │   │   description='Follow @martazedubs\nFollow @takeda-dubz\n\nlittle xmas gift  │ │
│ │           :3\n\n"I couldn\'t give a'+59,                                                     │ │
│ │           │   │   encoder=None,                                                              │ │
│ │           │   │   grouping=None,                                                             │ │
│ │           │   │   lyrics=None,                                                               │ │
│ │           │   │   purchase_date=None                                                         │ │
│ │           │   ),                                                                             │ │
│ │           │   artist='MARTAZE',                                                              │ │
│ │           │   tracknumber=1,                                                                 │ │
│ │           │   discnumber=0,                                                                  │ │
│ │           │   composer=None,                                                                 │ │
│ │           │   isrc=None                                                                      │ │
│ │           )                                                                                  │ │
│ │  parent = '/home/michel/StreamripDownloads'                                                  │ │
│ │ quality = 0                                                                                  │ │
│ │    resp = {                                                                                  │ │
│ │           │   'artwork_url':                                                                 │ │
│ │           'https://i1.sndcdn.com/artworks-XEBlFWzFqyB2mUHu-6ag8OQ-large.jpg',                │ │
│ │           │   'caption': None,                                                               │ │
│ │           │   'commentable': True,                                                           │ │
│ │           │   'comment_count': 102,                                                          │ │
│ │           │   'created_at': '2023-12-21T19:06:43Z',                                          │ │
│ │           │   'description': 'Follow @martazedubs\nFollow @takeda-dubz\n\nlittle xmas gift   │ │
│ │           :3\n\n"I couldn\'t give a'+59,                                                     │ │
│ │           │   'downloadable': True,                                                          │ │
│ │           │   'download_count': 1264,                                                        │ │
│ │           │   'duration': 211905,                                                            │ │
│ │           │   'full_duration': 211905,                                                       │ │
│ │           │   ... +37                                                                        │ │
│ │           }                                                                                  │ │
│ │    self = PendingSingle(                                                                     │ │
│ │           │   id='1696295736|_original_download',                                            │ │
│ │           │   client=<streamrip.client.soundcloud.SoundcloudClient object at                 │ │
│ │           0x7f88ab8f00d0>,                                                                   │ │
│ │           │   config=<streamrip.config.Config object at 0x7f88ab81ee90>,                     │ │
│ │           │   db=Database(                                                                   │ │
│ │           │   │   downloads=<streamrip.db.Downloads object at 0x7f88ab8f0130>,               │ │
│ │           │   │   failed=<streamrip.db.Failed object at 0x7f88ab8f0220>                      │ │
│ │           │   )                                                                              │ │
│ │           )                                                                                  │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/client/soundclou │
│ d.py:119 in get_downloadable                                                                     │
│                                                                                                  │
│   116 │   │   │   raise NonStreamableError(item_info)                                            │
│   117 │   │                                                                                      │
│   118 │   │   if download_info == self.ORIGINAL_DOWNLOAD:                                        │
│ ❱ 119 │   │   │   resp_json, status = await self._api_request(f"tracks/{item_id}/download")      │
│   120 │   │   │   assert status == 200                                                           │
│   121 │   │   │   return SoundcloudDownloadable(                                                 │
│   122 │   │   │   │   self.session,                                                              │
│                                                                                                  │
│ ╭──────────────────────────────────────── locals ─────────────────────────────────────────╮      │
│ │             _ = 0                                                                       │      │
│ │ download_info = '_original_download'                                                    │      │
│ │         infos = ['1696295736', '_original_download']                                    │      │
│ │       item_id = '1696295736'                                                            │      │
│ │     item_info = '1696295736|_original_download'                                         │      │
│ │          self = <streamrip.client.soundcloud.SoundcloudClient object at 0x7f88ab8f00d0> │      │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────╯      │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/client/soundclou │
│ d.py:227 in _api_request                                                                         │
│                                                                                                  │
│   224 │                                                                                          │
│   225 │   async def _api_request(self, path, params=None, headers=None):                         │
│   226 │   │   url = f"{BASE}/{path}"                                                             │
│ ❱ 227 │   │   return await self._request(url, params=params, headers=headers)                    │
│   228 │                                                                                          │
│   229 │   async def _request(self, url, params=None, headers=None) -> tuple[dict, int]:          │
│   230 │   │   c = self.config                                                                    │
│                                                                                                  │
│ ╭───────────────────────────────────── locals ──────────────────────────────────────╮            │
│ │ headers = None                                                                    │            │
│ │  params = None                                                                    │            │
│ │    path = 'tracks/1696295736/download'                                            │            │
│ │    self = <streamrip.client.soundcloud.SoundcloudClient object at 0x7f88ab8f00d0> │            │
│ │     url = 'https://api-v2.soundcloud.com/tracks/1696295736/download'              │            │
│ ╰───────────────────────────────────────────────────────────────────────────────────╯            │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/streamrip/client/soundclou │
│ d.py:241 in _request                                                                             │
│                                                                                                  │
│   238 │   │                                                                                      │
│   239 │   │   logger.debug(f"Requesting {url} with {_params=}, {headers=}")                      │
│   240 │   │   async with self.session.get(url, params=_params, headers=headers) as resp:         │
│ ❱ 241 │   │   │   return await resp.json(), resp.status                                          │
│   242 │                                                                                          │
│   243 │   async def _request_body(self, url, params=None, headers=None):                         │
│   244 │   │   c = self.config                                                                    │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ _params = {                                                                                  │ │
│ │           │   'client_id': 'KuAqwbkovCcpecMXSpUILPdVD8lDlXTd',                               │ │
│ │           │   'app_version': '1737551533',                                                   │ │
│ │           │   'app_locale': 'en'                                                             │ │
│ │           }                                                                                  │ │
│ │       c = SoundcloudConfig(                                                                  │ │
│ │           │   client_id='KuAqwbkovCcpecMXSpUILPdVD8lDlXTd',                                  │ │
│ │           │   app_version='1737551533',                                                      │ │
│ │           │   quality=0                                                                      │ │
│ │           )                                                                                  │ │
│ │ headers = None                                                                               │ │
│ │  params = None                                                                               │ │
│ │    resp = <ClientResponse(https://api-v2.soundcloud.com/tracks/1696295736/download?client_i… │ │
│ │           [401 Unauthorized]>                                                                │ │
│ │           <CIMultiDictProxy('Content-Length': '0', 'Connection': 'keep-alive',               │ │
│ │           'x-robots-tag': 'noindex', 'Cache-Control': 'private, max-age=0',                  │ │
│ │           'referrer-policy': 'no-referrer', 'x-frame-options': 'DENY',                       │ │
│ │           'x-content-type-options': 'nosniff', 'strict-transport-security':                  │ │
│ │           'max-age=63072000', 'Server': 'am/2', 'Date': 'Wed, 22 Jan 2025 15:43:41 GMT',     │ │
│ │           'Vary': 'Origin', 'X-Cache': 'Error from cloudfront', 'Via': '1.1                  │ │
│ │           cf65dbfe06da8e543052ca7066d0e458.cloudfront.net (CloudFront)', 'X-Amz-Cf-Pop':     │ │
│ │           'AMS58-P4', 'X-Amz-Cf-Id':                                                         │ │
│ │           '2MSFAPT_99jb1Tg9FwFetrg1XpHS-BuHoDoF3Lk8ly5OQF_Pp-o-Yw==')>                       │ │
│ │    self = <streamrip.client.soundcloud.SoundcloudClient object at 0x7f88ab8f00d0>            │ │
│ │     url = 'https://api-v2.soundcloud.com/tracks/1696295736/download'                         │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                  │
│ /home/michel/.local/pipx/venvs/streamrip/lib/python3.10/site-packages/aiohttp/client_reqrep.py:1 │
│ 176 in json                                                                                      │
│                                                                                                  │
│   1173 │   │   if content_type:                                                                  │
│   1174 │   │   │   ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower()                       │
│   1175 │   │   │   if not _is_expected_content_type(ctype, content_type):                        │
│ ❱ 1176 │   │   │   │   raise ContentTypeError(                                                   │
│   1177 │   │   │   │   │   self.request_info,                                                    │
│   1178 │   │   │   │   │   self.history,                                                         │
│   1179 │   │   │   │   │   message=(                                                             │
│                                                                                                  │
│ ╭─────────────────────────────────────────── locals ───────────────────────────────────────────╮ │
│ │ content_type = 'application/json'                                                            │ │
│ │        ctype = ''                                                                            │ │
│ │     encoding = None                                                                          │ │
│ │        loads = <function loads at 0x7f88ace7eb00>                                            │ │
│ │         self = <ClientResponse(https://api-v2.soundcloud.com/tracks/1696295736/download?cli… │ │
│ │                [401 Unauthorized]>                                                           │ │
│ │                <CIMultiDictProxy('Content-Length': '0', 'Connection': 'keep-alive',          │ │
│ │                'x-robots-tag': 'noindex', 'Cache-Control': 'private, max-age=0',             │ │
│ │                'referrer-policy': 'no-referrer', 'x-frame-options': 'DENY',                  │ │
│ │                'x-content-type-options': 'nosniff', 'strict-transport-security':             │ │
│ │                'max-age=63072000', 'Server': 'am/2', 'Date': 'Wed, 22 Jan 2025 15:43:41      │ │
│ │                GMT', 'Vary': 'Origin', 'X-Cache': 'Error from cloudfront', 'Via': '1.1       │ │
│ │                cf65dbfe06da8e543052ca7066d0e458.cloudfront.net (CloudFront)',                │ │
│ │                'X-Amz-Cf-Pop': 'AMS58-P4', 'X-Amz-Cf-Id':                                    │ │
│ │                '2MSFAPT_99jb1Tg9FwFetrg1XpHS-BuHoDoF3Lk8ly5OQF_Pp-o-Yw==')>                  │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
ContentTypeError: 0, message='Attempt to decode JSON with unexpected mimetype: ',
url=URL('https://api-v2.soundcloud.com/tracks/1696295736/download?client_id=KuAqwbkovCcpecMXSpUILPdVD8lDlXTd&app_version=1737551533&app_locale=en')

Config File

[downloads]
# Folder where tracks are downloaded to
folder = "C:\\Users\\mj99\\StreamripDownloads"
# Put Qobuz albums in a 'Qobuz' folder, Tidal albums in 'Tidal' etc.
source_subdirectories = false

# Download (and convert) tracks all at once, instead of sequentially. 
# If you are converting the tracks, or have fast internet, this will 
# substantially improve processing speed.
concurrency = true
# The maximum number of tracks to download at once
# If you have very fast internet, you will benefit from a higher value,
# A value that is too high for your bandwidth may cause slowdowns
# Set to -1 for no limit
max_connections = 6
# Max number of API requests per source to handle per minute
# Set to -1 for no limit
requests_per_minute = 60

[qobuz]
# 1: 320kbps MP3, 2: 16/44.1, 3: 24/<=96, 4: 24/>=96
quality = 3
# This will download booklet pdfs that are included with some albums
download_booklets = true

# Authenticate to Qobuz using auth token? Value can be true/false only
use_auth_token = false
# Enter your userid if the above use_auth_token is set to true, else enter your email
email_or_userid = ""
# Enter your auth token if the above use_auth_token is set to true, else enter the md5 hash of your plaintext password
password_or_token = ""
# Do not change
app_id = ""
# Do not change
secrets = []

[tidal]
# 0: 256kbps AAC, 1: 320kbps AAC, 2: 16/44.1 "HiFi" FLAC, 3: 24/44.1 "MQA" FLAC
quality = 3
# This will download videos included in Video Albums.
download_videos = true

# Do not change any of the fields below
user_id = ""
country_code = ""
access_token = ""
refresh_token = ""
# Tokens last 1 week after refresh. This is the Unix timestamp of the expiration
# time. If you haven't used streamrip in more than a week, you may have to log
# in again using `rip config --tidal`
token_expiry = ""

[deezer]
# 0, 1, or 2
# This only applies to paid Deezer subscriptions. Those using deezloader
# are automatically limited to quality = 1
quality = 2
# An authentication cookie that allows streamrip to use your Deezer account
# See https://github.com/nathom/streamrip/wiki/Finding-Your-Deezer-ARL-Cookie
# for instructions on how to find this
arl = ""
# This allows for free 320kbps MP3 downloads from Deezer
# If an arl is provided, deezloader is never used
use_deezloader = true
# This warns you when the paid deezer account is not logged in and rip falls
# back to deezloader, which is unreliable
deezloader_warnings = true

[soundcloud]
# Only 0 is available for now
quality = 0
# This changes periodically, so it needs to be updated
client_id = "KuAqwbkovCcpecMXSpUILPdVD8lDlXTd"
app_version = "1737551533"

[youtube]
# Only 0 is available for now
quality = 0
# Download the video along with the audio
download_videos = false
# The path to download the videos to
video_downloads_folder = "REMOVED"

[database]
# Create a database that contains all the track IDs downloaded so far
# Any time a track logged in the database is requested, it is skipped
# This can be disabled temporarily with the --no-db flag
downloads_enabled = true
# Path to the downloads database 
downloads_path = "C:\\Users\\mj99\\AppData\\Roaming\\streamrip\\downloads.db"
# If a download fails, the item ID is stored here. Then, `rip repair` can be
# called to retry the downloads
failed_downloads_enabled = true
failed_downloads_path = "REMOVED"

# Convert tracks to a codec after downloading them.
[conversion]
enabled = false
# FLAC, ALAC, OPUS, MP3, VORBIS, or AAC
codec = "ALAC"
# In Hz. Tracks are downsampled if their sampling rate is greater than this. 
# Value of 48000 is recommended to maximize quality and minimize space
sampling_rate = 48000
# Only 16 and 24 are available. It is only applied when the bit depth is higher
# than this value.
bit_depth = 24
# Only applicable for lossy codecs
lossy_bitrate = 320

# Filter a Qobuz artist's discography. Set to 'true' to turn on a filter.
# This will also be applied to other sources, but is not guaranteed to work correctly
[qobuz_filters]
# Remove Collectors Editions, live recordings, etc.
extras = false
# Picks the highest quality out of albums with identical titles.
repeats = false
# Remove EPs and Singles
non_albums = false
# Remove albums whose artist is not the one requested
features = false
# Skip non studio albums
non_studio_albums = false
# Only download remastered albums
non_remaster = false

[artwork]
# Write the image to the audio file
embed = true
# The size of the artwork to embed. Options: thumbnail, small, large, original.
# "original" images can be up to 30MB, and may fail embedding. 
# Using "large" is recommended.
embed_size = "large"
# If this is set to a value > 0, max(width, height) of the embedded art will be set to this value in pixels
# Proportions of the image will remain the same
embed_max_width = -1
# Save the cover image at the highest quality as a seperate jpg file
save_artwork = true
# If this is set to a value > 0, max(width, height) of the saved art will be set to this value in pixels
# Proportions of the image will remain the same
saved_max_width = -1


[metadata]
# Sets the value of the 'ALBUM' field in the metadata to the playlist's name. 
# This is useful if your music library software organizes tracks based on album name.
set_playlist_to_album = true
# If part of a playlist, sets the `tracknumber` field in the metadata to the track's 
# position in the playlist instead of its position in its album
renumber_playlist_tracks = true
# The following metadata tags won't be applied
# See https://github.com/nathom/streamrip/wiki/Metadata-Tag-Names for more info
exclude = []

# Changes the folder and file names generated by streamrip.
[filepaths]
# Create folders for single tracks within the downloads directory using the folder_format
# template
add_singles_to_folder = false
# Available keys: "albumartist", "title", "year", "bit_depth", "sampling_rate",
# "id", and "albumcomposer"
folder_format = "{albumartist} - {title} ({year}) [{container}] [{bit_depth}B-{sampling_rate}kHz]"
# Available keys: "tracknumber", "artist", "albumartist", "composer", "title",
# and "albumcomposer", "explicit"
track_format = "{tracknumber:02}. {artist} - {title}{explicit}"
# Only allow printable ASCII characters in filenames.
restrict_characters = false
# Truncate the filename if it is greater than this number of characters
# Setting this to false may cause downloads to fail on some systems
truncate_to = 120

# Last.fm playlists are downloaded by searching for the titles of the tracks
[lastfm]
# The source on which to search for the tracks.
source = "qobuz"
# If no results were found with the primary source, the item is searched for 
# on this one.
fallback_source = ""

[cli]
# Print "Downloading {Album name}" etc. to screen
text_output = true
# Show resolve, download progress bars
progress_bars = true
# The maximum number of search results to show in the interactive menu
max_search_results = 100

[misc]
# Metadata to identify this config file. Do not change.
version = "2.0.3"
# Print a message if a new version of streamrip is available 
check_for_updates = true

Operating System

Windows 10 but also happens within WSL Ubuntu

streamrip version

2.0.5

Screenshots and recordings

No response

Additional context

No response

MichelJonkman avatar Jan 22 '25 15:01 MichelJonkman

I'm getting this too, using a plain-text file with a listing of Soundcloud links. Version 2.10, on a Mac.

When I go through and attempt to download the files individually, they mostly work until I get to one in particular (https://soundcloud.com/tiffanytheduchess/the-duchess-bedrock-sessions-34-bm-sunset-wednesday-2024). So I think Soundcloud must be returning malformed data for that.

adamjrice avatar Apr 30 '25 23:04 adamjrice

I'm getting this too, using a plain-text file with a listing of Soundcloud links. Version 2.10, on a Mac.

When I go through and attempt to download the files individually, they mostly work until I get to one in particular (https://soundcloud.com/tiffanytheduchess/the-duchess-bedrock-sessions-34-bm-sunset-wednesday-2024). So I think Soundcloud must be returning malformed data for that.

Image

It only seems to happen on tracks with the "Download file" option avaliable.

ThinLiquid avatar May 01 '25 17:05 ThinLiquid

Well spotted!

adamjrice avatar May 01 '25 17:05 adamjrice