Bugfixes
- (#542) Fix: use unspecified ip
New features
- (#540) Add support for default port and reverse proxy
Bugfixes
- (#533) Fix the malformed JSON response of
get-playlists-tracksendpoint
Bugfixes
- (#526) Fix: deserialization of pagination with null items
- (#529) Fix: handle null images on FullPlaylist model
New features
Breaking changes
- (#487) Change the type of
TrackLink.idfromTrackId<'static>toOption<TrackId<'static>>
Bugfixes
- (#494) Fix endless sequential pagination problem.
New features
- (#496) Add support for searching multiple types
- (#512) Add
AuthCodePkceSpotify::from_token_with_config() - (#513)
- Automatically spawn a local TCPListener to handle redirect url without manually copy/paste URL into terminal
- Mark
artist_related_artists,track_features,tracks_features,track_analysisas deprecated because Spotify has deprecated these endpoints
New features
- (#490) Add impls for
Clone,Debug,PartialEq,Eq,SerializeandHashforPlayContextIdandPlayableId
- (#480) Fix deserialize empty images from null.
Bugfixes
- (#471) Fix
ureq-native-tlsfeature to actually use native-tls
New features
- (#458) Support for the
wasm32-unknown-unknownbuild target
Bugfixes
- (#440) Add Smartwatch device type, fix for json parse error: unknown variant Smartwatch.
- (#447) Replace the deprecated
dotenvcrate withdotenvy
New features
- (#390) The
scopes!macro supports to split the scope by whitespace. - (#418) Add a user-settable callback function whenever token is updated.
Breaking changes
- (#409) Change type of
positionparameter inplaylist_add_itemsendpoint fromOpinion<Duration>toOpinion<u32> - (#421) Change type of
AudioFeaturesPayload.audio_featuresfromVec<AudioFeatures>toVec<Option<AudioFeatures>> - (#429) Enable Token refreshing by default.
- (#432) Add optional
marketfield totrack,album,albums, andalbum_track[_manual]. Makemarketfield inartist_top_tracksoptional.
Bugfixes
- (#419) Base64url encode instead of plain base64 encode for PKCE challenge code.
- (#421) Filter
nulls ontracks_featuresrequests - (#424) Fix PKCE refresh token invalid error
- (#428) Fix PKCE url in doc
- (#399) Add a new variant
CollectionyourepisodesforTypeenum. - (#375) We now use
chrono::Durationin more places for consistency and usability:start_uris_playback,start_context_playback,rspotify_model::Offset,resume_playback,seek_track. Some of these fields have been renamed fromposition_mstoposition. - ((#356)[#356]) We now support custom authentication base URLs.
Config::prefixhas been renamed toConfig::api_base_url, and we've introducedConfig::auth_base_url. - (#384) Add STB alias for Stb device type, fix for
json parse error: unknown variant STB. - (#386) Support
BaseClient::artist_albumswith zero or moreAlbumType. - (#393) Add
ureq-rustls-tls-native-certsfeature flag. - (#402) Add
ureq-native-tlsfeature flag.
Bugfixes
- (#394) Set a common 10 second timeout for both http clients.
- (#331)
Marketis nowCopy - (#366) Replace all
std::time::Durationwithchrono::Durationto support negative duration.
Bugfixes:
- (#332) Fix typo in
RestrictionReasonenum values
Breaking changes:
-
(#336)
Offset::for_positionandOffset::for_urihave been removed, as they were unnecessary. UseOffset::PositionandOffset::Uriinstead, respectively. -
(#305) The
Idtypes have been refactored to maximize usability. Instead of focusing on having an object-safe trait and usingdyn Id, we now have enums to group up the IDs. This is based on howenum_dispatchworks, and it's not only easier to use, but also more efficient. It makes it possible to have borrowed IDs again, so we've chosen to useCowinternally for flexibility. Check out the docs for more information!Please let us know if there is anything that could be improved. Unfortunately, this breaks many methods in
BaseClientandOAuthClient, but the errors should occur at compile-time only. -
(#325) The
auth_code,auth_code_pkce,client_creds,clients::baseandclients::oauthmodules have been removed from the public API; you should access the same types from their parent modules instead -
(#326) The
rspotify::clients::mutexmodule has been renamed torspotify::sync -
(#330)
searchnow acceptsOption<IncludeExternal>instead ofOption<&IncludeExternal> -
(#330)
featured_playlistsnow acceptsOption<chrono::DateTime<chrono::Utc>>instead ofOption<&chrono::DateTime<chrono::Utc>> -
(#330)
current_user_top_artists[_manual]andcurrent_user_top_tracks[_manual]now acceptOption<TimeRange>instead ofOption<&TimeRange> -
(#331) All enums now implement
Into<&'static str>instead ofAsRef<str> -
(#331)
Option<&Market>parameters have been changed toOption<Market>
New features
- (362) Add "Get the User's Queue" endpoint
Breaking changes:
- (#306) The
collectionvariant has been added toType
- (#295) The
Tvvariant inDeviceTypeis actually case insensitive. - (#296) The
Avrvariant inDeviceTypeis actually case insensitive. - (#302) Added undocumented
labelfield toFullAlbum.
Breaking changes:
- (#303) The
cursorsfield inCursorBasedPageis now optional.
- (#281) The documentation website for the Spotify API has been changed, so the links in the
rspotifycrate have been updated. Unfortunately, the object model section has been removed, so we've had to delete most reference links inrspotify-model. From now on, you should refer to the endpoints where they are used to see their definition.
Breaking changes:
This release contains lots of breaking changes. These were necessary to continue RSpotify's development, and this shouldn't happen again. From now on we'll work on getting closer to the first stable release. Lots of internal code was rewritten to make RSpotify more flexible, performant and easier to use. Sorry for the inconvenience!
If we missed any change or there's something you'd like to discuss about this version, please open a new issue and let us know.
This guide should make it easier to upgrade your code, rather than checking out the changelog line by line. The most important changes are:
- Support for multiple HTTP clients. Instead of using
rspotify::blockingfor synchronous access, you just need to configure theureq-clientfeature and its TLS (learn more in the docs). However, note that this is subject to changes after #221 is fixed. - No need for the builder pattern anymore:
Spotifyhas been split up into multiple clients depending on the authentication process you want to follow. This means that you'll be required touse rspotify::prelude::*in order to access the traits with the endpoints, since they're written in a base trait now.- Client Credentials Flow: see
ClientCredsSpotify. - Authorization Code Flow: see
AuthCodeSpotify. - Authorization Code Flow with Proof Key for Code Exchange (PKCE): see
AuthCodePkceSpotify. This is new! You might be interested in using PKCE for your app if you don't want to expose your client secret. - Implicit Grant Flow: unimplemented, as RSpotify has not been tested on a browser yet. If you'd like support for it, let us know in an issue!
- Client Credentials Flow: see
- There's now support for (both sync and async) automatic pagination! Make sure you upgrade to these after checking out the
pagination_async.rsandpagination_sync.rsexamples. You can use the_manual-suffixed endpoints for the previous pagination style. - We've renamed a few structs and endpoints. The new names are quite similar, so the Rust compiler should suggest you what to change after an error. The only one you might not notice is the environmental variables: they're now
RSPOTIFY_CLIENT_ID,RSPOTIFY_CLIENT_SECRETandRSPOTIFY_REDIRECT_URIto avoid collisions with other libraries. - We always use
Option<T>for optional parameters now. This means that you might have to addSome(...)to some of your parameters. We were using bothInto<Option<T>>andOption<T>but decided that either of these would be best as long as it's consistent.Option<T>has less magic, so we went for that one. - The core library has been split up with features. If you need
dotenvjust activateenv-file, and if you need CLI functionality (prompt_for_tokenand similars), activatecli. - We use custom errors now instead of the
failurecrate. - The Spotify clients now have a
Configstruct for configuration. This includes cached tokens (saved/loaded automatically in a JSON file), and refreshing tokens (reauthenticated automatically when they become expired).
Now to a quick example: here's how you used to query the current user saved tracks:
extern crate rspotify;
use rspotify::blocking::client::Spotify;
use rspotify::blocking::oauth2::{SpotifyClientCredentials, SpotifyOAuth};
use rspotify::blocking::util::get_token;
fn main() {
let mut oauth = SpotifyOAuth::default().scope("user-library-read").build(); // Turns out this reads from the environment variables!
let token_info = get_token(&mut oauth).unwrap(); // How does it get the token? Why is it not in the client if it makes a request?
let client_credential = SpotifyClientCredentials::default() // This also accesses the environment variables with no warning.
.token_info(token_info)
.build(); // So verbose...
let spotify = Spotify::default() // So verbose and easy to mess up... What auth flow is this again?
.client_credentials_manager(client_credential)
.build();
let tracks = spotify.current_user_saved_tracks(10, 0); // Iterating is hard
println!("{:?}", tracks);
}And here's how you do it now:
use rspotify::{prelude::*, scopes, AuthCodeSpotify, Credentials, OAuth};
fn main() {
let oauth = OAuth::from_env(scopes!("user-library-read")).unwrap(); // Concise & explicit with `from_env`
let creds = Credentials::from_env().unwrap(); // Same, concise & explicit
let mut spotify = AuthCodeSpotify::new(creds, oauth); // Simpler initialization
let url = spotify.get_authorize_url(false).unwrap(); // More flexible, lets us implement PKCE
spotify.prompt_for_token(&url).unwrap(); // Explicit: the token is obtained by interacting with the user
let stream = spotify.current_user_saved_tracks(None);
println!("Items:");
for item in stream { // Easy iteration instead of manual pagination
println!("* {}", item.unwrap().track.name);
}
}Hopefully this will convince you that the new breaking changes are good; you'll find the new interface easier to read, more intuitive and less error prone.
Here are a few examples of upgrades:
| Name | Old | New |
|---|---|---|
| [Sync] device | examples/blocking/device.rs |
examples/ureq/device.rs |
| [Sync] me | examples/blocking/me.rs |
examples/ureq/me.rs |
| [Sync] search | examples/blocking/search_track.rs |
examples/ureq/search.rs |
| [Sync] seek_track | examples/blocking/seek_track.rs |
examples/ureq/seek_track.rs |
| [Sync] current_user_saved_tracks | examples/blocking/current_user_saved_tracks.rs |
examples/pagination_sync.rs |
| [Async] current_user_saved_tracks | examples/current_user_saved_tracks.rs |
examples/pagination_async.rs |
| [Async] current_user_saved_tracks (manually) | examples/current_user_saved_tracks.rs |
examples/pagination_manual.rs |
| [Async] current_playing | examples/current_playing.rs |
examples/auth_code.rs |
| [Async] current_playback | examples/current_playback.rs |
examples/auth_code_pkce.rs |
| [Async] album | examples/album.rs |
examples/client_creds.rs |
| [Async] webapp with Rocket | examples/webapp |
examples/webapp |
More in the examples directory!
- Rewritten documentation in hopes that it's easier to get started with RSpotify.
- Reduced the number of examples. Instead of having an example for each endpoint, which is repetitive and unhelpful for newcomers, some real-life examples are now included. If you'd like to add your own example, please do! (#113)
- RSpotify now uses macros internally to make the endpoints as concise as possible and nice to read.
- Add
add_item_to_queueendpoint. - Add
category_playlistsendpoint (#153). - Add
resume_playbackendpoint. - Fix race condition when using a single client from multiple threads (#114).
- RSpotify should now be considerably lighter and less bloated (discussion in #108):
- Remove unused dependencies:
base64,env_logger,random,url. - Remove
itertoolsdependency by using the standard library. - Remove
randin place ofgetrandomto reduce total dependencies and compile times. - Cleanup, reduced repetitive code and boilerplate internally in several places (#117, #113, #107, #106).
- Added internal zero-copy type for Spotify ids, reduced number of allocations/clones (#161).
- Updated dependencies to the latest versions, integrated Dependabot to keep track of them (#105, #111).
- Remove unused dependencies:
- (#145) Mark
SimplifiedEpisode.languageas deprecated. - (#145) Derive
PartialEqandEqfor models:ActionsAudioAnalysisMetaAudioAnalysisSectionAudioAnalysisSegmentAudioAnalysisTrackAudioAnalysisAudioFeaturesPayloadAudioFeaturesCategoryContextCopyrightCurrentPlaybackContextCurrentlyPlayingContextCursorBasedPageCursorPageFullArtistsCursorDevicePayloadDeviceExplicitContentFeaturedPlaylistsFullAlbumFullArtistFullEpisodeFullPlayingContextFullPlaylistFullShowFullTrackImageOffsetPageCategoryPagePlayHistoryPlayableItemPlayingItemPlaylistItemPlaylistResultPrivateUserPublicUserRecommendationsSeedTypeRecommendationsSeedRecommendationsRestrictionsResumePointSavedTrackSearchAlbumsSearchArtistsSearchEpisodesSearchPlaylistsSearchResultSearchShowsSearchTracksSeversalSimplifiedShowsShowSimplifiedAlbumSimplifiedArtistSimplifiedEpisodeSimplifiedPlayingContextSimplifiedPlaylistSimplifiedShowSimplifiedTrackTrackLinkTrackRestriction- Fix broken model links refering to Spotify documentation
- (#188) Replace html links with intra-documentation links
- (#189) Add
scopes!macro to generate scopes forTokenfrom string literal - RSpotify has now been split up into independent crates, so that it can be used without the client. See
rspotify-macrosandrspotify-model. - (#128) Reexport
modelmodule to allow user to writerspotify::model::FullAlbuminstead ofrspotify::model::album::FullAlbum. - (#246) Add support for PKCE, see
AuthCodePkceSpotify. - (#257)
parse_response_codenow checks that the state is the same in the request and in the callback.
Breaking changes:
-
(#202) RSpotify now consistently uses
Option<T>for optional parameters. Those generic overInto<Option<T>>have been changed, which makes calling endpoints a bit ugiler but more consistent and simpler. -
SpotifyClientCredentialshas been renamed toCredentials(#129), and its membersclient_idandclient_secrettoidandsecret, respectively. -
TokenInfohas been renamed toToken. It no longer has thetoken_typemember, as it's alwaysBearerfor now (#129). -
SpotifyOAuthhas been renamed toOAuth. It only contains the necessary parameters for OAuth authorization instead of repeating the items fromCredentialsandSpotify, soclient_id,client_secretandcache_pathare no longer inOAuth(#129). -
TokenBuilderandOAuthBuilderwill only read from environment variables whenfrom_envis used, instead ofdefault. -
dotenvsupport is now optional. You can enable it with theenv-filefeature to have the same behavior as before (#108). It may be used withfrom_envas well. -
Renamed environmental variables to
RSPOTIFY_CLIENT_ID,RSPOTIFY_CLIENT_SECRETandRSPOTIFY_REDIRECT_URIto avoid name collisions with other libraries that use OAuth2 (#118). -
The
blockingmodule has been removed, since RSpotify is able to use multiple HTTP clients now.reqwestandureqare currently supported, meaning that you can still use blocking code by enabling theclient-ureqfeature and a TLS likeureq-rustls-tls. Read the docs for more information (#129). -
The
Spotifyclient has been split up by authorization flows (ClientCredsSpotify,AuthCodeSpotify,AuthCodePkceSpotify), which allows us to remove the builder pattern. The authentication process has been rewritten. (#216). -
Fix typo in
user_playlist_remove_specific_occurrenes_of_tracks, now it'suser_playlist_remove_specific_occurrences_of_tracks. -
(#123) All fallible calls in the client return a
ClientErrorrather than usingfailure. -
(#244) Model objects like
FullTrackorAudioFeatureshave had their_typeandurifields removed. These can be accessed instead with theidfield:id._type()orid.uri(). -
(#244) Endpoints taking
Vec<String>/&[String]as parameter have changed toimpl IntoIterator<Item = &Id>.- The endpoints which changes parameter from
Vec<String>toimpl IntoIterator<Item = &Id>:albumsartistscheck_users_saved_showsget_several_episodesremove_users_saved_showssave_shows
- The endpoints which changes parameter from
&[String]toimpl IntoIterator<Item = &Id>:audios_featurescurrent_user_saved_albums_addcurrent_user_saved_albums_containscurrent_user_saved_albums_deletecurrent_user_saved_tracks_addcurrent_user_saved_tracks_containscurrent_user_saved_tracks_deleteuser_artist_check_followuser_follow_artistsuser_follow_usersuser_playlist_add_tracksuser_playlist_remove_all_occurrences_of_tracksuser_playlist_replace_tracksuser_unfollow_artistsuser_unfollow_users
- The endpoints which changes parameter from
Stringto&Id: -get_a_show-get_an_episode-get_shows_episodes - The endpoint which changes parameter from
Vec<Map<String, Value>>toVec<TrackPositions>: -playlist_remove_specific_occurrences_of_tracks
- The endpoints which changes parameter from
-
The
Offsettype is now an enum to match API logic,Offset::Positionisu32now (it's not a position in time, it's a position in a playlist, and you can't have bothpositionandurifields at the same time). -
(#128) Rename endpoints with more fitting name:
audio_analysis->track_analysisaudio_features->track_featuresaudios_features->tracks_features
-
(#128) Split single
senum.rsfile into a separate module namedenums(which is more appropriate compared withsenum) with three filescountry.rs,types.rs,misc.rs, and moveenumsmodule intomodelmodule, which should be part of themodelmodule, check enums mod.rs file for details. -
(#128) Refactor all enum files with
strum, reduced boilerplate code.- All enums don't have a method named
as_str()anymore, by leveragingstrum, it's easy to convert strings to enum variants based on their name, with methodas_ref().
- All enums don't have a method named
-
Fix typo in
transfer_playback:device_idtodevice_ids. -
(#249) The
recommendationsendpoint has been made simpler to use; the attributes are now serialized withRecommendationsAttribute. -
(#145) Refactor models to make it easier to use:
- Changed type of
trackinPlayHistorytoFullTrack(#139). - Rename model
CurrentlyPlaybackContexttoCurrentPlaybackContext - Change
copyrightsfromVec<HashMap<String, String>>toVec<Copyright> - Add missing field
is_private_sessionforDevice - Change
PublicUser.imagesfromOption<Vec<Image>>toVec<Image> - Add three missing fields
is_playable,linked_from,restrictionsforSimplifiedTrack - Delete deprecated field
birthdayand Add missing fieldsproductandexplicit_contentforPrivateUser - Rename PlayingTrack to PlayingItem and change
added_atto Option - Replace
PlayingwithCurrentlyPlayingContext, since it's the same - Make
Device.idandDevice.volume_percent, since they would be null - Rename
RestrictionstoRestrictionand move it to top level ofmodelmodule - Rename
AudioAnalysisMeasuretoTimeInterval - Replace
start,duration,confidencefields fromAudioAnalysisSectionandAudioAnalysisSegmenttoTimeIntervalfield - Remove useless
FullPlayingContext, since it has been replaced withCurrentPlayingContext - Rename
CUDResulttoPlaylistResult, since this original name isn't self-explaining - Change
{FullArtist, FullPlaylist, PublicUser, PrivateUser}::followersfromHashMap<String, Option<Value>>to structFollowers - Replace
Actions::disallowswith aVec<DisallowKey>by removing all entires whose value is false, which will result in a simpler API - Replace
{FullAlbum, SimplifiedEpisode, FullEpisode}::release_date_precisionfromStringtoDatePrecisionenum, makes it easier to use. - Id and URI parameters are type-safe now everywhere thanks to the
Idtrait and its implementations.
- Changed type of
-
(#157) Keep polishing models to make it easier to use:
- Constrain visibility of
FullArtistsstruct withpub (in crate), makeartistsandartist_related_artistsendpoints return aVec<FullArtist>instead. - Constrain visibility of
FullTracksstruct withpub (in crate), maketracksandartist_top_tracksendpoints return aVec<FullTrack>instead. - Constrain visibility of
AudioFeaturesPayloadstruct withpub (in crate), maketracks_featuresendpoints return aVec<AudioFeatures>instead. - Constrain visibility of
FullAlbumsstruct withpub (in crate), makealbumsendpoints return aVec<FullAlbum>instead. - Constrain visibility of
PageSimpliedAlbumsstruct withpub (in crate), makenew_releasesendpoints return aPage<SimplifiedAlbum>instead. - Constrain visibility of
CursorPageFullArtistsstruct withpub (in crate), makecurrent_user_followed_artistsendpoints return aCursorBasedPage<FullArtist>instead. - Constrain visibility of
PageCategorystruct withpub (in crate), makecategoriesendpoints return aPage<Category>instead. - Constrain visibility of
DevicePayloadstruct withpub (in crate), makedeviceendpoints return aVec<Device>instead. - Constrain visibility of
SeversalSimplifiedShowsstruct withpub (in crate), makeget_several_showsendpoints return aVec<SimplifiedShow>instead. - Constrain visibility of
SeversalEpisodesstruct withpub (in crate), makeget_several_episodesendpoints return aVec<FullEpisode>instead. - Rename
AudioFeatures.duration_mstoduration, and change its type fromu32tostd::time::Duration. - Rename
FullEpisode.duration_mstoduration, and change its type fromu32tostd::time::Duration. - Rename
SimplifiedEpisode.duration_mstoduration, and change its type fromu32tostd::time::Duration. - Rename
FullTrack.duration_mstoduration, and change its type fromu32tostd::time::Duration. - Rename
SimplifiedTrack.duration_mstoduration, and change its type fromu32tostd::time::Duration. - Rename
ResumePoint.resume_position_mstoresume_position, and change its type fromu32tostd::time::Duration. - Rename
CurrentlyPlayingContext.progress_mstoprogress, and change its type fromOption<u32>toOption<std::time::Duration>. - Rename
CurrentPlaybackContext.progress_mstoprogress, and change its type fromOption<u32>toOption<std::time::Duration>. - Change
CurrentlyPlayingContext.timestamp's type fromu64tochrono::DateTime<Utc>. - Change
CurrentPlaybackContext.timestamp's type fromu64tochrono::DateTime<Utc>. - Change
Offset.position's type fromOption<u32>toOption<std::time::Duration> - Remove
SimplifiedPlayingContext, since it's useless.
- Constrain visibility of
-
(#177) Change
modefromf32toenum Modality:- Change
AudioAnalysisSection::mode,AudioAnalysisTrack::modeandAudioFeatures::modefromf32toenum Modality.
- Change
-
(#185) Polish the
Token.expires_at,Token.expires_infields- Change
Token.expires_infrom u32 tochrono::Duration - Change
Token.expires_atfrom i64 tochrono::DateTime<Utc> - Change
Token.scopesfromStringtoHashSet. - Change
OAuth.scopesfromStringtoHashSet. - Change
SimplifiedPlaylist::tracksfromHashMaptoPlaylistTracksRef
- Change
-
(#194) Rename
PlayingItemtoPlayableItem,PlaylistItem::tracktype changed toOption<PlayableItem>, so playlists can contain episodes as well -
(#197) Making acronyms lowercase:
- Rename
ClientError::ParseJSONtoClientError::ParseJson - Rename
ClientError::ParseURLtoClientError::ParseUrl - Rename
ClientError::IOtoClientError::Io - Rename
ClientError::CLItoClientError::Cli - Rename
BaseHTTPClienttoBaseHttpClient
- Rename
-
(#166 #201) Add automatic pagination, which is now enabled by default. You can still use the methods with the
_manualsuffix to have access to manual pagination. There are three new examples for this, check outexamples/pagination*to learn more!As a side effect, some methods now take references instead of values (so that they can be used multiple times when querying), and the parameters have been reordered so that the
limitandoffsetare consistently the last two.The pagination chunk size can be configured with the
Spotify::pagination_chunksfield, which is set to 50 items by default. -
No default values are set from RSpotify now, they will be left to the Spotify API.
-
(#202) Add a
collaborativeparameter touser_playlist_create. -
(#202) Add a
urisparameter toplaylist_reorder_tracks. -
(#206) Update the endpoint signatures to pass parameters by reference, affected endpoint list:
tracksartist_albumsartist_albums_manualartist_top_trackssearchplaylistplaylist_remove_specific_occurences_of_tracksfeatured_playlistsrecommendationscurrent_playlistrepeatget_seversal_showsget_an_episodeget_several_episodesremove_users_saved_shows
-
(#261)
PageSimpliedAlbumshas been renamed toPageSimplifiedAlbums -
(#261)
Defaulthas been implemented for all the possible models -
(#257) Fix naming for most playlist-related endpoints. They used to work only for tracks, but they've been extended to episodes as well, so we call the contents of a playlist "items" instead of "tracks".
playlist_add_tracksis nowplaylist_add_itemsplaylist_tracksis nowplaylist_itemsplaylist_tracks_manualis nowplaylist_items_manualplaylist_replace_tracksis nowplaylist_replace_itemsplaylist_reorder_tracksis nowplaylist_reorder_itemsplaylist_remove_all_occurrences_of_tracksis nowplaylist_remove_all_occurrences_of_itemsplaylist_remove_specific_occurrences_of_tracksis nowplaylist_remove_specific_occurrences_of_itemsmodel::TrackPositionsis nowmodel::ItemPositionscurrent_user_playing_trackis nowcurrent_user_playing_item
-
(#260) The
current_user_saved_albumsandcurrent_user_saved_tracksnow have amarketparameter -
(#256, #198) Added missing
beforeandafterparameters fromcurrent_user_recently_played
-
Add
get_access_token_without_cacheandrefresh_access_token_without_cacheto get and refresh access token without caching it. -
Add
cross compilesupport. -
Add
podcastsupport:- add
save_showsendpoint. - add
get_saved_showsendpoint. - add
get_a_showendpoint. - add
get_several_showsendpoint. - add
get_shows_episodesendpoint. - add
get_an_episodeendpoint. - add
get_several_episodesendpoint. - add
check_users_saved_showsendpoint. - add
remove_users_saved_showsendpoint
Breaking Change
- update the
current_playingendpoint, add a new parameter namedadditional_types, and add some new fields for return object, change the return object type fromSimplifiedPlayingContexttoCurrentlyPlaybackContext. - update the
current_playbackendpoint, add a new parameter namedcurrent_playback, and add some new fields for return object, change the return object type fromFullPlayingContexttoCurrentlyPlaybackContext. - update the
searchendpoint, which adds support of podcast shows and spisodes, add a new parameter namedinclude_external, changesearchfunction from private to public. - remove
search_album,search_artist,search_playlist, andsearch_track, now there is only search method left, it's thesearchendpoint.
- add
- Adds
async/awaitsupport. - Keeps the previous synchronous API, enabled by extra feature
blocking, disabled by default. - Shorten the import path.
- Add missing
ShowandEpisodetypes.
- Provide more informational error strings for API.
- Fix tuneable attribute passing for recommendations.
- Support system proxy setting.
- Add two endpoint functions:
current_user_saved_albums_contains,user_artist_check_follow. - (Breaking change)Change
AlbumType::from_str,SearchType::from_str,RepeatState::from_str,Country::from_str,TimeRange::from_str,Type::from_str,AlbumType::from_str, implementFromStrtrait for all of them.
- Code optimize, remove a unnecessary mut and add a missing reference
- Fix reqwest breaking change
- Add missing devices type
- Add
position_mstostart_playback
- Make PrivateUser country optional
- Replace println! with log!
- FIx errors when email or birthdate are missing
- Fix de-serialization panics for null values
- Implement unsaving albums and unfollowing users/artists
- Allow application to perform error handling
- update dependencies to fix issus on Windows
- fix failed test
- Hide warning on successful authentication
- Remove unneeded extern crate from examples/new_releases.rs
- Changes to Spotify.user_playlist and Spotify.playlist methods
- add new field
UnknownforDeviceTypeenum
- update reqwest to 0.9
- add debug and clone derives to spotify client and credentials
- Change state field for authorization URL to have default
- Fix show_dialog field to be checked before setting true _ Fix typo in show_dialog
- rspotify first release, Cheers!