Made responses have public setters - needed for testing - removed old projects

This commit is contained in:
Jonas Dellinger 2020-05-08 10:25:33 +02:00
parent a82f95f0d0
commit bf4c817e70
106 changed files with 345 additions and 40073 deletions

View File

@ -13,11 +13,11 @@ indent_size = 2
indent_size = 2
[*.{cs,vb}]
# Does not seem to work...
dotnet_diagnostic.CA1303.severity = none
dotnet_diagnostic.CA1056.severity = none
dotnet_diagnostic.CA1034.severity = none
dotnet_diagnostic.CA1054.severity = none
dotnet_diagnostic.CA2227.severity = none
# Sort using and Import directives with System.* appearing first
dotnet_sort_system_directives_first = true
dotnet_style_require_accessibility_modifiers = always:warning

View File

@ -1,33 +0,0 @@
using System.Diagnostics;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SpotifyAPI.Web.Examples.ASP.Models;
namespace SpotifyAPI.Web.Examples.ASP.Controllers
{
[Authorize(AuthenticationSchemes = "Spotify")]
public class HomeController : Controller
{
public IActionResult Index()
{
// var accessToken = await HttpContext.GetTokenAsync("Spotify", "access_token");
// SpotifyWebAPI api = new SpotifyWebAPI
// {
// AccessToken = accessToken,
// TokenType = "Bearer"
// };
// var savedTracks = await api.GetSavedTracksAsync(50);
return View(new IndexModel { SavedTracks = null });
}
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}

View File

@ -1,11 +0,0 @@
using System;
namespace SpotifyAPI.Web.Examples.ASP.Models
{
public class ErrorViewModel
{
public string RequestId { get; set; }
public bool ShowRequestId => !string.IsNullOrEmpty(RequestId);
}
}

View File

@ -1,10 +0,0 @@
using System;
using SpotifyAPI.Web.Models;
namespace SpotifyAPI.Web.Examples.ASP.Models
{
public class IndexModel
{
public Paging<object> SavedTracks;
}
}

View File

@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace SpotifyAPI.Web.Examples.ASP
{
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}

View File

@ -1,27 +0,0 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:55802",
"sslPort": 44320
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"SpotifyAPI.Web.Examples.ASP": {
"commandName": "Project",
"launchBrowser": true,
"applicationUrl": "http://localhost:5000",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -1,16 +0,0 @@
# ASP.NET Core Spotify Example
This project provides an example ASP .NET Core Web Application, which utilizes `SpotifyAPI.Web` and `AspNet.Security.OAuth.Spotify` to authenticate the user from Spotify and retrieve his saved library tracks.
## Important files/lines
Most of the important configuration is inside of `Startup.cs`. It reads the `client_id` and `client_secret` from the configration store, so make sure you run the following commands in the project directory:
```
dotnet user-secrets set client_secret YOUR_CLIENT_SECRET
dotnet user-secrets set client_id YOUR_CLIENT_ID
```
Also, it specifies the callback URL (`/callback`). This has to be registered in your Spotify App Settings (`http://localhost:5000/callback`)
The actual request to Spotify and making sure that the user is authenticated happens in `Controllers/HomeController.cs`, which should be self explanatory.

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UserSecretsId>201e6943-a5b3-473c-b1da-a579b36ca283</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SpotifyAPI.Web\SpotifyAPI.Web.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNet.Security.OAuth.Spotify" Version="3.0.0" />
</ItemGroup>
</Project>

View File

@ -1,67 +0,0 @@
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace SpotifyAPI.Web.Examples.ASP
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
services.AddAuthentication(o => o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie()
.AddSpotify(options =>
{
// var scopes = Scope.UserLibraryRead | Scope.UserModifyPlaybackState;
// options.Scope.Add(scopes.GetStringAttribute(","));
options.SaveTokens = true;
options.ClientId = Configuration["client_id"];
options.ClientSecret = Configuration["client_secret"];
options.CallbackPath = "/callback";
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
// app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}

View File

@ -1,15 +0,0 @@
@model IndexModel
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
You have @Model.SavedTracks.Total saved tracks in your library! Here are 50 of them:
@* <ul>
@foreach (var item in Model.SavedTracks.Items)
{
<li>@item.Track.Name</li>
}
</ul> *@
</div>

View File

@ -1,25 +0,0 @@
@model ErrorViewModel
@{
ViewData["Title"] = "Error";
}
<h1 class="text-danger">Error.</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>
@if (Model.ShowRequestId)
{
<p>
<strong>Request ID:</strong> <code>@Model.RequestId</code>
</p>
}
<h3>Development Mode</h3>
<p>
Swapping to <strong>Development</strong> environment will display more detailed information about the error that occurred.
</p>
<p>
<strong>The Development environment shouldn't be enabled for deployed applications.</strong>
It can result in displaying sensitive information from exceptions to end users.
For local debugging, enable the <strong>Development</strong> environment by setting the <strong>ASPNETCORE_ENVIRONMENT</strong> environment variable to <strong>Development</strong>
and restarting the app.
</p>

View File

@ -1,38 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - SpotifyAPI.Web.Examples.ASP</title>
<link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
<link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
<header>
<nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
<div class="container">
<a class="navbar-brand" asp-area="" asp-controller="Home" asp-action="Index">SpotifyAPI.Web.Examples.ASP</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
</div>
</nav>
</header>
<div class="container">
<main role="main" class="pb-3">
@RenderBody()
</main>
</div>
<footer class="border-top footer text-muted">
<div class="container">
&copy; 2019 - SpotifyAPI.Web.Examples.ASP - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
</div>
</footer>
<script src="~/lib/jquery/dist/jquery.min.js"></script>
<script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
<script src="~/js/site.js" asp-append-version="true"></script>
@RenderSection("Scripts", required: false)
</body>
</html>

View File

@ -1,2 +0,0 @@
<script src="~/lib/jquery-validation/dist/jquery.validate.min.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.min.js"></script>

View File

@ -1,3 +0,0 @@
@using SpotifyAPI.Web.Examples.ASP
@using SpotifyAPI.Web.Examples.ASP.Models
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

View File

@ -1,3 +0,0 @@
@{
Layout = "_Layout";
}

View File

@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information"
}
}
}

View File

@ -1,10 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

View File

@ -1,71 +0,0 @@
/* Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
for details on configuring this project to bundle and minify static web assets. */
a.navbar-brand {
white-space: normal;
text-align: center;
word-break: break-all;
}
/* Provide sufficient contrast against white background */
a {
color: #0366d6;
}
.btn-primary {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
.nav-pills .nav-link.active, .nav-pills .show > .nav-link {
color: #fff;
background-color: #1b6ec2;
border-color: #1861ac;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
font-size: 14px;
}
@media (min-width: 768px) {
html {
font-size: 16px;
}
}
.border-top {
border-top: 1px solid #e5e5e5;
}
.border-bottom {
border-bottom: 1px solid #e5e5e5;
}
.box-shadow {
box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05);
}
button.accept-policy {
font-size: 1rem;
line-height: inherit;
}
/* Sticky footer styles
-------------------------------------------------- */
html {
position: relative;
min-height: 100%;
}
body {
/* Margin bottom by footer height */
margin-bottom: 60px;
}
.footer {
position: absolute;
bottom: 0;
width: 100%;
white-space: nowrap;
line-height: 60px; /* Vertically center the text there */
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

View File

@ -1,4 +0,0 @@
// Please see documentation at https://docs.microsoft.com/aspnet/core/client-side/bundling-and-minification
// for details on configuring this project to bundle and minify static web assets.
// Write your JavaScript code.

View File

@ -1,22 +0,0 @@
The MIT License (MIT)
Copyright (c) 2011-2018 Twitter, Inc.
Copyright (c) 2011-2018 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,331 +0,0 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
html {
font-family: sans-serif;
line-height: 1.15;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
article, aside, figcaption, figure, footer, header, hgroup, main, nav, section {
display: block;
}
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
text-align: left;
background-color: #fff;
}
[tabindex="-1"]:focus {
outline: 0 !important;
}
hr {
box-sizing: content-box;
height: 0;
overflow: visible;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 0;
margin-bottom: 0.5rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-original-title] {
text-decoration: underline;
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
border-bottom: 0;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: .5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 80%;
}
sub,
sup {
position: relative;
font-size: 75%;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -.25em;
}
sup {
top: -.5em;
}
a {
color: #007bff;
text-decoration: none;
background-color: transparent;
}
a:hover {
color: #0056b3;
text-decoration: underline;
}
a:not([href]):not([tabindex]) {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):hover, a:not([href]):not([tabindex]):focus {
color: inherit;
text-decoration: none;
}
a:not([href]):not([tabindex]):focus {
outline: 0;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
}
pre {
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
}
figure {
margin: 0 0 1rem;
}
img {
vertical-align: middle;
border-style: none;
}
svg {
overflow: hidden;
vertical-align: middle;
}
table {
border-collapse: collapse;
}
caption {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
color: #6c757d;
text-align: left;
caption-side: bottom;
}
th {
text-align: inherit;
}
label {
display: inline-block;
margin-bottom: 0.5rem;
}
button {
border-radius: 0;
}
button:focus {
outline: 1px dotted;
outline: 5px auto -webkit-focus-ring-color;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
input {
overflow: visible;
}
button,
select {
text-transform: none;
}
select {
word-wrap: normal;
}
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
button:not(:disabled),
[type="button"]:not(:disabled),
[type="reset"]:not(:disabled),
[type="submit"]:not(:disabled) {
cursor: pointer;
}
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
padding: 0;
border-style: none;
}
input[type="radio"],
input[type="checkbox"] {
box-sizing: border-box;
padding: 0;
}
input[type="date"],
input[type="time"],
input[type="datetime-local"],
input[type="month"] {
-webkit-appearance: listbox;
}
textarea {
overflow: auto;
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
display: block;
width: 100%;
max-width: 100%;
padding: 0;
margin-bottom: .5rem;
font-size: 1.5rem;
line-height: inherit;
color: inherit;
white-space: normal;
}
progress {
vertical-align: baseline;
}
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
[type="search"] {
outline-offset: -2px;
-webkit-appearance: none;
}
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
summary {
display: list-item;
cursor: pointer;
}
template {
display: none;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

File diff suppressed because one or more lines are too long

View File

@ -1,8 +0,0 @@
/*!
* Bootstrap Reboot v4.3.1 (https://getbootstrap.com/)
* Copyright 2011-2019 The Bootstrap Authors
* Copyright 2011-2019 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}html{font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;text-align:left;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg{overflow:hidden;vertical-align:middle}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#6c757d;text-align:left;caption-side:bottom}th{text-align:inherit}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item;cursor:pointer}template{display:none}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,12 +0,0 @@
Copyright (c) .NET Foundation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
these files except in compliance with the License. You may obtain a copy of the
License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
CONDITIONS OF ANY KIND, either express or implied. See the License for the
specific language governing permissions and limitations under the License.

View File

@ -1,432 +0,0 @@
// Unobtrusive validation support library for jQuery and jQuery Validate
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
// @version v3.2.11
/*jslint white: true, browser: true, onevar: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, strict: false */
/*global document: false, jQuery: false */
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define("jquery.validate.unobtrusive", ['jquery-validation'], factory);
} else if (typeof module === 'object' && module.exports) {
// CommonJS-like environments that support module.exports
module.exports = factory(require('jquery-validation'));
} else {
// Browser global
jQuery.validator.unobtrusive = factory(jQuery);
}
}(function ($) {
var $jQval = $.validator,
adapters,
data_validation = "unobtrusiveValidation";
function setValidationValues(options, ruleName, value) {
options.rules[ruleName] = value;
if (options.message) {
options.messages[ruleName] = options.message;
}
}
function splitAndTrim(value) {
return value.replace(/^\s+|\s+$/g, "").split(/\s*,\s*/g);
}
function escapeAttributeValue(value) {
// As mentioned on http://api.jquery.com/category/selectors/
return value.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g, "\\$1");
}
function getModelPrefix(fieldName) {
return fieldName.substr(0, fieldName.lastIndexOf(".") + 1);
}
function appendModelPrefix(value, prefix) {
if (value.indexOf("*.") === 0) {
value = value.replace("*.", prefix);
}
return value;
}
function onError(error, inputElement) { // 'this' is the form element
var container = $(this).find("[data-valmsg-for='" + escapeAttributeValue(inputElement[0].name) + "']"),
replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) !== false : null;
container.removeClass("field-validation-valid").addClass("field-validation-error");
error.data("unobtrusiveContainer", container);
if (replace) {
container.empty();
error.removeClass("input-validation-error").appendTo(container);
}
else {
error.hide();
}
}
function onErrors(event, validator) { // 'this' is the form element
var container = $(this).find("[data-valmsg-summary=true]"),
list = container.find("ul");
if (list && list.length && validator.errorList.length) {
list.empty();
container.addClass("validation-summary-errors").removeClass("validation-summary-valid");
$.each(validator.errorList, function () {
$("<li />").html(this.message).appendTo(list);
});
}
}
function onSuccess(error) { // 'this' is the form element
var container = error.data("unobtrusiveContainer");
if (container) {
var replaceAttrValue = container.attr("data-valmsg-replace"),
replace = replaceAttrValue ? $.parseJSON(replaceAttrValue) : null;
container.addClass("field-validation-valid").removeClass("field-validation-error");
error.removeData("unobtrusiveContainer");
if (replace) {
container.empty();
}
}
}
function onReset(event) { // 'this' is the form element
var $form = $(this),
key = '__jquery_unobtrusive_validation_form_reset';
if ($form.data(key)) {
return;
}
// Set a flag that indicates we're currently resetting the form.
$form.data(key, true);
try {
$form.data("validator").resetForm();
} finally {
$form.removeData(key);
}
$form.find(".validation-summary-errors")
.addClass("validation-summary-valid")
.removeClass("validation-summary-errors");
$form.find(".field-validation-error")
.addClass("field-validation-valid")
.removeClass("field-validation-error")
.removeData("unobtrusiveContainer")
.find(">*") // If we were using valmsg-replace, get the underlying error
.removeData("unobtrusiveContainer");
}
function validationInfo(form) {
var $form = $(form),
result = $form.data(data_validation),
onResetProxy = $.proxy(onReset, form),
defaultOptions = $jQval.unobtrusive.options || {},
execInContext = function (name, args) {
var func = defaultOptions[name];
func && $.isFunction(func) && func.apply(form, args);
};
if (!result) {
result = {
options: { // options structure passed to jQuery Validate's validate() method
errorClass: defaultOptions.errorClass || "input-validation-error",
errorElement: defaultOptions.errorElement || "span",
errorPlacement: function () {
onError.apply(form, arguments);
execInContext("errorPlacement", arguments);
},
invalidHandler: function () {
onErrors.apply(form, arguments);
execInContext("invalidHandler", arguments);
},
messages: {},
rules: {},
success: function () {
onSuccess.apply(form, arguments);
execInContext("success", arguments);
}
},
attachValidation: function () {
$form
.off("reset." + data_validation, onResetProxy)
.on("reset." + data_validation, onResetProxy)
.validate(this.options);
},
validate: function () { // a validation function that is called by unobtrusive Ajax
$form.validate();
return $form.valid();
}
};
$form.data(data_validation, result);
}
return result;
}
$jQval.unobtrusive = {
adapters: [],
parseElement: function (element, skipAttach) {
/// <summary>
/// Parses a single HTML element for unobtrusive validation attributes.
/// </summary>
/// <param name="element" domElement="true">The HTML element to be parsed.</param>
/// <param name="skipAttach" type="Boolean">[Optional] true to skip attaching the
/// validation to the form. If parsing just this single element, you should specify true.
/// If parsing several elements, you should specify false, and manually attach the validation
/// to the form when you are finished. The default is false.</param>
var $element = $(element),
form = $element.parents("form")[0],
valInfo, rules, messages;
if (!form) { // Cannot do client-side validation without a form
return;
}
valInfo = validationInfo(form);
valInfo.options.rules[element.name] = rules = {};
valInfo.options.messages[element.name] = messages = {};
$.each(this.adapters, function () {
var prefix = "data-val-" + this.name,
message = $element.attr(prefix),
paramValues = {};
if (message !== undefined) { // Compare against undefined, because an empty message is legal (and falsy)
prefix += "-";
$.each(this.params, function () {
paramValues[this] = $element.attr(prefix + this);
});
this.adapt({
element: element,
form: form,
message: message,
params: paramValues,
rules: rules,
messages: messages
});
}
});
$.extend(rules, { "__dummy__": true });
if (!skipAttach) {
valInfo.attachValidation();
}
},
parse: function (selector) {
/// <summary>
/// Parses all the HTML elements in the specified selector. It looks for input elements decorated
/// with the [data-val=true] attribute value and enables validation according to the data-val-*
/// attribute values.
/// </summary>
/// <param name="selector" type="String">Any valid jQuery selector.</param>
// $forms includes all forms in selector's DOM hierarchy (parent, children and self) that have at least one
// element with data-val=true
var $selector = $(selector),
$forms = $selector.parents()
.addBack()
.filter("form")
.add($selector.find("form"))
.has("[data-val=true]");
$selector.find("[data-val=true]").each(function () {
$jQval.unobtrusive.parseElement(this, true);
});
$forms.each(function () {
var info = validationInfo(this);
if (info) {
info.attachValidation();
}
});
}
};
adapters = $jQval.unobtrusive.adapters;
adapters.add = function (adapterName, params, fn) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="params" type="Array" optional="true">[Optional] An array of parameter names (strings) that will
/// be extracted from the data-val-nnnn-mmmm HTML attributes (where nnnn is the adapter name, and
/// mmmm is the parameter name).</param>
/// <param name="fn" type="Function">The function to call, which adapts the values from the HTML
/// attributes into jQuery Validate rules and/or messages.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
if (!fn) { // Called with no params, just a function
fn = params;
params = [];
}
this.push({ name: adapterName, params: params, adapt: fn });
return this;
};
adapters.addBool = function (adapterName, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has no parameter values.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, function (options) {
setValidationValues(options, ruleName || adapterName, true);
});
};
adapters.addMinMax = function (adapterName, minRuleName, maxRuleName, minMaxRuleName, minAttribute, maxAttribute) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation has three potential rules (one for min-only, one for max-only, and
/// one for min-and-max). The HTML parameters are expected to be named -min and -max.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute (where nnnn is the adapter name).</param>
/// <param name="minRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a minimum value.</param>
/// <param name="maxRuleName" type="String">The name of the jQuery Validate rule to be used when you only
/// have a maximum value.</param>
/// <param name="minMaxRuleName" type="String">The name of the jQuery Validate rule to be used when you
/// have both a minimum and maximum value.</param>
/// <param name="minAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the minimum value. The default is "min".</param>
/// <param name="maxAttribute" type="String" optional="true">[Optional] The name of the HTML attribute that
/// contains the maximum value. The default is "max".</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [minAttribute || "min", maxAttribute || "max"], function (options) {
var min = options.params.min,
max = options.params.max;
if (min && max) {
setValidationValues(options, minMaxRuleName, [min, max]);
}
else if (min) {
setValidationValues(options, minRuleName, min);
}
else if (max) {
setValidationValues(options, maxRuleName, max);
}
});
};
adapters.addSingleVal = function (adapterName, attribute, ruleName) {
/// <summary>Adds a new adapter to convert unobtrusive HTML into a jQuery Validate validation, where
/// the jQuery Validate validation rule has a single value.</summary>
/// <param name="adapterName" type="String">The name of the adapter to be added. This matches the name used
/// in the data-val-nnnn HTML attribute(where nnnn is the adapter name).</param>
/// <param name="attribute" type="String">[Optional] The name of the HTML attribute that contains the value.
/// The default is "val".</param>
/// <param name="ruleName" type="String" optional="true">[Optional] The name of the jQuery Validate rule. If not provided, the value
/// of adapterName will be used instead.</param>
/// <returns type="jQuery.validator.unobtrusive.adapters" />
return this.add(adapterName, [attribute || "val"], function (options) {
setValidationValues(options, ruleName || adapterName, options.params[attribute]);
});
};
$jQval.addMethod("__dummy__", function (value, element, params) {
return true;
});
$jQval.addMethod("regex", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
match = new RegExp(params).exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
$jQval.addMethod("nonalphamin", function (value, element, nonalphamin) {
var match;
if (nonalphamin) {
match = value.match(/\W/g);
match = match && match.length >= nonalphamin;
}
return match;
});
if ($jQval.methods.extension) {
adapters.addSingleVal("accept", "mimtype");
adapters.addSingleVal("extension", "extension");
} else {
// for backward compatibility, when the 'extension' validation method does not exist, such as with versions
// of JQuery Validation plugin prior to 1.10, we should use the 'accept' method for
// validating the extension, and ignore mime-type validations as they are not supported.
adapters.addSingleVal("extension", "extension", "accept");
}
adapters.addSingleVal("regex", "pattern");
adapters.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");
adapters.addMinMax("length", "minlength", "maxlength", "rangelength").addMinMax("range", "min", "max", "range");
adapters.addMinMax("minlength", "minlength").addMinMax("maxlength", "minlength", "maxlength");
adapters.add("equalto", ["other"], function (options) {
var prefix = getModelPrefix(options.element.name),
other = options.params.other,
fullOtherName = appendModelPrefix(other, prefix),
element = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(fullOtherName) + "']")[0];
setValidationValues(options, "equalTo", element);
});
adapters.add("required", function (options) {
// jQuery Validate equates "required" with "mandatory" for checkbox elements
if (options.element.tagName.toUpperCase() !== "INPUT" || options.element.type.toUpperCase() !== "CHECKBOX") {
setValidationValues(options, "required", true);
}
});
adapters.add("remote", ["url", "type", "additionalfields"], function (options) {
var value = {
url: options.params.url,
type: options.params.type || "GET",
data: {}
},
prefix = getModelPrefix(options.element.name);
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
var paramName = appendModelPrefix(fieldName, prefix);
value.data[paramName] = function () {
var field = $(options.form).find(":input").filter("[name='" + escapeAttributeValue(paramName) + "']");
// For checkboxes and radio buttons, only pick up values from checked fields.
if (field.is(":checkbox")) {
return field.filter(":checked").val() || field.filter(":hidden").val() || '';
}
else if (field.is(":radio")) {
return field.filter(":checked").val() || '';
}
return field.val();
};
});
setValidationValues(options, "remote", value);
});
adapters.add("password", ["min", "nonalphamin", "regex"], function (options) {
if (options.params.min) {
setValidationValues(options, "minlength", options.params.min);
}
if (options.params.nonalphamin) {
setValidationValues(options, "nonalphamin", options.params.nonalphamin);
}
if (options.params.regex) {
setValidationValues(options, "regex", options.params.regex);
}
});
adapters.add("fileextensions", ["extensions"], function (options) {
setValidationValues(options, "extension", options.params.extensions);
});
$(function () {
$jQval.unobtrusive.parse(document);
});
return $jQval.unobtrusive;
}));

