A command-line app for downloading songs, podcasts and videos from Spotify.
Join our Discord Server: https://discord.gg/aBjMEZ9tnq
- π΅ Songs - Download songs in AAC 128kbps, or AAC 256kbps with an active premium subscription.
- ποΈ Podcasts - Download podcasts in Vorbis or AAC.*
- π¬ Videos - Download podcast videos and music videos.
- π€ Synced Lyrics - Download synced lyrics in LRC format.
- π§βπ€ Artist Support - Download an entire discography by providing the artist's URL.
- βοΈ Highly Customizable - Extensive configuration options for advanced users.
*Vorbis codecs are not available at the moment. Podcasts can only be downloaded in AAC format, even if a Vorbis quality is selected.
- Python 3.10 or higher
- Spotify cookies - Export your browser cookies in Netscape format while logged in at the Spotify homepage:
- Firefox: Export Cookies
- Chromium-based browsers: Get cookies.txt LOCALLY
- FFmpeg on your system PATH. Recommended builds:
- Windows: AnimMouse's FFmpeg Builds
- Linux: John Van Sickle's FFmpeg Builds
- .wvd file - Required to decrypt music videos and AAC songs. Use KeyDive to extract it from an Android device. Files from emulated devices may not work.
Warning
Some users have reported that Spotify suspended their accounts after using Votify. Use it at your own risk.
Note
- A .wvd file is not needed if you only plan to download podcasts. In this case, you can use the
--no-drmflag to disable the .wvd file requirement. - FFmpeg can also be skipped when downloading podcasts in Vorbis codec.
Add these tools to your system PATH or specify their paths via command-line arguments or the config file:
- MP4Box - Required when using
mp4boxas remux mode. - Shaka Packager - Required for
webmvideo format and music video downloads. - mp4decrypt - Required when using
mp4boxormp4decryptas remux mode. - aria2c - Required when using
aria2cas download mode. - cURL - Required when using
curlas download mode.
-
Install Votify via pip:
pip install -y
-
Set up the cookies file:
- Place the cookies file in your working directory as
cookies.txt, or - Specify its path using
--cookies-pathor in the config file.
- Place the cookies file in your working directory as
-
Set up the
.wvdfile:- Place it in your working directory as
device.wvd, or - Specify its path using
--wvd-pathor in the config file.
- Place it in your working directory as
votify [OPTIONS] URLS...- Song
- Album
- Playlist
- Podcast episode
- Podcast series
- Music video
- Artist
Download a song:
votify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo"Download an album:
votify "https://open.spotify.com/album/0r8D5N674HbTXlR3zNxeU1"Download a podcast episode:
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx"Download a podcast series:
votify "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"Download a music video:
votify "https://open.spotify.com/track/31k4hgHmrbzorLZMvMWuzq"Download a music video from a song:
votify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo" --prefer-videoDownload a podcast video:
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx" --prefer-videoChoose which media to download from an artist:
votify "https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt"Auto-select artist albums without a prompt:
votify "https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt" --artist-media-option albums| Key | Action |
|---|---|
| Arrow keys | Move selection |
| Space | Toggle selection |
| Ctrl + A | Select all |
| Enter | Confirm selection |
Votify can be configured using command-line arguments or the config file.
Config file location:
- Linux:
~/.votify/config.ini - Windows:
%USERPROFILE%\.votify\config.ini
The file is created automatically on first run. Command-line arguments override config file values.
| Command-line argument / Config file key | Description | Default |
|---|---|---|
| General | ||
--wait-interval / wait_interval |
Wait interval between downloads in seconds | 10 |
--read-urls-as-txt, -r / - |
Read URLs from text files | false |
--config-path / - |
Config file path | <home>/.votify/config.ini |
--log-level / log_level |
Logging level | INFO |
--log-file / log_file |
Log file path | null |
--no-exceptions / no_exceptions |
Don't print exceptions | false |
--no-config-file, -n / - |
Don't use a config file | false |
| Spotify | ||
--cookies-path, -c / cookies_path |
Cookies file path | ./cookies.txt |
--wvd-path / wvd_path |
.wvd file path | ./device.wvd |
--prefer-video / prefer_video |
Prefer video streams when available | false |
--no-drm / no_drm |
Don't allow DRM-protected media | false |
| Output | ||
--output, -o / output |
Output directory path | ./Spotify |
--temp / temp |
Temporary directory path | . |
--save-cover-file / save_cover_file |
Save cover as a separate file | false |
--save-playlist-file / save_playlist_file |
Save a M3U8 playlist file when downloading a playlist | false |
--overwrite / overwrite |
Overwrite existing files | false |
--cover-size / cover_size |
Cover size to use | extra-large |
--exclude-tags / exclude_tags |
Comma-separated tags to exclude | null |
--truncate / truncate |
Maximum length of file/folder names | null |
| Template | ||
--album-folder-template / album_folder_template |
Folder template for album tracks | {album_artist}/{album} |
--compilation-folder-template / compilation_folder_template |
Folder template for compilation tracks | Compilations/{album} |
--podcast-folder-template / podcast_folder_template |
Folder template for podcast episodes | Podcasts/{album} |
--no-album-folder-template / no_album_folder_template |
Folder template for tracks not in an album | {artist}/Unknown Album |
--single-disc-file-template / single_disc_file_template |
File template for single-disc album tracks | {track:02d} {title} |
--multi-disc-file-template / multi_disc_file_template |
File template for multi-disc album tracks | {disc}-{track:02d} {title} |
--podcast-file-template / podcast_file_template |
File template for podcast episodes | {track:02d} {title} |
--no-album-file-template / no_album_file_template |
File template for tracks not in an album | {title} |
--playlist-file-template / playlist_file_template |
File template for M3U8 playlists | Playlists/{playlist_artist}/{playlist_title} |
--date-tag-template / date_tag_template |
Date tag template | %Y-%m-%dT%H:%M:%SZ |
| Song / Podcast | ||
--audio-quality / audio_quality |
Comma-separated audio quality priority | aac-medium |
--audio-download-mode / audio_download_mode |
Audio download mode to use | ytdlp |
--audio-remux-mode / audio_remux_mode |
Audio remux mode to use | ffmpeg |
--synced-lyrics-only / synced_lyrics_only |
Only download synced lyrics file | false |
--no-synced-lyrics-file / no_synced_lyrics_file |
Don't create synced lyrics file | false |
| Video | ||
--video-format / video_format |
Video format to use | mp4 |
--video-resolution / video_resolution |
Video resolution to use | 1080p |
--video-remux-mode / video_remux_mode |
Video remux mode to use | ffmpeg |
| Artist | ||
--artist-media-option / artist_media_option |
Auto-select option for artist URLs | null |
| Executables | ||
--aria2c-path / aria2c_path |
Path to aria2c binary | aria2c |
--curl-path / curl_path |
Path to curl binary | curl |
--ffmpeg-path / ffmpeg_path |
Path to FFmpeg binary | ffmpeg |
--mp4box-path / mp4box_path |
Path to MP4Box binary | mp4box |
--mp4decrypt-path / mp4decrypt_path |
Path to mp4decrypt binary | mp4decrypt |
--shaka-packager-path / shaka_packager_path |
Path to Shaka Packager binary | packager |
Tags usable in template folder/file options and in the exclude_tags list:
album,album_artistartistcomposerdate(supports strftime format:{date:%Y})disc,disc_totalisrclabelmedia_idmedia_typeplaylist_id,playlist_artist,playlist_title,playlist_trackproducer,publisherratingtitle,track,track_total
Tags usable in the exclude_tags list only:
compilation,copyright,coverdescriptionlyricsurl
small- Up to 64pxmedium- Up to 300pxlarge- Up to 640pxextra-large- Up to 2000px
aac-medium- AAC 128kbpsaac-high- AAC 256kbps, requires an active premium subscriptionvorbis-low- Vorbis 96kbps, podcasts onlyvorbis-medium- Vorbis 160kbps, podcasts onlyvorbis-high- Vorbis 320kbps, podcasts only, requires an active premium subscription
mp4- H.264 up to 1080p with AAC 128kbpswebm- VP9 up to 1080p with Opus 160kbpsask- Prompt to choose available video and audio codecs
ytdlp- Default download modearia2c- Faster alternativecurl- Alternative using curl
ffmpegmp4box
ffmpegmp4boxmp4decrypt
144p,240p,360p,480p,576p,720p,1080p
albums- Auto-select albumscompilations- Auto-select compilationssingles- Auto-select singlesvideos- Auto-select music videos
DEBUG,INFO,WARNING,ERROR
MIT License - see the LICENSE file for details.
I'm generally not reviewing pull requests that change or add features at this time. Only critical bug fixes will be considered. Feel free to open issues for bugs or feature requests.