Add the following code to your project's shard.yml under:
dependencies
to use in production
- OR -
development_dependencies
to use in development
A music scraper that understands your metadata needs.
irs
is a command-line application that downloads audio and metadata in order
to package an mp3 with both. Extensible, the user can download individual
songs, entire albums, or playlists from Spotify.
~ $ irs -h
Usage: irs [--help] [--version] [--install]
[-s <song> -a <artist>]
[-A <album> -a <artist>]
[-p <playlist> -a <username>]
Arguments:
-h, --help Show this help message and exit
-v, --version Show the program version and exit
-i, --install Download binaries to config location
-c, --config Show config file location
-a, --artist <artist> Specify artist name for downloading
-s, --song <song> Specify song name to download
-A, --album <album> Specify the album name to download
-p, --playlist <playlist> Specify the playlist name to download
-u, --url <url> Specify the youtube url to download from (for single songs only)
-g, --give-url Specify the youtube url sources while downloading (for albums or playlists only only)
Examples:
$ irs --song "Bohemian Rhapsody" --artist "Queen"
# => downloads the song "Bohemian Rhapsody" by "Queen"
$ irs --album "Demon Days" --artist "Gorillaz"
# => downloads the album "Demon Days" by "Gorillaz"
$ irs --playlist "a different drummer" --artist "prakkillian"
# => downloads the playlist "a different drummer" by the user prakkillian
Just download the latest release for your platform here.
Note that the binaries right now have only been tested on WSL. They should run on most linux distros, and OS X, but if they don't please make an issue above.
If you're one of those cool people who compiles from source
https://crystal-lang.org/install/
)git clone https://github.com/cooperhammond/irs
)cd irs
)shards build
).yaml
config file somewhere on your system (usually ~/.irs/
)binary_directory: ~/.irs/bin
music_directory: ~/Music
filename_pattern: "{track_number} - {title}"
directory_pattern: "{artist}/{album}"
client_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
single_folder_playlist:
enabled: true
retain_playlist_order: true
unify_into_album: false
IRS_CONFIG_LOCATION
pointing to that filehttps://developer.spotify.com/dashboard/
CREATE A CLIENT ID
irs --install
and answer the prompts!You should be good to go! Run the file from your command line to get more help on usage or keep reading!
You may have noticed that there's a config file with more than a few options. Here's what they do:
binary_directory: ~/.irs/bin
music_directory: ~/Music
search_terms: "lyrics"
filename_pattern: "{track_number} - {title}"
directory_pattern: "{artist}/{album}"
client_key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
client_secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
single_folder_playlist:
enabled: true
retain_playlist_order: true
unify_into_album: false
binary_directory
: a path specifying where the downloaded binaries should
be placedmusic_directory
: a path specifying where downloaded mp3s should be placed.search_terms
: additional search terms to plug into youtube, which can be
potentially useful for not grabbing erroneous audio.filename_pattern
: a pattern for the output filename of the mp3directory_pattern
: a pattern for the folder structure your mp3s are saved inclient_key
: a client key from your spotify API applicationclient_secret
: a client secret key from your spotify API applicationsingle_folder_playlist/enabled
: if set to true, all mp3s from a downloaded
playlist will be placed in the same folder.single_folder_playlist/retain_playlist_order
: if set to true, the track
numbers of the mp3s of the playlist will be overwritten to correspond to
their place in the playlistsingle_folder_playlist/unify_into_album
: if set to true, will overwrite
the album name and album image of the mp3 with the title of your playlist
and the image for your playlist respectivelyIn a pattern following keywords will be replaced:
Keyword | Replacement | Example |
---|---|---|
{artist} |
Artist Name | Queen |
{title} |
Track Title | Bohemian Rhapsody |
{album} |
Album Name | Stone Cold Classics |
{track_number} |
Track Number | 9 |
{total_tracks} |
Total Tracks in Album | 14 |
{disc_number} |
Disc Number | 1 |
{day} |
Release Day | 01 |
{month} |
Release Month | 01 |
{year} |
Release Year | 2006 |
{id} |
Spotify ID | 6l8GvAyoUZwWDgF1e4822w |
Beware OS-restrictions when naming your mp3s.
Pattern Examples:
music_directory: ~/Music
filename_pattern: "{track_number} - {title}"
directory_pattern: "{artist}/{album}"
Outputs: ~/Music/Queen/Stone Cold Classics/9 - Bohemian Rhapsody.mp3
music_directory: ~/Music
filename_pattern: "{artist} - {title}"
directory_pattern: ""
Outputs: ~/Music/Queen - Bohemian Rhapsody.mp3
music_directory: ~/Music
filename_pattern: "{track_number} of {total_tracks} - {title}"
directory_pattern: "{year}/{artist}/{album}"
Outputs: ~/Music/2006/Queen/Stone Cold Classics/9 of 14 - Bohemian Rhapsody.mp3
music_directory: ~/Music
filename_pattern: "{track_number}. {title}"
directory_pattern: "irs/{artist} - {album}"
Outputs: ~/Music/irs/Queen - Stone Cold Classics/9. Bohemian Rhapsody.mp3
At it's core irs
downloads individual songs. It does this by interfacing
with the Spotify API, grabbing metadata, and then searching Youtube for a video
containing the song's audio. It will download the video using
youtube-dl
, extract the audio using
ffmpeg
, and then pack the audio and metadata together
into an MP3.
From the core, it has been extended to download the index of albums and playlists through the spotify API, and then iteratively use the method above for downloading each song.
It used to be in python, but
crystal-lang
made some promises and I was interested in seeing how well it
did (verdict: if you're building high-level tools you want to run quickly
and distribute, it's perfect)Any and all contributions are welcome. If you think of a cool feature, send a PR or shoot me an email. If you think something could be implemented better, please shoot me an email. If you like what I'm doing here, pretty please shoot me an email.
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)