View File

@ -1,22 +0,0 @@
The MIT License (MIT)
=====================
Copyright Jörn Zaefferer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,36 +0,0 @@
Copyright JS Foundation and other contributors, https://js.foundation/
This software consists of voluntary contributions made by many
individuals. For exact contribution history, see the revision history
available at https://github.com/jquery/jquery
The following license applies to all parts of this software except as
documented below:
====
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
====
All files located in the node_modules and external directories are
externally maintained libraries used by this software which have their
own licenses; we recommend you read them, as their terms may differ from
the terms above.

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,72 +0,0 @@
using System;
using System.Threading.Tasks;
namespace SpotifyAPI.Web.Examples.CLI
{
internal static class Program
{
// private static string _clientId = ""; //"";
// private static string _secretId = ""; //"";
// ReSharper disable once UnusedParameter.Local
// public static void Main(string[] args)
// {
// _clientId = string.IsNullOrEmpty(_clientId) ?
// Environment.GetEnvironmentVariable("SPOTIFY_CLIENT_ID") :
// _clientId;
// _secretId = string.IsNullOrEmpty(_secretId) ?
// Environment.GetEnvironmentVariable("SPOTIFY_SECRET_ID") :
// _secretId;
// Console.WriteLine("####### Spotify API 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)");
// var auth =
// new AuthorizationCodeAuth(_clientId, _secretId, "http://localhost:4002", "http://localhost:4002",
// Scope.PlaylistReadPrivate | Scope.PlaylistReadCollaborative);
// auth.AuthReceived += AuthOnAuthReceived;
// auth.Start();
// auth.OpenBrowser();
// Console.ReadLine();
// auth.Stop(0);
// }
// private static async void AuthOnAuthReceived(object sender, AuthorizationCode payload)
// {
// var auth = (AuthorizationCodeAuth)sender;
// auth.Stop();
// Token token = await auth.ExchangeCode(payload.Code);
// var api = new SpotifyWebAPI
// {
// AccessToken = token.AccessToken,
// TokenType = token.TokenType
// };
// await PrintUsefulData(api);
// }
// private static async Task PrintAllPlaylistTracks(SpotifyWebAPI api, Paging<SimplePlaylist> playlists)
// {
// if (playlists.Items == null) return;
// playlists.Items.ForEach(playlist => Console.WriteLine($"- {playlist.Name}"));
// if (playlists.HasNextPage())
// await PrintAllPlaylistTracks(api, await api.GetNextPageAsync(playlists));
// }
// private static async Task PrintUsefulData(SpotifyWebAPI api)
// {
// PrivateProfile profile = await api.GetPrivateProfileAsync();
// string name = string.IsNullOrEmpty(profile.DisplayName) ? profile.Id : profile.DisplayName;
// Console.WriteLine($"Hello there, {name}!");
// Console.WriteLine("Your playlists:");
// await PrintAllPlaylistTracks(api, api.GetUserPlaylists(profile.Id));
// }
}
}

