All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
The release dates mentioned follow the format DD-MM-YYYY
.
- Fix YouTube pattern matching. (@FransM (#832)
- Error message instead of crash when no audio stream is found in the YouTube video. (@gordominossi) (#828)
- Improve input file validation for --list. (@FransM (#818)
- PyTube failing on outdated regex. (#798)
- Occasionaly wrong title would be extracted from YouTube video. (#779)
- Add support for Vorbis & Opus output formats. (@Sigill) (#769)
- "YouTube returned no videos for the search query" for most tracks. (@ritiek) (#775)
- Add metadata to a track from a different track. (@ritiek) (#757)
- Exit with an appropriate code on bad arguments. (@ritiek) (#736)
- Specifically display what went wrong with FFmpeg when encoding fails. (@ritiek) (#748)
- Fix complaining about missing
spotdl.patch
. (@ritiek) (120ae9e3629253bfabf8091e0762eeacc4e63b04)
- Patch PyTube so it correctly parses YouTube videos. (@ritiek) (#742)
- Fix crash if YouTube search results contains live streams. (@ritiek (#735)
- Skip invalid tracks returned on playlist endpoint with Spotify Web-API. (@ritiek) (#732)
- In some cases when using
-f
to create sub-directories from metadata, where the full slugified download filename and the non-slugified download directory happen to differ, the download would fail. The download directory will now be derived from filename itself so that the sub-directory name always overlaps. (@ritiek) (2aa7dce4a42feb5cd3ceb9324e58da524cdb4b6f)
- Disable unneeded logs from
chardet
. (@ritiek) (c1b3949edb943cc21a63c34d6a01ed59e9b6536d)
- Do not remove the currently downloading track from file on
KeyboardInterrupt
when--list
is passed. (@ritiek) (#722) - Failure on invoking spotdl if FFmpeg isn't found. It should now warn about missing FFmpeg and move ahead without encoding. (@ritiek) (debe7ee9024e2ec65eed9935460c62f4eecd03ea)
- Genius would sometimes return invalid lyrics. Retry a few times in such a case. (@ritiek) (29b1f31a2622f749df83c3072c4cbb22615bff95)
- Skipping tracks with
-m
would crash. (@ritiek) (bbe43da191093302726ddc9a48f0fa0a55be6fb6)
-o m4a
would always fail. (@ritiek) (cd5f224e379f3feefc95e338ec50674f976e2e89)
For v2.0.0 to work correctly, you need to remove your previous config.yml
due to
breaking changes in v2.0.0 (marked as [Breaking] in the below sections), new options being
added, and old ones being removed. You may want to first backup your old configuration for
reference. You can then install spotdl v2.0.0 and remove your current configuration by
running:
$ spotdl --remove-config
spotdl will automatically generate a new configuration file on the next run. You can then replace the appropriate fields in the newly generated configuration file by referring to your old configuration file.
All the below changes were made as a part of #690.
-i
now acceptsautomatic
which would automatically select the best available stream irrespective of the format.- Added parameter
-q
(--quality {best,worst}
) to select best (default) or worst audio quality. - Added
-ne
(--no-encode
) to disable encoding. - Output to STDOUT with
-f -
. - Output to STDOUT with
--write-to -
. - Read tracks from STDIN in
-s
parameter. - Display a combined download & encode progress bar.
- [Breaking] Tracks are now downloaded in the current working directory (instead of user's Music directory) by default.
- [Breaking] Short for
--album
is now-a
instead of-b
. - [Breaking] Short for
--all-albums
is now-aa
instead of-ab
. - Allow "&" character in filenames.
- [Breaking] Merge parameters
-ff
and-f
to-f
(--output-file
). - [Breaking] Do not prefix formats with a dot when specifying
-i
and-o
parameters Such as-o .mp3
is now written as-o mp3
. - [Breaking] Search format now uses hyphen for word break instead of underscore. Such as
-sf "{artist} - {track_name}"
is now written as-sf "{artist} - {track-name}"
. - [Breaking]
--write-successful
and--skip
is renamed to--write-successful-file
and--skip-file
respectively. - Partial re-write and internal API refactor.
- Enhance debug log output readability.
- Internally adapt to latest changes made in Spotipy library.
- Switch to
logging
+coloredlogs
instead oflogzero
. Our loggers weren't being setup properly withlogzero
. - Simplify checking for an downloaded already track. Previously it also analyzed metadata for the already downloaded track to determine whether to overwrite the already downloaded track, which caused unexpected behvaiours at times.
- Codebase is now more modular making it easier to use spotdl in python scripts.
config.yml
now uses underscores for separating between argument words instead of hyphens for better compatibility withargparse
.
- Track download and encoding now happen parallely instead of sequentially making spotdl faster.
- Lyrics and albumart are now downloaded in the background while the track is being downloaded instead of in the end. This reduces additional delays if we are to download them while applying metadata.
--write-m3u
now only scrapes YouTube for required metadata making it much faster. Previously, it was also required to parse it via an external YouTube parsing library which was slow.- Switch to PyTube from Pafy. PyTube is faster and relies only on scraping.
- [Breaking] Removed Avconv support. Only FFmpeg is supported now.
- [Breaking] Removed
--no-fallback-metadata
parameter since not many people seem to find it useful. - [Breaking] Removed apparently misleading
--download-only-metadata
parameter. - [Breaking] Removed ability to set YouTube API key since we now use PyTube instead of Pafy, and PyTube does not require an API key.
- [Breaking] As a side effect of above,
--music-videos-only
is also removed as this feature worked only with YouTube API.
- Embed release date metadata only when available (follow up of #672) (@ritiek) (#674)
- Skip crash when accessing YouTube-API-only fields in scrape mode (@ritiek) (#672)
- Changed FFMPEG args to convert to 48k quality audio instead of the current 44k audio. (@AvinashReddy3108) (#667)
- Fixed a crash occuring when lyrics for a track are not yet released on Genius (@ritiek) (#654)
- Fixed a regression where a track would fail to download if it isn't found on Spotify (@ritiek) (#653)
- Added
--no-remove-original-file
(@NightMachinary) (#580) - Added leading Zeros in
track_number
for correct sorting (@Dsujan) (#592) - Added
track_id
key for--file-format
parameter (@kadaliao) (#568)
- Some tracks randomly fail to download with Pafy v0.5.5 (@ritiek) (#638)
- Generate list error --write-m3u (@arthurlutz) (#559)
- Fetch lyrics from Genius and fallback to LyricWikia if not found (@ritiek) (#585)
- Patch bug in Pafy to prefer secure HTTPS (@ritiek) (#558)
- Patch bug in Pafy when fetching audiostreams with latest youtube-dl (@ritiek) (#539)
- Removed duplicate debug log entry from
internals.trim_song
(@ritiek) (#519) - Fix YAMLLoadWarning (@cyberboysumanjay) (#517)
--write-to
parameter for setting custom file to write Spotify track URLs to (@ritiek) (#507)- Set custom Spotify Client ID and Client Secret via config.yml (@ManveerBasra) (#502)
- Use YouTube as fallback metadata if track not found on Spotify. Also added
--no-fallback-metadata
to preserve old behaviour (@ritiek) (#457)
- Fix already downloaded prompt when using "/" in
--file-format
to create sub-directories (@ritiek) (#503) - Fix writing playlist tracks to file (@ritiek) (#506)
- Fetch all artist albums by default instead of only fetching the "album" type (@ritiek) (#493)
- Option
-f
(--folder
) is used when exporting text files using-p
(--playlist
) for playlists or-b
(--album
) for albums (@Silverfeelin) (#476) - Use first artist from album object for album artist (@tillhainbach)
- Fix renaming files when encoder is not found (@ritiek) (#475)
- Add missing
import time
(@ifduyue) (#465)
- Output informative message in case of no result found in YouTube search (@Amit-L) (#452)
- Ability to pass multiple tracks with
-s
option (@ritiek) (#442)
- Allowed to fetch metadata from Spotify upon searching Spotify-URL and
--no-metadata
to gather YouTube custom-search fields (@Amit-L) (#452) - Change FFmpeg to use the built-in encoder
aac
instead of 3rd partylibfdk-aac
which does not ship with the apt package (@ritiek) (#448) - Monkeypatch ever-changing network-relying tests (@ritiek) (#448)
- Correct
.m4a
container before writing metadata so metadata fields shows up properly in media players (especially iTunes) (@ritiek with thanks to @Amit-L!) (#453) - Refactored core downloading module (@ritiek) (#410)
- Workaround conversion conflicts when input and output filename are same (@ritiek) (#459)
- Applied a check on result in case of search using Spotify-URL
--no-metadata
option (@Amit-L) (#452) - Included a missing
import spotipy
in downloader.py (@ritiek) (#440)
1.1.0 - 2018-11-13
- Output error details when track download fails from list file (@ManveerBasra) (#406)
- Add support for
.m3u
playlists (@ritiek) (#401) - Introduce usage of black (code formatter) (@linusg) (#393)
- Added command line option for getting all artist's songs (@AlfredoSequeida) (#389)
- Added command line options for skipping tracks file and successful downloads file and place newline before track URL when appending to track file (@linusg) (#386)
- Overwrite track file with unique tracks (@ritiek) (#380)
- Embed comment metadata in
.m4a
(@ritiek) (#379) - Added check for publisher tag before adding publisher id3 tag to audio file (@gnodar01) (#377)
--list
flag accepts only text files using mimetypes (@ManveerBasra) (#414)- Refactored Spotify token refresh (@ManveerBasra) (#408)
- Don't search song on Spotify if
--no-metadata
is passed (@ManveerBasra) (#404) - Changed test track to one whose lyrics are found (@ManveerBasra) (#400)
- Windows - 'My Music' folder won't be assumed to be on C drive but looked up in Registry (@SillySam) (#387)
- Updated
setup.py
(fix PyPI URL, add Python 3.7 modifier) (@linusg) (#383) - Updated dependencies to their newest versions (as of 2018-10-02) (@linusg) (#382)
- Remove duplicates from track file while preserving order (@ritiek) (#369)
- Moved a lot of content from
README.md
to the repository's GitHub wiki (@sdhutchins, @ritiek) (#361) - Refactored internal use of logging (@arryon) (#358)
- Check and replace slashes with dashes to avoid directory creation error (@ManveerBasra) (#402)
- Filter unwanted text from Spotify URLs when extracting information (@ritiek) (#394)
- Correctly embed metadata in
.m4a
(@arryon) (#372) - Slugify will not ignore the
'
character (single quotation mark) anymore (@jimangel2001) (#357)
1.0.0 - 2018-09-09
- Initial complete release, recommended way to install is now from PyPI
- Initial release, prepare for 1.0.0