Compare commits

..

No commits in common. "91b9fc9190608e5c80f301bb12b8a24c2a7781bc" and "8f84d3530ccea5658c99b84e7554a668af27dc98" have entirely different histories.

30 changed files with 359 additions and 313 deletions

View File

@ -12,13 +12,16 @@ jobs:
uses: actions/checkout@v2 uses: actions/checkout@v2
- uses: actions/setup-dotnet@v1 - uses: actions/setup-dotnet@v1
with: with:
dotnet-version: "5.x" dotnet-version: "3.1.x"
- uses: actions/setup-dotnet@v1 - uses: actions/setup-dotnet@v1
with: with:
dotnet-version: "6.x" dotnet-version: "5.0.x"
- uses: actions/setup-dotnet@v1 - uses: actions/setup-dotnet@v1
with: with:
dotnet-version: "7.0.203" dotnet-version: "6.0.x"
- uses: actions/setup-dotnet@v1
with:
dotnet-version: "7.0.x"
- name: Set RELEASE_VERSION - name: Set RELEASE_VERSION
run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV
- name: Restore Packages - name: Restore Packages

27
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,27 @@
{
// Use IntelliSense to find out which attributes exist for C# debugging
// Use hover for the description of the existing attributes
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
"version": "0.2.0",
"configurations": [
{
"name": "Launch Example.ASP",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "Example.ASP-build",
"program": "${workspaceFolder}/SpotifyAPI.Web.Examples/Example.ASP/bin/Debug/netcoreapp3.1/Example.ASP.dll",
"args": [],
"cwd": "${workspaceFolder}/SpotifyAPI.Web.Examples/Example.ASP",
"stopAtEntry": false,
// "serverReadyAction": {
// "pattern": "^\\s*Now listening on:\\s+(https?://\\S+)"
// },
"env": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"sourceFileMap": {
"/Views": "${workspaceFolder}/Views"
}
}
]
}

17
.vscode/tasks.json vendored Normal file
View File

@ -0,0 +1,17 @@
{
"version": "2.0.0",
"tasks": [
{
"label": "Example.ASP-build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/SpotifyAPI.Web.Examples/Example.ASP/Example.ASP.csproj",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary"
],
"problemMatcher": "$msCompile"
}
]
}

View File

