Want to be a l33t h4cker pirate? Look no further, you have come to the right place! In this blog post you will get some idea on how to start ripping music.
In this blog post I will discuss:
The take away from this blog post is that shell scripting in combination with free programs from your distributions repository (or Mac OSX homebrew or what repo is available on Windows these days) is very powerful and is often more than enough to get your job done. This is a great example where I think a shell script really shines.
Disclaimer: I will not provide a working script, I will merely give some pointers on how to record music from your sound device directly. I do not endorse the illegal distribution of pirated music! Just use it for your own consumption.
At some point in time I wanted to make a mix tape, in order to do that I needed the songs so I could mix them. My first idea was to create a youtube playlist containing all my songs I wanted to mix and then to use
youtube-dl to extract the audio from the videos in the playlist. This does work, and is straightforward, but the audio quality is not very good. I wanted to play this mix tape once on an event, and people would listen to it using headphones, therefore I did needed normal audio quality.
So I went for plan B; recording the tracks I wanted straight from a paid music subscription service. The procedure I ended up using is as follows:
This is the script:
while read -r p; do trackId=$(Extract the trackId from the playlist) # Start the song with the extracted trackId # Stop the song on your music streaming subscription with the provided API by the subscription sleep 2 title=$(Extract the song title of the song currently playing) artist=$(Extract the artist of the song currently playing) time=$(Extract the time remaning of the song currently playing) artist=$(Format the artist nicely with sed) title=$(Format the title of the song with sed) filename="$artist-$title.wav" if [ ! -f "$filename" ]; then echo "recording" "$filename" # Start the song with the API provided by your music streaming subscription timeout "$time"s pacat --record -d alsa_output.pci-0000_00_1f.3.analog-stereo.monitor | sox -t raw -r 44100 -L -e signed-integer -S -b 16 -c 2 - "$filename" # Stop the song with the API provided by your music streaming subscription else echo "$filename" already exists fi done < "$1"
This script takes as input a file containing all the songs in the playlist. The script stops after all the lines in the input file have been processed. Most of the shell script is there to automate the extraction of the metadata of the songs you want to record, and it is really specific to the API of music subscription service that you are using.
This line is where the magic happens,
timeout "$time"s pacat --record -d alsa_output.pci-0000_00_1f.3.analog-stereo.monitor | sox -t raw -r 44100 -L -e signed-integer -S -b 16 -c 2 - "$filename"
In this line,
timeout in runs a command for the duration of
$time seconds. In this case the
pacat command records the audio streaming going to my monitor and streams the bytes to the
sox command, which encodes the stream as a
.wav file. I use
pacat because I use Pulseaudio as my audio server, if you use a different audio server there probably exists something very similar. The
sox commando, also known as “SoX - Sound eXchange, the Swiss Army knife of audio manipulation” encodes the stream to a
.wav file. I do not know all the ins and outs of
sox but in this case it was very useful. The recording stops when the song should be done, and the next song is started. If you want to do this yourself you have to change some things in order to get this to work.
Shell scripting is just so convenient to get work done quickly. The programs
sox where in my user repository and were very easily installed using my package manager, and using pipes (
|) they efficiently work together! I hope that after this you will be inspired to make your own shell scripts, and that your realize that bending a computer to your will is not that hard (at least not on Linux 😉)!
And making this script was way more fun than the actual mixing of the music!