A powerful, command-line tool for downloading your favorite contentāincluding songs, podcasts, and music videosādirectly from Spotify.
- Songs: Download songs in AAC 128kbps or in AAC 256kbps with an active premium subscription.
- Podcasts: Download podcasts in Vorbis or AAC.
- Videos: Download podcast videos and music videos with an active premium subscription.
- Synced Lyrics: Download synced lyrics in
.lrcformat. - Artist Support: Download an entire discography by providing the artist's URL.
- Highly Customizable: Extensive configuration options for advanced users.
- Python 3.10 or higher installed on your system.
- The cookies file of your Spotify browser session in Netscape format.
- Firefox: Use the Export Cookies extension.
- Chromium-based Browsers: Use the Get cookies.txt LOCALLY extension.
- FFmpeg on your system
PATH.- Windows: Download from AnimMouse's FFmpeg Builds.
- Linux: Download from John Van Sickle's FFmpeg Builds.
- A
.wvdfile.- A
.wvdfile contains Widevine keys from a device and is required to decrypt music videos and songs in AAC. The easiest method to obtain one is using KeyDive, which extracts it from an Android device..wvdfiles from emulated devices may not work.
- A
- Warning: Some users have reported that Spotify suspended their accounts after using similar tools. Use it at your own risk.
- The
.wvdfile is not required if you only plan on downloading podcasts. You can skip this prerequisite by using the--disable-wvdoption. - FFmpeg is not required for downloading podcasts in Vorbis, but it is necessary for downloading podcasts in AAC.
The following tools are optional but required for specific features. Add them to your system's PATH or specify their paths using command-line arguments or the config file.
- MP4Box: Required when setting
mp4boxas the remux mode. - Shaka Packager: Required when setting
webmas the video format. - mp4decrypt: Required when setting
mp4boxormp4decryptas the remux mode for audio. - aria2c: Required when setting
aria2cas the download mode.
- Install the package
dotifyusing pip:pip install dotify-cli
- Set up the cookies file.
- Move the cookies file to the directory where you'll run Dotify and rename it to
cookies.txt. - Alternatively, specify the path using the
--cookies-pathargument.
- Move the cookies file to the directory where you'll run Dotify and rename it to
- Set up the
.wvdfile.- Move the
.wvdfile to the directory where you'll run Dotify and rename it todevice.wvd. - Alternatively, specify the path using the
--wvd-pathargument.
- Move the
Run Dotify with the following command:
dotify [OPTIONS] URLS...- Song
- Album
- Playlist
- Podcast Episode
- Podcast Show
- Artist
Download a song
dotify "https://open.spotify.com/track/18gqCQzqYb0zvurQPlRkpo"Download an album
dotify "https://open.spotify.com/album/0r8D5N674HbTXlR3zNxeU1"List and select a related music video to download from a song
dotify "https://open.spotify.com/track/0a0n6u6j3t6m0p4k0t0k0u0" --download-music-videosDownload a podcast video
dotify "https://open.spotify.com/episode/3kwxWnzGH8T6UY2Nq582zx" --download-podcast-videosChoose which albums to download from an artist
dotify "https://open.spotify.com/artist/0gxyHStUsqpMadRV0Di1Qt"Interactive prompt controls:
- Arrow keys: Move selection
- Space: Toggle selection
- Ctrl + A: Select all
- Enter: Confirm selection
Dotify can be configured using command-line arguments or a config file.
The config file is created automatically when you run Dotify for the first time at ~/.dotify/config.json on Linux and %USERPROFILE%\.dotify\config.json on Windows.
Config file values can be overridden using command-line arguments.
| Command-line argument / Config file key | Description | Default value |
|---|---|---|
--wait-interval, -w / wait_interval |
Wait interval between downloads in seconds. | 5 |
--disable-wvd / disable_wvd |
Disable Widevine decryption. | false |
--download-music-videos / download_music_videos |
List and select a related music video to download from songs. | false |
--download-podcast-videos / download_podcast_videos |
Attempt to download the video version of podcasts. | false |
--force-premium, -f / force_premium |
Force to detect the account as premium. | false |
--read-urls-as-txt, -r / - |
Interpret URLs as paths to text files containing URLs. | false |
--config-path / - |
Path to config file. | <home>/.dotify/config.json |
--log-level / log_level |
Log level. | INFO |
--no-exceptions / no_exceptions |
Don't print exceptions. | false |
--cookies-path / cookies_path |
Path to cookies file. | cookies.txt |
--output-path, -o / output_path |
Path to output directory. | Spotify |
--temp-path / temp_path |
Path to temporary directory. | temp |
--wvd-path / wvd_path |
Path to .wvd file. | device.wvd |
--aria2c-path / aria2c_path |
Path to aria2c binary. | aria2c |
--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 |
--packager-path / packager_path |
Path to Shaka Packager binary. | packager |
--template-folder-album / template_folder_album |
Template folder for tracks that are part of an album. | {album_artist}/{album} |
--template-folder-compilation / template_folder_compilation |
Template folder for tracks that are part of a compilation album. | Compilations/{album} |
--template-file-single-disc / template_file_single_disc |
Template file for tracks on a single-disc album. | {track:02d} {title} |
--template-file-multi-disc / template_file_multi_disc |
Template file for tracks on a multi-disc album. | {disc}-{track:02d} {title} |
--template-folder-episode / template_folder_episode |
Template folder for podcast episodes. | Podcasts/{album} |
--template-file-episode / template_file_episode |
Template file for music videos. | {track:02d} {title} |
--template-folder-music-video / template_folder_music_video |
Template folder for music videos. | {artist}/Unknown Album |
--template-file-music-video / template_file_music_video |
Template file for tracks not part of an album. | {title} |
--template-file-playlist / template_file_playlist |
Template file for the M3U8 playlist. | Playlists/{playlist_artist}/{playlist_title} |
--date-tag-template / date_tag_template |
Date tag template. | %Y-%m-%dT%H:%M:%SZ |
--cover-size / cover_size |
Cover size. | extra-large |
--save-cover / save_cover |
Save cover as a separate file. | false |
--save-playlist / save_playlist |
Save a M3U8 playlist file when downloading a playlist. | false |
--overwrite / overwrite |
Overwrite existing files. | false |
--exclude-tags / exclude_tags |
Comma-separated tags to exclude. | null |
--truncate / truncate |
Maximum length of the file/folder names. | null |
--audio-quality, -a / audio_quality |
Audio quality for songs and podcasts. | aac-medium |
--download-mode, -d / download_mode |
Download mode for songs and podcasts. | ytdlp |
--remux-mode-audio / remux_mode_audio |
Remux mode for songs and podcasts. | ffmpeg |
--lrc-only, -l / lrc_only |
Download only the synced lyrics. | false |
--no-lrc / no_lrc |
Don't download the synced lyrics. | false |
--video-format / video_format |
Video format. | mp4 |
--remux-mode-video / remux_mode_video |
Remux mode for videos. | ffmpeg |
--no-config-file, -n / - |
Do not use a config file. | false |
The following variables can be used in the template folder/file and/or in the exclude_tags list:
album, album_artist, artist, compilation, composer, copyright, cover, disc, disc_total, isrc, label, lyrics, media_type, playlist_artist, playlist_title, playlist_track, publisher, producer, rating, release_date, release_year, title, track, track_total, url
- Cover Sizes:
small(64px),medium(300px),large(640px),extra-large(2000px) - Audio Qualities:
aac-medium(128kbps),aac-high(256kbps),vorbis-high(320kbps),vorbis-medium(160kbps),vorbis-low(96kbps) - Video Formats:
mp4,webm,ask - Download Modes:
ytdlp,aria2c - Remux Modes:
ffmpeg,mp4box,mp4decrypt
Encountered a bug or have some feedback? Please open an issue on GitHub. We'd love to hear from you!
For support, email me at `salahin0ashfi@gmail.com
This project is licensed under the MIT License.
- @AsHfIEXE
MADE WITH MIT License