@ -132,7 +132,7 @@ private static async void AuthOnAuthReceived(object sender, AuthorizationCode pa
// NEW // NEW
var config = SpotifyClientConfig.CreateDefault(); var config = SpotifyClientConfig.CreateDefault();
var server = new EmbedIOAuthServer(new Uri("http://localhost:5543/callback"), 5543); var server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000);
server.AuthorizationCodeReceived += async (sender, response) => server.AuthorizationCodeReceived += async (sender, response) =>
{ {
await server.Stop(); await server.Stop();

View File

@ -10,9 +10,9 @@ title: Authorization Code
If you are already in control of a Web-Server (like `ASP.NET`), you can start the flow by generating a login uri: If you are already in control of a Web-Server (like `ASP.NET`), you can start the flow by generating a login uri:
```csharp ```csharp
// Make sure "http://localhost:5543" is in your applications redirect URIs! // Make sure "http://localhost:5000" is in your applications redirect URIs!
var loginRequest = new LoginRequest( var loginRequest = new LoginRequest(
new Uri("http://localhost:5543"), new Uri("http://localhost:5000"),
"ClientId", "ClientId",
LoginRequest.ResponseType.Code LoginRequest.ResponseType.Code
) )
@ -23,14 +23,14 @@ var uri = loginRequest.ToUri();
// Redirect user to uri via your favorite web-server // Redirect user to uri via your favorite web-server
``` ```
When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5543` and a `code` parameter is attached to the query. This `code` has to be exchanged for an `access_token` and `refresh_token`: When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5000` and a `code` parameter is attached to the query. This `code` has to be exchanged for an `access_token` and `refresh_token`:
```csharp ```csharp
// This method should be called from your web-server when the user visits "http://localhost:5543" // This method should be called from your web-server when the user visits "http://localhost:5000"
public Task GetCallback(string code) public Task GetCallback(string code)
{ {
var response = await new OAuthClient().RequestToken( var response = await new OAuthClient().RequestToken(
new AuthorizationCodeTokenRequest("ClientId", "ClientSecret", code, "http://localhost:5543") new AuthorizationCodeTokenRequest("ClientId", "ClientSecret", code, "http://localhost:5000")
); );
var spotify = new SpotifyClient(response.AccessToken); var spotify = new SpotifyClient(response.AccessToken);
@ -52,7 +52,7 @@ You can also let the `AuthorizationCodeAuthenticator` take care of the refresh p
```csharp ```csharp
var response = await new OAuthClient().RequestToken( var response = await new OAuthClient().RequestToken(
new AuthorizationCodeTokenRequest("ClientId", "ClientSecret", code, "http://localhost:5543") new AuthorizationCodeTokenRequest("ClientId", "ClientSecret", code, "http://localhost:5000")
); );
var config = SpotifyClientConfig var config = SpotifyClientConfig
.CreateDefault() .CreateDefault()
@ -76,8 +76,8 @@ private static EmbedIOAuthServer _server;
public static async Task Main() public static async Task Main()
{ {
// Make sure "http://localhost:5543/callback" is in your spotify application as redirect uri! // Make sure "http://localhost:5000/callback" is in your spotify application as redirect uri!
_server = new EmbedIOAuthServer(new Uri("http://localhost:5543/callback"), 5543); _server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000);
await _server.Start(); await _server.Start();
_server.AuthorizationCodeReceived += OnAuthorizationCodeReceived; _server.AuthorizationCodeReceived += OnAuthorizationCodeReceived;
@ -97,7 +97,7 @@ private static async Task OnAuthorizationCodeReceived(object sender, Authorizati
var config = SpotifyClientConfig.CreateDefault(); var config = SpotifyClientConfig.CreateDefault();
var tokenResponse = await new OAuthClient(config).RequestToken( var tokenResponse = await new OAuthClient(config).RequestToken(
new AuthorizationCodeTokenRequest( new AuthorizationCodeTokenRequest(
"ClientId", "ClientSecret", response.Code, new Uri("http://localhost:5543/callback") "ClientId", "ClientSecret", response.Code, new Uri("http://localhost:5000/callback")
) )
); );

View File

@ -17,7 +17,7 @@ This example is based on ASP .NET Core. It uses `Authorization Code` under the h
## Run it ## Run it
Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5543` is a redirect uri of it. Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5001` is a redirect uri of it.
```bash ```bash
# Assumes linux and current working directory is the cloned repository # Assumes linux and current working directory is the cloned repository
@ -26,5 +26,5 @@ dotnet restore
SPOTIFY_CLIENT_ID=YourClientId SPOTIFY_CLIENT_SECRET=YourClientSecret dotnet run SPOTIFY_CLIENT_ID=YourClientId SPOTIFY_CLIENT_SECRET=YourClientSecret dotnet run
# Visit https://localhost:5543 # Visit https://localhost:5001
``` ```

View File

@ -13,7 +13,7 @@ Very similar to the [Blazor WASM Example](example_blazor_wasm.md), but runs code
## Run it ## Run it
Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5543` is a redirect uri of it. Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5001` is a redirect uri of it.
```bash ```bash
# Assumes linux and current working directory is the cloned repository # Assumes linux and current working directory is the cloned repository
@ -22,5 +22,5 @@ dotnet restore
SPOTIFY_CLIENT_ID=YourClientId SPOTIFY_CLIENT_SECRET=YourClientSecret dotnet run SPOTIFY_CLIENT_ID=YourClientId SPOTIFY_CLIENT_SECRET=YourClientSecret dotnet run
# Visit https://localhost:5543 # Visit https://localhost:5001
``` ```

View File

@ -16,7 +16,7 @@ Since this library is compatible with `.NET Standard 2.1`, you can use all featu
## Run it ## Run it
Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5543` is a redirect uri of it. Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5001` is a redirect uri of it.
```bash ```bash
# Assumes linux and current working directory is the cloned repository # Assumes linux and current working directory is the cloned repository
@ -26,5 +26,5 @@ dotnet restore
echo "{ \"SPOTIFY_CLIENT_ID\": \"YourSpotifyClientId\" }" > wwwroot/appsettings.json echo "{ \"SPOTIFY_CLIENT_ID\": \"YourSpotifyClientId\" }" > wwwroot/appsettings.json
dotnet run dotnet run
# Visit https://localhost:5543 # Visit https://localhost:5001
``` ```

View File

@ -13,7 +13,7 @@ An example to show how you can display your own HTML resource after the user wen
## Run it ## Run it
Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5543` is a redirect uri of it. Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5001` is a redirect uri of it.
```bash ```bash
# Assumes linux and current working directory is the cloned repository # Assumes linux and current working directory is the cloned repository

View File

@ -11,7 +11,7 @@ The access and refresh token is saved in a `credentials.json` file of the curren
## Run it ## Run it
Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5543` is a redirect uri of it. Before running it, make sure you created an app in your [spotify dashboard](https://developer.spotify.com/dashboard/) and `https://localhost:5000` is a redirect uri of it.
```bash ```bash
# Assumes linux and current working directory is the cloned repository # Assumes linux and current working directory is the cloned repository

View File

@ -14,9 +14,9 @@ This flow is useful for getting a user access token for a short timespan.
If you are already in control of a Web-Server (like `ASP.NET`), you can start the flow by generating a login uri: If you are already in control of a Web-Server (like `ASP.NET`), you can start the flow by generating a login uri:
```csharp ```csharp
// Make sure "http://localhost:5543" is in your applications redirect URIs! // Make sure "http://localhost:5000" is in your applications redirect URIs!
var loginRequest = new LoginRequest( var loginRequest = new LoginRequest(
new Uri("http://localhost:5543"), new Uri("http://localhost:5000"),
"ClientId", "ClientId",
LoginRequest.ResponseType.Token LoginRequest.ResponseType.Token
) )
@ -27,7 +27,7 @@ var uri = loginRequest.ToUri();
// Redirect user to uri via your favorite web-server // Redirect user to uri via your favorite web-server
``` ```
When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5543` and the fragment identifier (`#` part of URI) will contain an access token. When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5000` and the fragment identifier (`#` part of URI) will contain an access token.
:::warning :::warning
Note, this parameter is not sent to the server! You need JavaScript to access it. Note, this parameter is not sent to the server! You need JavaScript to access it.
@ -77,15 +77,15 @@ For a real example, have a look at the [Example.UWP](https://github.com/JohnnyCr
# Using Spotify.Web.Auth # Using Spotify.Web.Auth
For cross-platform CLI and desktop apps (non `UWP` apps), custom protocol handlers are sometimes not an option. The fallback here is a small cross-platform embedded web server running on `http://localhost:5543` serving JavaScript. The JavaScript will parse the fragment part of the URI and sends a request to the web server in the background. The web server then notifies your appliciation via an event. For cross-platform CLI and desktop apps (non `UWP` apps), custom protocol handlers are sometimes not an option. The fallback here is a small cross-platform embedded web server running on `http://localhost:5000` serving JavaScript. The JavaScript will parse the fragment part of the URI and sends a request to the web server in the background. The web server then notifies your appliciation via an event.
```csharp ```csharp
private static EmbedIOAuthServer _server; private static EmbedIOAuthServer _server;
public static async Task Main() public static async Task Main()
{ {
// Make sure "http://localhost:5543/callback" is in your spotify application as redirect uri! // Make sure "http://localhost:5000/callback" is in your spotify application as redirect uri!
_server = new EmbedIOAuthServer(new Uri("http://localhost:5543/callback"), 5543); _server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000);
await _server.Start(); await _server.Start();
_server.ImplictGrantReceived += OnImplicitGrantReceived; _server.ImplictGrantReceived += OnImplicitGrantReceived;

View File

@ -25,9 +25,9 @@ var (verifier, challenge) = PKCEUtil.GenerateCodes("YourSecureRandomString");
Like most auth flows, you'll need to redirect your user to Spotify's servers so they are able to grant access to your application: Like most auth flows, you'll need to redirect your user to Spotify's servers so they are able to grant access to your application:
```csharp ```csharp
// Make sure "http://localhost:5543/callback" is in your applications redirect URIs! // Make sure "http://localhost:5000/callback" is in your applications redirect URIs!
var loginRequest = new LoginRequest( var loginRequest = new LoginRequest(
new Uri("http://localhost:5543/callback"), new Uri("http://localhost:5000/callback"),
"YourClientId", "YourClientId",
LoginRequest.ResponseType.Code LoginRequest.ResponseType.Code
) )
@ -40,15 +40,15 @@ var uri = loginRequest.ToUri();
// Redirect user to uri via your favorite web-server or open a local browser window // Redirect user to uri via your favorite web-server or open a local browser window
``` ```
When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5543/callback` and a `code` parameter is attached to the query. The redirect URI can also contain a custom protocol paired with UWP App Custom Protocol handler. This received `code` has to be exchanged for an `access_token` and `refresh_token`: When the user is redirected to the generated uri, they will have to login with their Spotify account and confirm that your application wants to access their user data. Once confirmed, they will be redirected to `http://localhost:5000/callback` and a `code` parameter is attached to the query. The redirect URI can also contain a custom protocol paired with UWP App Custom Protocol handler. This received `code` has to be exchanged for an `access_token` and `refresh_token`:
```csharp ```csharp
// This method should be called from your web-server when the user visits "http://localhost:5543/callback" // This method should be called from your web-server when the user visits "http://localhost:5000/callback"
public Task GetCallback(string code) public Task GetCallback(string code)
{ {
// Note that we use the verifier calculated above! // Note that we use the verifier calculated above!
var initialResponse = await new OAuthClient().RequestToken( var initialResponse = await new OAuthClient().RequestToken(
new PKCETokenRequest("ClientId", code, "http://localhost:5543", verifier) new PKCETokenRequest("ClientId", code, "http://localhost:5000", verifier)
); );
var spotify = new SpotifyClient(initialResponse.AccessToken); var spotify = new SpotifyClient(initialResponse.AccessToken);

View File

@ -14,8 +14,8 @@
} }
}, },
"dependencies": { "dependencies": {
"@docusaurus/core": "^2.4.1", "@docusaurus/core": "^2.0.0-beta.4",
"@docusaurus/preset-classic": "^2.4.1", "@docusaurus/preset-classic": "^2.0.0-beta.4",
"classnames": "^2.3.1", "classnames": "^2.3.1",
"react": "^17.0.2", "react": "^17.0.2",
"react-dom": "^17.0.2", "react-dom": "^17.0.2",
@ -35,7 +35,7 @@
}, },
"devDependencies": { "devDependencies": {
"import-sort-style-module": "^6.0.0", "import-sort-style-module": "^6.0.0",
"prettier": "^2.8.8", "prettier": "^2.3.2",
"prettier-plugin-import-sort": "^0.0.7" "prettier-plugin-import-sort": "^0.0.7"
} }
} }

View File

@ -1353,10 +1353,10 @@
"@docsearch/css" "3.3.0" "@docsearch/css" "3.3.0"
algoliasearch "^4.0.0" algoliasearch "^4.0.0"
"@docusaurus/core@2.4.1", "@docusaurus/core@^2.4.1": "@docusaurus/core@2.2.0", "@docusaurus/core@^2.0.0-beta.4":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.4.1.tgz#4b8ff5766131ce3fbccaad0b1daf2ad4dc76f62d" resolved "https://registry.yarnpkg.com/@docusaurus/core/-/core-2.2.0.tgz#64c9ee31502c23b93c869f8188f73afaf5fd4867"
integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== integrity sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==
dependencies: dependencies:
"@babel/core" "^7.18.6" "@babel/core" "^7.18.6"
"@babel/generator" "^7.18.7" "@babel/generator" "^7.18.7"
@ -1368,13 +1368,13 @@
"@babel/runtime" "^7.18.6" "@babel/runtime" "^7.18.6"
"@babel/runtime-corejs3" "^7.18.6" "@babel/runtime-corejs3" "^7.18.6"
"@babel/traverse" "^7.18.8" "@babel/traverse" "^7.18.8"
"@docusaurus/cssnano-preset" "2.4.1" "@docusaurus/cssnano-preset" "2.2.0"
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/react-loadable" "5.5.2" "@docusaurus/react-loadable" "5.5.2"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-common" "2.4.1" "@docusaurus/utils-common" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
"@slorber/static-site-generator-webpack-plugin" "^4.0.7" "@slorber/static-site-generator-webpack-plugin" "^4.0.7"
"@svgr/webpack" "^6.2.1" "@svgr/webpack" "^6.2.1"
autoprefixer "^10.4.7" autoprefixer "^10.4.7"
@ -1395,7 +1395,7 @@
del "^6.1.1" del "^6.1.1"
detect-port "^1.3.0" detect-port "^1.3.0"
escape-html "^1.0.3" escape-html "^1.0.3"
eta "^2.0.0" eta "^1.12.3"
file-loader "^6.2.0" file-loader "^6.2.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
html-minifier-terser "^6.1.0" html-minifier-terser "^6.1.0"
@ -1430,33 +1430,33 @@
webpack-merge "^5.8.0" webpack-merge "^5.8.0"
webpackbar "^5.0.2" webpackbar "^5.0.2"
"@docusaurus/cssnano-preset@2.4.1": "@docusaurus/cssnano-preset@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz#eacadefb1e2e0f59df3467a0fe83e4ff79eed163" resolved "https://registry.yarnpkg.com/@docusaurus/cssnano-preset/-/cssnano-preset-2.2.0.tgz#fc05044659051ae74ab4482afcf4a9936e81d523"
integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== integrity sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==
dependencies: dependencies:
cssnano-preset-advanced "^5.3.8" cssnano-preset-advanced "^5.3.8"
postcss "^8.4.14" postcss "^8.4.14"
postcss-sort-media-queries "^4.2.1" postcss-sort-media-queries "^4.2.1"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/logger@2.4.1": "@docusaurus/logger@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.4.1.tgz#4d2c0626b40752641f9fdd93ad9b5a7a0792f767" resolved "https://registry.yarnpkg.com/@docusaurus/logger/-/logger-2.2.0.tgz#ea2f7feda7b8675485933b87f06d9c976d17423f"
integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== integrity sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A==
dependencies: dependencies:
chalk "^4.1.2" chalk "^4.1.2"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/mdx-loader@2.4.1": "@docusaurus/mdx-loader@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz#6425075d7fc136dbfdc121349060cedd64118393" resolved "https://registry.yarnpkg.com/@docusaurus/mdx-loader/-/mdx-loader-2.2.0.tgz#fd558f429e5d9403d284bd4214e54d9768b041a0"
integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== integrity sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==
dependencies: dependencies:
"@babel/parser" "^7.18.8" "@babel/parser" "^7.18.8"
"@babel/traverse" "^7.18.8" "@babel/traverse" "^7.18.8"
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@mdx-js/mdx" "^1.6.22" "@mdx-js/mdx" "^1.6.22"
escape-html "^1.0.3" escape-html "^1.0.3"
file-loader "^6.2.0" file-loader "^6.2.0"
@ -1471,13 +1471,13 @@
url-loader "^4.1.1" url-loader "^4.1.1"
webpack "^5.73.0" webpack "^5.73.0"
"@docusaurus/module-type-aliases@2.4.1": "@docusaurus/module-type-aliases@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz#38b3c2d2ae44bea6d57506eccd84280216f0171c" resolved "https://registry.yarnpkg.com/@docusaurus/module-type-aliases/-/module-type-aliases-2.2.0.tgz#1e23e54a1bbb6fde1961e4fa395b1b69f4803ba5"
integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== integrity sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ==
dependencies: dependencies:
"@docusaurus/react-loadable" "5.5.2" "@docusaurus/react-loadable" "5.5.2"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@types/history" "^4.7.11" "@types/history" "^4.7.11"
"@types/react" "*" "@types/react" "*"
"@types/react-router-config" "*" "@types/react-router-config" "*"
@ -1485,18 +1485,18 @@
react-helmet-async "*" react-helmet-async "*"
react-loadable "npm:@docusaurus/react-loadable@5.5.2" react-loadable "npm:@docusaurus/react-loadable@5.5.2"
"@docusaurus/plugin-content-blog@2.4.1": "@docusaurus/plugin-content-blog@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz#c705a8b1a36a34f181dcf43b7770532e4dcdc4a3" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.2.0.tgz#dc55982e76771f4e678ac10e26d10e1da2011dc1"
integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== integrity sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-common" "2.4.1" "@docusaurus/utils-common" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
cheerio "^1.0.0-rc.12" cheerio "^1.0.0-rc.12"
feed "^4.2.2" feed "^4.2.2"
fs-extra "^10.1.0" fs-extra "^10.1.0"
@ -1507,18 +1507,18 @@
utility-types "^3.10.0" utility-types "^3.10.0"
webpack "^5.73.0" webpack "^5.73.0"
"@docusaurus/plugin-content-docs@2.4.1": "@docusaurus/plugin-content-docs@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz#ed94d9721b5ce7a956fb01cc06c40d8eee8dfca7" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.2.0.tgz#0fcb85226fcdb80dc1e2d4a36ef442a650dcc84d"
integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== integrity sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/module-type-aliases" "2.4.1" "@docusaurus/module-type-aliases" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
"@types/react-router-config" "^5.0.6" "@types/react-router-config" "^5.0.6"
combine-promises "^1.1.0" combine-promises "^1.1.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
@ -1529,95 +1529,84 @@
utility-types "^3.10.0" utility-types "^3.10.0"
webpack "^5.73.0" webpack "^5.73.0"
"@docusaurus/plugin-content-pages@2.4.1": "@docusaurus/plugin-content-pages@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz#c534f7e49967699a45bbe67050d1605ebbf3d285" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.2.0.tgz#e3f40408787bbe229545dd50595f87e1393bc3ae"
integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== integrity sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
tslib "^2.4.0" tslib "^2.4.0"
webpack "^5.73.0" webpack "^5.73.0"
"@docusaurus/plugin-debug@2.4.1": "@docusaurus/plugin-debug@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz#461a2c77b0c5a91b2c05257c8f9585412aaa59dc" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-debug/-/plugin-debug-2.2.0.tgz#b38741d2c492f405fee01ee0ef2e0029cedb689a"
integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== integrity sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
react-json-view "^1.21.3" react-json-view "^1.21.3"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/plugin-google-analytics@2.4.1": "@docusaurus/plugin-google-analytics@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz#30de1c35773bf9d52bb2d79b201b23eb98022613" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.2.0.tgz#63c7137eff5a1208d2059fea04b5207c037d7954"
integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== integrity sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/plugin-google-gtag@2.4.1": "@docusaurus/plugin-google-gtag@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz#6a3eb91022714735e625c7ca70ef5188fa7bd0dc" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.2.0.tgz#7b086d169ac5fe9a88aca10ab0fd2bf00c6c6b12"
integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== integrity sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/plugin-google-tag-manager@2.4.1": "@docusaurus/plugin-sitemap@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz#b99f71aec00b112bbf509ef2416e404a95eb607e" resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.2.0.tgz#876da60937886032d63143253d420db6a4b34773"
integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== integrity sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/types" "2.2.0"
tslib "^2.4.0" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-common" "2.2.0"
"@docusaurus/plugin-sitemap@2.4.1": "@docusaurus/utils-validation" "2.2.0"
version "2.4.1"
resolved "https://registry.yarnpkg.com/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz#8a7a76ed69dc3e6b4474b6abb10bb03336a9de6d"
integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg==
dependencies:
"@docusaurus/core" "2.4.1"
"@docusaurus/logger" "2.4.1"
"@docusaurus/types" "2.4.1"
"@docusaurus/utils" "2.4.1"
"@docusaurus/utils-common" "2.4.1"
"@docusaurus/utils-validation" "2.4.1"
fs-extra "^10.1.0" fs-extra "^10.1.0"
sitemap "^7.1.1" sitemap "^7.1.1"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/preset-classic@^2.4.1": "@docusaurus/preset-classic@^2.0.0-beta.4":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz#072f22d0332588e9c5f512d4bded8d7c99f91497" resolved "https://registry.yarnpkg.com/@docusaurus/preset-classic/-/preset-classic-2.2.0.tgz#bece5a043eeb74430f7c6c7510000b9c43669eb7"
integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== integrity sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/plugin-content-blog" "2.4.1" "@docusaurus/plugin-content-blog" "2.2.0"
"@docusaurus/plugin-content-docs" "2.4.1" "@docusaurus/plugin-content-docs" "2.2.0"
"@docusaurus/plugin-content-pages" "2.4.1" "@docusaurus/plugin-content-pages" "2.2.0"
"@docusaurus/plugin-debug" "2.4.1" "@docusaurus/plugin-debug" "2.2.0"
"@docusaurus/plugin-google-analytics" "2.4.1" "@docusaurus/plugin-google-analytics" "2.2.0"
"@docusaurus/plugin-google-gtag" "2.4.1" "@docusaurus/plugin-google-gtag" "2.2.0"
"@docusaurus/plugin-google-tag-manager" "2.4.1" "@docusaurus/plugin-sitemap" "2.2.0"
"@docusaurus/plugin-sitemap" "2.4.1" "@docusaurus/theme-classic" "2.2.0"
"@docusaurus/theme-classic" "2.4.1" "@docusaurus/theme-common" "2.2.0"
"@docusaurus/theme-common" "2.4.1" "@docusaurus/theme-search-algolia" "2.2.0"
"@docusaurus/theme-search-algolia" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/types" "2.4.1"
"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": "@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2":
version "5.5.2" version "5.5.2"
@ -1627,27 +1616,27 @@
"@types/react" "*" "@types/react" "*"
prop-types "^15.6.2" prop-types "^15.6.2"
"@docusaurus/theme-classic@2.4.1": "@docusaurus/theme-classic@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz#0060cb263c1a73a33ac33f79bb6bc2a12a56ad9e" resolved "https://registry.yarnpkg.com/@docusaurus/theme-classic/-/theme-classic-2.2.0.tgz#a048bb1bc077dee74b28bec25f4b84b481863742"
integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== integrity sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==
dependencies: dependencies:
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/module-type-aliases" "2.4.1" "@docusaurus/module-type-aliases" "2.2.0"
"@docusaurus/plugin-content-blog" "2.4.1" "@docusaurus/plugin-content-blog" "2.2.0"
"@docusaurus/plugin-content-docs" "2.4.1" "@docusaurus/plugin-content-docs" "2.2.0"
"@docusaurus/plugin-content-pages" "2.4.1" "@docusaurus/plugin-content-pages" "2.2.0"
"@docusaurus/theme-common" "2.4.1" "@docusaurus/theme-common" "2.2.0"
"@docusaurus/theme-translations" "2.4.1" "@docusaurus/theme-translations" "2.2.0"
"@docusaurus/types" "2.4.1" "@docusaurus/types" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-common" "2.4.1" "@docusaurus/utils-common" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
"@mdx-js/react" "^1.6.22" "@mdx-js/react" "^1.6.22"
clsx "^1.2.1" clsx "^1.2.1"
copy-text-to-clipboard "^3.0.1" copy-text-to-clipboard "^3.0.1"
infima "0.2.0-alpha.43" infima "0.2.0-alpha.42"
lodash "^4.17.21" lodash "^4.17.21"
nprogress "^0.2.0" nprogress "^0.2.0"
postcss "^8.4.14" postcss "^8.4.14"
@ -1658,18 +1647,17 @@
tslib "^2.4.0" tslib "^2.4.0"
utility-types "^3.10.0" utility-types "^3.10.0"
"@docusaurus/theme-common@2.4.1": "@docusaurus/theme-common@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.4.1.tgz#03e16f7aa96455e952f3243ac99757b01a3c83d4" resolved "https://registry.yarnpkg.com/@docusaurus/theme-common/-/theme-common-2.2.0.tgz#2303498d80448aafdd588b597ce9d6f4cfa930e4"
integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== integrity sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==
dependencies: dependencies:
"@docusaurus/mdx-loader" "2.4.1" "@docusaurus/mdx-loader" "2.2.0"
"@docusaurus/module-type-aliases" "2.4.1" "@docusaurus/module-type-aliases" "2.2.0"
"@docusaurus/plugin-content-blog" "2.4.1" "@docusaurus/plugin-content-blog" "2.2.0"
"@docusaurus/plugin-content-docs" "2.4.1" "@docusaurus/plugin-content-docs" "2.2.0"
"@docusaurus/plugin-content-pages" "2.4.1" "@docusaurus/plugin-content-pages" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-common" "2.4.1"
"@types/history" "^4.7.11" "@types/history" "^4.7.11"
"@types/react" "*" "@types/react" "*"
"@types/react-router-config" "*" "@types/react-router-config" "*"
@ -1677,43 +1665,42 @@
parse-numeric-range "^1.3.0" parse-numeric-range "^1.3.0"
prism-react-renderer "^1.3.5" prism-react-renderer "^1.3.5"
tslib "^2.4.0" tslib "^2.4.0"
use-sync-external-store "^1.2.0"
utility-types "^3.10.0" utility-types "^3.10.0"
"@docusaurus/theme-search-algolia@2.4.1": "@docusaurus/theme-search-algolia@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz#906bd2cca3fced0241985ef502c892f58ff380fc" resolved "https://registry.yarnpkg.com/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.2.0.tgz#77fd9f7a600917e6024fe3ac7fb6cfdf2ce84737"
integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== integrity sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==
dependencies: dependencies:
"@docsearch/react" "^3.1.1" "@docsearch/react" "^3.1.1"
"@docusaurus/core" "2.4.1" "@docusaurus/core" "2.2.0"
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/plugin-content-docs" "2.4.1" "@docusaurus/plugin-content-docs" "2.2.0"
"@docusaurus/theme-common" "2.4.1" "@docusaurus/theme-common" "2.2.0"
"@docusaurus/theme-translations" "2.4.1" "@docusaurus/theme-translations" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
"@docusaurus/utils-validation" "2.4.1" "@docusaurus/utils-validation" "2.2.0"
algoliasearch "^4.13.1" algoliasearch "^4.13.1"
algoliasearch-helper "^3.10.0" algoliasearch-helper "^3.10.0"
clsx "^1.2.1" clsx "^1.2.1"
eta "^2.0.0" eta "^1.12.3"
fs-extra "^10.1.0" fs-extra "^10.1.0"
lodash "^4.17.21" lodash "^4.17.21"
tslib "^2.4.0" tslib "^2.4.0"
utility-types "^3.10.0" utility-types "^3.10.0"
"@docusaurus/theme-translations@2.4.1": "@docusaurus/theme-translations@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz#4d49df5865dae9ef4b98a19284ede62ae6f98726" resolved "https://registry.yarnpkg.com/@docusaurus/theme-translations/-/theme-translations-2.2.0.tgz#5fbd4693679806f80c26eeae1381e1f2c23d83e7"
integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== integrity sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w==
dependencies: dependencies:
fs-extra "^10.1.0" fs-extra "^10.1.0"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/types@2.4.1": "@docusaurus/types@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.4.1.tgz#d8e82f9e0f704984f98df1f93d6b4554d5458705" resolved "https://registry.yarnpkg.com/@docusaurus/types/-/types-2.2.0.tgz#02c577a4041ab7d058a3c214ccb13647e21a9857"
integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== integrity sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw==
dependencies: dependencies:
"@types/history" "^4.7.11" "@types/history" "^4.7.11"
"@types/react" "*" "@types/react" "*"
@ -1724,32 +1711,31 @@
webpack "^5.73.0" webpack "^5.73.0"
webpack-merge "^5.8.0" webpack-merge "^5.8.0"
"@docusaurus/utils-common@2.4.1": "@docusaurus/utils-common@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.4.1.tgz#7f72e873e49bd5179588869cc3ab7449a56aae63" resolved "https://registry.yarnpkg.com/@docusaurus/utils-common/-/utils-common-2.2.0.tgz#a401c1b93a8697dd566baf6ac64f0fdff1641a78"
integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== integrity sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==
dependencies: dependencies:
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/utils-validation@2.4.1": "@docusaurus/utils-validation@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz#19959856d4a886af0c5cfb357f4ef68b51151244" resolved "https://registry.yarnpkg.com/@docusaurus/utils-validation/-/utils-validation-2.2.0.tgz#04d4d103137ad0145883971d3aa497f4a1315f25"
integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== integrity sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==
dependencies: dependencies:
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@docusaurus/utils" "2.4.1" "@docusaurus/utils" "2.2.0"
joi "^17.6.0" joi "^17.6.0"
js-yaml "^4.1.0" js-yaml "^4.1.0"
tslib "^2.4.0" tslib "^2.4.0"
"@docusaurus/utils@2.4.1": "@docusaurus/utils@2.2.0":
version "2.4.1" version "2.2.0"
resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.4.1.tgz#9c5f76eae37b71f3819c1c1f0e26e6807c99a4fc" resolved "https://registry.yarnpkg.com/@docusaurus/utils/-/utils-2.2.0.tgz#3d6f9b7a69168d5c92d371bf21c556a4f50d1da6"
integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== integrity sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==
dependencies: dependencies:
"@docusaurus/logger" "2.4.1" "@docusaurus/logger" "2.2.0"
"@svgr/webpack" "^6.2.1" "@svgr/webpack" "^6.2.1"
escape-string-regexp "^4.0.0"
file-loader "^6.2.0" file-loader "^6.2.0"
fs-extra "^10.1.0" fs-extra "^10.1.0"
github-slugger "^1.4.0" github-slugger "^1.4.0"
@ -3843,10 +3829,10 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
eta@^2.0.0: eta@^1.12.3:
version "2.2.0" version "1.12.3"
resolved "https://registry.yarnpkg.com/eta/-/eta-2.2.0.tgz#eb8b5f8c4e8b6306561a455e62cd7492fe3a9b8a" resolved "https://registry.yarnpkg.com/eta/-/eta-1.12.3.tgz#2982d08adfbef39f9fa50e2fbd42d7337e7338b1"
integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== integrity sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==
etag@~1.8.1: etag@~1.8.1:
version "1.8.1" version "1.8.1"
@ -4714,10 +4700,10 @@ indent-string@^4.0.0:
resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==
infima@0.2.0-alpha.43: infima@0.2.0-alpha.42:
version "0.2.0-alpha.43" version "0.2.0-alpha.42"
resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" resolved "https://registry.yarnpkg.com/infima/-/infima-0.2.0-alpha.42.tgz#f6e86a655ad40877c6b4d11b2ede681eb5470aa5"
integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== integrity sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==
inflight@^1.0.4: inflight@^1.0.4:
version "1.0.6" version "1.0.6"
@ -6117,10 +6103,10 @@ prettier-plugin-import-sort@^0.0.7:
import-sort-parser-babylon "^6.0.0" import-sort-parser-babylon "^6.0.0"
import-sort-parser-typescript "^6.0.0" import-sort-parser-typescript "^6.0.0"
prettier@^2.8.8: prettier@^2.3.2:
version "2.8.8" version "2.7.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==
pretty-error@^4.0.0: pretty-error@^4.0.0:
version "4.0.0" version "4.0.0"
@ -7556,11 +7542,6 @@ use-latest@^1.2.1:
dependencies: dependencies:
use-isomorphic-layout-effect "^1.1.1" use-isomorphic-layout-effect "^1.1.1"
use-sync-external-store@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a"
integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"

View File

@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk.Web"> <Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net7.0</TargetFramework>
<UserSecretsId>da29eac4-4c22-4a7f-b393-379e83b60998</UserSecretsId> <UserSecretsId>da29eac4-4c22-4a7f-b393-379e83b60998</UserSecretsId>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="AspNet.Security.OAuth.Spotify" Version="7.0.2" /> <PackageReference Include="AspNet.Security.OAuth.Spotify" Version="7.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\SpotifyAPI.Web\SpotifyAPI.Web.csproj" /> <ProjectReference Include="..\..\SpotifyAPI.Web\SpotifyAPI.Web.csproj" />

View File

@ -10,7 +10,7 @@ namespace Example.ASP.Pages
private const int LIMIT = 10; private const int LIMIT = 10;
private readonly SpotifyClientBuilder _spotifyClientBuilder; private readonly SpotifyClientBuilder _spotifyClientBuilder;
public Paging<FullPlaylist> Playlists { get; set; } public Paging<SimplePlaylist> Playlists { get; set; }
public string Next { get; set; } public string Next { get; set; }
public string Previous { get; set; } public string Previous { get; set; }

View File

@ -5,9 +5,9 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.5" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="7.0.4" />
<PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.5" PrivateAssets="all" /> <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="7.0.3" PrivateAssets="all" />
<PackageReference Include="System.Net.Http.Json" Version="7.0.1" /> <PackageReference Include="System.Net.Http.Json" Version="7.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -24,8 +24,8 @@ namespace Example.CLI.CustomHTML
} }
_server = new EmbedIOAuthServer( _server = new EmbedIOAuthServer(
new Uri("http://localhost:5543/callback"), new Uri("http://localhost:5000/callback"),
5543, 5000,
Assembly.GetExecutingAssembly(), Assembly.GetExecutingAssembly(),
"Example.CLI.CustomHTML.Resources.custom_site" "Example.CLI.CustomHTML.Resources.custom_site"
); );
@ -38,7 +38,7 @@ namespace Example.CLI.CustomHTML
Scope = new List<string> { UserReadEmail } Scope = new List<string> { UserReadEmail }
}; };
var uri = request.ToUri(); Uri uri = request.ToUri();
try try
{ {
BrowserUtil.Open(uri); BrowserUtil.Open(uri);
@ -48,14 +48,14 @@ namespace Example.CLI.CustomHTML
Console.WriteLine("Unable to open URL, manually open: {0}", uri); Console.WriteLine("Unable to open URL, manually open: {0}", uri);
} }
_ = Console.ReadKey(); Console.ReadKey();
} }
private static async Task OnAuthorizationCodeReceived(object sender, AuthorizationCodeResponse response) private static async Task OnAuthorizationCodeReceived(object sender, AuthorizationCodeResponse response)
{ {
await _server.Stop(); await _server.Stop();
var token = await new OAuthClient().RequestToken( AuthorizationCodeTokenResponse token = await new OAuthClient().RequestToken(
new AuthorizationCodeTokenRequest(clientId, clientSecret, response.Code, _server.BaseUri) new AuthorizationCodeTokenRequest(clientId, clientSecret, response.Code, _server.BaseUri)
); );

View File

@ -5,25 +5,22 @@ using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using SpotifyAPI.Web; using SpotifyAPI.Web;
using SpotifyAPI.Web.Auth; using SpotifyAPI.Web.Auth;
using Swan.Logging;
using static SpotifyAPI.Web.Scopes; using static SpotifyAPI.Web.Scopes;
namespace Example.CLI.PersistentConfig namespace Example.CLI.PersistentConfig
{ {
/// <summary> /// <summary>
/// This is a basic example how to get user access using the Auth package and a CLI Program /// This is a basic example how to get user access using the Auth package and a CLI Program
/// Your spotify app needs to have http://localhost:5543 as redirect uri whitelisted /// Your spotify app needs to have http://localhost:5000 as redirect uri whitelisted
/// </summary> /// </summary>
public class Program public class Program
{ {
private const string CredentialsPath = "credentials.json"; private const string CredentialsPath = "credentials.json";
private static readonly string? clientId = Environment.GetEnvironmentVariable("SPOTIFY_CLIENT_ID"); private static readonly string? clientId = Environment.GetEnvironmentVariable("SPOTIFY_CLIENT_ID");
private static readonly EmbedIOAuthServer _server = new(new Uri("http://localhost:5543/callback"), 5543); private static readonly EmbedIOAuthServer _server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000);
private static void Exiting()
{
Console.CursorVisible = true;
}
private static void Exiting() => Console.CursorVisible = true;
public static async Task<int> Main() public static async Task<int> Main()
{ {
// This is a bug in the SWAN Logging library, need this hack to bring back the cursor // This is a bug in the SWAN Logging library, need this hack to bring back the cursor
@ -45,7 +42,7 @@ namespace Example.CLI.PersistentConfig
await StartAuthentication(); await StartAuthentication();
} }
_ = Console.ReadKey(); Console.ReadKey();
return 0; return 0;
} }
@ -80,7 +77,7 @@ namespace Example.CLI.PersistentConfig
_server.AuthorizationCodeReceived += async (sender, response) => _server.AuthorizationCodeReceived += async (sender, response) =>
{ {
await _server.Stop(); await _server.Stop();
var token = await new OAuthClient().RequestToken( PKCETokenResponse token = await new OAuthClient().RequestToken(
new PKCETokenRequest(clientId!, response.Code, _server.BaseUri, verifier) new PKCETokenRequest(clientId!, response.Code, _server.BaseUri, verifier)
); );
@ -95,7 +92,7 @@ namespace Example.CLI.PersistentConfig
Scope = new List<string> { UserReadEmail, UserReadPrivate, PlaylistReadPrivate, PlaylistReadCollaborative } Scope = new List<string> { UserReadEmail, UserReadPrivate, PlaylistReadPrivate, PlaylistReadCollaborative }
}; };
var uri = request.ToUri(); Uri uri = request.ToUri();
try try
{ {
BrowserUtil.Open(uri); BrowserUtil.Open(uri);

View File

@ -13,7 +13,7 @@ namespace Client
public static async Task Main() public static async Task Main()
{ {
_server = new EmbedIOAuthServer(new Uri("http://localhost:5543/callback"), 5543); _server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000);
await _server.Start(); await _server.Start();
_server.AuthorizationCodeReceived += OnAuthorizationCodeReceived; _server.AuthorizationCodeReceived += OnAuthorizationCodeReceived;
@ -23,7 +23,7 @@ namespace Client
Scope = new List<string> { Scopes.UserReadEmail } Scope = new List<string> { Scopes.UserReadEmail }
}; };
var uri = request.ToUri(); Uri uri = request.ToUri();
try try
{ {
BrowserUtil.Open(uri); BrowserUtil.Open(uri);
@ -33,20 +33,20 @@ namespace Client
Console.WriteLine("Unable to open URL, manually open: {0}", uri); Console.WriteLine("Unable to open URL, manually open: {0}", uri);
} }
_ = Console.ReadKey(); Console.ReadKey();
} }
private static async Task OnAuthorizationCodeReceived(object sender, AuthorizationCodeResponse response) private static async Task OnAuthorizationCodeReceived(object sender, AuthorizationCodeResponse response)
{ {
var oauth = new OAuthClient(); var oauth = new OAuthClient();
var tokenRequest = new TokenSwapTokenRequest(new Uri("http://localhost:5543/swap"), response.Code); var tokenRequest = new TokenSwapTokenRequest(new Uri("http://localhost:5001/swap"), response.Code);
var tokenResponse = await oauth.RequestToken(tokenRequest); var tokenResponse = await oauth.RequestToken(tokenRequest);
Console.WriteLine($"We got an access token from server: {tokenResponse.AccessToken}"); Console.WriteLine($"We got an access token from server: {tokenResponse.AccessToken}");
var refreshRequest = new TokenSwapRefreshRequest( var refreshRequest = new TokenSwapRefreshRequest(
new Uri("http://localhost:5543/refresh"), new Uri("http://localhost:5001/refresh"),
tokenResponse.RefreshToken tokenResponse.RefreshToken
); );
var refreshResponse = await oauth.RequestToken(refreshRequest); var refreshResponse = await oauth.RequestToken(refreshRequest);

View File

@ -1,52 +1,44 @@
const express = require("express"); const express = require('express');
const bodyParser = require("body-parser"); const bodyParser = require('body-parser');
const axios = require("axios"); const axios = require('axios');
const { default: Axios } = require("axios"); const { default: Axios } = require('axios');
const PORT = process.env.PORT || "5543"; const PORT = process.env.PORT || '5001';
const SPOTIFY_CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET; const SPOTIFY_CLIENT_SECRET = process.env.SPOTIFY_CLIENT_SECRET;
const SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID; const SPOTIFY_CLIENT_ID = process.env.SPOTIFY_CLIENT_ID;
if (!SPOTIFY_CLIENT_SECRET || !SPOTIFY_CLIENT_ID) { if (!SPOTIFY_CLIENT_SECRET || !SPOTIFY_CLIENT_ID) {
console.log( console.log("SPOTIFY_CLIENT_SECRET or SPOTIFY_CLIENT_ID environment variable is not set!");
"SPOTIFY_CLIENT_SECRET or SPOTIFY_CLIENT_ID environment variable is not set!"
);
process.exit(1); process.exit(1);
} }
const app = express(); const app = express();
app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.urlencoded({ extended: true }));
app.post("/swap", async (req, res) => { app.post('/swap', async (req, res) => {
const { code } = req.body; const { code } = req.body;
const params = new URLSearchParams(); const params = new URLSearchParams();
params.append("grant_type", "authorization_code"); params.append('grant_type', 'authorization_code');
params.append("code", code); params.append('code', code);
params.append("redirect_uri", "http://localhost:5543/callback"); params.append('redirect_uri', 'http://localhost:5000/callback');
params.append("client_secret", SPOTIFY_CLIENT_SECRET); params.append('client_secret', SPOTIFY_CLIENT_SECRET);
params.append("client_id", SPOTIFY_CLIENT_ID); params.append('client_id', SPOTIFY_CLIENT_ID);
const { data } = await Axios.post( const { data } = await Axios.post('https://accounts.spotify.com/api/token', params);
"https://accounts.spotify.com/api/token",
params
);
return res.send(data); return res.send(data);
}); });
app.post("/refresh", async (req, res) => { app.post('/refresh', async (req, res) => {
const { refresh_token } = req.body; const { refresh_token } = req.body;
const params = new URLSearchParams(); const params = new URLSearchParams();
params.append("grant_type", "refresh_token"); params.append('grant_type', 'refresh_token');
params.append("refresh_token", refresh_token); params.append('refresh_token', refresh_token);
params.append("client_secret", SPOTIFY_CLIENT_SECRET); params.append('client_secret', SPOTIFY_CLIENT_SECRET);
params.append("client_id", SPOTIFY_CLIENT_ID); params.append('client_id', SPOTIFY_CLIENT_ID);
const { data } = await Axios.post( const { data } = await Axios.post('https://accounts.spotify.com/api/token', params);
"https://accounts.spotify.com/api/token",
params
);
return res.send(data); return res.send(data);
}); });

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup> <PropertyGroup>
@ -157,7 +157,7 @@
<Version>6.2.14</Version> <Version>6.2.14</Version>
</PackageReference> </PackageReference>
<PackageReference Include="MvvmCross"> <PackageReference Include="MvvmCross">
<Version>9.0.10</Version> <Version>9.0.9</Version>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -15,10 +15,10 @@ namespace Example.UWP.ViewModels
{ {
private SpotifyClient _spotify; private SpotifyClient _spotify;
private IList<FullPlaylist> _playlists; private IList<SimplePlaylist> _playlists;
public IList<FullPlaylist> Playlists public IList<SimplePlaylist> Playlists
{ {
get => _playlists ?? (_playlists = new List<FullPlaylist>()); get => _playlists ?? (_playlists = new List<SimplePlaylist>());
set => SetProperty(ref _playlists, value); set => SetProperty(ref _playlists, value);
} }

View File

@ -1,16 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>net7.0;net6.0;net5.0</TargetFrameworks> <TargetFrameworks>net7.0;net6.0;net5.0;netcoreapp3.1</TargetFrameworks>
<LangVersion>9.0</LangVersion> <LangVersion>9.0</LangVersion>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
<PackageReference Include="Moq" Version="4.18.4" /> <PackageReference Include="Moq" Version="4.18.4" />
<PackageReference Include="NUnit" Version="3.13.3" /> <PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NUnit3TestAdapter" Version="4.4.2" /> <PackageReference Include="NUnit3TestAdapter" Version="4.3.1" />
<PackageReference Include="NUnit.Console" Version="3.16.3" /> <PackageReference Include="NUnit.Console" Version="3.16.3" />
</ItemGroup> </ItemGroup>

View File

@ -100,7 +100,7 @@ namespace SpotifyAPI.Web
/// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists
/// </remarks> /// </remarks>
/// <returns></returns> /// <returns></returns>
Task<Paging<FullPlaylist>> GetUsers(string userId, CancellationToken cancel = default); Task<Paging<SimplePlaylist>> GetUsers(string userId, CancellationToken cancel = default);
/// <summary> /// <summary>
/// Get a list of the playlists owned or followed by a Spotify user. /// Get a list of the playlists owned or followed by a Spotify user.
@ -112,7 +112,7 @@ namespace SpotifyAPI.Web
/// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists
/// </remarks> /// </remarks>
/// <returns></returns> /// <returns></returns>
Task<Paging<FullPlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request, CancellationToken cancel = default); Task<Paging<SimplePlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request, CancellationToken cancel = default);
/// <summary> /// <summary>
/// Get a playlist owned by a Spotify user. /// Get a playlist owned by a Spotify user.
@ -160,7 +160,7 @@ namespace SpotifyAPI.Web
/// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists
/// </remarks> /// </remarks>
/// <returns></returns> /// <returns></returns>
Task<Paging<FullPlaylist>> CurrentUsers(CancellationToken cancel = default); Task<Paging<SimplePlaylist>> CurrentUsers(CancellationToken cancel = default);
/// <summary> /// <summary>
/// Get a list of the playlists owned or followed by the current Spotify user. /// Get a list of the playlists owned or followed by the current Spotify user.
@ -171,7 +171,7 @@ namespace SpotifyAPI.Web
/// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists
/// </remarks> /// </remarks>
/// <returns></returns> /// <returns></returns>
Task<Paging<FullPlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request, CancellationToken cancel = default); Task<Paging<SimplePlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request, CancellationToken cancel = default);
/// <summary> /// <summary>
/// Change a playlists name and public/private state. (The user must, of course, own the playlist.) /// Change a playlists name and public/private state. (The user must, of course, own the playlist.)

View File

@ -66,19 +66,19 @@ namespace SpotifyAPI.Web
return API.Get<List<Image>>(URLs.PlaylistImages(playlistId), cancel); return API.Get<List<Image>>(URLs.PlaylistImages(playlistId), cancel);
} }
public Task<Paging<FullPlaylist>> GetUsers(string userId, CancellationToken cancel = default) public Task<Paging<SimplePlaylist>> GetUsers(string userId, CancellationToken cancel = default)
{ {
Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId));
return API.Get<Paging<FullPlaylist>>(URLs.UserPlaylists(userId), cancel); return API.Get<Paging<SimplePlaylist>>(URLs.UserPlaylists(userId), cancel);
} }
public Task<Paging<FullPlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request, CancellationToken cancel = default) public Task<Paging<SimplePlaylist>> GetUsers(string userId, PlaylistGetUsersRequest request, CancellationToken cancel = default)
{ {
Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId));
Ensure.ArgumentNotNull(request, nameof(request)); Ensure.ArgumentNotNull(request, nameof(request));
return API.Get<Paging<FullPlaylist>>(URLs.UserPlaylists(userId), request.BuildQueryParams(), cancel); return API.Get<Paging<SimplePlaylist>>(URLs.UserPlaylists(userId), request.BuildQueryParams(), cancel);
} }
public Task<FullPlaylist> Get(string playlistId, CancellationToken cancel = default) public Task<FullPlaylist> Get(string playlistId, CancellationToken cancel = default)
@ -105,16 +105,16 @@ namespace SpotifyAPI.Web
return statusCode == HttpStatusCode.Created; return statusCode == HttpStatusCode.Created;
} }
public Task<Paging<FullPlaylist>> CurrentUsers(CancellationToken cancel = default) public Task<Paging<SimplePlaylist>> CurrentUsers(CancellationToken cancel = default)
{ {
return API.Get<Paging<FullPlaylist>>(URLs.CurrentUserPlaylists(), cancel); return API.Get<Paging<SimplePlaylist>>(URLs.CurrentUserPlaylists(), cancel);
} }
public Task<Paging<FullPlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request, CancellationToken cancel = default) public Task<Paging<SimplePlaylist>> CurrentUsers(PlaylistCurrentUsersRequest request, CancellationToken cancel = default)
{ {
Ensure.ArgumentNotNull(request, nameof(request)); Ensure.ArgumentNotNull(request, nameof(request));
return API.Get<Paging<FullPlaylist>>(URLs.CurrentUserPlaylists(), request.BuildQueryParams(), cancel); return API.Get<Paging<SimplePlaylist>>(URLs.CurrentUserPlaylists(), request.BuildQueryParams(), cancel);
} }
public async Task<bool> ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request, CancellationToken cancel = default) public async Task<bool> ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request, CancellationToken cancel = default)

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{ {
public class CategoryPlaylistsResponse public class CategoryPlaylistsResponse
{ {
public Paging<FullPlaylist, CategoryPlaylistsResponse> Playlists { get; set; } = default!; public Paging<SimplePlaylist, CategoryPlaylistsResponse> Playlists { get; set; } = default!;
} }
} }

