Ripping an album from youtube - CLI Style

With the advent of [Spotify](https://www.spotify.com/), 
[Apple Music](https://www.apple.com/music), [Youtube](https://youtube.com), 
[Pandora](https://www.pandora.com) and many other streaming music services, the 
need to have local mp3 files doesn't crop up very often. However, my kids either
have cheap mp3 players or use their 
[3ds's](https://en.wikipedia.org/wiki/Nintendo_3DS) to play local mp3 files.

---

This post is a quick tip on ripping an album from youtube using a web browser and
 a few cli apps. Remember, most tasks don't need a bloated gui to be done
efficiently.

### Requirement
1. A Web browser that can play youtube videos
2. [Youtube-dl](http://rg3.github.io/youtube-dl/)
3. ffmpeg
4. Bash

### Prep work

#### Install ffmpeg
 
Ubuntu

    sudo apt-get install ffmpeg -y

Fedora

    sudo yum install ffmpeg

Gentoo

    sudo emerge ffmpeg

#### Install Youtube-DL

If your on a Debian or Ubuntu flavor of linux

    sudo apt-get install youtube-dl -y

Fedora 

    sudo yum install youtub-dl

On my favourite, Gentoo

    emerge --ask youtube-dl

### Download the album

At this point you have all the tools you need to get the job done. Have a browse
around on youtube to find the album you want an offline copy of and copy the url of the page. Then from a
command prompt:

    mkdir ~/tmp
    cd ~/tmp
    youtube-dl -x --audio-format mp3 https://youtube.com/fullurltovideo

### Create a list file

While the audio file is downloading, your going to want to create a simple txt
file which lists the tracks, titles and start and end timings. I simply fast
forwarded through each track toward the end of the song and made note of the
mintes and seconds. I created a file with each line representing a track in the album with the following details:

_Track Number_-_Track title_-_Start duration_-_End duration_

The durations are in the form of HH:MM:SS. Here is what my file looks like:

    cat ~/tmp/list.txt
    01-The Greatest Show-00:0:00-5:08
    02-A Million Dreams-00:5:08-9:38
    03-A Million Dreams Reprise-00:9:39-10:38
    04-Come Alive-00:10:38-14:25
    05-The Other Side-00:14:25-17:58
    06-Never Enough-00:17:58-21:28
    07-This Is Me-00:21:38-25:23
    08-Rewrite the Stars-00:25:23-28:59
    09-Tightrope-00:28:59-32:50
    10-Never Enough (Reprise)-00:32:50-34:14
    11-From Now On-00:34:14-40:12

### Split the audio to seperate mp3's

Now that my file has finished downloading, I can convert the file into separate
song files

Here is the little bash script I wrote to split the file based on the contents
of the list.txt file

*Note the `-nostdin` parameter below is required to prevent ffmpeg from
consuming bytes from input which makes it go screwy*

    cat splitsong.sh
    #!/bin/bash

    while IFS=- read tr ti s e; do
        FILENAME="${tr} - The Greatest Showman - ${ti}.mp3"
        ffmpeg -nostdin \
            -i "$2" -acodec copy \
            -ss "$s" -to "$e" \
            "${FILENAME}" < /dev/null
    done <"$1"

I then execute the file like this:

    chmod +x splitsong.sh
    ./splitsong.sh list.txt 'Some Sound Track List-qDZLSHY1ims.mp3'

And the whole thing is over in a matter of seconds.

Tags: bash-tips, mp3, ffmpeg, cli, scripting, youtube, music, linux
