Super-simple steps to save your Suno session and download your songs (MP3, WAV by default; optional Video) with metadata.
- Install requirements
python -m pip install --upgrade pip
pip install playwright
playwright install firefoxOn Arch Linux, you can install playwright using the package python-playwright.
- Save your login session
python save-login.py- A Firefox window opens at https://suno.com
- Login to your Suno account. I have only tested Google and Facebook login.
- Do NOT use Google login (Google blocks Playwright logins).
- Once you see you are logged in, return to the terminal and press Enter. This creates
context.jsonin this folder.
- Download your songs
Default (MP3 + WAV only):
python download-songs.pyAlso download videos (adds MP4):
python download-songs.py --videosBehavior with --videos:
- For new songs on the page, the script will attempt to download MP3, WAV, and the Video. If the video download fails or times out, it logs a warning and continues — MP3/WAV and metadata are still saved. You can re-run with
--videosto retry videos later. - For songs that already exist in
suno-songs.json, if theirlocalFilesdo not contain any.mp4, the script will attempt to download the video only (best effort). Failures are warnings only and do not stop the run.
General:
- The script opens
https://suno.com/me, goes through your songs and downloads:- MP3 (
.mp3) - WAV (
.wav) - Video (
.mp4) — only when--videosis used
- MP3 (
- Files go to
downloads/ - Files are named with a stable id-based pattern:
<persona> - <title> - <id>.<ext>(persona may be empty)
- A metadata catalog is maintained in
suno-songs.json
That’s it.
downloads/— your MP3/WAV files (MP4 videos only when--videosis used)suno-songs.json— metadata per song, including title, duration, persona, lyrics, and the local filenames
Example entry:
{
"id": "<suno-song-id>",
"title": "Song Title",
"duration": "2:23",
"version": "v3",
"lyrics": "...",
"style": "...",
"persona": "Artist Persona",
"personaUrl": "https://suno.com/user/...",
"songUrl": "https://suno.com/song/<id>",
"localFiles": [
"Artist Persona - Song Title - <id>.mp3",
"Artist Persona - Song Title - <id>.wav",
"Artist Persona - Song Title - <id>.mp4"
]
}- Browser: Runs headless by default for automation. Use
--headedto run with a visible Firefox window when needed. - Session:
context.jsonmust exist in the project folder (created bysave-login.py). If it expires, just runsave-login.pyagain. - Filenames: Files are named
<persona> - <title> - <id>.<ext>(persona may be empty). Re-runs will skip files already downloaded with the same id.
- Can’t log in: Use the Facebook button. Avoid Google login.
- Video timeouts: Video (.mp4) downloads often time out, even with a 60-second timeout. Just re-run
python download-songs.py --videosand it will continue; already-downloaded songs are skipped. You may need to retry a few times if Suno is slow. - General timeouts: On slow networks or when Suno is busy, any format may time out. Re-run the script — it skips what’s already saved.
Only download content you own rights to or are allowed to download. Keep context.json private.