View File

@ -3,7 +3,7 @@ namespace SpotifyAPI.Web
public class FeaturedPlaylistsResponse public class FeaturedPlaylistsResponse
{ {
public string Message { get; set; } = default!; public string Message { get; set; } = default!;
public Paging<FullPlaylist, FeaturedPlaylistsResponse> Playlists { get; set; } = default!; public Paging<SimplePlaylist, FeaturedPlaylistsResponse> Playlists { get; set; } = default!;
} }
} }

View File

@ -7,7 +7,7 @@ namespace SpotifyAPI.Web
public Paging<FullTrack, SearchResponse> Tracks { get; set; } = default!; public Paging<FullTrack, SearchResponse> Tracks { get; set; } = default!;
public Paging<SimpleShow, SearchResponse> Shows { get; set; } = default!; public Paging<SimpleShow, SearchResponse> Shows { get; set; } = default!;
public Paging<SimpleEpisode, SearchResponse> Episodes { get; set; } = default!; public Paging<SimpleEpisode, SearchResponse> Episodes { get; set; } = default!;
public Paging<FullPlaylist, SearchResponse> Playlists { get; set; } = default!; public Paging<SimplePlaylist, SearchResponse> Playlists { get; set; } = default!;
} }
} }

View File

@ -0,0 +1,29 @@
using System.Collections.Generic;
namespace SpotifyAPI.Web
{
/// <summary>
/// <a href="https://developer.spotify.com/documentation/web-api/reference/object-model/#playlist-object-simplified">Docs</a>
/// </summary>
public class SimplePlaylist
{
public bool Collaborative { get; set; }
public string Description { get; set; } = default!;
public Dictionary<string, string> ExternalUrls { get; set; } = default!;
public string Href { get; set; } = default!;
public string Id { get; set; } = default!;
public List<Image> Images { get; set; } = default!;
public string Name { get; set; } = default!;
public PublicUser Owner { get; set; } = default!;
public bool? Public { get; set; }
public string SnapshotId { get; set; } = default!;
/// <summary>
/// A list of PlaylistTracks, which items can be a FullTrack or FullEpisode
/// </summary>
/// <value></value>
public Paging<PlaylistTrack<IPlayableItem>> Tracks { get; set; } = default!;
public string Type { get; set; } = default!;
public string Uri { get; set; } = default!;
}
}