A command-line app for downloading songs, podcasts and videos from Spotify.
Project description
Votify
A command-line app for downloading songs, podcasts and videos from Spotify.
Join our Discord Server: https://discord.gg/aBjMEZ9tnq
✨ Features
- 🎵 Songs - Download songs.
- 🎙️ Podcasts - Download podcasts.
- 🎬 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.
📋 Prerequisites
Required
- 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
[!WARNING]
- Some users have reported that Spotify suspended their accounts after using Votify. Use it at your own risk.
- You may not be able to download songs if your account is too new. In this case, you can try downloading songs in AAC quality with a .wvd file, which uses a different download method that may work for new accounts.
Optional
Add these tools to your system PATH or specify their paths via command-line arguments or the config file. Then configure the appropriate option for your use case:
Download songs and podcasts in Vorbis quality:
- Votify uses default settings without requiring any optional tools
Download songs and podcasts in AAC quality (128kbps / 256kbps):
- .wvd file (for songs only)
- FFmpeg, mp4decrypt, or MP4Box + mp4decrypt
Download songs in FLAC quality:
- L1-certified .wvd file
- FFmpeg
Download music videos:
- .wvd file
- FFmpeg or MP4Box
- mp4decrypt (for MP4) or Shaka Packager (for WebM)
Download podcast videos:
- FFmpeg or MP4Box
Download with faster speeds:
- aria2c or cURL
Tools Reference
- .wvd file - Extract using KeyDive from an Android device. Extracted files from emulated devices may not work.
- FFmpeg - Download for Windows: AnimMouse's FFmpeg Builds, Linux: John Van Sickle's FFmpeg Builds
- MP4Box - Download
- mp4decrypt - Download
- Shaka Packager - Download
- cURL - Download
- aria2c - Download
📦 Installation
-
Install Votify via pip:
pip install votify[librespot]
-
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
[!NOTE]
- The 'librespot' extra is only required if you want to download in Vorbis quality. If you only want to download in AAC quality, you can just install the main
votifypackage without the extra.
🚀 Usage
votify [OPTIONS] URLS...
Supported URL types
- Song
- Album
- Playlist
- Podcast episode
- Podcast series
- Music video
- Artist
Examples
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-video
Download a podcast video:
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx" --prefer-video
Choose 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" --auto-media-option albums
Download liked tracks:
votify --auto-media-option liked-tracks
Interactive prompt controls
| Key | Action |
|---|---|
| Arrow keys | Move selection |
| Space | Toggle selection |
| Ctrl + A | Select all |
| Enter | Confirm selection |
⚙️ Configuration
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.
Configuration options
| 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 |
--database-path / database_path |
Path to the SQLite database file for registering downloaded media | null |
--auto-media-option / auto_media_option |
Auto media option | null |
| Spotify | ||
--cookies-path, -c / cookies_path |
Cookies file path | ./cookies.txt |
--wvd-path / wvd_path |
.wvd file path | null |
--prefer-video / prefer_video |
Prefer video streams when available | 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 | vorbis-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 |
| 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 |
Template variables
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
Cover sizes
small- Up to 64pxmedium- Up to 300pxlarge- Up to 640pxextra-large- Up to 2000px
Audio qualities
vorbis-low- Vorbis 96kbpsvorbis-medium- Vorbis 160kbps, songs onlyvorbis-high- Vorbis 320kbps, songs only, requires an active premium subscriptionaac-medium- AAC 128kbps, .wvd file required for songsaac-high- AAC 256kbps, songs only, .wvd required, requires an active premium subscriptionflac- FLAC lossless, songs only, .wvd required, requires an active premium subscription
[!NOTE]
- FLAC quality requires a L1 .wvd file.
Video formats
mp4- H.264 up to 1080p with AAC 128kbpswebm- VP9 up to 1080p with Opus 160kbpsask- Prompt to choose available video and audio codecs
Download modes
ytdlp- Default download modearia2c- Faster alternativecurl- Alternative using curl
[!NOTE]
- yt-dlp is only used as a file download library. Tracks are still fetched directly from Spotify's servers, and yt-dlp is only responsible for handling the file download process.
Video remux modes
ffmpegmp4box
Audio remux modes
ffmpegmp4boxmp4decrypt
[!NOTE] Audio remux modes only apply for non vorbis qualities.
Video resolutions
144p,240p,360p,480p,576p,720p,1080p
Auto media options
artist-albums- Auto-select albumsartist-compilations- Auto-select compilationsartist-singles- Auto-select singlesartist-videos- Auto-select music videosliked-tracks- Auto-select liked tracks (URL not required)
Log levels
DEBUG,INFO,WARNING,ERROR
📄 License
MIT License - see the LICENSE file for details.
🤝 Contributing
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.
🙏 Credits
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file votify-1.8.tar.gz.
File metadata
- Download URL: votify-1.8.tar.gz
- Upload date:
- Size: 46.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e2cbe83b1559caa29c78af9010b9d114475be6daf06ab91767c8b97641b192ce
|
|
| MD5 |
9f1105582c07026186070471eaa7d360
|
|
| BLAKE2b-256 |
bc3c67548da71563ea3f7cb6a51c74bd56e8f9788c70064e34b7ead4d71e2706
|
Provenance
The following attestation bundles were made for votify-1.8.tar.gz:
Publisher:
python-publish.yml on glomatico/votify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
votify-1.8.tar.gz -
Subject digest:
e2cbe83b1559caa29c78af9010b9d114475be6daf06ab91767c8b97641b192ce - Sigstore transparency entry: 1173492188
- Sigstore integration time:
-
Permalink:
glomatico/votify@15192f4fb300c02c921b0c0b67c1077777854f45 -
Branch / Tag:
refs/tags/1.8 - Owner: https://github.com/glomatico
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@15192f4fb300c02c921b0c0b67c1077777854f45 -
Trigger Event:
release
-
Statement type:
File details
Details for the file votify-1.8-py3-none-any.whl.
File metadata
- Download URL: votify-1.8-py3-none-any.whl
- Upload date:
- Size: 54.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fbeeaa719f3fb5e452b4913218b2d2ad04a2d353ca2c020222c0fb1f1d6efcdc
|
|
| MD5 |
59076440f34c4075e2e335d6768617f5
|
|
| BLAKE2b-256 |
5eca6b25a12d2fd78f9164d108c404988e6204d163d4eef3521746ec6ec7e252
|
Provenance
The following attestation bundles were made for votify-1.8-py3-none-any.whl:
Publisher:
python-publish.yml on glomatico/votify
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
votify-1.8-py3-none-any.whl -
Subject digest:
fbeeaa719f3fb5e452b4913218b2d2ad04a2d353ca2c020222c0fb1f1d6efcdc - Sigstore transparency entry: 1173492265
- Sigstore integration time:
-
Permalink:
glomatico/votify@15192f4fb300c02c921b0c0b67c1077777854f45 -
Branch / Tag:
refs/tags/1.8 - Owner: https://github.com/glomatico
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@15192f4fb300c02c921b0c0b67c1077777854f45 -
Trigger Event:
release
-
Statement type: