diff --git a/.gitignore b/.gitignore index 45a0df12..492b8a19 100644 --- a/.gitignore +++ b/.gitignore @@ -111,3 +111,6 @@ UpgradeLog*.XML # NuGet /packages/ *.nupkg + +# Idea jetbrains +.idea/ diff --git a/SpotifyAPI.Docs/docs/SpotifyLocalAPI/index.md b/SpotifyAPI.Docs/docs/SpotifyLocalAPI/index.md deleted file mode 100644 index 17af3f19..00000000 --- a/SpotifyAPI.Docs/docs/SpotifyLocalAPI/index.md +++ /dev/null @@ -1,171 +0,0 @@ -# Getting started - -This API provides some access to the local running Spotify-Client (Windows only). -You can fetch details for the current track, play/pause, skip/previous track and -get notified on various events. - -**NOTE:** This API is unofficial, things may break in the future and there is no -guarantee everything works out of the box. - ---- - -## First steps - -**Imports** -So after you added the API to your project, you may want to add following imports to your files: - -```cs -using SpotifyAPI.Local; //Base Namespace -using SpotifyAPI.Local.Enums; //Enums -using SpotifyAPI.Local.Models; //Models for the JSON-responses -``` - -**Basic-Usage** -Now you can actually start fetching infos from your spotify client, just create a new Instance of SpotifyLocalAPI: -```cs -private static SpotifyLocalAPI _spotify; - -public static void Main(String[] args) -{ - _spotify = new SpotifyLocalAPI(); - if (!SpotifyLocalAPI.IsSpotifyRunning()) - return; //Make sure the spotify client is running - if (!SpotifyLocalAPI.IsSpotifyWebHelperRunning()) - return; //Make sure the WebHelper is running - - if(!_spotify.Connect()) - return; //We need to call Connect before fetching infos, this will handle Auth stuff - - StatusResponse status = _spotify.GetStatus(); //status contains infos -} -``` - -## Configuration - -Different spotify versions often require different configuration. Some versions run their web-helper on port `4371`, others on `4381` or `4380`. Also, some use `https`, and others use `http`. You can use `SpotifyLocalAPIConfig` to configure the API: - -```cs -_spotify = new SpotifyLocalAPI(new SpotifyLocalAPIConfig -{ - Port = 4371, - HostUrl = "https://127.0.0.1" -}); -``` - -it's also possible to change the current `UserAgent` string, which is needed if the library wasn't updated for some time. In this case, you should first make an unauthenticated call with `spotify.GetStatus()`, receive the current spotify version, and update the config afterwards: - -```cs -var config = new SpotifyLocalAPIConfig { Port = 4371, HostUrl = "https://127.0.0.1" }); -_spotify = new SpotifyLocalAPI(config); - -var status = _spotify.GetStatus(); -config.UserAgent = status.ClientVersion; - -// Now you should call auth stuff, like "_spotify.Connect()" -``` - -## Proxy Settings - -You can forward your proxy settings to the local api by using a field in the `SpotifyLocalAPIConfig`. - -```cs -_spotify = new SpotifyLocalAPI(new SpotifyLocalAPIConfig -{ - ProxyConfig = new ProxyConfig() { - Host = "127.0.0.1", - Port = 8080 - // Additional values like Username and Password are available - } -}); -``` - -## Anti-Virus Blocking Response - -Some Anti-Virus Software blocks the response from spotify due wrong headers. -Currently, it's confirmed for AVG's LinkScanner and Bitdefender. -Adding `http://SpotifyAPI.spotilocal.com:4380` to the URL-Exceptions seems to fix it for most users. -More infos can be found [here](https://github.com/JohnnyCrazy/SpotifyAPI-NET/issues/51) - -## Client Status - -Calling `_spotify.GetStatus()` after connecting returns the following `StatusResponse`: - -``` -public int Version { get; set; } - -public string ClientVersion { get; set; } - -public bool Playing { get; set; } - -public bool Shuffle { get; set; } - -public bool Repeat { get; set; } - -public bool PlayEnabled { get; set; } - -public bool PrevEnabled { get; set; } - -public bool NextEnabled { get; set; } - -public Track Track { get; set; } - -public double PlayingPosition { get; set; } - -public int ServerTime { get; set; } - -public double Volume { get; set; } - -public bool Online { get; set; } - -public bool Running { get; set; } -``` - -Most of the properties are self-explanatory, some notes: - -* `Shuffle` and `Repeat` currently always return `false` - -## Current Track - -The current Track can be fetched via `_spotify.GetStatus().Track` and contains following properties/methods: - -* `TrackResource` - `SpotifyResource` which contains Track `Name` and `Uri` -* `AlbumResource` - `SpotifyResource` which contains Album `Name` and `Uri` -* `ArtistResource` - `SpotifyResource` which contains Artist `Name` and `Uri` (Only the main artist will be listed) -* `IsAd()` will check whether the current track is an AD -* Various methods for getting the album art: - * `string GetAlbumArtUrl(AlbumArtSize size)` - * `Task GetAlbumArtAsync(AlbumArtSize size)` - * `Bitmap GetAlbumArt(AlbumArtSize size)` - * `Task GetAlbumArtAsByteArrayAsync(AlbumArtSize size)` - * `byte[] GetAlbumArtAsByteArray(AlbumArtSize size)` - -## Events - -To receive events, make sure you listen for them `_spotify.ListenForEvents = true;` -You can set a `SynchronizingObject`, then the events will be called on the specific context - -Following events can be overriden: - -* `OnPlayStateChange` - triggers when the player changes from `play` to `pause` and vice versa -* `OnTrackChange` - triggers when a new track will be played -* `OnTrackTimeChange` - triggers when a track is playing and track-time changes -* `OnVolumeChange` - triggeres when the internal volume of spotify changes - -## Methods - -Furthermore, following methods are available: - -* `void Mute()` - will mute the Spotify client via WindowsAPI -* `void UnMute()` - will unmute the Spotify client via WindowsAPI -* `bool IsSpotifyMuted()` - will return wether the Spotify client is muted -* `void SetSpotifyVolume(float volume = 100)` - sets the windows volume of spotify (0 - 100) -* `float GetSpotifyVolume()` - returns the windows volume of spotify (0 - 100) -* `void Pause()` - will pause spotify's playback -* `void Play()` - will resume spotify's playback -* `void PlayURL(string uri, string context = "")` - will play a spotify URI (track/album/playlist) in the specifc context (can be a album/playlist URI) -* `void Skip()` - will skip the track via an emulated media key -* `void Previous()` - will play the previous track via an emulated media key -* `bool IsSpotifyRunning()` - returns true if a spotify client instance is running, false if not -* `bool IsSpotifyWebHelperRunning()` - returns true if a spotify web-helper instance is running, false if not -* `void RunSpotify()` - will attempt to start a Spotify instance -* `void RunSpotifyWebHelper()` - will attempt to start a Spotify web-helper instance diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/albums.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/albums.md index 80814e80..db18415f 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/albums.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/albums.md @@ -1,7 +1,7 @@ ##GetAlbumTracks > Get Spotify catalog information about an album's tracks. Optional parameters can be used to limit the number of tracks returned. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -24,7 +24,7 @@ Console.WriteLine(tracks.Total.ToString()) //Display total album track count ##GetAlbum > Get Spotify catalog information for a single album. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -43,7 +43,7 @@ Console.WriteLine(album.Name + "| Popularity: " + album.Popularity); //Display n ##GetSeveralAlbums > Get Spotify catalog information for multiple albums identified by their Spotify IDs. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/artists.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/artists.md index f9b30249..ba4d917a 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/artists.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/artists.md @@ -2,7 +2,7 @@ > Get Spotify catalog information for a single artist identified by their unique Spotify ID. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -20,7 +20,7 @@ Console.WriteLine() ##GetRelatedArtists > Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the Spotify community's listening history. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -38,7 +38,7 @@ Console.WriteLine(artists.Artists[0].Name); ##GetArtistsTopTracks > Get Spotify catalog information about an artist's top tracks by country. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -57,7 +57,7 @@ Console.WriteLine(tracks.Tracks.Count); //How many tracks did we get? ##GetArtistsAlbums > Get Spotify catalog information about an artist's albums. Optional parameters can be specified in the query string to filter and sort the response. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -79,7 +79,7 @@ albums.Items.ForEach(album => Console.WriteLine(album.Name)); ##GetSeveralArtists > Get Spotify catalog information for several artists based on their Spotify IDs. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/auth.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/auth.md index 78e08100..f619ae35 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/auth.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/auth.md @@ -1,193 +1,94 @@ -#Auth-Methods +#Auth-Methods -Before you can use the Web API full functional, you need the user to authenticate your Application. +Before you can use the Web API full functional, you need the user to authenticate your Application. If you want to know more, you can read to the whole auth-process [here](https://developer.spotify.com/web-api/authorization-guide/). -Before you start, you need to create a Application at Spotify: [Your Applications](https://developer.spotify.com/my-applications/#!/applications) +Before you start, install `SpotifyAPI.Web.Auth` and create an application at Spotify: [Your Applications](https://developer.spotify.com/my-applications/#!/applications) *** -After you created your Application, you will have following important values: ->**Client_Id** This is your client_id, you don't have to hide it ->**Client_Secret** Never use this in one of your client-side apps!! Keep it secret! ->**Redirect URIs** Add "http://localhost", if you want full support for this API +After you created your Application, you will have following important values: +>**Client_Id**: This is your client_id, you don't have to hide it +>**Client_Secret**: Never use this in one of your client-side apps!! Keep it secret! +>**Redirect URIs**: Add "http://localhost", if you want full support for this API Now you can start with the User-authentication, Spotify provides 3 ways: -* [ImplicitGrantAuth](/SpotifyWebAPI/auth#implicitgrantauth) (**Recommended**, no server-side code needed) +* [ImplicitGrantAuth](/SpotifyWebAPI/auth#implicitgrantauth) -* [AutorizationCodeAuth](/SpotifyWebAPI/auth#autorizationcodeauth) (Not Recommended, Server-side code needed, else it's unsecure) +* [AutorizationCodeAuth](/SpotifyWebAPI/auth#autorizationcodeauth) -* [ClientCredentialsAuth](/SpotifyWebAPI/auth#clientcredentialsauth) (Not Recommended, Server-side code needed, else it's unsecure) +* [ClientCredentialsAuth](/SpotifyWebAPI/auth#clientcredentialsauth) -**Note:** I would recommend a little PHP Script, which will exchange the Keys using AutorizationCodeAuth. -When using ImplicitGrantAuth, another user could abuse the "localhost" RedirectUri by creating a "fake"-app which uses your ClientId. +## Notes + +Generally, if you're developing a 100% client-side application, no auth mechanism is totally secure. `AutorizationCodeAuth` and `ClientCredentialsAuth` require your clients to know the `client_secret`, which should be kept secret. For `ImplicitGrantAuth` to work, `http://localhost` needs to be added to the redirect uris of your spotify application. Since `localhost` is not a controlled domain by you, everybody is able to generate API-Keys. However, it is still the best option of all 3. Overview: ![Overview](http://i.imgur.com/uf3ahTl.png) -After implementing one of the provided auth-methods, you can start doing requests with the token you get from one of the auth-methods +After implementing one of the provided auth-methods, you can start doing requests with the token you get from one of the auth-methods. ##ImplicitGrantAuth -This way is **recommended** and the only auth-process, which does not need a server-side exchange of keys. With this approach, you directly get a Token object after the user authed your application. -You won't be able to refresh the token. If you want to use the internal Http server, please add "http://localhost" to your application redirects. +With this approach, you directly get a Token object after the user authed your application. +You won't be able to refresh the token. If you want to use the internal Http server, make sure the redirect URI is in your spotify application redirects. -More info: [here](https://developer.spotify.com/web-api/authorization-guide/#implicit_grant_flow) +More info: [here](https://developer.spotify.com/documentation/general/guides/authorization-guide/#implicit-grant-flow) -For this kind of authentication, there is also a `WebAPIFactory`, it's easier to use and uses an async method: -``` +```c# static async void Main(string[] args) { - WebAPIFactory webApiFactory = new WebAPIFactory( - "http://localhost", - 8000, - "XXXXXXXXXXXXXXXX", - Scope.UserReadPrivate, - TimeSpan.FromSeconds(20) - ); - - try - { - //This will open the user's browser and returns once - //the user is authorized. - _spotify = await webApiFactory.GetWebApi(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message); - } - - if (_spotify == null) - return; -} -``` - -The old way: -``` -static ImplicitGrantAuth auth; -static void Main(string[] args) -{ - //Create the auth object - auth = new ImplicitGrantAuth() + ImplicitGrantAuth auth = + new ImplicitGrantAuth(_clientId, "http://localhost:4002", "http://localhost:4002", Scope.UserReadPrivate); + auth.AuthReceived += async (sender, payload) => { - //Your client Id - ClientId = "XXXXXXXXXXXXXXXX", - //Set this to localhost if you want to use the built-in HTTP Server - RedirectUri = "http://localhost", - //How many permissions we need? - Scope = Scope.UserReadPrivate, + auth.Stop(); // `sender` is also the auth instance + SpotifyWebAPI api = new SpotifyWebAPI() {TokenType = payload.TokenType, AccessToken = payload.AccessToken}; + // Do requests with API client }; - //Start the internal http server - auth.StartHttpServer(); - //When we got our response - auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent; - //Start - auth.DoAuth(); -} - -static void auth_OnResponseReceivedEvent(Token token, string state, string error) -{ - var spotify = new SpotifyWebApiClass() - { - TokenType = token.TokenType, - AccessToken = token.AccessToken - }; - //We can now make calls with the token object - - //stop the http server - auth.StopHttpServer(); + auth.Start(); // Starts an internal HTTP Server + auth.OpenBrowser(); } ``` ##AutorizationCodeAuth -This way is **not recommended** and requires server-side code to run securely. -With this approach, you first get a code which you need to trade against the access-token. -In this exchange you need to provide your Client-Secret and because of that it's not recommended. -(But you can e.g exchange to codes via a PHP Script) +This way is **not recommended** and requires server-side code to run securely. +With this approach, you first get a code which you need to trade against the access-token. +In this exchange you need to provide your Client-Secret and because of that it's not recommended. A good thing about this method: You can always refresh your token, without having the user to auth it again -More info: [here](https://developer.spotify.com/web-api/authorization-guide/#authorization_code_flow) +More info: [here](https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow) -``` -static AutorizationCodeAuth auth; -static void Main(string[] args) +```c# +static async void Main(string[] args) { - //Create the auth object - auth = new AutorizationCodeAuth() + AuthorizationCodeAuth auth = + new AuthorizationCodeAuth(_clientId, _secretId, "http://localhost:4002", "http://localhost:4002", + Scope.PlaylistReadPrivate | Scope.PlaylistReadCollaborative); + auth.AuthReceived += async (sender, payload) => { - //Your client Id - ClientId = "XXXXXXXXXXXXXXX", - //Set this to localhost if you want to use the built-in HTTP Server - RedirectUri = "http://localhost", - //How many permissions we need? - Scope = Scope.UserReadPrivate, + auth.Stop(); + Token token = await auth.ExchangeCode(payload.Code); + SpotifyWebAPI api = new SpotifyWebAPI() {TokenType = token.TokenType, AccessToken = token.AccessToken}; + // Do requests with API client }; - //This will be called, if the user cancled/accept the auth-request - auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent; - //a local HTTP Server will be started (Needed for the response) - auth.StartHttpServer(); - //This will open the spotify auth-page. The user can decline/accept the request - auth.DoAuth(); - - Thread.Sleep(60000); - auth.StopHttpServer(); - Console.WriteLine("Too long, didnt respond, exiting now..."); -} - -private static void auth_OnResponseReceivedEvent(AutorizationCodeAuthResponse response) -{ - - //NEVER DO THIS! You would need to provide the ClientSecret. - //You would need to do it e.g via a PHP-Script. - Token token = auth.ExchangeAuthCode(response.Code, "XXXXXXXXXXX"); - - var spotify = new SpotifyWebApiClass() - { - TokenType = token.TokenType, - AccessToken = token.AccessToken - }; - - //With the token object, you can now make API calls - - //Stop the HTTP Server, done. - auth.StopHttpServer(); + auth.Start(); // Starts an internal HTTP Server + auth.OpenBrowser(); } ``` ##ClientCredentialsAuth -This way is **not recommended** and requires server-side code to run securely. -With this approach, you make a POST Request with a base64 encoded string (consists of ClientId + ClientSecret). You will directly get the token (Without a local HTTP Server), but it will expire and can't be refreshed. -If you want to use it securely, you would need to do it all server-side. +With this approach, you make a POST Request with a base64 encoded string (consists of ClientId + ClientSecret). You will directly get the token (Without a local HTTP Server), but it will expire and can't be refreshed. +If you want to use it securely, you would need to do it all server-side. **NOTE:** You will only be able to query non-user-related information e.g search for a Track. -More info: [here](https://developer.spotify.com/web-api/authorization-guide/#client_credentials_flow) +More info: [here](https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow) +```c# +CredentialsAuth auth = new CredentialsAuth(_clientId, _secretId); +Token token = await auth.GetToken(); +SpotifyWebAPI api = new SpotifyWebAPI() {TokenType = token.TokenType, AccessToken = token.AccessToken}; ``` -static ClientCredentialsAuth auth; -static void Main(string[] args) -{ - //Create the auth object - auth = new ClientCredentialsAuth() - { - //Your client Id - ClientId = "XXXXXXXXXXXXXXX", - //Your client secret UNSECURE!! - ClientSecret = "XXXXXXXXXXXX", - //How many permissions we need? - Scope = Scope.UserReadPrivate, - }; - //With this token object, we now can make calls - Token token = auth.DoAuth(); - var spotify = new SpotifyWebApiClass() - { - TokenType = token.TokenType, - AccessToken = token.AccessToken, - UseAuth = false - }; -} -``` - -#Scopes diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/browse.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/browse.md index 003945eb..e36c0e89 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/browse.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/browse.md @@ -2,7 +2,7 @@ AUTH REQUIRED > Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab). -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -26,7 +26,7 @@ playlists.Playlists.Items.ForEach(playlist => Console.WriteLine(playlist.Name)); AUTH REQUIRED > Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -47,7 +47,7 @@ newAlbums.Albums.Items.ForEach(album => Console.WriteLine(album.Name)); AUTH REQUIRED > Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -69,7 +69,7 @@ categoryList.Categories.Items.ForEach(category => Console.WriteLine(category.Nam AUTH REQUIRED > Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -90,7 +90,7 @@ Console.WriteLine(cat.Name); AUTH REQUIRED > Get a list of Spotify playlists tagged with a particular category. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/follow.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/follow.md index 11450a4e..cc892d18 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/follow.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/follow.md @@ -2,7 +2,7 @@ AUTH REQUIRED > Add the current user as a follower of one or more artists or other Spotify users. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -23,7 +23,7 @@ ErrorResponse response = _spotify.Follow(FollowType.User, "1122095781"); AUTH REQUIRED > Remove the current user as a follower of one or more artists or other Spotify users. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -44,7 +44,7 @@ ErrorResponse response = _spotify.Unfollow(FollowType.User, "1122095781"); AUTH REQUIRED > Check to see if the current user is following one or more artists or other Spotify users. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -65,7 +65,7 @@ Console.WriteLine(response.List[0] ? "Yis!" : "No :("); AUTH REQUIRED > Add the current user as a follower of a playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -87,7 +87,7 @@ if(!response.HasError()) AUTH REQUIRED > Remove the current user as a follower of a playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -108,7 +108,7 @@ if(!response.HasError()) AUTH REQUIRED > Check to see if one or more Spotify users are following a specified playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/library.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/library.md index d2474d2c..22d103ab 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/library.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/library.md @@ -2,7 +2,7 @@ AUTH REQUIRED > Save one or more tracks to the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -22,7 +22,7 @@ if(!response.HasError()) AUTH REQUIRED > Save one track to the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -42,7 +42,7 @@ if(!response.HasError()) AUTH REQUIRED > Get a list of the songs saved in the current Spotify user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -63,7 +63,7 @@ savedTracks.Items.ForEach(track => Console.WriteLine(track.Track.Name)); AUTH REQUIRED > Remove one or more tracks from the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -83,7 +83,7 @@ if(!response.HasError()) AUTH REQUIRED > Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -103,7 +103,7 @@ if(tracksSaved.List[0]) AUTH REQUIRED > Save one or more albums to the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -123,7 +123,7 @@ if(!response.HasError()) AUTH REQUIRED > Save one album to the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -143,7 +143,7 @@ if(!response.HasError()) AUTH REQUIRED > Get a list of the albums saved in the current Spotify user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -164,7 +164,7 @@ savedAlbums.Items.ForEach(album => Console.WriteLine(album.Album.Name)); AUTH REQUIRED > Remove one or more albums from the current user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -184,7 +184,7 @@ if(!response.HasError()) AUTH REQUIRED > Check if one or more albums is already saved in the current Spotify user’s “Your Music” library. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/player.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/player.md index b60a20d3..d35b1a98 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/player.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/player.md @@ -1,7 +1,7 @@ ## GetDevices > Get information about a user’s available devices. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -18,7 +18,7 @@ devices.Devices.ForEach(device => Console.WriteLine(device.Name)); ## GetPlayback > Get information about the user’s current playback state, including track, track progress, and active device. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -37,7 +37,7 @@ if(contex.Item != null) ## GetPlayingTrack > Get the object currently being played on the user’s Spotify account. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -58,7 +58,7 @@ if(contex.Item != null) ## TransferPlayback > Transfer playback to a new device and determine if it should start playing. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -76,7 +76,7 @@ ErrorResponse error = _spotify.TransferPlayback("XXXX-XXXX-XXXX-XXXX"); ## ResumePlayback > Start a new context or resume current playback on the user’s active device. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -96,7 +96,7 @@ ErrorResponse error = _spotify.ResumePlayback(uris: new List { "spotify: ## PausePlayback > Pause playback on the user’s account. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -113,7 +113,7 @@ ErrorResponse error = _spotify.PausePlayback(); ## SkipPlaybackToNext > Skips to next track in the user’s queue. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -132,7 +132,7 @@ ErrorResponse error = _spotify.SkipPlaybackToNext(); Note that this will ALWAYS skip to the previous track, regardless of the current track’s progress. Returning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -149,7 +149,7 @@ ErrorResponse error = _spotify.SkipPlaybackToPrevious(); ## SeekPlayback > Seeks to the given position in the user’s currently playing track. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -167,7 +167,7 @@ ErrorResponse error = _spotify.SeekPlayback(50); ## SetRepeatMode > Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -185,7 +185,7 @@ ErrorResponse error = _spotify.SetRepeatMode(RepeatState.Track); ## SetVolume > Set the volume for the user’s current playback device. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -203,7 +203,7 @@ ErrorResponse error = _spotify.SetVolume(50); ## SetShuffle > Toggle shuffle on or off for user’s playback. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/playlists.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/playlists.md index 62b1d311..8df5bc7e 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/playlists.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/playlists.md @@ -2,7 +2,7 @@ AUTH REQUIRED > Get a list of the playlists owned or followed by a Spotify user. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -23,7 +23,7 @@ userPlaylists.Items.ForEach(playlist => playlist.Owner.DisplayName) //Who is the AUTH REQUIRED > Get a playlist owned by a Spotify user. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -45,7 +45,7 @@ playlist.Tracks.Items.ForEach(track => Console.WriteLine(track.Track.Name)); AUTH REQUIRED > Get full details of the tracks of a playlist owned by a Spotify user. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -69,7 +69,7 @@ playlist.Items.ForEach(track => Console.WriteLine(track.Track.Name)); AUTH REQUIRED > Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -91,7 +91,7 @@ if(!playlist.HasError()) AUTH REQUIRED > Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -114,7 +114,7 @@ if(!response.HasError()) AUTH REQUIRED > Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for replacing tracks, re-ordering existing tracks, or clearing the playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -136,7 +136,7 @@ if(!response.HasError()) AUTH REQUIRED > Remove one or more tracks from a user’s playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -167,7 +167,7 @@ ErrorResponse playlist = _spotify.RemovePlaylistTracks("1122095781", "1TtEejT1y4 AUTH REQUIRED > Remove one or more tracks from a user’s playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -191,7 +191,7 @@ ErrorResponse response = _spotify.RemovePlaylistTrack("1122095781", "1TtEejT1y4D AUTH REQUIRED > Add one or more tracks to a user’s playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -214,7 +214,7 @@ if(!response.HasError()) AUTH REQUIRED > Add one or more tracks to a user’s playlist. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -238,7 +238,7 @@ if(!response.HasError()) > Reorder a track or a group of tracks in a playlist. > More Info: [Reorder-Playlist](https://developer.spotify.com/web-api/reorder-playlists-tracks/) -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/profiles.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/profiles.md index de4b1b5b..50ce48f8 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/profiles.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/profiles.md @@ -2,7 +2,7 @@ AUTH REQUIRED > Get detailed profile information about the current user (including the current user’s username). -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -21,7 +21,7 @@ Console.WriteLine(user.DisplayName); > Get public profile information about a Spotify user. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/search.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/search.md index a39499e6..9df7cb5e 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/search.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/search.md @@ -2,7 +2,7 @@ > Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/SpotifyWebAPI/tracks.md b/SpotifyAPI.Docs/docs/SpotifyWebAPI/tracks.md index 6a56b6ef..e327f0a6 100644 --- a/SpotifyAPI.Docs/docs/SpotifyWebAPI/tracks.md +++ b/SpotifyAPI.Docs/docs/SpotifyWebAPI/tracks.md @@ -2,7 +2,7 @@ > Get Spotify catalog information for multiple tracks based on their Spotify IDs. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -22,7 +22,7 @@ severalTracks.Tracks.ForEach(track => Console.WriteLine(track.Name)); > Get Spotify catalog information for a single track identified by its unique Spotify ID. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| @@ -42,7 +42,7 @@ Console.WriteLine(track.Name); > Get a detailed audio analysis for a single track identified by its unique Spotify ID. -**Paramters** +**Parameters** |Name|Description|Example| |--------------|-------------------------|-------------------------| diff --git a/SpotifyAPI.Docs/docs/index.md b/SpotifyAPI.Docs/docs/index.md index 81dd8b3f..72d028e0 100644 --- a/SpotifyAPI.Docs/docs/index.md +++ b/SpotifyAPI.Docs/docs/index.md @@ -2,17 +2,17 @@ ## About -This Library, written in C#/.NET, combines two independent SpotifyAPIs into one. +This project, written in C#/.NET, provides 2 libraries for an easier usage of the Spotify Web API **Spotify's Web API** ([link](https://developer.spotify.com/web-api/)) > Based on simple REST principles, our Web API endpoints return metadata in JSON format about artists, albums, and tracks directly from the Spotify catalogue. > The API also provides access to user-related data such as playlists and music saved in a “Your Music” library, subject to user’s authorization. -**Spotify's *unofficial* Local API** -> Do you ever wanted to control your local Spotify Client with some sort of API? Now you can! This API gives you full control over your spotify client. -> You can get infos about the currently playing song, get its Album-Art, skip/pause and much more. It also features multiple Event-Interfaces. +**SpotifyAPI.Web** +> A wrapper around Spotify's Web API, providing sync and async methods to query all possible endpoints. Results are returned as typed class instances, allowing property-based access. -Both combined can be used for any kind of application. +**SpotifyAPI.Web.Auth** +> A library providing C# implementations of the 3 supported Authentication modes, including `ImplicitGrantAuth`, `AuthorizationCodeAuth` and `CredentialsAuth` --- @@ -20,12 +20,11 @@ Both combined can be used for any kind of application. * Via NuGet Package: ```cs -Install-Package SpotifyAPI-NET -//or -Install-Package SpotifyAPI-NET -pre +Install-Package SpotifyAPI.Web +Install-Package SpotifyAPI.Web.Auth ``` * Download the latest binaries on the [GitHub Release Page](https://github.com/JohnnyCrazy/SpotifyAPI-NET/releases) and add it to your Project -* Clone the Repo and build the project on your local machine. +* Clone the Repo and build the project yourself. --- @@ -37,8 +36,8 @@ Install-Package SpotifyAPI-NET -pre ### [Toastify](https://github.com/aleab/toastify) by [@aleab](https://github.com/aleab) -> Toastify adds global hotkeys and toast notifications to Spotify -> +> Toastify adds global hotkeys and toast notifications to Spotify +> > *Forked from [nachmore/toastify](https://github.com/nachmore/toastify)* ### [Spotify Oculus](https://github.com/CaptainMorgs/spotify-oculus-release) by [@CaptainMorgs](https://github.com/CaptainMorgs) diff --git a/SpotifyAPI.Docs/mkdocs.yml b/SpotifyAPI.Docs/mkdocs.yml index 274ae20c..67a80a56 100644 --- a/SpotifyAPI.Docs/mkdocs.yml +++ b/SpotifyAPI.Docs/mkdocs.yml @@ -2,10 +2,9 @@ site_name: 'SpotifyAPI-NET' theme_dir: 'mytheme' pages: - 'Home': 'index.md' - - 'SpotifyWebAPI': + - 'SpotifyAPI.Web': - 'Getting started': 'SpotifyWebAPI/gettingstarted.md' - 'Examples': 'SpotifyWebAPI/examples.md' - - 'Authentication': 'SpotifyWebAPI/auth.md' - 'Proxy': 'SpotifyWebAPI/proxy.md' - '- Albums': 'SpotifyWebAPI/albums.md' - '- Artists': 'SpotifyWebAPI/artists.md' @@ -19,10 +18,10 @@ pages: - '- Search': 'SpotifyWebAPI/search.md' - '- Tracks': 'SpotifyWebAPI/tracks.md' - '- Util': 'SpotifyWebAPI/util.md' - - 'SpotifyLocalAPI': 'SpotifyLocalAPI/index.md' + - 'SpotifyAPI.Web.Auth': 'SpotifyWebAPI/auth.md' repo_url: 'https://github.com/JohnnyCrazy/SpotifyAPI-NET' site_author: 'JohnnyCrazy' -site_description: 'API Docs for SpotifyAPI-NET' +site_description: 'API Docs for SpotifyAPI.Web and SpotifyAPI.Web.Auth' extra_javascript: - 'highlight.js' markdown_extensions: diff --git a/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs b/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs index fa9cf800..c4ef759d 100644 --- a/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs +++ b/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs @@ -10,10 +10,6 @@ using SpotifyAPI.Web.Models; using Unosquare.Labs.EmbedIO; using Unosquare.Labs.EmbedIO.Constants; using Unosquare.Labs.EmbedIO.Modules; -using Unosquare.Swan; -#if NET46 -using HttpListenerContext = Unosquare.Net.HttpListenerContext; -#endif namespace SpotifyAPI.Web.Auth { @@ -43,9 +39,9 @@ namespace SpotifyAPI.Web.Auth return ShouldRegisterNewApp() ? $"{RedirectUri}/start.html#{State}" : base.GetUri(); } - protected override WebServer AdaptWebServer(WebServer webServer) + protected override void AdaptWebServer(WebServer webServer) { - return webServer.WithWebApiController(); + webServer.Module().RegisterController(); } private string GetAuthHeader() => $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes(ClientId + ":" + SecretId))}"; @@ -97,29 +93,29 @@ namespace SpotifyAPI.Web.Auth internal class AuthorizationCodeAuthController : WebApiController { [WebApiHandler(HttpVerbs.Get, "/")] - public Task GetEmpty(WebServer server, HttpListenerContext context) + public Task GetEmpty() { - string state = context.Request.QueryString["state"]; + string state = Request.QueryString["state"]; AuthorizationCodeAuth.Instances.TryGetValue(state, out SpotifyAuthServer auth); string code = null; - string error = context.Request.QueryString["error"]; + string error = Request.QueryString["error"]; if (error == null) - code = context.Request.QueryString["code"]; + code = Request.QueryString["code"]; Task.Factory.StartNew(() => auth?.TriggerAuth(new AuthorizationCode { Code = code, Error = error })); - - return context.StringResponseAsync("OK - This window can be closed now"); + + return this.StringResponseAsync("OK - This window can be closed now"); } [WebApiHandler(HttpVerbs.Post, "/")] - public bool PostValues(WebServer server, HttpListenerContext context) + public bool PostValues() { - Dictionary formParams = context.RequestFormDataDictionary(); + Dictionary formParams = this.RequestFormDataDictionary(); string state = (string) formParams["state"]; AuthorizationCodeAuth.Instances.TryGetValue(state, out SpotifyAuthServer authServer); @@ -129,7 +125,11 @@ namespace SpotifyAPI.Web.Auth auth.SecretId = (string) formParams["secretId"]; string uri = auth.GetUri(); - return context.Redirect(uri, false); + return this.Redirect(uri, false); + } + + public AuthorizationCodeAuthController(IHttpContext context) : base(context) + { } } } diff --git a/SpotifyAPI.Web.Auth/ImplictGrantAuth.cs b/SpotifyAPI.Web.Auth/ImplictGrantAuth.cs index 96487a60..f5bba3c8 100644 --- a/SpotifyAPI.Web.Auth/ImplictGrantAuth.cs +++ b/SpotifyAPI.Web.Auth/ImplictGrantAuth.cs @@ -24,32 +24,30 @@ namespace SpotifyAPI.Web.Auth ClientId = clientId; } - protected override WebServer AdaptWebServer(WebServer webServer) + protected override void AdaptWebServer(WebServer webServer) { - Console.WriteLine("Hello"); webServer.Module().RegisterController(); - return webServer; } } public class ImplictGrantAuthController : WebApiController { [WebApiHandler(HttpVerbs.Get, "/auth")] - public Task GetAuth(WebServer server, HttpListenerContext context) + public Task GetAuth() { - string state = context.Request.QueryString["state"]; + string state = Request.QueryString["state"]; SpotifyAuthServer auth = ImplictGrantAuth.GetByState(state); if (auth == null) - return context.StringResponseAsync( + return this.StringResponseAsync( $"Failed - Unable to find auth request with state \"{state}\" - Please retry"); Token token; - string error = context.Request.QueryString["error"]; + string error = Request.QueryString["error"]; if (error == null) { - string accessToken = context.Request.QueryString["access_token"]; - string tokenType = context.Request.QueryString["token_type"]; - string expiresIn = context.Request.QueryString["expires_in"]; + string accessToken = Request.QueryString["access_token"]; + string tokenType = Request.QueryString["token_type"]; + string expiresIn = Request.QueryString["expires_in"]; token = new Token { AccessToken = accessToken, @@ -66,7 +64,11 @@ namespace SpotifyAPI.Web.Auth } Task.Factory.StartNew(() => auth.TriggerAuth(token)); - return context.StringResponseAsync("OK - This window can be closed now"); + return this.StringResponseAsync("OK - This window can be closed now"); + } + + public ImplictGrantAuthController(IHttpContext context) : base(context) + { } } } diff --git a/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj b/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj index 4d7343e5..5b1e162d 100644 --- a/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj +++ b/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0;net46 + net46;netstandard2.0 @@ -15,7 +15,7 @@ - + diff --git a/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs b/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs index 0925ccfa..74359eff 100644 --- a/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs +++ b/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Reflection; using System.Text; using System.Threading; using SpotifyAPI.Web.Enums; @@ -44,10 +45,10 @@ namespace SpotifyAPI.Web.Auth Instances.Add(State, this); _serverSource = new CancellationTokenSource(); - _server = WebServer.Create(ServerUri, RoutingStrategy.Regex); + _server = WebServer.Create(ServerUri); _server.RegisterModule(new WebApiModule()); AdaptWebServer(_server); - _server.RegisterModule(new ResourceFilesModule(typeof(T).Assembly, $"SpotifyAPI.Web.Auth.Resources.{_folder}")); + _server.RegisterModule(new ResourceFilesModule(Assembly.GetExecutingAssembly(), $"SpotifyAPI.Web.Auth.Resources.{_folder}")); #pragma warning disable 4014 _server.RunAsync(_serverSource.Token); #pragma warning restore 4014 @@ -88,6 +89,6 @@ namespace SpotifyAPI.Web.Auth return Instances.TryGetValue(state, out SpotifyAuthServer auth) ? auth : null; } - protected abstract WebServer AdaptWebServer(WebServer webServer); + protected abstract void AdaptWebServer(WebServer webServer); } } \ No newline at end of file diff --git a/SpotifyAPI.Web.Example/Program.cs b/SpotifyAPI.Web.Example/Program.cs index bf3d6130..4e05d574 100644 --- a/SpotifyAPI.Web.Example/Program.cs +++ b/SpotifyAPI.Web.Example/Program.cs @@ -1,5 +1,4 @@ using System; -using System.Threading.Tasks; using SpotifyAPI.Web.Auth; using SpotifyAPI.Web.Enums; using SpotifyAPI.Web.Models; @@ -25,15 +24,11 @@ namespace SpotifyAPI.Web.Example Console.WriteLine("This example uses AuthorizationCodeAuth."); Console.WriteLine( "Tip: If you want to supply your ClientID and SecretId beforehand, use env variables (SPOTIFY_CLIENT_ID and SPOTIFY_SECRET_ID)"); - - - AuthorizationCodeAuth auth = - new AuthorizationCodeAuth(_clientId, _secretId, "http://localhost:4002", "http://localhost:4002", - Scope.PlaylistReadPrivate | Scope.PlaylistReadCollaborative); - auth.AuthReceived += AuthOnAuthReceived; - auth.Start(); - auth.OpenBrowser(); - + + CredentialsAuth auth = new CredentialsAuth(_clientId, _secretId); + Token token = await auth.GetToken(); + SpotifyWebAPI api = new SpotifyWebAPI() { TokenType = token.TokenType, AccessToken = token.AccessToken}; + Console.ReadLine(); auth.Stop(0); } diff --git a/SpotifyAPI.Web.Tests/SpotifyAPI.Web.Tests.csproj b/SpotifyAPI.Web.Tests/SpotifyAPI.Web.Tests.csproj index c0827cd8..1e8a9d7e 100644 --- a/SpotifyAPI.Web.Tests/SpotifyAPI.Web.Tests.csproj +++ b/SpotifyAPI.Web.Tests/SpotifyAPI.Web.Tests.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.0 @@ -7,11 +7,11 @@ - - - - - + + + + + diff --git a/SpotifyAPI.Web/SpotifyAPI.Web.csproj b/SpotifyAPI.Web/SpotifyAPI.Web.csproj index 038dde9b..d8bb7b47 100644 --- a/SpotifyAPI.Web/SpotifyAPI.Web.csproj +++ b/SpotifyAPI.Web/SpotifyAPI.Web.csproj @@ -1,7 +1,7 @@ - + - netstandard2.0;net46 + net46;netstandard2.0 @@ -15,7 +15,7 @@ - +