View File

@ -1,12 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\SpotifyAPI.Web.Auth\SpotifyAPI.Web.Auth.csproj" />
</ItemGroup>
</Project>

View File

@ -4,6 +4,6 @@ namespace SpotifyAPI.Web
{
public class Actions
{
public Dictionary<string, bool> Disallows { get; private set; }
public Dictionary<string, bool> Disallows { get; set; }
}
}

View File

@ -4,6 +4,6 @@ namespace SpotifyAPI.Web
{
public class AlbumsResponse
{
public List<FullAlbum> Albums { get; private set; }
public List<FullAlbum> Albums { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace SpotifyAPI.Web
{
public class CategoriesResponse
{
public Paging<Category> Categories { get; private set; }
public Paging<Category> Categories { get; set; }
}
}

View File

@ -4,9 +4,9 @@ namespace SpotifyAPI.Web
{
public class Category
{
public string Href { get; private set; }
public List<Image> Icons { get; private set; }
public string Id { get; private set; }
public string Name { get; private set; }
public string Href { get; set; }
public List<Image> Icons { get; set; }
public string Id { get; set; }
public string Name { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace SpotifyAPI.Web
{
public class CategoryPlaylistsResponse
{
public Paging<SimplePlaylist> Playlists { get; private set; }
public Paging<SimplePlaylist> Playlists { get; set; }
}
}

View File

@ -4,9 +4,9 @@ namespace SpotifyAPI.Web
{
public class Context
{
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{
public class Copyright
{
public string Text { get; private set; }
public string Type { get; private set; }
public string Text { get; set; }
public string Type { get; set; }
}
}

View File

@ -5,13 +5,13 @@ namespace SpotifyAPI.Web
{
public class CurrentlyPlaying
{
public Context Context { get; private set; }
public string CurrentlyPlayingType { get; private set; }
public bool IsPlaying { get; private set; }
public Context Context { get; set; }
public string CurrentlyPlayingType { get; set; }
public bool IsPlaying { get; set; }
[JsonConverter(typeof(PlayableItemConverter))]
public IPlayableItem Item { get; private set; }
public int? ProgressMs { get; private set; }
public long Timestamp { get; private set; }
public IPlayableItem Item { get; set; }
public int? ProgressMs { get; set; }
public long Timestamp { get; set; }
}
}

View File

@ -4,18 +4,18 @@ namespace SpotifyAPI.Web
{
public class CurrentlyPlayingContext
{
public Device Device { get; private set; }
public string RepeatState { get; private set; }
public bool ShuffleState { get; private set; }
public Context Context { get; private set; }
public long Timestamp { get; private set; }
public int ProgressMs { get; private set; }
public bool IsPlaying { get; private set; }
public Device Device { get; set; }
public string RepeatState { get; set; }
public bool ShuffleState { get; set; }
public Context Context { get; set; }
public long Timestamp { get; set; }
public int ProgressMs { get; set; }
public bool IsPlaying { get; set; }
[JsonConverter(typeof(PlayableItemConverter))]
public IPlayableItem Item { get; private set; }
public IPlayableItem Item { get; set; }
public string CurrentlyPlayingType { get; private set; }
public Actions Actions { get; private set; }
public string CurrentlyPlayingType { get; set; }
public Actions Actions { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{
public class Cursor
{
public string Before { get; private set; }
public string After { get; private set; }
public string Before { get; set; }
public string After { get; set; }
}
}

View File

@ -4,11 +4,11 @@ namespace SpotifyAPI.Web
{
public class CursorPaging<T>
{
public string Href { get; private set; }
public List<T> Items { get; private set; }
public int Limit { get; private set; }
public string Next { get; private set; }
public Cursor Cursors { get; private set; }
public int Total { get; private set; }
public string Href { get; set; }
public List<T> Items { get; set; }
public int Limit { get; set; }
public string Next { get; set; }
public Cursor Cursors { get; set; }
public int Total { get; set; }
}
}

View File

@ -2,12 +2,12 @@ namespace SpotifyAPI.Web
{
public class Device
{
public string Id { get; private set; }
public bool IsActive { get; private set; }
public bool IsPrivateSession { get; private set; }
public bool IsRestricted { get; private set; }
public string Name { get; private set; }
public string Type { get; private set; }
public int? VolumePercent { get; private set; }
public string Id { get; set; }
public bool IsActive { get; set; }
public bool IsPrivateSession { get; set; }
public bool IsRestricted { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public int? VolumePercent { get; set; }
}
}

View File

@ -4,6 +4,6 @@ namespace SpotifyAPI.Web
{
public class DeviceResponse
{
public List<Device> Devices { get; private set; }
public List<Device> Devices { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{
public class FeaturedPlaylistsResponse
{
public string Message { get; private set; }
public Paging<SimplePlaylist> Playlists { get; private set; }
public string Message { get; set; }
public Paging<SimplePlaylist> Playlists { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace SpotifyAPI.Web
{
public class FollowedArtistsResponse
{
public CursorPaging<FullArtist> Artists { get; private set; }
public CursorPaging<FullArtist> Artists { get; set; }
}
}

View File

@ -2,8 +2,8 @@ namespace SpotifyAPI.Web
{
public class Followers
{
public string Href { get; private set; }
public string Href { get; set; }
public int Total { get; private set; }
public int Total { get; set; }
}
}

View File

@ -4,24 +4,24 @@ namespace SpotifyAPI.Web
{
public class FullAlbum
{
public string AlbumType { get; private set; }
public List<SimpleArtist> Artists { get; private set; }
public List<string> AvailableMarkets { get; private set; }
public List<Copyright> Copyrights { get; private set; }
public Dictionary<string, string> ExternalIds { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public List<string> Genres { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Label { get; private set; }
public string Name { get; private set; }
public int Popularity { get; private set; }
public string ReleaseDate { get; private set; }
public string ReleaseDatePrecision { get; private set; }
public Dictionary<string, string> Restrictions { get; private set; }
public Paging<SimpleTrack> Tracks { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public string AlbumType { get; set; }
public List<SimpleArtist> Artists { get; set; }
public List<string> AvailableMarkets { get; set; }
public List<Copyright> Copyrights { get; set; }
public Dictionary<string, string> ExternalIds { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public List<string> Genres { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Label { get; set; }
public string Name { get; set; }
public int Popularity { get; set; }
public string ReleaseDate { get; set; }
public string ReleaseDatePrecision { get; set; }
public Dictionary<string, string> Restrictions { get; set; }
public Paging<SimpleTrack> Tracks { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -4,15 +4,15 @@ namespace SpotifyAPI.Web
{
public class FullArtist
{
public Dictionary<string, string> ExternalUrls { get; private set; }
public Followers Followers { get; private set; }
public List<string> Genres { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Name { get; private set; }
public int Popularity { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public Followers Followers { get; set; }
public List<string> Genres { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Name { get; set; }
public int Popularity { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -6,25 +6,25 @@ namespace SpotifyAPI.Web
{
public class FullEpisode : IPlayableItem
{
public string AudioPreviewUrl { get; private set; }
public string Description { get; private set; }
public int DurationMs { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public bool IsExternallyHosted { get; private set; }
public bool IsPlayable { get; private set; }
public List<string> Languages { get; private set; }
public string Name { get; private set; }
public string ReleaseDate { get; private set; }
public string ReleaseDatePrecision { get; private set; }
public ResumePoint ResumePoint { get; private set; }
public SimpleShow Show { get; private set; }
public string AudioPreviewUrl { get; set; }
public string Description { get; set; }
public int DurationMs { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public bool IsExternallyHosted { get; set; }
public bool IsPlayable { get; set; }
public List<string> Languages { get; set; }
public string Name { get; set; }
public string ReleaseDate { get; set; }
public string ReleaseDatePrecision { get; set; }
public ResumePoint ResumePoint { get; set; }
public SimpleShow Show { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public ItemType Type { get; private set; }
public string Uri { get; private set; }
public ItemType Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -3,17 +3,17 @@ namespace SpotifyAPI.Web
{
public class FullPlaylist
{
public bool Collaborative { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Name { get; private set; }
public PublicUser Owner { get; private set; }
public bool Public { get; private set; }
public string SnapshotId { get; private set; }
public Paging<PlaylistTrack<IPlayableItem>> Tracks { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public bool Collaborative { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Name { get; set; }
public PublicUser Owner { get; set; }
public bool Public { get; set; }
public string SnapshotId { get; set; }
public Paging<PlaylistTrack<IPlayableItem>> Tracks { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -4,21 +4,21 @@ namespace SpotifyAPI.Web
{
public class FullShow
{
public List<string> AvailableMarkets { get; private set; }
public List<Copyright> Copyrights { get; private set; }
public string Description { get; private set; }
public Paging<SimpleEpisode> Episodes { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public bool IsExternallyHosted { get; private set; }
public List<string> Languages { get; private set; }
public string MediaType { get; private set; }
public string Name { get; private set; }
public string Publisher { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public List<string> AvailableMarkets { get; set; }
public List<Copyright> Copyrights { get; set; }
public string Description { get; set; }
public Paging<SimpleEpisode> Episodes { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public bool IsExternallyHosted { get; set; }
public List<string> Languages { get; set; }
public string MediaType { get; set; }
public string Name { get; set; }
public string Publisher { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -6,27 +6,27 @@ namespace SpotifyAPI.Web
{
public class FullTrack : IPlayableItem
{
public SimpleAlbum Album { get; private set; }
public List<SimpleArtist> Artists { get; private set; }
public List<string> AvailableMarkets { get; private set; }
public int DiscNumber { get; private set; }
public int DurationMs { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalIds { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public bool IsPlayable { get; private set; }
public LinkedTrack LinkedFrom { get; private set; }
public Dictionary<string, string> Restrictions { get; private set; }
public string Name { get; private set; }
public int Popularity { get; private set; }
public string PreviewUrl { get; private set; }
public int TrackNumber { get; private set; }
public SimpleAlbum Album { get; set; }
public List<SimpleArtist> Artists { get; set; }
public List<string> AvailableMarkets { get; set; }
public int DiscNumber { get; set; }
public int DurationMs { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalIds { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public bool IsPlayable { get; set; }
public LinkedTrack LinkedFrom { get; set; }
public Dictionary<string, string> Restrictions { get; set; }
public string Name { get; set; }
public int Popularity { get; set; }
public string PreviewUrl { get; set; }
public int TrackNumber { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public ItemType Type { get; private set; }
public string Uri { get; private set; }
public bool IsLocal { get; private set; }
public ItemType Type { get; set; }
public string Uri { get; set; }
public bool IsLocal { get; set; }
}
}

View File

@ -2,8 +2,8 @@ namespace SpotifyAPI.Web
{
public class Image
{
public int Height { get; private set; }
public int Width { get; private set; }
public string Url { get; private set; }
public int Height { get; set; }
public int Width { get; set; }
public string Url { get; set; }
}
}

View File

@ -3,10 +3,10 @@ namespace SpotifyAPI.Web
{
public class LinkedTrack
{
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{
public class NewReleasesResponse
{
public string Message { get; private set; }
public Paging<SimpleAlbum> Albums { get; private set; }
public string Message { get; set; }
public Paging<SimpleAlbum> Albums { get; set; }
}
}

View File

@ -4,23 +4,23 @@ namespace SpotifyAPI.Web
{
public class Paging<T>
{
public string Href { get; private set; }
public List<T> Items { get; private set; }
public int Limit { get; private set; }
public string Next { get; private set; }
public int Offset { get; private set; }
public string Previous { get; private set; }
public int Total { get; private set; }
public string Href { get; set; }
public List<T> Items { get; set; }
public int Limit { get; set; }
public string Next { get; set; }
public int Offset { get; set; }
public string Previous { get; set; }
public int Total { get; set; }
}
public class Paging<T, TNext>
{
public string Href { get; private set; }
public List<T> Items { get; private set; }
public int Limit { get; private set; }
public string Next { get; private set; }
public int Offset { get; private set; }
public string Previous { get; private set; }
public int Total { get; private set; }
public string Href { get; set; }
public List<T> Items { get; set; }
public int Limit { get; set; }
public string Next { get; set; }
public int Offset { get; set; }
public string Previous { get; set; }
public int Total { get; set; }
}
}

View File

@ -3,8 +3,8 @@ namespace SpotifyAPI.Web
{
public class PlayHistoryItem
{
public SimpleTrack Track { get; private set; }
public DateTime PlayedAt { get; private set; }
public Context Context { get; private set; }
public SimpleTrack Track { get; set; }
public DateTime PlayedAt { get; set; }
public Context Context { get; set; }
}
}

View File

@ -5,11 +5,11 @@ namespace SpotifyAPI.Web
{
public class PlaylistTrack<T>
{
public DateTime? AddedAt { get; private set; }
public PublicUser AddedBy { get; private set; }
public bool IsLocal { get; private set; }
public DateTime? AddedAt { get; set; }
public PublicUser AddedBy { get; set; }
public bool IsLocal { get; set; }
[JsonConverter(typeof(PlayableItemConverter))]
public T Track { get; private set; }
public T Track { get; set; }
}
}

View File

@ -5,16 +5,16 @@ namespace SpotifyAPI.Web.Models
{
public class PrivateUser
{
public string Country { get; private set; }
public string DisplayName { get; private set; }
public string Email { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public Followers Followers { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Product { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public string Country { get; set; }
public string DisplayName { get; set; }
public string Email { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public Followers Followers { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Product { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -5,13 +5,13 @@ namespace SpotifyAPI.Web
{
public class PublicUser
{
public string DisplayName { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public Followers Followers { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public string DisplayName { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public Followers Followers { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -4,6 +4,6 @@ namespace SpotifyAPI.Web
{
public class RecommendationGenresResponse
{
public List<string> Genres { get; private set; }
public List<string> Genres { get; set; }
}
}

View File

@ -5,14 +5,14 @@ namespace SpotifyAPI.Web
public class RecommendationSeed
{
[JsonProperty("afterFilteringSize")]
public int AfterFiliteringSize { get; private set; }
public int AfterFiliteringSize { get; set; }
[JsonProperty("afterRelinkingSize")]
public int AfterRelinkingSize { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public int AfterRelinkingSize { get; set; }
public string Href { get; set; }
public string Id { get; set; }
[JsonProperty("initialPoolSize")]
public int InitialPoolSize { get; private set; }
public string Type { get; private set; }
public int InitialPoolSize { get; set; }
public string Type { get; set; }
}
}

View File

@ -4,7 +4,7 @@ namespace SpotifyAPI.Web
{
public class RecommendationsResponse
{
public List<RecommendationSeed> Seeds { get; private set; }
public List<SimpleTrack> Tracks { get; private set; }
public List<RecommendationSeed> Seeds { get; set; }
public List<SimpleTrack> Tracks { get; set; }
}
}

View File

@ -2,7 +2,7 @@ namespace SpotifyAPI.Web
{
public class ResumePoint
{
public bool FullyPlayed { get; private set; }
public int ResumePositionMs { get; private set; }
public bool FullyPlayed { get; set; }
public int ResumePositionMs { get; set; }
}
}

View File

@ -2,10 +2,10 @@ namespace SpotifyAPI.Web
{
public class SearchResponse
{
public Paging<FullArtist, SearchResponse> Artists { get; private set; }
public Paging<SimpleAlbum, SearchResponse> Albums { get; private set; }
public Paging<FullTrack, SearchResponse> Tracks { get; private set; }
public Paging<SimpleShow, SearchResponse> Shows { get; private set; }
public Paging<SimpleEpisode, SearchResponse> Episodes { get; private set; }
public Paging<FullArtist, SearchResponse> Artists { get; set; }
public Paging<SimpleAlbum, SearchResponse> Albums { get; set; }
public Paging<FullTrack, SearchResponse> Tracks { get; set; }
public Paging<SimpleShow, SearchResponse> Shows { get; set; }
public Paging<SimpleEpisode, SearchResponse> Episodes { get; set; }
}
}

View File

@ -2,17 +2,17 @@ namespace SpotifyAPI.Web
{
public class Section
{
public float Start { get; private set; }
public float Duration { get; private set; }
public float Confidence { get; private set; }
public float Loudness { get; private set; }
public float Tempo { get; private set; }
public float TempoConfidence { get; private set; }
public int Key { get; private set; }
public float KeyConfidence { get; private set; }
public int Mode { get; private set; }
public float ModeConfidence { get; private set; }
public int TimeSignature { get; private set; }
public float TimeSignatureConfidence { get; private set; }
public float Start { get; set; }
public float Duration { get; set; }
public float Confidence { get; set; }
public float Loudness { get; set; }
public float Tempo { get; set; }
public float TempoConfidence { get; set; }
public int Key { get; set; }
public float KeyConfidence { get; set; }
public int Mode { get; set; }
public float ModeConfidence { get; set; }
public int TimeSignature { get; set; }
public float TimeSignatureConfidence { get; set; }
}
}

View File

@ -4,14 +4,14 @@ namespace SpotifyAPI.Web
{
public class Segment
{
public float Start { get; private set; }
public float Duration { get; private set; }
public float Confidence { get; private set; }
public float LoudnessStart { get; private set; }
public float LoudnessMax { get; private set; }
public float LoudnessMaxTime { get; private set; }
public float LoudnessEnd { get; private set; }
public List<float> Pitches { get; private set; }
public List<float> Timbre { get; private set; }
public float Start { get; set; }
public float Duration { get; set; }
public float Confidence { get; set; }
public float LoudnessStart { get; set; }
public float LoudnessMax { get; set; }
public float LoudnessMaxTime { get; set; }
public float LoudnessEnd { get; set; }
public List<float> Pitches { get; set; }
public List<float> Timbre { get; set; }
}
}

View File

@ -4,6 +4,6 @@ namespace SpotifyAPI.Web
{
public class ShowsResponse
{
public List<SimpleShow> Shows { get; private set; }
public List<SimpleShow> Shows { get; set; }
}
}

View File

@ -4,19 +4,19 @@ namespace SpotifyAPI.Web
{
public class SimpleAlbum
{
public string AlbumGroup { get; private set; }
public string AlbumType { get; private set; }
public List<SimpleArtist> Artists { get; private set; }
public List<string> AvailableMarkets { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Name { get; private set; }
public string ReleaseDate { get; private set; }
public string ReleaseDatePrecision { get; private set; }
public Dictionary<string, string> Restrictions { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public string AlbumGroup { get; set; }
public string AlbumType { get; set; }
public List<SimpleArtist> Artists { get; set; }
public List<string> AvailableMarkets { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Name { get; set; }
public string ReleaseDate { get; set; }
public string ReleaseDatePrecision { get; set; }
public Dictionary<string, string> Restrictions { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -3,11 +3,11 @@ namespace SpotifyAPI.Web
{
public class SimpleArtist
{
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public string Name { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public string Name { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -7,27 +7,27 @@ namespace SpotifyAPI.Web
{
public class SimpleEpisode
{
public string AudioPreviewUrl { get; private set; }
public string Description { get; private set; }
public int DurationMs { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public bool IsExternallyHosted { get; private set; }
public bool IsPlayable { get; private set; }
public string AudioPreviewUrl { get; set; }
public string Description { get; set; }
public int DurationMs { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public bool IsExternallyHosted { get; set; }
public bool IsPlayable { get; set; }
[Obsolete("This field is deprecated and might be removed in the future. Please use the languages field instead")]
public string Language { get; private set; }
public List<string> Languages { get; private set; }
public string Name { get; private set; }
public string ReleaseDate { get; private set; }
public string ReleaseDatePrecision { get; private set; }
public ResumePoint ResumePoint { get; private set; }
public string Language { get; set; }
public List<string> Languages { get; set; }
public string Name { get; set; }
public string ReleaseDate { get; set; }
public string ReleaseDatePrecision { get; set; }
public ResumePoint ResumePoint { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public ItemType Type { get; private set; }
public string Uri { get; private set; }
public ItemType Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -6,18 +6,18 @@ namespace SpotifyAPI.Web
/// </summary>
public class SimplePlaylist
{
public bool Collaborative { get; private set; }
public string Description { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public string Name { get; private set; }
public PublicUser Owner { get; private set; }
public bool? Public { get; private set; }
public string SnapshotId { get; private set; }
public Paging<PlaylistTrack<IPlayableItem>> Tracks { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public bool Collaborative { get; set; }
public string Description { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public string Name { get; set; }
public PublicUser Owner { get; set; }
public bool? Public { get; set; }
public string SnapshotId { get; set; }
public Paging<PlaylistTrack<IPlayableItem>> Tracks { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -4,20 +4,20 @@ namespace SpotifyAPI.Web
{
public class SimpleShow
{
public List<string> AvailableMarkets { get; private set; }
public List<Copyright> Copyrights { get; private set; }
public string Description { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public List<Image> Images { get; private set; }
public bool IsExternallyHosted { get; private set; }
public List<string> Languages { get; private set; }
public string MediaType { get; private set; }
public string Name { get; private set; }
public string Publisher { get; private set; }
public string Type { get; private set; }
public string Uri { get; private set; }
public List<string> AvailableMarkets { get; set; }
public List<Copyright> Copyrights { get; set; }
public string Description { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public List<Image> Images { get; set; }
public bool IsExternallyHosted { get; set; }
public List<string> Languages { get; set; }
public string MediaType { get; set; }
public string Name { get; set; }
public string Publisher { get; set; }
public string Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -6,22 +6,22 @@ namespace SpotifyAPI.Web
{
public class SimpleTrack
{
public List<SimpleArtist> Artists { get; private set; }
public List<string> AvailableMarkets { get; private set; }
public int DiscNumber { get; private set; }
public int DurationMs { get; private set; }
public bool Explicit { get; private set; }
public Dictionary<string, string> ExternalUrls { get; private set; }
public string Href { get; private set; }
public string Id { get; private set; }
public bool IsPlayable { get; private set; }
public LinkedTrack LinkedFrom { get; private set; }
public string Name { get; private set; }
public string PreviewUrl { get; private set; }
public int TrackNumber { get; private set; }
public List<SimpleArtist> Artists { get; set; }
public List<string> AvailableMarkets { get; set; }
public int DiscNumber { get; set; }
public int DurationMs { get; set; }
public bool Explicit { get; set; }
public Dictionary<string, string> ExternalUrls { get; set; }
public string Href { get; set; }
public string Id { get; set; }
public bool IsPlayable { get; set; }
public LinkedTrack LinkedFrom { get; set; }
public string Name { get; set; }
public string PreviewUrl { get; set; }
public int TrackNumber { get; set; }
[JsonConverter(typeof(StringEnumConverter))]
public ItemType Type { get; private set; }
public string Uri { get; private set; }
public ItemType Type { get; set; }
public string Uri { get; set; }
}
}

View File

@ -2,6 +2,6 @@ namespace SpotifyAPI.Web
{
public class SnapshotResponse
{
public string SnapshotId { get; private set; }
public string SnapshotId { get; set; }
}
}

Some files were not shown because too many files have changed in this diff Show More