Getting started
July 30, 2026 · View on GitHub
Install
pip install nuvem_de_som # search + stream (requests + beautifulsoup4)
pip install "nuvem_de_som[stealth]" # adds curl_cffi for browser-impersonating HTTP
pip install "nuvem_de_som[yt-dlp]" # adds yt-dlp for downloads and stream fallback
pip install "nuvem_de_som[cli]" # adds nds terminal app (click)
pip install "nuvem_de_som[yt-dlp,cli]" # everything
Pick a backend
from nuvem_de_som import SoundCloud, SoundCloudAPI, SoundCloudHTML, SoundCloudYTDLP
sc = SoundCloud() # orchestrator: tries API, then yt-dlp, then HTML
sc = SoundCloudAPI() # recommended for most tasks
sc = SoundCloudHTML() # no extra deps; search returns title+URL only
sc = SoundCloudYTDLP() # pip install nuvem_de_som[yt-dlp]
See Backends reference for a full comparison.
Search tracks
for release in sc.search_tracks("nuclear chill", limit=10):
artist = release.work.credits[0].entity.name if release.work.credits else ""
print(release.work.title, artist, release.work.runtime)
search_tracks returns mediavocab.Release objects. See
mediavocab converters for the full field list.
Get all tracks for an artist or set
for release in sc.get_tracks("https://soundcloud.com/acidkid", limit=200):
print(release.work.title, release.uri)
for release in sc.get_tracks("https://soundcloud.com/acidkid/sets/beathop"):
print(release.work.title)
Resolve a stream URL
# Direct MP3/AAC (seekable)
url = sc.resolve_stream("https://soundcloud.com/acidkid/piratech-nuclear-chill")
# HLS playlist
url = sc.resolve_stream("...", prefer="hls")
SoundCloudHTML.resolve_stream() raises NotImplementedError. Use
SoundCloudAPI or SoundCloudYTDLP for stream access.
Download
path = sc.download_track("https://soundcloud.com/acidkid/some-track", output_dir="~/Music")
sc.download_playlist("https://soundcloud.com/acidkid", output_dir="~/Music")
SoundCloudHTML has no download methods. See Backends reference.
Discover artists with crawl()
SoundCloudAPI.crawl() walks the social graph (followers and followings)
with a breadth-first search from one or more seed profiles. A seed can be a
profile URL or a keyword query string. A keyword seed resolves to the top
search_people result.
from nuvem_de_som import SoundCloudAPI
sc = SoundCloudAPI()
seen = set()
for entity in sc.crawl(
["https://soundcloud.com/noisia", "black metal"],
social_depth=20,
max_artists=100,
seen=seen,
):
followers = entity.extra.get("followers_count", "?")
verified = " verified" if entity.extra.get("verified") else ""
print(entity.name, followers, verified)
Pass the same seen set across calls to resume without visiting the same
profile twice. SoundCloudHTML and SoundCloudYTDLP also expose crawl(),
but they use a flat expansion, not a follower graph, because those backends
have no follower endpoints.
See examples/11_crawl.py and examples/12_followers.py for more.
Logging
import logging
logging.getLogger("nuvem_de_som").setLevel(logging.DEBUG)