{"id":15442561,"url":"https://github.com/glomatico/votify","last_synced_at":"2026-03-09T22:04:44.286Z","repository":{"id":257789618,"uuid":"860553154","full_name":"glomatico/votify","owner":"glomatico","description":"A command-line app for downloading songs, podcasts and videos from Spotify.","archived":false,"fork":false,"pushed_at":"2026-02-26T21:44:09.000Z","size":366,"stargazers_count":724,"open_issues_count":26,"forks_count":67,"subscribers_count":13,"default_branch":"main","last_synced_at":"2026-02-26T22:33:44.986Z","etag":null,"topics":["aac","cli","downloader","music-video","ogg","ogg-vorbis","python","spotify","spotify-downloader","video","vorbis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/glomatico.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-09-20T16:47:34.000Z","updated_at":"2026-02-26T21:44:13.000Z","dependencies_parsed_at":"2026-02-26T18:05:52.838Z","dependency_job_id":null,"html_url":"https://github.com/glomatico/votify","commit_stats":{"total_commits":99,"total_committers":2,"mean_commits":49.5,"dds":"0.030303030303030276","last_synced_commit":"0cbb12dc6490909f2ea0d506b817e88f1b926548"},"previous_names":["glomatico/votify"],"tags_count":27,"template":false,"template_full_name":null,"purl":"pkg:github/glomatico/votify","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glomatico%2Fvotify","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glomatico%2Fvotify/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glomatico%2Fvotify/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glomatico%2Fvotify/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/glomatico","download_url":"https://codeload.github.com/glomatico/votify/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/glomatico%2Fvotify/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30127343,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-05T12:40:50.676Z","status":"ssl_error","status_checked_at":"2026-03-05T12:39:32.209Z","response_time":93,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aac","cli","downloader","music-video","ogg","ogg-vorbis","python","spotify","spotify-downloader","video","vorbis"],"created_at":"2024-10-01T19:28:35.189Z","updated_at":"2026-03-09T22:04:44.280Z","avatar_url":"https://github.com/glomatico.png","language":"Python","readme":"# Votify\n\n[![PyPI version](https://img.shields.io/pypi/v/votify?color=blue)](https://pypi.org/project/votify/)\n[![Python versions](https://img.shields.io/pypi/pyversions/votify)](https://pypi.org/project/votify/)\n[![License](https://img.shields.io/github/license/glomatico/votify)](https://github.com/glomatico/votify/blob/main/LICENSE)\n[![Downloads](https://img.shields.io/pypi/dm/votify)](https://pypi.org/project/votify/)\n\nA command-line app for downloading songs, podcasts and videos from Spotify.\n\n**Join our Discord Server:** \u003chttps://discord.gg/aBjMEZ9tnq\u003e\n\n## ✨ Features\n\n- 🎵 **Songs** - Download songs.\n- 🎙️ **Podcasts** - Download podcasts.\n- 🎬 **Videos** - Download podcast videos and music videos.\n- 🎤 **Synced Lyrics** - Download synced lyrics in LRC format.\n- 🧑‍🎤 **Artist Support** - Download an entire discography by providing the artist's URL.\n- ⚙️ **Highly Customizable** - Extensive configuration options for advanced users.\n\n## 📋 Prerequisites\n\n### Required\n\n- **Python 3.10 or higher**\n- **Spotify cookies** - Export your browser cookies in Netscape format while logged in at the Spotify homepage:\n  - Firefox: [Export Cookies](https://addons.mozilla.org/addon/export-cookies-txt)\n  - Chromium-based browsers: [Get cookies.txt LOCALLY](https://chromewebstore.google.com/detail/get-cookiestxt-locally/cclelndahbckbenkjhflpdbgdldlbecc)\n- **FFmpeg** on your system PATH. Recommended builds:\n  - Windows: [AnimMouse's FFmpeg Builds](https://github.com/AnimMouse/ffmpeg-stable-autobuild/releases)\n  - Linux: [John Van Sickle's FFmpeg Builds](https://johnvansickle.com/ffmpeg/)\n- **[.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.\n\n\u003e [!WARNING]\n\u003e **Some users have reported that Spotify suspended their accounts after using Votify.** Use it at your own risk.\n\n\u003e [!NOTE]\n\u003e - 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.\n\u003e - FFmpeg can also be skipped when downloading podcasts in Vorbis codec.\n\n### Optional\n\nAdd these tools to your system PATH or specify their paths via command-line arguments or the config file:\n\n- **[MP4Box](https://gpac.io/downloads/gpac-nightly-builds/)** - Required when using `mp4box` as remux mode.\n- **[Shaka Packager](https://github.com/shaka-project/shaka-packager/releases/latest)** - Required for `webm` video format and music video downloads.\n- **[mp4decrypt](https://www.bento4.com/downloads/)** - Required when using `mp4box` or `mp4decrypt` as remux mode.\n- **[aria2c](https://github.com/aria2/aria2/releases)** - Required when using `aria2c` as download mode.\n- **[cURL](https://curl.se/download.html)** - Required when using `curl` as download mode.\n\n## 📦 Installation\n\n1. Install Votify via pip:\n   ```bash\n   pip install votify\n   ```\n\n2. Set up the cookies file:\n   - Place the cookies file in your working directory as `cookies.txt`, or\n   - Specify its path using `--cookies-path` or in the config file.\n\n3. Set up the `.wvd` file:\n   - Place it in your working directory as `device.wvd`, or\n   - Specify its path using `--wvd-path` or in the config file.\n\n## 🚀 Usage\n\n```bash\nvotify [OPTIONS] URLS...\n```\n\n### Supported URL types\n\n- Song\n- Album\n- Playlist\n- Podcast episode\n- Podcast series\n- Music video\n- Artist\n\n### Examples\n\nDownload a song:\n```bash\nvotify \"https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo\"\n```\n\nDownload an album:\n```bash\nvotify \"https://open.spotify.com/album/0r8D5N674HbTXlR3zNxeU1\"\n```\n\nDownload a podcast episode:\n```bash\nvotify \"https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx\"\n```\n\nDownload a podcast series:\n```bash\nvotify \"https://open.spotify.com/show/4rOoJ6Egrf8K2IrywzwOMk\"\n```\n\nDownload a music video:\n```bash\nvotify \"https://open.spotify.com/track/31k4hgHmrbzorLZMvMWuzq\"\n```\n\nDownload a music video from a song:\n```bash\nvotify \"https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo\" --prefer-video\n```\n\nDownload a podcast video:\n```bash\nvotify \"https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx\" --prefer-video\n```\n\nChoose which media to download from an artist:\n```bash\nvotify \"https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt\"\n```\n\nAuto-select artist albums without a prompt:\n```bash\nvotify \"https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt\" --auto-media-option albums\n```\n\nDownload liked tracks:\n```bash\nvotify --auto-media-option liked-tracks\n```\n\n### Interactive prompt controls\n\n| Key | Action |\n| --- | ------ |\n| Arrow keys | Move selection |\n| Space | Toggle selection |\n| Ctrl + A | Select all |\n| Enter | Confirm selection |\n\n## ⚙️ Configuration\n\nVotify can be configured using command-line arguments or the config file.\n\nConfig file location:\n- Linux: `~/.votify/config.ini`\n- Windows: `%USERPROFILE%\\.votify\\config.ini`\n\nThe file is created automatically on first run. Command-line arguments override config file values.\n\n### Configuration options\n\n| Command-line argument / Config file key | Description | Default |\n| --------------------------------------- | ----------- | ------- |\n| **General** | | |\n| `--wait-interval` / `wait_interval` | Wait interval between downloads in seconds | `10` |\n| `--read-urls-as-txt`, `-r` / - | Read URLs from text files | `false` |\n| `--config-path` / - | Config file path | `\u003chome\u003e/.votify/config.ini` |\n| `--log-level` / `log_level` | Logging level | `INFO` |\n| `--log-file` / `log_file` | Log file path | `null` |\n| `--no-exceptions` / `no_exceptions` | Don't print exceptions | `false` |\n| `--no-config-file`, `-n` / - | Don't use a config file | `false` |\n| `--database-path` / `database_path` | Path to the SQLite database file for registering downloaded media | `null` |\n| `--auto-media-option` / `auto_media_option` | Auto media option | `null` |\n| **Spotify** | | |\n| `--cookies-path`, `-c` / `cookies_path` | Cookies file path | `./cookies.txt` |\n| `--wvd-path` / `wvd_path` | .wvd file path | `./device.wvd` |\n| `--prefer-video` / `prefer_video` | Prefer video streams when available | `false` |\n| `--no-drm` / `no_drm` | Don't allow DRM-protected media | `false` |\n| **Output** | | |\n| `--output`, `-o` / `output` | Output directory path | `./Spotify` |\n| `--temp` / `temp` | Temporary directory path | `.` |\n| `--save-cover-file` / `save_cover_file` | Save cover as a separate file | `false` |\n| `--save-playlist-file` / `save_playlist_file` | Save a M3U8 playlist file when downloading a playlist | `false` |\n| `--overwrite` / `overwrite` | Overwrite existing files | `false` |\n| `--cover-size` / `cover_size` | Cover size to use | `extra-large` |\n| `--exclude-tags` / `exclude_tags` | Comma-separated tags to exclude | `null` |\n| `--truncate` / `truncate` | Maximum length of file/folder names | `null` |\n| **Template** | | |\n| `--album-folder-template` / `album_folder_template` | Folder template for album tracks | `{album_artist}/{album}` |\n| `--compilation-folder-template` / `compilation_folder_template` | Folder template for compilation tracks | `Compilations/{album}` |\n| `--podcast-folder-template` / `podcast_folder_template` | Folder template for podcast episodes | `Podcasts/{album}` |\n| `--no-album-folder-template` / `no_album_folder_template` | Folder template for tracks not in an album | `{artist}/Unknown Album` |\n| `--single-disc-file-template` / `single_disc_file_template` | File template for single-disc album tracks | `{track:02d} {title}` |\n| `--multi-disc-file-template` / `multi_disc_file_template` | File template for multi-disc album tracks | `{disc}-{track:02d} {title}` |\n| `--podcast-file-template` / `podcast_file_template` | File template for podcast episodes | `{track:02d} {title}` |\n| `--no-album-file-template` / `no_album_file_template` | File template for tracks not in an album | `{title}` |\n| `--playlist-file-template` / `playlist_file_template` | File template for M3U8 playlists | `Playlists/{playlist_artist}/{playlist_title}` |\n| `--date-tag-template` / `date_tag_template` | Date tag template | `%Y-%m-%dT%H:%M:%SZ` |\n| **Song / Podcast** | | |\n| `--audio-quality` / `audio_quality` | Comma-separated audio quality priority | `aac-medium` |\n| `--audio-download-mode` / `audio_download_mode` | Audio download mode to use | `ytdlp` |\n| `--audio-remux-mode` / `audio_remux_mode` | Audio remux mode to use | `ffmpeg` |\n| `--synced-lyrics-only` / `synced_lyrics_only` | Only download synced lyrics file | `false` |\n| `--no-synced-lyrics-file` / `no_synced_lyrics_file` | Don't create synced lyrics file | `false` |\n| **Video** | | |\n| `--video-format` / `video_format` | Video format to use | `mp4` |\n| `--video-resolution` / `video_resolution` | Video resolution to use | `1080p` |\n| `--video-remux-mode` / `video_remux_mode` | Video remux mode to use | `ffmpeg` |\n| **Executables** | | |\n| `--aria2c-path` / `aria2c_path` | Path to aria2c binary | `aria2c` |\n| `--curl-path` / `curl_path` | Path to curl binary | `curl` |\n| `--ffmpeg-path` / `ffmpeg_path` | Path to FFmpeg binary | `ffmpeg` |\n| `--mp4box-path` / `mp4box_path` | Path to MP4Box binary | `mp4box` |\n| `--mp4decrypt-path` / `mp4decrypt_path` | Path to mp4decrypt binary | `mp4decrypt` |\n| `--shaka-packager-path` / `shaka_packager_path` | Path to Shaka Packager binary | `packager` |\n\n### Template variables\n\nTags usable in template folder/file options and in the `exclude_tags` list:\n\n- `album`, `album_artist`\n- `artist`\n- `composer`\n- `date` (supports strftime format: `{date:%Y}`)\n- `disc`, `disc_total`\n- `isrc`\n- `label`\n- `media_id`\n- `media_type`\n- `playlist_id`, `playlist_artist`, `playlist_title`, `playlist_track`\n- `producer`, `publisher`\n- `rating`\n- `title`, `track`, `track_total`\n\nTags usable in the `exclude_tags` list only:\n\n- `compilation`, `copyright`, `cover`\n- `description`\n- `lyrics`\n- `url`\n\n### Cover sizes\n\n- `small` - Up to 64px\n- `medium` - Up to 300px\n- `large` - Up to 640px\n- `extra-large` - Up to 2000px\n\n### Audio qualities\n\n- `aac-medium` - AAC 128kbps\n- `aac-high` - AAC 256kbps, songs only, requires an active premium subscription\n- `vorbis-low` - Vorbis 96kbps, podcasts only\n- `vorbis-medium` - Vorbis 160kbps, unsupported\n- `vorbis-high` - Vorbis 320kbps, unsupported, requires an active premium subscription\n- `flac` - FLAC lossless, songs only, requires an active premium subscription\n\n\u003e [!NOTE]\n\u003e - **Vorbis quality levels are not available at the moment.**\n\u003e - **FLAC quality requires a L1 .wvd file.**\n\n### Video formats\n\n- `mp4` - H.264 up to 1080p with AAC 128kbps\n- `webm` - VP9 up to 1080p with Opus 160kbps\n- `ask` - Prompt to choose available video and audio codecs\n\n### Download modes\n\n- `ytdlp` - Default download mode\n- `aria2c` - Faster alternative\n- `curl` - Alternative using curl\n\n\u003e [!NOTE]\n\u003e - **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.\n\n### Video remux modes\n\n- `ffmpeg`\n- `mp4box`\n\n### Audio remux modes\n\n- `ffmpeg`\n- `mp4box`\n- `mp4decrypt`\n\n### Video resolutions\n\n- `144p`, `240p`, `360p`, `480p`, `576p`, `720p`, `1080p`\n\n### Auto media options\n\n- `artist-albums` - Auto-select albums\n- `artist-compilations` - Auto-select compilations\n- `artist-singles` - Auto-select singles\n- `artist-videos` - Auto-select music videos\n- `liked-tracks` - Auto-select liked tracks (URL not required)\n\n### Log levels\n\n- `DEBUG`, `INFO`, `WARNING`, `ERROR`\n\n## 📄 License\n\nMIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🤝 Contributing\n\nI'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.\n\n## 🙏 Credits\n\n- [spotify-oggmp4-dl](https://github.com/DevLARLEY/spotify-oggmp4-dl)\n- [spsync](https://github.com/baltitenger/spsync)\n- [unplayplay](https://git.gay/uhwot/unplayplay)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglomatico%2Fvotify","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fglomatico%2Fvotify","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fglomatico%2Fvotify/lists"}