2026-02-26 18:32:59 -03:00
# Votify
2026-02-26 17:49:47 -03:00
[](https://pypi.org/project/votify/)
[](https://pypi.org/project/votify/)
[](https://github.com/glomatico/votify/blob/main/LICENSE)
[](https://pypi.org/project/votify/)
2025-07-04 19:40:41 -03:00
2025-07-09 13:38:21 -03:00
A command-line app for downloading songs, podcasts and videos from Spotify.
2024-09-21 13:13:54 -03:00
2025-09-09 16:24:00 -03:00
**Join our Discord Server:** <https://discord.gg/aBjMEZ9tnq>
2024-09-21 13:58:31 -03:00
2026-02-26 17:49:47 -03:00
## ✨ Features
2026-03-04 13:26:49 -03:00
- 🎵 **Songs** - Download songs.
- 🎙️ **Podcasts** - Download podcasts.
2026-02-26 21:26:27 -03:00
- 🎬 **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.
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
## 📋 Prerequisites
2024-09-21 13:13:54 -03:00
2026-02-26 17:49:47 -03:00
### Required
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
- **Python 3.10 or higher**
2026-02-26 21:26:27 -03:00
- **Spotify cookies** - Export your browser cookies in Netscape format while logged in at the Spotify homepage:
2026-02-26 17:49:47 -03:00
- Firefox: [Export Cookies ](https://addons.mozilla.org/addon/export-cookies-txt )
- Chromium-based browsers: [Get cookies.txt LOCALLY ](https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc )
- **FFmpeg** on your system PATH. Recommended builds:
- Windows: [AnimMouse's FFmpeg Builds ](https://github.com/AnimMouse/ffmpeg-stable-autobuild/releases )
- Linux: [John Van Sickle's FFmpeg Builds ](https://johnvansickle.com/ffmpeg/ )
2026-02-26 21:26:27 -03:00
- **[.wvd file ](https://github.com/hyugogirubato/KeyDive )** - Required to decrypt music videos and AAC songs. Use [KeyDive ](https://github.com/hyugogirubato/KeyDive ) to extract it from an Android device. Files from emulated devices may not work.
2024-11-30 23:22:59 -03:00
2026-02-26 17:49:47 -03:00
> [!WARNING]
> **Some users have reported that Spotify suspended their accounts after using Votify.** Use it at your own risk.
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
> [!NOTE]
2026-02-26 20:36:29 -03:00
> - A .wvd file is not needed if you only plan to download podcasts. In this case, you can use the `--no-drm` flag to disable the .wvd file requirement.
> - FFmpeg can also be skipped when downloading podcasts in Vorbis codec.
2024-09-23 13:58:24 -03:00
2026-02-26 17:49:47 -03:00
### Optional
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
Add these tools to your system PATH or specify their paths via command-line arguments or the config file:
2025-07-04 19:40:41 -03:00
2026-02-26 21:26:27 -03:00
- **[MP4Box ](https://gpac.io/downloads/gpac-nightly-builds/ )** - Required when using `mp4box` as remux mode.
- **[Shaka Packager ](https://github.com/shaka-project/shaka-packager/releases/latest )** - Required for `webm` video format and music video downloads.
- **[mp4decrypt ](https://www.bento4.com/downloads/ )** - Required when using `mp4box` or `mp4decrypt` as remux mode.
- **[aria2c ](https://github.com/aria2/aria2/releases )** - Required when using `aria2c` as download mode.
- **[cURL ](https://curl.se/download.html )** - Required when using `curl` as download mode.
2024-09-21 13:13:54 -03:00
2026-02-26 17:49:47 -03:00
## 📦 Installation
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
1. Install Votify via pip:
2025-07-04 19:40:41 -03:00
```bash
2026-02-26 17:49:47 -03:00
pip install -y
2025-07-04 19:40:41 -03:00
` ``
2024-09-21 13:13:54 -03:00
2026-02-26 17:49:47 -03:00
2. Set up the cookies file:
- Place the cookies file in your working directory as ` cookies.txt`, or
- Specify its path using ` --cookies-path` or in the config file.
3. Set up the ` .wvd` file:
- Place it in your working directory as ` device.wvd`, or
- Specify its path using ` --wvd-path` or in the config file.
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
## 🚀 Usage
2025-07-04 19:40:41 -03:00
2024-09-21 13:13:54 -03:00
` ``bash
votify [OPTIONS] URLS...
` ``
2024-10-11 17:35:13 -03:00
### Supported URL types
2025-07-04 19:40:41 -03:00
- Song
- Album
- Playlist
- Podcast episode
- Podcast series
- Music video
- Artist
2024-10-11 17:33:54 -03:00
2024-09-21 13:13:54 -03:00
### Examples
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
Download a song:
` ``bash
votify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo"
` ``
Download an album:
` ``bash
votify "https://open.spotify.com/album/0r8D5N674HbTXlR3zNxeU1"
` ``
Download a podcast episode:
` ``bash
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx"
` ``
Download a podcast series:
` ``bash
votify "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"
` ``
Download a music video:
` ``bash
2026-02-26 18:01:24 -03:00
votify "https://open.spotify.com/track/31k4hgHmrbzorLZMvMWuzq"
` ``
Download a music video from a song:
` ``bash
votify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo" --prefer-video
2026-02-26 17:49:47 -03:00
` ``
Download a podcast video:
` ``bash
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx" --prefer-video
` ``
Choose which media to download from an artist:
` ``bash
votify "https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt"
` ``
Auto-select artist albums without a prompt:
` ``bash
votify "https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt" --artist-media-option albums
` ``
2024-09-21 22:31:27 -03:00
### Interactive prompt controls
2025-07-04 19:40:41 -03:00
2026-02-26 17:49:47 -03:00
| 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** | | |
2026-03-03 15:24:50 -03:00
| ` --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` |
2026-02-26 17:49:47 -03:00
| ` --log-file` / ` log_file` | Log file path | ` null` |
| ` --no-exceptions` / ` no_exceptions` | Don't print exceptions | ` false` |
2026-03-03 15:24:50 -03:00
| ` --no-config-file`, ` -n` / - | Don't use a config file | ` false` |
2026-02-26 17:49:47 -03:00
| **Spotify** | | |
2026-03-03 15:24:50 -03:00
| ` --cookies-path`, ` -c` / ` cookies_path` | Cookies file path | ` ./cookies.txt` |
| ` --wvd-path` / ` wvd_path` | .wvd file path | ` ./device.wvd` |
2026-02-26 17:49:47 -03:00
| ` --prefer-video` / ` prefer_video` | Prefer video streams when available | ` false` |
| ` --no-drm` / ` no_drm` | Don't allow DRM-protected media | ` false` |
| **Output** | | |
2026-03-03 15:24:50 -03:00
| ` --output`, ` -o` / ` output` | Output directory path | ` ./Spotify` |
| ` --temp` / ` temp` | Temporary directory path | ` .` |
2026-02-26 17:49:47 -03:00
| ` --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` |
2026-03-03 15:24:50 -03:00
| ` --cover-size` / ` cover_size` | Cover size to use | ` extra-large` |
2026-02-26 17:49:47 -03:00
| ` --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}` |
2026-02-26 20:40:12 -03:00
| ` --podcast-folder-template` / ` podcast_folder_template` | Folder template for podcast episodes | ` Podcasts/{album}` |
2026-02-26 17:49:47 -03:00
| ` --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}` |
2026-02-26 20:40:12 -03:00
| ` --podcast-file-template` / ` podcast_file_template` | File template for podcast episodes | ` {track:02d} {title}` |
2026-02-26 17:49:47 -03:00
| ` --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** | | |
2026-03-03 15:24:50 -03:00
| ` --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` |
2026-02-26 17:49:47 -03:00
| **Video** | | |
2026-03-03 15:24:50 -03:00
| ` --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` |
2026-02-26 17:49:47 -03:00
| **Artist** | | |
2026-03-03 15:24:50 -03:00
| ` --artist-media-option` / ` artist_media_option` | Auto-select option for artist URLs | ` null` |
2026-02-26 17:49:47 -03:00
| **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
2026-02-26 17:59:50 -03:00
Tags usable in template folder/file options and in the ` exclude_tags` list:
2026-02-26 17:49:47 -03:00
- ` album`, ` album_artist`
2024-09-21 13:13:54 -03:00
- ` artist`
2026-02-26 17:59:50 -03:00
- ` composer`
- ` date` (supports strftime format: ` {date:%Y}`)
2026-02-26 17:49:47 -03:00
- ` disc`, ` disc_total`
2024-09-21 13:13:54 -03:00
- ` isrc`
2026-02-26 17:59:50 -03:00
- ` label`
- ` media_id`
2024-09-23 13:58:24 -03:00
- ` media_type`
2026-02-26 17:59:50 -03:00
- ` playlist_id`, ` playlist_artist`, ` playlist_title`, ` playlist_track`
2026-02-26 17:49:47 -03:00
- ` producer`, ` publisher`
2026-02-26 17:59:50 -03:00
- ` rating`
2026-02-26 17:49:47 -03:00
- ` title`, ` track`, ` track_total`
2026-02-26 17:59:50 -03:00
Tags usable in the ` exclude_tags` list only:
- ` compilation`, ` copyright`, ` cover`
- ` description`
- ` lyrics`
2024-09-21 13:13:54 -03:00
- ` url`
2025-07-04 19:40:41 -03:00
2024-12-04 20:37:24 -03:00
### Cover sizes
2025-07-04 19:40:41 -03:00
2026-02-26 17:55:59 -03:00
- ` small` - Up to 64px
- ` medium` - Up to 300px
- ` large` - Up to 640px
- ` extra-large` - Up to 2000px
2024-09-23 13:58:24 -03:00
### Audio qualities
2025-07-04 19:40:41 -03:00
2026-02-26 17:55:59 -03:00
- ` aac-medium` - AAC 128kbps
2026-03-04 13:26:49 -03:00
- ` aac-high` - AAC 256kbps, songs only, requires an active premium subscription
2026-02-26 17:55:59 -03:00
- ` vorbis-low` - Vorbis 96kbps, podcasts only
2026-03-04 13:26:49 -03:00
- ` vorbis-medium` - Vorbis 160kbps, unsupported
- ` vorbis-high` - Vorbis 320kbps, unsupported, requires an active premium subscription
2026-03-04 15:47:55 -03:00
- ` flac` - FLAC lossless, songs only, requires an active premium subscription
2026-03-04 13:26:49 -03:00
> [!NOTE]
> - **Vorbis quality levels are not available at the moment.**
> - **FLAC quality doesn't work at the moment.** The Spotify servers refuse to accept the Widevine license for FLAC streams, resulting in a decryption failure.
2024-09-23 13:58:24 -03:00
2024-09-23 14:25:49 -03:00
### Video formats
2025-07-04 19:40:41 -03:00
2026-02-26 17:55:59 -03:00
- ` mp4` - H.264 up to 1080p with AAC 128kbps
- ` webm` - VP9 up to 1080p with Opus 160kbps
- ` ask` - Prompt to choose available video and audio codecs
2024-09-21 13:13:54 -03:00
### Download modes
2025-07-04 19:40:41 -03:00
2026-02-26 17:55:59 -03:00
- ` ytdlp` - Default download mode
- ` aria2c` - Faster alternative
- ` curl` - Alternative using curl
2024-09-21 13:13:54 -03:00
2026-03-05 08:06:44 -03:00
> [!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.
2024-09-23 14:25:49 -03:00
### Video remux modes
2025-07-04 19:40:41 -03:00
- ` ffmpeg`
- ` mp4box`
2024-09-23 13:58:24 -03:00
2024-09-23 14:25:49 -03:00
### Audio remux modes
2025-07-04 19:40:41 -03:00
- ` ffmpeg`
- ` mp4box`
- ` mp4decrypt`
2024-09-21 13:13:54 -03:00
2026-02-26 17:49:47 -03:00
### Video resolutions
- ` 144p`, ` 240p`, ` 360p`, ` 480p`, ` 576p`, ` 720p`, ` 1080p`
### Artist media options
2026-02-26 17:55:59 -03:00
- ` albums` - Auto-select albums
- ` compilations` - Auto-select compilations
- ` singles` - Auto-select singles
- ` videos` - Auto-select music videos
2026-02-26 17:49:47 -03:00
### Log levels
- ` DEBUG`, ` INFO`, ` WARNING`, ` ERROR`
## 📄 License
2026-02-26 21:26:27 -03:00
MIT License - see the [LICENSE ](LICENSE ) file for details.
2026-02-26 17:49:47 -03:00
## 🤝 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
2025-07-04 19:40:41 -03:00
- [spotify-oggmp4-dl ](https://github.com/DevLARLEY/spotify-oggmp4-dl )
- [spsync ](https://github.com/baltitenger/spsync )
- [unplayplay ](https://git.gay/uhwot/unplayplay )