- 
      
- 
        Save FGRibreau/420b5da7289969e5746298356a49423c to your computer and use it in GitHub Desktop. 
| // open your javascript console and paste this | |
| copy([...$('[role="grid"]')[Object.keys($('[role="grid"]')).filter(x => x.startsWith('__reactProps'))[0]].children[0].props.values[0][1].collection].filter(x => x.value.audio_url).map(x => x.value.audio_url).join(' ')) | |
| // now you have a list of mp3 urls directly in your clipboard that you can pass to wget or a url downloader | 
@SurfingTurtles Put the coppied text inside a txt file then run the python
python3 suno-downloader.py output.txt
Can not figure, what name the txt file should be? I created file output.txt - i got answer  [Errno 2] No such file or directory
Where to get "suno-downloader"? or smth?
rename the text file you created to suno-downloader.py and make sure to install python
Here is a script to download and rename files in Bash.
- Save this script as download.sh, then runchmod +x download.sh.
- Put the list of MP3 and MP4 URLs (that you get from @gadelkareem javascript) inside input.txt
- Then run ./download.sh
#!/bin/bash
# Read the file line by line
while IFS="|" read -r filename url; do
    # Use curl to download the file
    curl -o "$filename" "$url"
    # Wait for 1 second
    sleep 1
done < input.txt
I'd like to offer an updated js snippet to the work done by @gadelkareem , this one will handle the renaming of multiple song names. Don't we all just love how SUNO always spends double our credits making 2 songs fo every prompt.
I found the original code above was a bit problematic because it would try to name the songs the same which doesn't work well when bulk downloading.
This code will give multiple songs of the same name a number such as songname_2, songname_3 etc. The first song name is untouched.
Example:
Virtual Rainfall.mp3|https://cdn1.suno.ai/b75f73f7-e535-4e40-982b-b59342ac1291.mp3
Virtual Rainfall.mp4|https://cdn1.suno.ai/b75f73f7-e535-4e40-982b-b59342ac1291.mp4
Virtual Rainfall_2.mp3|https://cdn1.suno.ai/923ea8f2-bcfa-4c19-b75e-1218618fde52.mp3
Virtual Rainfall_2.mp4|https://cdn1.suno.ai/923ea8f2-bcfa-4c19-b75e-1218618fde52.mp4
// open your javascript console and paste this
copy([...$('[role="grid"]')[Object.keys($('[role="grid"]')).filter(x => x.startsWith('__reactProps'))[0]].children[0].props.values[0][1].collection]
  .filter(x => x.value.audio_url || x.value.video_url)
  .reduce((acc, x) => {
    const title = x.value.title.trim() || x.value.id;
    acc.titles[title] = (acc.titles[title] || 0) + 1;
    const uniqueTitle = acc.titles[title] > 1 ? `${title}_${acc.titles[title]}` : title;
    const audio = x.value.audio_url ? `${uniqueTitle}.mp3|${x.value.audio_url}` : '';
    const video = x.value.video_url ? `${uniqueTitle}.mp4|${x.value.video_url}` : '';
    acc.urls.push([audio, video].filter(Boolean).join("\n"));
    return acc;
  }, { urls: [], titles: {} }).urls.join("\n")
)
// now you have a list of mp3 urls directly in your clipboard that you can pass to wget or a url downloader
I hope this helps.
If you want a slightly improved download script that @jagamypriera created, this one will let you specify any input file you like but it also handles duplicate filenames by appending a number to the song name.
example:
Stardust Reverberation.mp3
Stardust Reverberation.mp4
Stardust Reverberation_2.mp3
Stardust Reverberation_2.mp4
#!/bin/bash
# Check if the input file is provided
if [ -z "$1" ]; then
    echo "Usage: $0 <input_file>"
    exit 1
fi
input_file="$1"
# Read the file line by line
while IFS="|" read -r filename url; do
    # Check if the file already exists
    if [[ -e "$filename" ]]; then
        base="${filename%.*}"
        ext="${filename##*.}"
        counter=2
        while [[ -e "${base}_${counter}.${ext}" ]]; do
            ((counter++))
        done
        filename="${base}_${counter}.${ext}"
    fi
    # Print the song name being downloaded
    echo "Downloading $filename"
    # Use curl to download the file
    curl -o "$filename" "$url"
    # Wait for 1 second
    sleep 1
done < "$input_file"
I hope this helps someone.
works great!, thanks
Im trying to do this but the issue is when pasting it in the console window it doesnt work. I looked and it seems the children element doesnt exsist.
if you want to do this from a playlist, can use
copy([...$('[role="grid"]')[Object.keys($('[role="grid"]')).filter(x => x.startsWith('__reactProps'))[0]].children[0].props.values[0][1].collection].filter(x => x.value.clip.clip.audio_url).map(x => x.value.clip.clip.audio_url).join(' '))
Would you have a JS code working as of July 2025?
Something that you can copy/pate in console when you are on https://suno.com/create?wid=default&page=2
@william-r-s @FGRibreau The previous code doesn't work anymore.
Would you have a JS code working as of July 2025?
Something that you can copy/pate in console when you are on https://suno.com/create?wid=default&page=2
@william-r-s @FGRibreau The previous code doesn't work anymore.
I've created a small Python script that removes the need for using the Javascript console, based on the original code of @FGRibreau . You can get it here: https://gist.github.com/dppancake/f9f43825209050b27900347014459fa4
Let me know if it works
Anyone managed to automate downloading the wav files?
@SurfingTurtles Put the coppied text inside a txt file then run the python
python3 suno-downloader.py output.txt