CLI tool
glomatico/votify avatar
glomatico/votify

Votify: a command line downloader for Spotify tracks, podcasts and videos

A command-line app for downloading songs, podcasts and videos from Spotify.

940 stars86 forksPythonMIT

At a glance

What is it?
Votify is a Python CLI that takes open.spotify.com URLs and writes audio or video files locally, with a config matrix that maps session type and audio quality to the external tools you need on PATH. It fits people who already pay for Spotify and want their own library on disk, and it does not fit anyone whose account may not survive the attempt.
Who is it for?
Adopt Votify if you have a Spotify account you are willing to put at risk, if you are comfortable with the session_type and audio_quality matrix, and if you can live with a dependency list that grows with the format you want. Skip it if your account is new, if account suspension would hurt you, or if you need a tool that plays rather than copies.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 179 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One URL in, media files out

Votify is described as a command-line app for downloading songs, podcasts and videos from Spotify. The interface is a single Click command that takes one or more URLs, and the supported URL types are listed plainly: song, album, playlist, podcast episode, podcast series, music video and artist. That last entry is the one that changes the shape of a job, since providing an artist URL pulls an entire discography.

Beyond audio, the feature list names synced lyrics in LRC format, and there is a separate path for video output covering both music videos and podcast videos. The last feature listed is customizability, which in this project is not a vague claim: the configuration is a grid where each combination of format and session type maps to a specific set of external programs.

The implementation is Python and requires Python 3.10 or newer. The package is on PyPI as votify, the console script is wired to votify.cli.cli:main, and the dependency list in pyproject.toml is short and telling: click for the CLI, httpx with retries for network calls, inquirerpy for interactive prompts, mutagen for tagging written files, pillow for artwork, pybase62 and pycryptodome for identifier handling, unplayplay, pywidevine, and yt-dlp pinned to a 2026 build.

The session type and quality matrix drives everything

The heart of the project is a dependency table, and understanding it tells you most of what the tool does. Configuration keys include audio_quality with values such as vorbis-low, vorbis-medium, vorbis-high, aac-medium, aac-high, flac-mp4, flac-mp4-24, flac-flac and flac-flac-24, plus session_type with librespot, desktop and web, and separate remux keys for audio and video.

The default path, songs in Vorbis with session_type librespot, lists no required tools at all. Move to desktop and the table asks for the Spotify DLL. Move to AAC and it asks for a .wvd file, and then for FFmpeg, or for MP4Box and mp4decrypt, or for mp4decrypt alone depending on audio_remux_mode. FLAC asks for more: the table marks an L1-certified .wvd file as required for the flac-mp4 variants.

The pattern is consistent enough to state as a rule: each step up in quality or each change of session type adds another external binary or key file that you must supply. Video output adds FFmpeg or MP4Box plus mp4decrypt, and webm video adds Shaka Packager as well. Podcast videos with prefer_video set to true need FFmpeg or MP4Box. Separately, audio_download_mode set to aria2c pulls in aria2c, and set to curl pulls in cURL, both described as download speed options.

Installing the package and placing the cookies file

Installation is a pip install with the librespot extra:

bash
pip install votify[librespot]

A note in the documentation makes the point that the librespot extra is only required when session_type is set to librespot, and that for the desktop or web session types you can install the package with pip install votify instead.

The second setup step is the one with legal and account weight. The prerequisites require Spotify cookies, exported from your browser in Netscape format while logged in to the Spotify homepage, with a Firefox extension and a Chromium extension both linked for the export. The cookies file goes in your working directory as cookies.txt, or its location is given with the --cookies-path option or in the config file.

So the tool authenticates as you, using your session, rather than with a separate credential. That is also where the main risk sits, and the documentation does not soften it: a warning states that some users have reported Spotify suspending their accounts after using Votify, and that downloads may not work with default settings on accounts that are too new.

Downloading a track, an album or a whole discography

The usage line is short:

bash
votify [OPTIONS] URLS...

Concrete invocations cover the different URL types:

bash
votify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo"
votify "https://open.spotify.com/album/0r8D5N674HbTXlR3zNxeU1"
votify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx"
votify "https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk"

That is the whole workflow for a track, an album, a podcast episode and a podcast series. Because the command takes multiple URLs, batch use is a matter of passing more of them, and because mutagen is a dependency, the written files carry proper tags rather than raw stream data.

The artist case is the one to think about before you run it. Pulling a discography by artist URL is a single command against a catalogue you may not own in full, and the result is a directory of files on your disk rather than a stream. Whatever the legal position in your jurisdiction, the practical effect on your account is the same as downloading hundreds of tracks one at a time.

Where the external tools and the account risk become the real limits

Two failure modes sit outside the Python code, and both are structural rather than bugs.

The first is the dependency chain. A FLAC request with session_type desktop needs the Spotify DLL, extracted from version 1.2.88.483 of the Spotify desktop app for Windows, and the audio in AAC or FLAC quality needs a .wvd file, which the documentation says is extracted from an Android device and that an L1-certified file is required for FLAC. A Windows-only DLL, an Android-sourced key file and an L1 licence are three separate external dependencies before a single track is written. The tool degrades gracefully downward, since the default Vorbis path needs nothing, but the higher quality options are a supply chain of artefacts you have to source yourself.

The second is account standing. Suspension is reported by users rather than measured by the project, and the documentation offers no account-safety configuration, no rate limiting option and no recovery path beyond the warning itself. Combined with the note that new accounts may not work with default settings, the practical reading is that the tool suits an established account and is a poor choice for a new one.

There is also a scope limit worth stating. Votify downloads and tags. It does not sync back to Spotify, it does not manage your library metadata, and it gives you no way to verify that a written file matches what the service served. If your goal is an offline copy for personal use, that is enough. If your goal is a managed library with correct metadata across devices, it is not the tool.

Release pace, packaging, and the MIT licence

The repository is not archived, and the last push was on 2026-04-27, which is also the date of release 1.9.9. The recent history is dense: 1.9.7 and 1.9.8 both landed on 2026-04-16, and 1.9.9 followed on 2026-04-27. So the project is shipping small version increments in quick succession, and pyproject.toml tracks the same number at 1.9.9 with requires-python at 3.10 or newer. The tree uses uv for dependency locking, with a uv.lock and a.python-version file, and the dev extra pulls in pytest, pytest-asyncio, asynctest and python-dotenv.

Licensing is MIT, declared in pyproject.toml as license = "MIT" and confirmed by the repository licence field. That permits modification and redistribution of the code with attribution, and it says nothing about the media you download, the terms of the Spotify service, or the licences attached to the external binaries and key files the tool asks you to supply.

The upgrade path is straightforward: pip upgrade the package, and re-run, since the configuration lives in your own file rather than in the package. The risk sits in the pinned dependencies, yt-dlp in particular at a 2026 build, which age against a live service.

Editorial conclusion

Adopt Votify if you have a Spotify account you are willing to put at risk, if you are comfortable with the session_type and audio_quality matrix, and if you can live with a dependency list that grows with the format you want. Skip it if your account is new, if account suspension would hurt you, or if you need a tool that plays rather than copies. Verify first that a single vorbis download works with your cookies file before configuring anything else, because the README warns that new accounts may not download with default settings.

Frequently asked questions

How do I install Votify and authenticate it?

Install with pip install votify[librespot], then export your Spotify cookies from the browser in Netscape format while logged in, and save them as cookies.txt in your working directory or point at them with --cookies-path. The librespot extra is only required when session_type is librespot.

Which external tools does Votify need for high quality audio?

AAC quality needs a .wvd file plus FFmpeg, or MP4Box with mp4decrypt, or mp4decrypt alone depending on audio_remux_mode. FLAC needs an L1-certified .wvd file, and the desktop session type asks for the Spotify DLL from the Spotify app for Windows version 1.2.88.483.

Can Votify suspend my Spotify account?

The documentation warns that some users have reported Spotify suspending their accounts after using Votify, and it says to use it at your own risk. It also notes that an account that is too new may not download with default settings.

What can Votify download besides songs?

Songs, albums, playlists, podcast episodes, podcast series, music videos and podcast videos, plus an entire artist discography from the artist URL. It also writes synced lyrics in LRC format and tags the output files with mutagen.

Official sources

  1. glomatico/votify on GitHub
  2. Issues
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/glomatico-votify.svg)](https://hysenlabs.com/projects/glomatico-votify)

Was this useful?