From d7d06f0460cce6c4c20acd02a027f99098c3f690 Mon Sep 17 00:00:00 2001 From: zkhcohen Date: Mon, 29 Mar 2021 00:01:18 -0700 Subject: [PATCH 1/5] PKCE Auth is working. All methods transitioned from 5.x.x to 6.x.x. --- .gitignore | 77 + Plugins/EmbedIO.dll | Bin 0 -> 350720 bytes Plugins/SpotifyAPI.Web.Auth.dll | Bin 252928 -> 73728 bytes Plugins/SpotifyAPI.Web.dll | Bin 135168 -> 197632 bytes Plugins/Swan.Lite.dll | Bin 0 -> 192512 bytes Source Files/PanelInterface.cs | 95 +- .../SpotifyAPI.Web.Auth/AssemblyInfo.cs | 5 + .../SpotifyAPI.Web.Auth/AuthException.cs | 20 + Source Files/SpotifyAPI.Web.Auth/AuthUtil.cs | 69 - .../AuthorizationCodeAuth.cs | 134 - .../SpotifyAPI.Web.Auth/BrowserUtil.cs | 26 + .../SpotifyAPI.Web.Auth/CredentialsAuth.cs | 42 - .../SpotifyAPI.Web.Auth/EmbedIOAuthServer.cs | 114 + .../SpotifyAPI.Web.Auth/IAuthServer.cs | 19 + .../SpotifyAPI.Web.Auth/ImplicitGrantAuth.cs | 65 - .../Response/AuthorizationCodeResponse.cs | 15 + .../Models/Response/ImplicitGrantResponse.cs | 30 + .../Models/Response/PkceResponse.cs | 15 + .../AuthorizationCodeAuth/css/bulma.min.css | 1 - .../AuthorizationCodeAuth/images/1.png | Bin 38997 -> 0 bytes .../AuthorizationCodeAuth/images/2.png | Bin 16049 -> 0 bytes .../AuthorizationCodeAuth/start.html | 77 - .../Resources/ImplicitGrantAuth/index.html | 45 - .../Resources/auth_assets/logo.svg | 9 + .../Resources/auth_assets/main.css | 22 + .../Resources/auth_assets/main.js | 57 + .../Resources/default_site/favicon.ico | Bin 0 -> 4286 bytes .../Resources/default_site/index.html | 38 + .../SpotifyAPI.Web.Auth.csproj | 64 +- .../SpotifyAPI.Web.Auth.nuspec | 31 - .../SpotifyAPI.Web.Auth/SpotifyAuthServer.cs | 101 - .../SpotifyAPI.Web.Auth/TokenSwapAuth.cs | 217 -- .../TokenSwapWebAPIFactory.cs | 282 -- Source Files/SpotifyAPI.Web/Assembly.cs | 5 + .../AuthorizationCodeAuthenticator.cs | 71 + .../ClientCredentialsAuthenticator.cs | 70 + .../Authenticators/IAuthenticator.cs | 10 + .../Authenticators/PKCEAuthenticator.cs | 65 + .../Authenticators/TokenAuthenticator.cs | 26 + .../SpotifyAPI.Web/Clients/APIClient.cs | 16 + .../SpotifyAPI.Web/Clients/AlbumsClient.cs | 48 + .../SpotifyAPI.Web/Clients/ArtistsClient.cs | 55 + .../SpotifyAPI.Web/Clients/BrowseClient.cs | 90 + .../SpotifyAPI.Web/Clients/EpisodesClient.cs | 33 + .../SpotifyAPI.Web/Clients/FollowClient.cs | 93 + .../Clients/Interfaces/IAlbumsClient.cs | 66 + .../Clients/Interfaces/IArtistsClient.cs | 78 + .../Clients/Interfaces/IBrowseClient.cs | 130 + .../Clients/Interfaces/IEpisodesClient.cs | 43 + .../Clients/Interfaces/IFollowClient.cs | 110 + .../Clients/Interfaces/ILibraryClient.cs | 161 + .../Clients/Interfaces/IOAuthClient.cs | 61 + .../Clients/Interfaces/IPaginator.cs | 74 + .../Interfaces/IPersonalizationClient.cs | 48 + .../Clients/Interfaces/IPlayerClient.cs | 208 ++ .../Clients/Interfaces/IPlaylistsClient.cs | 183 + .../Clients/Interfaces/ISearchClient.cs | 21 + .../Clients/Interfaces/IShowsClient.cs | 66 + .../Clients/Interfaces/ISpotifyClient.cs | 181 + .../Clients/Interfaces/ITracksClient.cs | 70 + .../Clients/Interfaces/IUserProfileClient.cs | 28 + .../SpotifyAPI.Web/Clients/LibraryClient.cs | 117 + .../SpotifyAPI.Web/Clients/OAuthClient.cs | 267 ++ .../Clients/PersonalizationClient.cs | 35 + .../SpotifyAPI.Web/Clients/PlayerClient.cs | 154 + .../SpotifyAPI.Web/Clients/PlaylistsClient.cs | 136 + .../SpotifyAPI.Web/Clients/SearchClient.cs | 18 + .../SpotifyAPI.Web/Clients/ShowsClient.cs | 48 + .../SpotifyAPI.Web/Clients/SimplePaginator.cs | 130 + .../SpotifyAPI.Web/Clients/SpotifyClient.cs | 303 ++ .../Clients/SpotifyClientConfig.cs | 198 ++ .../SpotifyAPI.Web/Clients/TracksClient.cs | 54 + .../Clients/UserProfileClient.cs | 23 + .../SpotifyAPI.Web/Enums/AlbumType.cs | 23 - .../SpotifyAPI.Web/Enums/FollowType.cs | 14 - .../SpotifyAPI.Web/Enums/RepeatState.cs | 17 - Source Files/SpotifyAPI.Web/Enums/Scope.cs | 68 - .../SpotifyAPI.Web/Enums/SearchType.cs | 23 - .../SpotifyAPI.Web/Enums/TimeRangeType.cs | 20 - .../SpotifyAPI.Web/Enums/TrackType.cs | 20 - .../SpotifyAPI.Web/Exceptions/APIException.cs | 73 + .../Exceptions/APIPagingException.cs | 31 + .../Exceptions/APITooManyRequestsException.cs | 31 + .../Exceptions/APIUnauthorizedException.cs | 20 + .../SpotifyAPI.Web/Http/APIConnector.cs | 291 ++ .../SpotifyAPI.Web/Http/APIResponse.cs | 17 + .../Http/Interfaces/IAPIConnector.cs | 51 + .../Http/Interfaces/IAPIResponse.cs | 9 + .../Http/Interfaces/IHTTPLogger.cs | 8 + .../Http/Interfaces/IHttpClient.cs | 11 + .../Http/Interfaces/IJSONSerializer.cs | 10 + .../Http/Interfaces/IProxyConfig.cs | 15 + .../Http/Interfaces/IRequest.cs | 21 + .../Http/Interfaces/IResponse.cs | 16 + .../SpotifyAPI.Web/Http/NetHttpClient.cs | 141 + .../Http/NewtonsoftJSONSerializer.cs | 68 + .../SpotifyAPI.Web/Http/ProxyConfig.cs | 20 + Source Files/SpotifyAPI.Web/Http/Request.cs | 53 + Source Files/SpotifyAPI.Web/Http/Response.cs | 25 + .../Http/SimpleConsoleHTTPLogger.cs | 40 + Source Files/SpotifyAPI.Web/IClient.cs | 125 - .../SpotifyAPI.Web/Models/AnalysisMeta.cs | 28 - .../SpotifyAPI.Web/Models/AnalysisSection.cs | 43 - .../SpotifyAPI.Web/Models/AnalysisSegment.cs | 35 - .../Models/AnalysisTimeSlice.cs | 16 - .../SpotifyAPI.Web/Models/AnalysisTrack.cs | 86 - .../SpotifyAPI.Web/Models/ArrayResponse.cs | 9 - .../SpotifyAPI.Web/Models/AudioAnalysis.cs | 29 - .../SpotifyAPI.Web/Models/AudioFeatures.cs | 61 - .../SpotifyAPI.Web/Models/AvailabeDevices.cs | 11 - .../SpotifyAPI.Web/Models/BasicModel.cs | 23 - .../SpotifyAPI.Web/Models/Category.cs | 20 - .../SpotifyAPI.Web/Models/CategoryList.cs | 10 - .../SpotifyAPI.Web/Models/CategoryPlaylist.cs | 10 - .../Converters/PlayableItemConverter.cs | 51 + .../SpotifyAPI.Web/Models/CursorPaging.cs | 26 - Source Files/SpotifyAPI.Web/Models/Device.cs | 25 - .../Models/FeaturedPlaylists.cs | 13 - .../SpotifyAPI.Web/Models/FollowedArtists.cs | 10 - .../SpotifyAPI.Web/Models/FullAlbum.cs | 65 - .../SpotifyAPI.Web/Models/FullArtist.cs | 38 - .../SpotifyAPI.Web/Models/FullPlaylist.cs | 50 - .../SpotifyAPI.Web/Models/FullTrack.cs | 71 - .../SpotifyAPI.Web/Models/GeneralModels.cs | 159 - .../SpotifyAPI.Web/Models/IPaginatable.cs | 21 + .../SpotifyAPI.Web/Models/NewAlbumReleases.cs | 10 - Source Files/SpotifyAPI.Web/Models/Paging.cs | 39 - .../SpotifyAPI.Web/Models/PlayHistory.cs | 17 - .../SpotifyAPI.Web/Models/PlaybackContext.cs | 38 - .../SpotifyAPI.Web/Models/PrivateProfile.cs | 44 - .../SpotifyAPI.Web/Models/PublicProfile.cs | 32 - .../Models/RecommendationSeed .cs | 25 - .../Models/RecommendationSeedGenres.cs | 11 - .../SpotifyAPI.Web/Models/Recommendations.cs | 14 - .../Models/Request/AlbumRequest.cs | 12 + .../Models/Request/AlbumTracksRequest.cs | 29 + .../Models/Request/AlbumsRequest.cs | 34 + .../Models/Request/ArtistsAlbumsRequest.cs | 58 + .../Models/Request/ArtistsRequest.cs | 26 + .../Models/Request/ArtistsTopTracksRequest.cs | 24 + .../AuthorizationCodeRefreshRequest.cs | 44 + .../Request/AuthorizationCodeTokenRequest.cs | 54 + .../Models/Request/CategoriesRequest.cs | 42 + .../Request/CategoryPlaylistsRequest.cs | 28 + .../Models/Request/CategoryRequest.cs | 25 + .../Request/ClientCredentialsRequest.cs | 35 + .../Models/Request/EpisodeRequest.cs | 18 + .../Models/Request/EpisodesRequest.cs | 38 + .../Request/FeaturedPlaylistsRequest.cs | 60 + .../Request/FollowCheckCurrentUserRequest.cs | 50 + .../Request/FollowCheckPlaylistRequest.cs | 32 + .../Request/FollowGetCurrentUserRequest.cs | 42 + .../Models/Request/FollowPlaylistRequest.cs | 15 + .../Models/Request/FollowRequest.cs | 50 + .../Models/Request/LibraryAlbumsRequest.cs | 29 + .../Request/LibraryCheckAlbumsRequest.cs | 28 + .../Request/LibraryCheckShowsRequest.cs | 26 + .../Request/LibraryCheckTracksRequest.cs | 28 + .../Request/LibraryRemoveAlbumsRequest.cs | 29 + .../Request/LibraryRemoveShowsRequest.cs | 28 + .../Request/LibraryRemoveTracksRequest.cs | 30 + .../Request/LibrarySaveAlbumsRequest.cs | 29 + .../Models/Request/LibrarySaveShowsRequest.cs | 26 + .../Request/LibrarySaveTracksRequest.cs | 30 + .../Models/Request/LibraryShowsRequest.cs | 21 + .../Models/Request/LibraryTracksRequest.cs | 29 + .../Models/Request/LoginRequest.cs | 67 + .../Models/Request/NewReleasesRequest.cs | 30 + .../Models/Request/PKCETokenRefreshRequest.cs | 33 + .../Models/Request/PKCETokenRequest.cs | 55 + .../Request/PersonalizationTopRequest.cs | 41 + .../Models/Request/PlayerAddToQueueRequest.cs | 32 + .../Request/PlayerCurrentPlaybackRequest.cs | 46 + .../Request/PlayerCurrentlyPlayingRequest.cs | 55 + .../Request/PlayerPausePlaybackRequest.cs | 13 + .../Request/PlayerRecentlyPlayedRequest.cs | 29 + .../Request/PlayerResumePlaybackRequest.cs | 62 + .../Models/Request/PlayerSeekToRequest.cs | 35 + .../Models/Request/PlayerSetRepeatRequest.cs | 45 + .../Models/Request/PlayerShuffleRequest.cs | 30 + .../Models/Request/PlayerSkipNextRequest.cs | 13 + .../Request/PlayerSkipPreviousRequest.cs | 14 + .../Request/PlayerTransferPlaybackRequest.cs | 41 + .../Models/Request/PlayerVolumeRequest.cs | 29 + .../Models/Request/PlaylistAddItemsRequest.cs | 44 + .../Request/PlaylistChangeDetailsRequest.cs | 35 + .../Models/Request/PlaylistCreateRequest.cs | 52 + .../Request/PlaylistCurrentUsersRequest.cs | 21 + .../Models/Request/PlaylistGetItemsRequest.cs | 86 + .../Models/Request/PlaylistGetRequest.cs | 60 + .../Models/Request/PlaylistGetUsersRequest.cs | 21 + .../Request/PlaylistRemoveItemsRequest.cs | 47 + .../Request/PlaylistReorderItemsRequest.cs | 63 + .../Request/PlaylistReplaceItemsRequest.cs | 30 + .../Models/Request/RecommendationsRequest.cs | 118 + .../Models/Request/RequestParams.cs | 182 + .../Models/Request/SearchRequest.cs | 120 + .../Models/Request/ShowEpisodesRequest.cs | 33 + .../Models/Request/ShowRequest.cs | 19 + .../Models/Request/ShowsRequest.cs | 41 + .../Models/Request/TokenSwapRefreshRequest.cs | 20 + .../Models/Request/TokenSwapTokenRequest.cs | 20 + .../Models/Request/TrackRequest.cs | 14 + .../Request/TracksAudioFeaturesRequest.cs | 26 + .../Models/Request/TracksRequest.cs | 34 + .../Models/Request/UnfollowRequest.cs | 49 + .../SpotifyAPI.Web/Models/Response/Actions.cs | 10 + .../Models/Response/AlbumsResponse.cs | 10 + .../Response/ArtistsRelatedArtistsResponse.cs | 10 + .../Models/Response/ArtistsResponse.cs | 10 + .../Response/ArtistsTopTracksResponse.cs | 10 + .../AuthorizationCodeRefreshResponse.cs | 21 + .../AuthorizationCodeTokenResponse.cs | 23 + .../Models/Response/CategoriesResponse.cs | 8 + .../Models/Response/Category.cs | 13 + .../Response/CategoryPlaylistsResponse.cs | 8 + .../ClientCredentialsTokenResponse.cs | 20 + .../SpotifyAPI.Web/Models/Response/Context.cs | 13 + .../Models/Response/Copyright.cs | 9 + .../Models/Response/CurrentlyPlaying.cs | 22 + .../Response/CurrentlyPlayingContext.cs | 26 + .../SpotifyAPI.Web/Models/Response/Cursor.cs | 9 + .../Models/Response/CursorPaging.cs | 25 + .../SpotifyAPI.Web/Models/Response/Device.cs | 14 + .../Models/Response/DeviceResponse.cs | 10 + .../Models/Response/EpisodesResponse.cs | 10 + .../Response/FeaturedPlaylistsResponse.cs | 9 + .../Response/FollowedArtistsResponse.cs | 8 + .../Models/Response/Followers.cs | 10 + .../Models/Response/FullAlbum.cs | 28 + .../Models/Response/FullArtist.cs | 19 + .../Models/Response/FullEpisode.cs | 31 + .../Models/Response/FullPlaylist.cs | 27 + .../Models/Response/FullShow.cs | 25 + .../Models/Response/FullTrack.cs | 33 + .../SpotifyAPI.Web/Models/Response/Image.cs | 10 + .../Response/Interfaces/IPlaylistElement.cs | 18 + .../Response/Interfaces/IRefreshableToken.cs | 13 + .../Models/Response/Interfaces/IToken.cs | 30 + .../Models/Response/Interfaces/IUserToken.cs | 13 + .../Models/Response/LinkedTrack.cs | 13 + .../Models/Response/NewReleasesResponse.cs | 9 + .../Models/Response/PKCETokenResponse.cs | 21 + .../SpotifyAPI.Web/Models/Response/Paging.cs | 27 + .../Models/Response/PlayHistoryItem.cs | 11 + .../Models/Response/PlaylistTrack.cs | 16 + .../Models/Response/PrivateUser.cs | 21 + .../Models/Response/PublicUser.cs | 18 + .../Response/RecommendationGenresResponse.cs | 10 + .../Models/Response/RecommendationSeed.cs | 19 + .../Response/RecommendationsResponse.cs | 11 + .../Models/Response/ResumePointObject.cs | 9 + .../Models/Response/SavedAlbum.cs | 11 + .../Models/Response/SavedShow.cs | 11 + .../Models/Response/SavedTrack.cs | 11 + .../Models/Response/SearchResponse.cs | 13 + .../SpotifyAPI.Web/Models/Response/Section.cs | 19 + .../SpotifyAPI.Web/Models/Response/Segment.cs | 18 + .../Models/Response/ShowsResponse.cs | 10 + .../Models/Response/SimpleAlbum.cs | 23 + .../Models/Response/SimpleArtist.cs | 14 + .../Models/Response/SimpleEpisode.cs | 34 + .../Models/Response/SimplePlaylist.cs | 29 + .../Models/Response/SimpleShow.cs | 24 + .../Models/Response/SimpleTrack.cs | 28 + .../Models/Response/SnapshotResponse.cs | 8 + .../Models/Response/TimeInterval.cs | 10 + .../Models/Response/TrackAudioAnalysis.cs | 14 + .../Models/Response/TrackAudioFeatures.cs | 25 + .../Response/TracksAudioFeaturesResponse.cs | 10 + .../Models/Response/TracksResponse.cs | 10 + .../SpotifyAPI.Web/Models/ResponseInfo.cs | 13 - Source Files/SpotifyAPI.Web/Models/Scopes.cs | 26 + .../SpotifyAPI.Web/Models/SearchItem.cs | 19 - .../SpotifyAPI.Web/Models/SeveralAlbums.cs | 11 - .../SpotifyAPI.Web/Models/SeveralArtists.cs | 11 - .../Models/SeveralAudioFeatures.cs | 11 - .../SpotifyAPI.Web/Models/SeveralTracks.cs | 11 - .../SpotifyAPI.Web/Models/SimpleAlbum.cs | 50 - .../SpotifyAPI.Web/Models/SimpleArtist.cs | 26 - .../SpotifyAPI.Web/Models/SimplePlaylist.cs | 44 - .../SpotifyAPI.Web/Models/SimpleTrack.cs | 50 - .../SpotifyAPI.Web/Models/Snapshot.cs | 10 - Source Files/SpotifyAPI.Web/Models/Token.cs | 47 - .../SpotifyAPI.Web/Models/TuneableTrack.cs | 69 - Source Files/SpotifyAPI.Web/ProxyConfig.cs | 77 - .../RetryHandlers/IRetryHandler.cs | 15 + .../RetryHandlers/SimpleRetryHandler.cs | 103 + .../SpotifyAPI.Web/SpotifyAPI.Web.csproj | 49 +- .../SpotifyAPI.Web/SpotifyAPI.Web.nuspec | 30 - Source Files/SpotifyAPI.Web/SpotifyUrls.cs | 130 + Source Files/SpotifyAPI.Web/SpotifyWebAPI.cs | 2958 ----------------- .../SpotifyAPI.Web/SpotifyWebBuilder.cs | 1129 ------- .../SpotifyAPI.Web/SpotifyWebClient.cs | 223 -- Source Files/SpotifyAPI.Web/Util.cs | 41 - .../SpotifyAPI.Web/Util/Base64Util.cs | 132 + Source Files/SpotifyAPI.Web/Util/Ensure.cs | 52 + Source Files/SpotifyAPI.Web/Util/PKCEUtil.cs | 69 + .../SpotifyAPI.Web/Util/StringAttribute.cs | 39 + .../SpotifyAPI.Web/Util/URIExtension.cs | 42 + .../Util/URIParameterFormatProvider.cs | 27 + Source Files/SpotifyIntegration.cs | 414 ++- Source Files/mb_Spotify-Plugin.csproj | 12 +- Source Files/mb_Spotify-Plugin.sln | 12 +- 304 files changed, 10030 insertions(+), 7502 deletions(-) create mode 100644 Plugins/EmbedIO.dll create mode 100644 Plugins/Swan.Lite.dll create mode 100644 Source Files/SpotifyAPI.Web.Auth/AssemblyInfo.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/AuthException.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/AuthUtil.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/BrowserUtil.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/CredentialsAuth.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/EmbedIOAuthServer.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/IAuthServer.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/ImplicitGrantAuth.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/Models/Response/AuthorizationCodeResponse.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/Models/Response/ImplicitGrantResponse.cs create mode 100644 Source Files/SpotifyAPI.Web.Auth/Models/Response/PkceResponse.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/css/bulma.min.css delete mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/1.png delete mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/2.png delete mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/start.html delete mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/ImplicitGrantAuth/index.html create mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/logo.svg create mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.css create mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.js create mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/default_site/favicon.ico create mode 100644 Source Files/SpotifyAPI.Web.Auth/Resources/default_site/index.html delete mode 100644 Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.nuspec delete mode 100644 Source Files/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/TokenSwapAuth.cs delete mode 100644 Source Files/SpotifyAPI.Web.Auth/TokenSwapWebAPIFactory.cs create mode 100644 Source Files/SpotifyAPI.Web/Assembly.cs create mode 100644 Source Files/SpotifyAPI.Web/Authenticators/AuthorizationCodeAuthenticator.cs create mode 100644 Source Files/SpotifyAPI.Web/Authenticators/ClientCredentialsAuthenticator.cs create mode 100644 Source Files/SpotifyAPI.Web/Authenticators/IAuthenticator.cs create mode 100644 Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs create mode 100644 Source Files/SpotifyAPI.Web/Authenticators/TokenAuthenticator.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/APIClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/AlbumsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/ArtistsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/BrowseClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/EpisodesClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/FollowClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IArtistsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IBrowseClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IEpisodesClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IFollowClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/ILibraryClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IOAuthClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IPaginator.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlayerClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlaylistsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/ISearchClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IShowsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/ITracksClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/Interfaces/IUserProfileClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/LibraryClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/OAuthClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/PersonalizationClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/PlayerClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/PlaylistsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/SearchClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/ShowsClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/SimplePaginator.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/SpotifyClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/SpotifyClientConfig.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/TracksClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Clients/UserProfileClient.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/AlbumType.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/FollowType.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/RepeatState.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/Scope.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/SearchType.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/TimeRangeType.cs delete mode 100644 Source Files/SpotifyAPI.Web/Enums/TrackType.cs create mode 100644 Source Files/SpotifyAPI.Web/Exceptions/APIException.cs create mode 100644 Source Files/SpotifyAPI.Web/Exceptions/APIPagingException.cs create mode 100644 Source Files/SpotifyAPI.Web/Exceptions/APITooManyRequestsException.cs create mode 100644 Source Files/SpotifyAPI.Web/Exceptions/APIUnauthorizedException.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/APIConnector.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/APIResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIConnector.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IHTTPLogger.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IHttpClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IJSONSerializer.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IProxyConfig.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Interfaces/IResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/NetHttpClient.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/NewtonsoftJSONSerializer.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/ProxyConfig.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Request.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/Response.cs create mode 100644 Source Files/SpotifyAPI.Web/Http/SimpleConsoleHTTPLogger.cs delete mode 100644 Source Files/SpotifyAPI.Web/IClient.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AnalysisMeta.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AnalysisSection.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AnalysisSegment.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AnalysisTimeSlice.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AnalysisTrack.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/ArrayResponse.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AudioAnalysis.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AudioFeatures.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/AvailabeDevices.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/BasicModel.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Category.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/CategoryList.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/CategoryPlaylist.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Converters/PlayableItemConverter.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/CursorPaging.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Device.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FeaturedPlaylists.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FollowedArtists.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FullAlbum.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FullArtist.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FullPlaylist.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/FullTrack.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/GeneralModels.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/IPaginatable.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/NewAlbumReleases.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Paging.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/PlayHistory.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/PlaybackContext.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/PrivateProfile.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/PublicProfile.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/RecommendationSeed .cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/RecommendationSeedGenres.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Recommendations.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/AlbumRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ArtistsAlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ArtistsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ArtistsTopTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeRefreshRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeTokenRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/CategoriesRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/CategoryPlaylistsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/CategoryRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ClientCredentialsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/EpisodeRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/EpisodesRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FeaturedPlaylistsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FollowCheckCurrentUserRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FollowCheckPlaylistRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FollowGetCurrentUserRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FollowPlaylistRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/FollowRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryAlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckAlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckShowsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveAlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveShowsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveAlbumsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveShowsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryShowsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LibraryTracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/LoginRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/NewReleasesRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRefreshRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerAddToQueueRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentPlaybackRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentlyPlayingRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerPausePlaybackRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerRecentlyPlayedRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerResumePlaybackRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerSeekToRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerSetRepeatRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerShuffleRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipNextRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipPreviousRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerTransferPlaybackRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlayerVolumeRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistAddItemsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistChangeDetailsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistCreateRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistCurrentUsersRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetItemsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetUsersRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistRemoveItemsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistReorderItemsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/PlaylistReplaceItemsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/RecommendationsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/RequestParams.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/SearchRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ShowEpisodesRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ShowRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/ShowsRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/TokenSwapRefreshRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/TokenSwapTokenRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/TrackRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/TracksAudioFeaturesRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/TracksRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Request/UnfollowRequest.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Actions.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ArtistsRelatedArtistsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ArtistsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ArtistsTopTracksResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeRefreshResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeTokenResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/CategoriesResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Category.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/CategoryPlaylistsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ClientCredentialsTokenResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Context.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Copyright.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlaying.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlayingContext.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Cursor.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/CursorPaging.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Device.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/DeviceResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/EpisodesResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FeaturedPlaylistsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FollowedArtistsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Followers.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullAlbum.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullArtist.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullEpisode.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullPlaylist.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullShow.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/FullTrack.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Image.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IPlaylistElement.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IRefreshableToken.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IToken.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IUserToken.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/LinkedTrack.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/NewReleasesResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/PKCETokenResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Paging.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/PlayHistoryItem.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/PlaylistTrack.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/PrivateUser.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/PublicUser.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/RecommendationGenresResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/RecommendationSeed.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/RecommendationsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ResumePointObject.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SavedAlbum.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SavedShow.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SavedTrack.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SearchResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Section.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/Segment.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/ShowsResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimpleAlbum.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimpleArtist.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimpleEpisode.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimplePlaylist.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimpleShow.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SimpleTrack.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/SnapshotResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/TimeInterval.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/TrackAudioAnalysis.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/TrackAudioFeatures.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/TracksAudioFeaturesResponse.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Response/TracksResponse.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/ResponseInfo.cs create mode 100644 Source Files/SpotifyAPI.Web/Models/Scopes.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SearchItem.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SeveralAlbums.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SeveralArtists.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SeveralAudioFeatures.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SeveralTracks.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SimpleAlbum.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SimpleArtist.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SimplePlaylist.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/SimpleTrack.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Snapshot.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/Token.cs delete mode 100644 Source Files/SpotifyAPI.Web/Models/TuneableTrack.cs delete mode 100644 Source Files/SpotifyAPI.Web/ProxyConfig.cs create mode 100644 Source Files/SpotifyAPI.Web/RetryHandlers/IRetryHandler.cs create mode 100644 Source Files/SpotifyAPI.Web/RetryHandlers/SimpleRetryHandler.cs delete mode 100644 Source Files/SpotifyAPI.Web/SpotifyAPI.Web.nuspec create mode 100644 Source Files/SpotifyAPI.Web/SpotifyUrls.cs delete mode 100644 Source Files/SpotifyAPI.Web/SpotifyWebAPI.cs delete mode 100644 Source Files/SpotifyAPI.Web/SpotifyWebBuilder.cs delete mode 100644 Source Files/SpotifyAPI.Web/SpotifyWebClient.cs delete mode 100644 Source Files/SpotifyAPI.Web/Util.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/Base64Util.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/Ensure.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/PKCEUtil.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/StringAttribute.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/URIExtension.cs create mode 100644 Source Files/SpotifyAPI.Web/Util/URIParameterFormatProvider.cs diff --git a/.gitignore b/.gitignore index 8debf01..0ff7e94 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,10 @@ +# git ls-files --others --exclude-from=.git/info/exclude +# Lines that start with '#' are comments. +# For a project mostly in C, the following would be a good set of +# exclude patterns (uncomment them if you want to use them): +# *.[oa] +# *~ + # Created by https://www.gitignore.io/api/visualstudio # Edit at https://www.gitignore.io/?templates=visualstudio @@ -8,6 +15,76 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +**/.idea/** + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/modules.xml +# .idea/*.iml +# .idea/modules + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +# JetBrains templates +**___jb_tmp___ + + # User-specific files *.rsuser *.suo diff --git a/Plugins/EmbedIO.dll b/Plugins/EmbedIO.dll new file mode 100644 index 0000000000000000000000000000000000000000..cfdff5ab338e277ce7245a76362c75a1341e8f17 GIT binary patch literal 350720 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 z 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 literal 0 HcmV?d00001 diff --git a/Plugins/SpotifyAPI.Web.Auth.dll b/Plugins/SpotifyAPI.Web.Auth.dll index 129f93631b4505ab4ecae912be8cc00ab859fa64..37224dd1dc6d378d5dee4e49b576bc16e114cdf1 100644 GIT binary patch literal 73728 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

YkolD92#7@up9 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

Gn>?lKn27?{A8xkfP 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%0A0Wo;80*5un1TNtN?BW?g8!t9t0i% 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 literal 0 HcmV?d00001 diff --git a/Source Files/PanelInterface.cs b/Source Files/PanelInterface.cs index c30c07c..1e5b33b 100644 --- a/Source Files/PanelInterface.cs +++ b/Source Files/PanelInterface.cs @@ -119,35 +119,35 @@ private void DrawPanel(object sender, PaintEventArgs e) e.Graphics.DrawImage(image, new Point(10, 80)); webClient.Dispose(); - - if (CheckTrack(_trackID)) - { - TextRenderer.DrawText(e.Graphics, "Track Saved in Library", smallBold, new Point(80, 85), text1); - } - else - { - TextRenderer.DrawText(e.Graphics, "Track Not in Library", smallRegular, new Point(80, 85), text1); - } - - if (CheckAlbum(_albumID)) - { - TextRenderer.DrawText(e.Graphics, "Album Saved in Library", smallBold, new Point(80, 105), text1); - } - else - { - TextRenderer.DrawText(e.Graphics, "Album Not in Library", smallRegular, new Point(80, 105), text1); - } - - if (CheckArtist(_artistID)) - { - TextRenderer.DrawText(e.Graphics, "Artist Already Followed", smallBold, new Point(80, 125), text1); - } - else - { - TextRenderer.DrawText(e.Graphics, "Artist Not Followed", smallRegular, new Point(80, 125), text1); - } - + if (CheckTrack(_trackID)) + { + TextRenderer.DrawText(e.Graphics, "Track Saved in Library", smallBold, new Point(80, 85), text1); + } + else + { + TextRenderer.DrawText(e.Graphics, "Track Not in Library", smallRegular, new Point(80, 85), text1); + } + + if (CheckAlbum(_albumID)) + { + TextRenderer.DrawText(e.Graphics, "Album Saved in Library", smallBold, new Point(80, 105), text1); + } + else + { + TextRenderer.DrawText(e.Graphics, "Album Not in Library", smallRegular, new Point(80, 105), text1); + } + + if (CheckArtist(_artistID)) + { + TextRenderer.DrawText(e.Graphics, "Artist Already Followed", smallBold, new Point(80, 125), text1); + } + else + { + TextRenderer.DrawText(e.Graphics, "Artist Not Followed", smallRegular, new Point(80, 125), text1); + } + + } else if (_auth == 1 && _trackMissing == 1) { @@ -237,26 +237,24 @@ private void PanelClick(object sender, EventArgs e) panel.Invalidate(); //panel.Paint += DrawPanel; } - + } else if (point.X > 80 && point.X < this.panel.Width && point.Y < 120 && point.Y > 110) { - + if (_albumLIB) { RemoveAlbum(); - GenerateAlbumList(); panel.Invalidate(); //panel.Paint += DrawPanel; } else { SaveAlbum(); - GenerateAlbumList(); panel.Invalidate(); //panel.Paint += DrawPanel; } - + } else if (point.X > 80 && point.X < this.panel.Width && point.Y < 100 && point.Y > 90) { @@ -273,9 +271,9 @@ private void PanelClick(object sender, EventArgs e) panel.Invalidate(); //panel.Paint += DrawPanel; } - + } - + } @@ -283,12 +281,11 @@ private void PanelClick(object sender, EventArgs e) } - public void ReceiveNotification(string sourceFileUrl, NotificationType type) + public async void ReceiveNotification(string sourceFileUrl, NotificationType type) { switch (type) { - // Window stacking doesn't work with custom panel plugins. //case NotificationType.PluginStartup: @@ -301,17 +298,17 @@ public void ReceiveNotification(string sourceFileUrl, NotificationType type) case NotificationType.TrackChanged: - if(_runOnce == true) - { - authTimer = new System.Threading.Timer( - new TimerCallback(TickTimer), - null, - 3600000, - 3600000); - - GenerateAlbumList(); - _runOnce = false; - } + //if(_runOnce == true) + //{ + // authTimer = new System.Threading.Timer( + // new TimerCallback(TickTimer), + // null, + // 3600000, + // 3600000); + + // GenerateAlbumList(); + // _runOnce = false; + //} _trackMissing = 0; @@ -322,7 +319,7 @@ public void ReceiveNotification(string sourceFileUrl, NotificationType type) if (_auth == 1) { mbApiInterface.MB_RefreshPanels(); - TrackSearch(); + await TrackSearch(); } diff --git a/Source Files/SpotifyAPI.Web.Auth/AssemblyInfo.cs b/Source Files/SpotifyAPI.Web.Auth/AssemblyInfo.cs new file mode 100644 index 0000000..661cd81 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/AssemblyInfo.cs @@ -0,0 +1,5 @@ +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SpotifyAPI.Web.Tests")] +[assembly: CLSCompliant(true)] diff --git a/Source Files/SpotifyAPI.Web.Auth/AuthException.cs b/Source Files/SpotifyAPI.Web.Auth/AuthException.cs new file mode 100644 index 0000000..aec059f --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/AuthException.cs @@ -0,0 +1,20 @@ +namespace SpotifyAPI.Web.Auth +{ + [System.Serializable] + public class AuthException : System.Exception + { + public AuthException(string? error, string? state) + { + Error = error; + State = state; + } + public AuthException(string message) : base(message) { } + public AuthException(string message, System.Exception inner) : base(message, inner) { } + protected AuthException( + System.Runtime.Serialization.SerializationInfo info, + System.Runtime.Serialization.StreamingContext context) : base(info, context) { } + + public string? Error { get; set; } + public string? State { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/AuthUtil.cs b/Source Files/SpotifyAPI.Web.Auth/AuthUtil.cs deleted file mode 100644 index 84719e6..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/AuthUtil.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Diagnostics; -using System.Runtime.InteropServices; -using System.Windows.Forms; -using System.Management.Automation; -using System.Collections.ObjectModel; -using System.Text.RegularExpressions; - -namespace SpotifyAPI.Web.Auth -{ - internal static class AuthUtil - { - public static void OpenBrowser(string url, bool AR) - { -#if NETSTANDARD2_0 - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - url = url.Replace("&", "^&"); - Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) - { - Process.Start("xdg-open", url); - } - else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - { - Process.Start("open", url); - } -#else - - - if (AR == true) - { - - - var proc = new Process(); - proc.StartInfo.FileName = "powershell.exe"; - proc.StartInfo.Arguments = $"$ie = new-object -com \"InternetExplorer.Application\"; $ie.navigate(\"\"\" {url} \"\"\"); $ie.visible = $true"; - proc.StartInfo.CreateNoWindow = true; - proc.StartInfo.RedirectStandardError = true; - proc.StartInfo.UseShellExecute = false; - - - if (!proc.Start()) - { - - MessageBox.Show("Powershell didn't start properly."); - return; - - } - - var reader = proc.StandardError; - string line; - while ((line = reader.ReadLine()) != null) System.Console.WriteLine(line); - - proc.Close(); - - - } - else - { - url = url.Replace("&", "^&"); - Process.Start(new ProcessStartInfo("cmd", $"/c start {url}")); - - } -#endif - } - - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs b/Source Files/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs deleted file mode 100644 index b8687c3..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/AuthorizationCodeAuth.cs +++ /dev/null @@ -1,134 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; -using Unosquare.Labs.EmbedIO; -using Unosquare.Labs.EmbedIO.Constants; -using Unosquare.Labs.EmbedIO.Modules; - -namespace SpotifyAPI.Web.Auth -{ - public class AuthorizationCodeAuth : SpotifyAuthServer - { - public string SecretId { get; set; } - - public AuthorizationCodeAuth(string redirectUri, string serverUri, Scope scope = Scope.None, string state = "") - : base("code", "AuthorizationCodeAuth", redirectUri, serverUri, scope, state) - { - } - - public AuthorizationCodeAuth(string clientId, string secretId, string redirectUri, string serverUri, Scope scope = Scope.None, string state = "") - : this(redirectUri, serverUri, scope, state) - { - ClientId = clientId; - SecretId = secretId; - } - - private bool ShouldRegisterNewApp() - { - return string.IsNullOrEmpty(SecretId) || string.IsNullOrEmpty(ClientId); - } - - public override string GetUri() - { - return ShouldRegisterNewApp() ? $"{RedirectUri}/start.html#{State}" : base.GetUri(); - } - - protected override void AdaptWebServer(WebServer webServer) - { - webServer.Module().RegisterController(); - } - - private string GetAuthHeader() => $"Basic {Convert.ToBase64String(Encoding.UTF8.GetBytes(ClientId + ":" + SecretId))}"; - - public async Task RefreshToken(string refreshToken) - { - List> args = new List> - { - new KeyValuePair("grant_type", "refresh_token"), - new KeyValuePair("refresh_token", refreshToken) - }; - - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("Authorization", GetAuthHeader()); - HttpContent content = new FormUrlEncodedContent(args); - - HttpResponseMessage resp = await client.PostAsync("https://accounts.spotify.com/api/token", content); - string msg = await resp.Content.ReadAsStringAsync(); - - return JsonConvert.DeserializeObject(msg); - } - public async Task ExchangeCode(string code) - { - List> args = new List> - { - new KeyValuePair("grant_type", "authorization_code"), - new KeyValuePair("code", code), - new KeyValuePair("redirect_uri", RedirectUri) - }; - - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("Authorization", GetAuthHeader()); - HttpContent content = new FormUrlEncodedContent(args); - - HttpResponseMessage resp = await client.PostAsync("https://accounts.spotify.com/api/token", content); - string msg = await resp.Content.ReadAsStringAsync(); - - return JsonConvert.DeserializeObject(msg); - } - } - - public class AuthorizationCode - { - public string Code { get; set; } - - public string Error { get; set; } - } - - internal class AuthorizationCodeAuthController : WebApiController - { - [WebApiHandler(HttpVerbs.Get, "/")] - public Task GetEmpty() - { - string state = Request.QueryString["state"]; - AuthorizationCodeAuth.Instances.TryGetValue(state, out SpotifyAuthServer auth); - - string code = null; - string error = Request.QueryString["error"]; - if (error == null) - code = Request.QueryString["code"]; - - Task.Factory.StartNew(() => auth?.TriggerAuth(new AuthorizationCode - { - Code = code, - Error = error - })); - - return this.StringResponseAsync("OK - This window can be closed now"); - } - - [WebApiHandler(HttpVerbs.Post, "/")] - public async Task PostValues() - { - Dictionary formParams = await this.RequestFormDataDictionaryAsync(); - - string state = (string) formParams["state"]; - AuthorizationCodeAuth.Instances.TryGetValue(state, out SpotifyAuthServer authServer); - - AuthorizationCodeAuth auth = (AuthorizationCodeAuth) authServer; - auth.ClientId = (string) formParams["clientId"]; - auth.SecretId = (string) formParams["secretId"]; - - string uri = auth.GetUri(); - return this.Redirect(uri, false); - } - - public AuthorizationCodeAuthController(IHttpContext context) : base(context) - { - } - } -} diff --git a/Source Files/SpotifyAPI.Web.Auth/BrowserUtil.cs b/Source Files/SpotifyAPI.Web.Auth/BrowserUtil.cs new file mode 100644 index 0000000..b8cda77 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/BrowserUtil.cs @@ -0,0 +1,26 @@ +using System.Diagnostics; +using System.Runtime.InteropServices; +using System; + +namespace SpotifyAPI.Web.Auth +{ + public static class BrowserUtil + { + public static void Open(Uri uri) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + var uriStr = uri.ToString().Replace("&", "^&"); + Process.Start(new ProcessStartInfo($"cmd", $"/c start {uriStr}")); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + Process.Start("xdg-open", uri.ToString()); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + Process.Start("open", uri.ToString()); + } + } + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/CredentialsAuth.cs b/Source Files/SpotifyAPI.Web.Auth/CredentialsAuth.cs deleted file mode 100644 index 1da062b..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/CredentialsAuth.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net.Http; -using System.Text; -using System.Threading.Tasks; -using Newtonsoft.Json; -using SpotifyAPI.Web.Models; - -namespace SpotifyAPI.Web.Auth -{ - public class CredentialsAuth - { - public string ClientSecret { get; set; } - - public string ClientId { get; set; } - - public CredentialsAuth(string clientId, string clientSecret) - { - ClientId = clientId; - ClientSecret = clientSecret; - } - - public async Task GetToken() - { - string auth = Convert.ToBase64String(Encoding.UTF8.GetBytes(ClientId + ":" + ClientSecret)); - - List> args = new List> - { - new KeyValuePair("grant_type", "client_credentials") - }; - - HttpClient client = new HttpClient(); - client.DefaultRequestHeaders.Add("Authorization", $"Basic {auth}"); - HttpContent content = new FormUrlEncodedContent(args); - - HttpResponseMessage resp = await client.PostAsync("https://accounts.spotify.com/api/token", content); - string msg = await resp.Content.ReadAsStringAsync(); - - return JsonConvert.DeserializeObject(msg); - } - } -} diff --git a/Source Files/SpotifyAPI.Web.Auth/EmbedIOAuthServer.cs b/Source Files/SpotifyAPI.Web.Auth/EmbedIOAuthServer.cs new file mode 100644 index 0000000..e1b7c73 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/EmbedIOAuthServer.cs @@ -0,0 +1,114 @@ +using System.Reflection; +using System.Threading; +using System.Web; +using System.Globalization; +using System.Text; +using System; +using System.Threading.Tasks; +using EmbedIO; +using EmbedIO.Actions; + +namespace SpotifyAPI.Web.Auth +{ + public class EmbedIOAuthServer : IAuthServer + { + public event Func? AuthorizationCodeReceived; + public event Func? ImplictGrantReceived; + public event Func? PkceReceived; + + private const string AssetsResourcePath = "SpotifyAPI.Web.Auth.Resources.auth_assets"; + private const string DefaultResourcePath = "SpotifyAPI.Web.Auth.Resources.default_site"; + + private CancellationTokenSource? _cancelTokenSource; + private readonly WebServer _webServer; + + public EmbedIOAuthServer(Uri baseUri, int port) + : this(baseUri, port, Assembly.GetExecutingAssembly(), DefaultResourcePath) { } + + public EmbedIOAuthServer(Uri baseUri, int port, Assembly resourceAssembly, string resourcePath) + { + Ensure.ArgumentNotNull(baseUri, nameof(baseUri)); + + BaseUri = baseUri; + Port = port; + + _webServer = new WebServer(port) + .WithModule(new ActionModule("/callback", HttpVerbs.Post, (ctx) => + { + var query = ctx.Request.QueryString; + var error = query["error"]; + if (error != null) + { + throw new AuthException(error, query["state"]); + } + + PkceReceived?.Invoke(this, new PkceResponse(query["code"]!) + { + State = query["state"] + }); + + return ctx.SendStringAsync("OK", "text/plain", Encoding.UTF8); + })) + .WithModule(new ActionModule("/", HttpVerbs.Post, (ctx) => + { + var query = ctx.Request.QueryString; + var error = query["error"]; + if (error != null) + { + throw new AuthException(error, query["state"]); + } + + var requestType = query.Get("request_type"); + if (requestType == "token") + { + ImplictGrantReceived?.Invoke(this, new ImplictGrantResponse( + query["access_token"]!, query["token_type"]!, int.Parse(query["expires_in"]!) + ) + { + State = query["state"] + }); + } + if (requestType == "code") + { + AuthorizationCodeReceived?.Invoke(this, new AuthorizationCodeResponse(query["code"]!) + { + State = query["state"] + }); + } + return ctx.SendStringAsync("OK", "text/plain", Encoding.UTF8); + })) + .WithEmbeddedResources("/auth_assets", Assembly.GetExecutingAssembly(), AssetsResourcePath) + .WithEmbeddedResources(baseUri.AbsolutePath, resourceAssembly, resourcePath); + } + + public Uri BaseUri { get; } + public int Port { get; } + + public Task Start() + { + _cancelTokenSource = new CancellationTokenSource(); + _webServer.Start(_cancelTokenSource.Token); + return Task.CompletedTask; + } + + public Task Stop() + { + _cancelTokenSource?.Cancel(); + return Task.CompletedTask; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _webServer?.Dispose(); + } + } + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/IAuthServer.cs b/Source Files/SpotifyAPI.Web.Auth/IAuthServer.cs new file mode 100644 index 0000000..1347121 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/IAuthServer.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Auth +{ + public interface IAuthServer : IDisposable + { + event Func AuthorizationCodeReceived; + + event Func ImplictGrantReceived; + + event Func PkceReceived; + + Task Start(); + Task Stop(); + + Uri BaseUri { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/ImplicitGrantAuth.cs b/Source Files/SpotifyAPI.Web.Auth/ImplicitGrantAuth.cs deleted file mode 100644 index c99809f..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/ImplicitGrantAuth.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Threading.Tasks; -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; -using Unosquare.Labs.EmbedIO; -using Unosquare.Labs.EmbedIO.Constants; -using Unosquare.Labs.EmbedIO.Modules; - -namespace SpotifyAPI.Web.Auth -{ - public class ImplicitGrantAuth : SpotifyAuthServer - { - public ImplicitGrantAuth(string clientId, string redirectUri, string serverUri, Scope scope = Scope.None, string state = "") : - base("token", "ImplicitGrantAuth", redirectUri, serverUri, scope, state) - { - ClientId = clientId; - } - - protected override void AdaptWebServer(WebServer webServer) - { - webServer.Module().RegisterController(); - } - } - - public class ImplicitGrantAuthController : WebApiController - { - [WebApiHandler(HttpVerbs.Get, "/auth")] - public Task GetAuth() - { - string state = Request.QueryString["state"]; - SpotifyAuthServer auth = ImplicitGrantAuth.GetByState(state); - if (auth == null) - return this.StringResponseAsync( - $"Failed - Unable to find auth request with state \"{state}\" - Please retry"); - - Token token; - string error = Request.QueryString["error"]; - if (error == null) - { - string accessToken = Request.QueryString["access_token"]; - string tokenType = Request.QueryString["token_type"]; - string expiresIn = Request.QueryString["expires_in"]; - token = new Token - { - AccessToken = accessToken, - ExpiresIn = double.Parse(expiresIn), - TokenType = tokenType - }; - } - else - { - token = new Token - { - Error = error - }; - } - - Task.Factory.StartNew(() => auth.TriggerAuth(token)); - return this.StringResponseAsync("OK - This window can be closed now"); - } - - public ImplicitGrantAuthController(IHttpContext context) : base(context) - { - } - } -} diff --git a/Source Files/SpotifyAPI.Web.Auth/Models/Response/AuthorizationCodeResponse.cs b/Source Files/SpotifyAPI.Web.Auth/Models/Response/AuthorizationCodeResponse.cs new file mode 100644 index 0000000..b83bec2 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Models/Response/AuthorizationCodeResponse.cs @@ -0,0 +1,15 @@ +namespace SpotifyAPI.Web.Auth +{ + public class AuthorizationCodeResponse + { + public AuthorizationCodeResponse(string code) + { + Ensure.ArgumentNotNullOrEmptyString(code, nameof(code)); + + Code = code; + } + + public string Code { get; set; } = default!; + public string? State { get; set; } = default!; + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/Models/Response/ImplicitGrantResponse.cs b/Source Files/SpotifyAPI.Web.Auth/Models/Response/ImplicitGrantResponse.cs new file mode 100644 index 0000000..7f8e256 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Models/Response/ImplicitGrantResponse.cs @@ -0,0 +1,30 @@ +using System; + +namespace SpotifyAPI.Web.Auth +{ + public class ImplictGrantResponse + { + public ImplictGrantResponse(string accessToken, string tokenType, int expiresIn) + { + Ensure.ArgumentNotNullOrEmptyString(accessToken, nameof(accessToken)); + Ensure.ArgumentNotNullOrEmptyString(tokenType, nameof(tokenType)); + + AccessToken = accessToken; + TokenType = tokenType; + ExpiresIn = expiresIn; + } + + public string AccessToken { get; set; } = default!; + public string TokenType { get; set; } = default!; + public int ExpiresIn { get; set; } + public string? State { get; set; } = default!; + + /// + /// Auto-Initalized to UTC Now + /// + /// + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + public bool IsExpired { get => CreatedAt.AddSeconds(ExpiresIn) <= DateTime.UtcNow; } + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/Models/Response/PkceResponse.cs b/Source Files/SpotifyAPI.Web.Auth/Models/Response/PkceResponse.cs new file mode 100644 index 0000000..6dcfdbb --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Models/Response/PkceResponse.cs @@ -0,0 +1,15 @@ +namespace SpotifyAPI.Web.Auth +{ + public class PkceResponse + { + public PkceResponse(string code) + { + Ensure.ArgumentNotNullOrEmptyString(code, nameof(code)); + + Code = code; + } + + public string Code { get; set; } = default!; + public string? State { get; set; } = default!; + } +} diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/css/bulma.min.css b/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/css/bulma.min.css deleted file mode 100644 index 59825f7..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/css/bulma.min.css +++ /dev/null @@ -1 +0,0 @@ -/*! bulma.io v0.7.1 | MIT License | github.com/jgthms/bulma */@-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.breadcrumb,.button,.delete,.file,.is-unselectable,.modal-close,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.tabs{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.navbar-link::after,.select:not(.is-multiple):not(.is-loading)::after{border:3px solid transparent;border-radius:2px;border-right:0;border-top:0;content:" ";display:block;height:.625em;margin-top:-.4375em;pointer-events:none;position:absolute;top:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:center;transform-origin:center;width:.625em}.block:not(:last-child),.box:not(:last-child),.breadcrumb:not(:last-child),.content:not(:last-child),.highlight:not(:last-child),.level:not(:last-child),.message:not(:last-child),.notification:not(:last-child),.progress:not(:last-child),.subtitle:not(:last-child),.table-container:not(:last-child),.table:not(:last-child),.tabs:not(:last-child),.title:not(:last-child){margin-bottom:1.5rem}.delete,.modal-close{-moz-appearance:none;-webkit-appearance:none;background-color:rgba(10,10,10,.2);border:none;border-radius:290486px;cursor:pointer;display:inline-block;flex-grow:0;flex-shrink:0;font-size:0;height:20px;max-height:20px;max-width:20px;min-height:20px;min-width:20px;outline:0;position:relative;vertical-align:top;width:20px}.delete::after,.delete::before,.modal-close::after,.modal-close::before{background-color:#fff;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.delete::before,.modal-close::before{height:2px;width:50%}.delete::after,.modal-close::after{height:50%;width:2px}.delete:focus,.delete:hover,.modal-close:focus,.modal-close:hover{background-color:rgba(10,10,10,.3)}.delete:active,.modal-close:active{background-color:rgba(10,10,10,.4)}.is-small.delete,.is-small.modal-close{height:16px;max-height:16px;max-width:16px;min-height:16px;min-width:16px;width:16px}.is-medium.delete,.is-medium.modal-close{height:24px;max-height:24px;max-width:24px;min-height:24px;min-width:24px;width:24px}.is-large.delete,.is-large.modal-close{height:32px;max-height:32px;max-width:32px;min-height:32px;min-width:32px;width:32px}.button.is-loading::after,.control.is-loading::after,.loader,.select.is-loading::after{-webkit-animation:spinAround .5s infinite linear;animation:spinAround .5s infinite linear;border:2px solid #dbdbdb;border-radius:290486px;border-right-color:transparent;border-top-color:transparent;content:"";display:block;height:1em;position:relative;width:1em}.hero-video,.image.is-16by9 img,.image.is-1by1 img,.image.is-1by2 img,.image.is-1by3 img,.image.is-2by1 img,.image.is-2by3 img,.image.is-3by1 img,.image.is-3by2 img,.image.is-3by4 img,.image.is-3by5 img,.image.is-4by3 img,.image.is-4by5 img,.image.is-5by3 img,.image.is-5by4 img,.image.is-9by16 img,.image.is-square img,.is-overlay,.modal,.modal-background{bottom:0;left:0;position:absolute;right:0;top:0}.button,.file-cta,.file-name,.input,.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous,.select select,.textarea{-moz-appearance:none;-webkit-appearance:none;align-items:center;border:1px solid transparent;border-radius:4px;box-shadow:none;display:inline-flex;font-size:1rem;height:2.25em;justify-content:flex-start;line-height:1.5;padding-bottom:calc(.375em - 1px);padding-left:calc(.625em - 1px);padding-right:calc(.625em - 1px);padding-top:calc(.375em - 1px);position:relative;vertical-align:top}.button:active,.button:focus,.file-cta:active,.file-cta:focus,.file-name:active,.file-name:focus,.input:active,.input:focus,.is-active.button,.is-active.file-cta,.is-active.file-name,.is-active.input,.is-active.pagination-ellipsis,.is-active.pagination-link,.is-active.pagination-next,.is-active.pagination-previous,.is-active.textarea,.is-focused.button,.is-focused.file-cta,.is-focused.file-name,.is-focused.input,.is-focused.pagination-ellipsis,.is-focused.pagination-link,.is-focused.pagination-next,.is-focused.pagination-previous,.is-focused.textarea,.pagination-ellipsis:active,.pagination-ellipsis:focus,.pagination-link:active,.pagination-link:focus,.pagination-next:active,.pagination-next:focus,.pagination-previous:active,.pagination-previous:focus,.select select.is-active,.select select.is-focused,.select select:active,.select select:focus,.textarea:active,.textarea:focus{outline:0}.button[disabled],.file-cta[disabled],.file-name[disabled],.input[disabled],.pagination-ellipsis[disabled],.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled],.select select[disabled],.textarea[disabled]{cursor:not-allowed}/*! minireset.css v0.0.3 | MIT License | github.com/jgthms/minireset.css */blockquote,body,dd,dl,dt,fieldset,figure,h1,h2,h3,h4,h5,h6,hr,html,iframe,legend,li,ol,p,pre,textarea,ul{margin:0;padding:0}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:400}ul{list-style:none}button,input,select,textarea{margin:0}html{box-sizing:border-box}*,::after,::before{box-sizing:inherit}audio,img,video{height:auto;max-width:100%}iframe{border:0}table{border-collapse:collapse;border-spacing:0}td,th{padding:0;text-align:left}html{background-color:#fff;font-size:16px;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;min-width:300px;overflow-x:hidden;overflow-y:scroll;text-rendering:optimizeLegibility;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;-ms-text-size-adjust:100%;text-size-adjust:100%}article,aside,figure,footer,header,hgroup,section{display:block}body,button,input,select,textarea{font-family:BlinkMacSystemFont,-apple-system,"Segoe UI",Roboto,Oxygen,Ubuntu,Cantarell,"Fira Sans","Droid Sans","Helvetica Neue",Helvetica,Arial,sans-serif}code,pre{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:auto;font-family:monospace}body{color:#4a4a4a;font-size:1rem;font-weight:400;line-height:1.5}a{color:#3273dc;cursor:pointer;text-decoration:none}a strong{color:currentColor}a:hover{color:#363636}code{background-color:#f5f5f5;color:#ff3860;font-size:.875em;font-weight:400;padding:.25em .5em .25em}hr{background-color:#f5f5f5;border:none;display:block;height:2px;margin:1.5rem 0}img{height:auto;max-width:100%}input[type=checkbox],input[type=radio]{vertical-align:baseline}small{font-size:.875em}span{font-style:inherit;font-weight:inherit}strong{color:#363636;font-weight:700}pre{-webkit-overflow-scrolling:touch;background-color:#f5f5f5;color:#4a4a4a;font-size:.875em;overflow-x:auto;padding:1.25rem 1.5rem;white-space:pre;word-wrap:normal}pre code{background-color:transparent;color:currentColor;font-size:1em;padding:0}table td,table th{text-align:left;vertical-align:top}table th{color:#363636}.is-clearfix::after{clear:both;content:" ";display:table}.is-pulled-left{float:left!important}.is-pulled-right{float:right!important}.is-clipped{overflow:hidden!important}.is-size-1{font-size:3rem!important}.is-size-2{font-size:2.5rem!important}.is-size-3{font-size:2rem!important}.is-size-4{font-size:1.5rem!important}.is-size-5{font-size:1.25rem!important}.is-size-6{font-size:1rem!important}.is-size-7{font-size:.75rem!important}@media screen and (max-width:768px){.is-size-1-mobile{font-size:3rem!important}.is-size-2-mobile{font-size:2.5rem!important}.is-size-3-mobile{font-size:2rem!important}.is-size-4-mobile{font-size:1.5rem!important}.is-size-5-mobile{font-size:1.25rem!important}.is-size-6-mobile{font-size:1rem!important}.is-size-7-mobile{font-size:.75rem!important}}@media screen and (min-width:769px),print{.is-size-1-tablet{font-size:3rem!important}.is-size-2-tablet{font-size:2.5rem!important}.is-size-3-tablet{font-size:2rem!important}.is-size-4-tablet{font-size:1.5rem!important}.is-size-5-tablet{font-size:1.25rem!important}.is-size-6-tablet{font-size:1rem!important}.is-size-7-tablet{font-size:.75rem!important}}@media screen and (max-width:1087px){.is-size-1-touch{font-size:3rem!important}.is-size-2-touch{font-size:2.5rem!important}.is-size-3-touch{font-size:2rem!important}.is-size-4-touch{font-size:1.5rem!important}.is-size-5-touch{font-size:1.25rem!important}.is-size-6-touch{font-size:1rem!important}.is-size-7-touch{font-size:.75rem!important}}@media screen and (min-width:1088px){.is-size-1-desktop{font-size:3rem!important}.is-size-2-desktop{font-size:2.5rem!important}.is-size-3-desktop{font-size:2rem!important}.is-size-4-desktop{font-size:1.5rem!important}.is-size-5-desktop{font-size:1.25rem!important}.is-size-6-desktop{font-size:1rem!important}.is-size-7-desktop{font-size:.75rem!important}}@media screen and (min-width:1280px){.is-size-1-widescreen{font-size:3rem!important}.is-size-2-widescreen{font-size:2.5rem!important}.is-size-3-widescreen{font-size:2rem!important}.is-size-4-widescreen{font-size:1.5rem!important}.is-size-5-widescreen{font-size:1.25rem!important}.is-size-6-widescreen{font-size:1rem!important}.is-size-7-widescreen{font-size:.75rem!important}}@media screen and (min-width:1472px){.is-size-1-fullhd{font-size:3rem!important}.is-size-2-fullhd{font-size:2.5rem!important}.is-size-3-fullhd{font-size:2rem!important}.is-size-4-fullhd{font-size:1.5rem!important}.is-size-5-fullhd{font-size:1.25rem!important}.is-size-6-fullhd{font-size:1rem!important}.is-size-7-fullhd{font-size:.75rem!important}}.has-text-centered{text-align:center!important}.has-text-justified{text-align:justify!important}.has-text-left{text-align:left!important}.has-text-right{text-align:right!important}@media screen and (max-width:768px){.has-text-centered-mobile{text-align:center!important}}@media screen and (min-width:769px),print{.has-text-centered-tablet{text-align:center!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-centered-tablet-only{text-align:center!important}}@media screen and (max-width:1087px){.has-text-centered-touch{text-align:center!important}}@media screen and (min-width:1088px){.has-text-centered-desktop{text-align:center!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-centered-desktop-only{text-align:center!important}}@media screen and (min-width:1280px){.has-text-centered-widescreen{text-align:center!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-centered-widescreen-only{text-align:center!important}}@media screen and (min-width:1472px){.has-text-centered-fullhd{text-align:center!important}}@media screen and (max-width:768px){.has-text-justified-mobile{text-align:justify!important}}@media screen and (min-width:769px),print{.has-text-justified-tablet{text-align:justify!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-justified-tablet-only{text-align:justify!important}}@media screen and (max-width:1087px){.has-text-justified-touch{text-align:justify!important}}@media screen and (min-width:1088px){.has-text-justified-desktop{text-align:justify!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-justified-desktop-only{text-align:justify!important}}@media screen and (min-width:1280px){.has-text-justified-widescreen{text-align:justify!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-justified-widescreen-only{text-align:justify!important}}@media screen and (min-width:1472px){.has-text-justified-fullhd{text-align:justify!important}}@media screen and (max-width:768px){.has-text-left-mobile{text-align:left!important}}@media screen and (min-width:769px),print{.has-text-left-tablet{text-align:left!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-left-tablet-only{text-align:left!important}}@media screen and (max-width:1087px){.has-text-left-touch{text-align:left!important}}@media screen and (min-width:1088px){.has-text-left-desktop{text-align:left!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-left-desktop-only{text-align:left!important}}@media screen and (min-width:1280px){.has-text-left-widescreen{text-align:left!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-left-widescreen-only{text-align:left!important}}@media screen and (min-width:1472px){.has-text-left-fullhd{text-align:left!important}}@media screen and (max-width:768px){.has-text-right-mobile{text-align:right!important}}@media screen and (min-width:769px),print{.has-text-right-tablet{text-align:right!important}}@media screen and (min-width:769px) and (max-width:1087px){.has-text-right-tablet-only{text-align:right!important}}@media screen and (max-width:1087px){.has-text-right-touch{text-align:right!important}}@media screen and (min-width:1088px){.has-text-right-desktop{text-align:right!important}}@media screen and (min-width:1088px) and (max-width:1279px){.has-text-right-desktop-only{text-align:right!important}}@media screen and (min-width:1280px){.has-text-right-widescreen{text-align:right!important}}@media screen and (min-width:1280px) and (max-width:1471px){.has-text-right-widescreen-only{text-align:right!important}}@media screen and (min-width:1472px){.has-text-right-fullhd{text-align:right!important}}.is-capitalized{text-transform:capitalize!important}.is-lowercase{text-transform:lowercase!important}.is-uppercase{text-transform:uppercase!important}.is-italic{font-style:italic!important}.has-text-white{color:#fff!important}a.has-text-white:focus,a.has-text-white:hover{color:#e6e6e6!important}.has-background-white{background-color:#fff!important}.has-text-black{color:#0a0a0a!important}a.has-text-black:focus,a.has-text-black:hover{color:#000!important}.has-background-black{background-color:#0a0a0a!important}.has-text-light{color:#f5f5f5!important}a.has-text-light:focus,a.has-text-light:hover{color:#dbdbdb!important}.has-background-light{background-color:#f5f5f5!important}.has-text-dark{color:#363636!important}a.has-text-dark:focus,a.has-text-dark:hover{color:#1c1c1c!important}.has-background-dark{background-color:#363636!important}.has-text-primary{color:#00d1b2!important}a.has-text-primary:focus,a.has-text-primary:hover{color:#009e86!important}.has-background-primary{background-color:#00d1b2!important}.has-text-link{color:#3273dc!important}a.has-text-link:focus,a.has-text-link:hover{color:#205bbc!important}.has-background-link{background-color:#3273dc!important}.has-text-info{color:#209cee!important}a.has-text-info:focus,a.has-text-info:hover{color:#0f81cc!important}.has-background-info{background-color:#209cee!important}.has-text-success{color:#23d160!important}a.has-text-success:focus,a.has-text-success:hover{color:#1ca64c!important}.has-background-success{background-color:#23d160!important}.has-text-warning{color:#ffdd57!important}a.has-text-warning:focus,a.has-text-warning:hover{color:#ffd324!important}.has-background-warning{background-color:#ffdd57!important}.has-text-danger{color:#ff3860!important}a.has-text-danger:focus,a.has-text-danger:hover{color:#ff0537!important}.has-background-danger{background-color:#ff3860!important}.has-text-black-bis{color:#121212!important}.has-background-black-bis{background-color:#121212!important}.has-text-black-ter{color:#242424!important}.has-background-black-ter{background-color:#242424!important}.has-text-grey-darker{color:#363636!important}.has-background-grey-darker{background-color:#363636!important}.has-text-grey-dark{color:#4a4a4a!important}.has-background-grey-dark{background-color:#4a4a4a!important}.has-text-grey{color:#7a7a7a!important}.has-background-grey{background-color:#7a7a7a!important}.has-text-grey-light{color:#b5b5b5!important}.has-background-grey-light{background-color:#b5b5b5!important}.has-text-grey-lighter{color:#dbdbdb!important}.has-background-grey-lighter{background-color:#dbdbdb!important}.has-text-white-ter{color:#f5f5f5!important}.has-background-white-ter{background-color:#f5f5f5!important}.has-text-white-bis{color:#fafafa!important}.has-background-white-bis{background-color:#fafafa!important}.has-text-weight-light{font-weight:300!important}.has-text-weight-normal{font-weight:400!important}.has-text-weight-semibold{font-weight:600!important}.has-text-weight-bold{font-weight:700!important}.is-block{display:block!important}@media screen and (max-width:768px){.is-block-mobile{display:block!important}}@media screen and (min-width:769px),print{.is-block-tablet{display:block!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-block-tablet-only{display:block!important}}@media screen and (max-width:1087px){.is-block-touch{display:block!important}}@media screen and (min-width:1088px){.is-block-desktop{display:block!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-block-desktop-only{display:block!important}}@media screen and (min-width:1280px){.is-block-widescreen{display:block!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-block-widescreen-only{display:block!important}}@media screen and (min-width:1472px){.is-block-fullhd{display:block!important}}.is-flex{display:flex!important}@media screen and (max-width:768px){.is-flex-mobile{display:flex!important}}@media screen and (min-width:769px),print{.is-flex-tablet{display:flex!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-flex-tablet-only{display:flex!important}}@media screen and (max-width:1087px){.is-flex-touch{display:flex!important}}@media screen and (min-width:1088px){.is-flex-desktop{display:flex!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-flex-desktop-only{display:flex!important}}@media screen and (min-width:1280px){.is-flex-widescreen{display:flex!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-flex-widescreen-only{display:flex!important}}@media screen and (min-width:1472px){.is-flex-fullhd{display:flex!important}}.is-inline{display:inline!important}@media screen and (max-width:768px){.is-inline-mobile{display:inline!important}}@media screen and (min-width:769px),print{.is-inline-tablet{display:inline!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-tablet-only{display:inline!important}}@media screen and (max-width:1087px){.is-inline-touch{display:inline!important}}@media screen and (min-width:1088px){.is-inline-desktop{display:inline!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-desktop-only{display:inline!important}}@media screen and (min-width:1280px){.is-inline-widescreen{display:inline!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-widescreen-only{display:inline!important}}@media screen and (min-width:1472px){.is-inline-fullhd{display:inline!important}}.is-inline-block{display:inline-block!important}@media screen and (max-width:768px){.is-inline-block-mobile{display:inline-block!important}}@media screen and (min-width:769px),print{.is-inline-block-tablet{display:inline-block!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-block-tablet-only{display:inline-block!important}}@media screen and (max-width:1087px){.is-inline-block-touch{display:inline-block!important}}@media screen and (min-width:1088px){.is-inline-block-desktop{display:inline-block!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-block-desktop-only{display:inline-block!important}}@media screen and (min-width:1280px){.is-inline-block-widescreen{display:inline-block!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-block-widescreen-only{display:inline-block!important}}@media screen and (min-width:1472px){.is-inline-block-fullhd{display:inline-block!important}}.is-inline-flex{display:inline-flex!important}@media screen and (max-width:768px){.is-inline-flex-mobile{display:inline-flex!important}}@media screen and (min-width:769px),print{.is-inline-flex-tablet{display:inline-flex!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-inline-flex-tablet-only{display:inline-flex!important}}@media screen and (max-width:1087px){.is-inline-flex-touch{display:inline-flex!important}}@media screen and (min-width:1088px){.is-inline-flex-desktop{display:inline-flex!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-inline-flex-desktop-only{display:inline-flex!important}}@media screen and (min-width:1280px){.is-inline-flex-widescreen{display:inline-flex!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-inline-flex-widescreen-only{display:inline-flex!important}}@media screen and (min-width:1472px){.is-inline-flex-fullhd{display:inline-flex!important}}.is-hidden{display:none!important}@media screen and (max-width:768px){.is-hidden-mobile{display:none!important}}@media screen and (min-width:769px),print{.is-hidden-tablet{display:none!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-hidden-tablet-only{display:none!important}}@media screen and (max-width:1087px){.is-hidden-touch{display:none!important}}@media screen and (min-width:1088px){.is-hidden-desktop{display:none!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-hidden-desktop-only{display:none!important}}@media screen and (min-width:1280px){.is-hidden-widescreen{display:none!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-hidden-widescreen-only{display:none!important}}@media screen and (min-width:1472px){.is-hidden-fullhd{display:none!important}}.is-invisible{visibility:hidden!important}@media screen and (max-width:768px){.is-invisible-mobile{visibility:hidden!important}}@media screen and (min-width:769px),print{.is-invisible-tablet{visibility:hidden!important}}@media screen and (min-width:769px) and (max-width:1087px){.is-invisible-tablet-only{visibility:hidden!important}}@media screen and (max-width:1087px){.is-invisible-touch{visibility:hidden!important}}@media screen and (min-width:1088px){.is-invisible-desktop{visibility:hidden!important}}@media screen and (min-width:1088px) and (max-width:1279px){.is-invisible-desktop-only{visibility:hidden!important}}@media screen and (min-width:1280px){.is-invisible-widescreen{visibility:hidden!important}}@media screen and (min-width:1280px) and (max-width:1471px){.is-invisible-widescreen-only{visibility:hidden!important}}@media screen and (min-width:1472px){.is-invisible-fullhd{visibility:hidden!important}}.is-marginless{margin:0!important}.is-paddingless{padding:0!important}.is-radiusless{border-radius:0!important}.is-shadowless{box-shadow:none!important}.box{background-color:#fff;border-radius:6px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;display:block;padding:1.25rem}a.box:focus,a.box:hover{box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px #3273dc}a.box:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2),0 0 0 1px #3273dc}.button{background-color:#fff;border-color:#dbdbdb;border-width:1px;color:#363636;cursor:pointer;justify-content:center;padding-bottom:calc(.375em - 1px);padding-left:.75em;padding-right:.75em;padding-top:calc(.375em - 1px);text-align:center;white-space:nowrap}.button strong{color:inherit}.button .icon,.button .icon.is-large,.button .icon.is-medium,.button .icon.is-small{height:1.5em;width:1.5em}.button .icon:first-child:not(:last-child){margin-left:calc(-.375em - 1px);margin-right:.1875em}.button .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:calc(-.375em - 1px)}.button .icon:first-child:last-child{margin-left:calc(-.375em - 1px);margin-right:calc(-.375em - 1px)}.button.is-hovered,.button:hover{border-color:#b5b5b5;color:#363636}.button.is-focused,.button:focus{border-color:#3273dc;color:#363636}.button.is-focused:not(:active),.button:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-active,.button:active{border-color:#4a4a4a;color:#363636}.button.is-text{background-color:transparent;border-color:transparent;color:#4a4a4a;text-decoration:underline}.button.is-text.is-focused,.button.is-text.is-hovered,.button.is-text:focus,.button.is-text:hover{background-color:#f5f5f5;color:#363636}.button.is-text.is-active,.button.is-text:active{background-color:#e8e8e8;color:#363636}.button.is-text[disabled]{background-color:transparent;border-color:transparent;box-shadow:none}.button.is-white{background-color:#fff;border-color:transparent;color:#0a0a0a}.button.is-white.is-hovered,.button.is-white:hover{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.button.is-white.is-focused,.button.is-white:focus{border-color:transparent;color:#0a0a0a}.button.is-white.is-focused:not(:active),.button.is-white:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.button.is-white.is-active,.button.is-white:active{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.button.is-white[disabled]{background-color:#fff;border-color:transparent;box-shadow:none}.button.is-white.is-inverted{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted:hover{background-color:#000}.button.is-white.is-inverted[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none;color:#fff}.button.is-white.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-white.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-white.is-outlined:focus,.button.is-white.is-outlined:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.button.is-white.is-outlined.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-white.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-white.is-inverted.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-white.is-inverted.is-outlined:focus,.button.is-white.is-inverted.is-outlined:hover{background-color:#0a0a0a;color:#fff}.button.is-white.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black{background-color:#0a0a0a;border-color:transparent;color:#fff}.button.is-black.is-hovered,.button.is-black:hover{background-color:#040404;border-color:transparent;color:#fff}.button.is-black.is-focused,.button.is-black:focus{border-color:transparent;color:#fff}.button.is-black.is-focused:not(:active),.button.is-black:focus:not(:active){box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.button.is-black.is-active,.button.is-black:active{background-color:#000;border-color:transparent;color:#fff}.button.is-black[disabled]{background-color:#0a0a0a;border-color:transparent;box-shadow:none}.button.is-black.is-inverted{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted:hover{background-color:#f2f2f2}.button.is-black.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#0a0a0a}.button.is-black.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-black.is-outlined{background-color:transparent;border-color:#0a0a0a;color:#0a0a0a}.button.is-black.is-outlined:focus,.button.is-black.is-outlined:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.button.is-black.is-outlined.is-loading::after{border-color:transparent transparent #0a0a0a #0a0a0a!important}.button.is-black.is-outlined[disabled]{background-color:transparent;border-color:#0a0a0a;box-shadow:none;color:#0a0a0a}.button.is-black.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-black.is-inverted.is-outlined:focus,.button.is-black.is-inverted.is-outlined:hover{background-color:#fff;color:#0a0a0a}.button.is-black.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-light{background-color:#f5f5f5;border-color:transparent;color:#363636}.button.is-light.is-hovered,.button.is-light:hover{background-color:#eee;border-color:transparent;color:#363636}.button.is-light.is-focused,.button.is-light:focus{border-color:transparent;color:#363636}.button.is-light.is-focused:not(:active),.button.is-light:focus:not(:active){box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.button.is-light.is-active,.button.is-light:active{background-color:#e8e8e8;border-color:transparent;color:#363636}.button.is-light[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none}.button.is-light.is-inverted{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted:hover{background-color:#292929}.button.is-light.is-inverted[disabled]{background-color:#363636;border-color:transparent;box-shadow:none;color:#f5f5f5}.button.is-light.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-light.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-light.is-outlined:focus,.button.is-light.is-outlined:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.button.is-light.is-outlined.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-light.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-light.is-inverted.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-light.is-inverted.is-outlined:focus,.button.is-light.is-inverted.is-outlined:hover{background-color:#363636;color:#f5f5f5}.button.is-light.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark{background-color:#363636;border-color:transparent;color:#f5f5f5}.button.is-dark.is-hovered,.button.is-dark:hover{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused,.button.is-dark:focus{border-color:transparent;color:#f5f5f5}.button.is-dark.is-focused:not(:active),.button.is-dark:focus:not(:active){box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.button.is-dark.is-active,.button.is-dark:active{background-color:#292929;border-color:transparent;color:#f5f5f5}.button.is-dark[disabled]{background-color:#363636;border-color:transparent;box-shadow:none}.button.is-dark.is-inverted{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted:hover{background-color:#e8e8e8}.button.is-dark.is-inverted[disabled]{background-color:#f5f5f5;border-color:transparent;box-shadow:none;color:#363636}.button.is-dark.is-loading::after{border-color:transparent transparent #f5f5f5 #f5f5f5!important}.button.is-dark.is-outlined{background-color:transparent;border-color:#363636;color:#363636}.button.is-dark.is-outlined:focus,.button.is-dark.is-outlined:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.button.is-dark.is-outlined.is-loading::after{border-color:transparent transparent #363636 #363636!important}.button.is-dark.is-outlined[disabled]{background-color:transparent;border-color:#363636;box-shadow:none;color:#363636}.button.is-dark.is-inverted.is-outlined{background-color:transparent;border-color:#f5f5f5;color:#f5f5f5}.button.is-dark.is-inverted.is-outlined:focus,.button.is-dark.is-inverted.is-outlined:hover{background-color:#f5f5f5;color:#363636}.button.is-dark.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#f5f5f5;box-shadow:none;color:#f5f5f5}.button.is-primary{background-color:#00d1b2;border-color:transparent;color:#fff}.button.is-primary.is-hovered,.button.is-primary:hover{background-color:#00c4a7;border-color:transparent;color:#fff}.button.is-primary.is-focused,.button.is-primary:focus{border-color:transparent;color:#fff}.button.is-primary.is-focused:not(:active),.button.is-primary:focus:not(:active){box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.button.is-primary.is-active,.button.is-primary:active{background-color:#00b89c;border-color:transparent;color:#fff}.button.is-primary[disabled]{background-color:#00d1b2;border-color:transparent;box-shadow:none}.button.is-primary.is-inverted{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted:hover{background-color:#f2f2f2}.button.is-primary.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#00d1b2}.button.is-primary.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-primary.is-outlined{background-color:transparent;border-color:#00d1b2;color:#00d1b2}.button.is-primary.is-outlined:focus,.button.is-primary.is-outlined:hover{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.button.is-primary.is-outlined.is-loading::after{border-color:transparent transparent #00d1b2 #00d1b2!important}.button.is-primary.is-outlined[disabled]{background-color:transparent;border-color:#00d1b2;box-shadow:none;color:#00d1b2}.button.is-primary.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-primary.is-inverted.is-outlined:focus,.button.is-primary.is-inverted.is-outlined:hover{background-color:#fff;color:#00d1b2}.button.is-primary.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-link{background-color:#3273dc;border-color:transparent;color:#fff}.button.is-link.is-hovered,.button.is-link:hover{background-color:#276cda;border-color:transparent;color:#fff}.button.is-link.is-focused,.button.is-link:focus{border-color:transparent;color:#fff}.button.is-link.is-focused:not(:active),.button.is-link:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.button.is-link.is-active,.button.is-link:active{background-color:#2366d1;border-color:transparent;color:#fff}.button.is-link[disabled]{background-color:#3273dc;border-color:transparent;box-shadow:none}.button.is-link.is-inverted{background-color:#fff;color:#3273dc}.button.is-link.is-inverted:hover{background-color:#f2f2f2}.button.is-link.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#3273dc}.button.is-link.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-link.is-outlined{background-color:transparent;border-color:#3273dc;color:#3273dc}.button.is-link.is-outlined:focus,.button.is-link.is-outlined:hover{background-color:#3273dc;border-color:#3273dc;color:#fff}.button.is-link.is-outlined.is-loading::after{border-color:transparent transparent #3273dc #3273dc!important}.button.is-link.is-outlined[disabled]{background-color:transparent;border-color:#3273dc;box-shadow:none;color:#3273dc}.button.is-link.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-link.is-inverted.is-outlined:focus,.button.is-link.is-inverted.is-outlined:hover{background-color:#fff;color:#3273dc}.button.is-link.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-info{background-color:#209cee;border-color:transparent;color:#fff}.button.is-info.is-hovered,.button.is-info:hover{background-color:#1496ed;border-color:transparent;color:#fff}.button.is-info.is-focused,.button.is-info:focus{border-color:transparent;color:#fff}.button.is-info.is-focused:not(:active),.button.is-info:focus:not(:active){box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.button.is-info.is-active,.button.is-info:active{background-color:#118fe4;border-color:transparent;color:#fff}.button.is-info[disabled]{background-color:#209cee;border-color:transparent;box-shadow:none}.button.is-info.is-inverted{background-color:#fff;color:#209cee}.button.is-info.is-inverted:hover{background-color:#f2f2f2}.button.is-info.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#209cee}.button.is-info.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-info.is-outlined{background-color:transparent;border-color:#209cee;color:#209cee}.button.is-info.is-outlined:focus,.button.is-info.is-outlined:hover{background-color:#209cee;border-color:#209cee;color:#fff}.button.is-info.is-outlined.is-loading::after{border-color:transparent transparent #209cee #209cee!important}.button.is-info.is-outlined[disabled]{background-color:transparent;border-color:#209cee;box-shadow:none;color:#209cee}.button.is-info.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-info.is-inverted.is-outlined:focus,.button.is-info.is-inverted.is-outlined:hover{background-color:#fff;color:#209cee}.button.is-info.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-success{background-color:#23d160;border-color:transparent;color:#fff}.button.is-success.is-hovered,.button.is-success:hover{background-color:#22c65b;border-color:transparent;color:#fff}.button.is-success.is-focused,.button.is-success:focus{border-color:transparent;color:#fff}.button.is-success.is-focused:not(:active),.button.is-success:focus:not(:active){box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.button.is-success.is-active,.button.is-success:active{background-color:#20bc56;border-color:transparent;color:#fff}.button.is-success[disabled]{background-color:#23d160;border-color:transparent;box-shadow:none}.button.is-success.is-inverted{background-color:#fff;color:#23d160}.button.is-success.is-inverted:hover{background-color:#f2f2f2}.button.is-success.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#23d160}.button.is-success.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-success.is-outlined{background-color:transparent;border-color:#23d160;color:#23d160}.button.is-success.is-outlined:focus,.button.is-success.is-outlined:hover{background-color:#23d160;border-color:#23d160;color:#fff}.button.is-success.is-outlined.is-loading::after{border-color:transparent transparent #23d160 #23d160!important}.button.is-success.is-outlined[disabled]{background-color:transparent;border-color:#23d160;box-shadow:none;color:#23d160}.button.is-success.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-success.is-inverted.is-outlined:focus,.button.is-success.is-inverted.is-outlined:hover{background-color:#fff;color:#23d160}.button.is-success.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-warning{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-hovered,.button.is-warning:hover{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused,.button.is-warning:focus{border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning.is-focused:not(:active),.button.is-warning:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.button.is-warning.is-active,.button.is-warning:active{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.button.is-warning[disabled]{background-color:#ffdd57;border-color:transparent;box-shadow:none}.button.is-warning.is-inverted{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted:hover{background-color:rgba(0,0,0,.7)}.button.is-warning.is-inverted[disabled]{background-color:rgba(0,0,0,.7);border-color:transparent;box-shadow:none;color:#ffdd57}.button.is-warning.is-loading::after{border-color:transparent transparent rgba(0,0,0,.7) rgba(0,0,0,.7)!important}.button.is-warning.is-outlined{background-color:transparent;border-color:#ffdd57;color:#ffdd57}.button.is-warning.is-outlined:focus,.button.is-warning.is-outlined:hover{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.button.is-warning.is-outlined.is-loading::after{border-color:transparent transparent #ffdd57 #ffdd57!important}.button.is-warning.is-outlined[disabled]{background-color:transparent;border-color:#ffdd57;box-shadow:none;color:#ffdd57}.button.is-warning.is-inverted.is-outlined{background-color:transparent;border-color:rgba(0,0,0,.7);color:rgba(0,0,0,.7)}.button.is-warning.is-inverted.is-outlined:focus,.button.is-warning.is-inverted.is-outlined:hover{background-color:rgba(0,0,0,.7);color:#ffdd57}.button.is-warning.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:rgba(0,0,0,.7);box-shadow:none;color:rgba(0,0,0,.7)}.button.is-danger{background-color:#ff3860;border-color:transparent;color:#fff}.button.is-danger.is-hovered,.button.is-danger:hover{background-color:#ff2b56;border-color:transparent;color:#fff}.button.is-danger.is-focused,.button.is-danger:focus{border-color:transparent;color:#fff}.button.is-danger.is-focused:not(:active),.button.is-danger:focus:not(:active){box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.button.is-danger.is-active,.button.is-danger:active{background-color:#ff1f4b;border-color:transparent;color:#fff}.button.is-danger[disabled]{background-color:#ff3860;border-color:transparent;box-shadow:none}.button.is-danger.is-inverted{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted:hover{background-color:#f2f2f2}.button.is-danger.is-inverted[disabled]{background-color:#fff;border-color:transparent;box-shadow:none;color:#ff3860}.button.is-danger.is-loading::after{border-color:transparent transparent #fff #fff!important}.button.is-danger.is-outlined{background-color:transparent;border-color:#ff3860;color:#ff3860}.button.is-danger.is-outlined:focus,.button.is-danger.is-outlined:hover{background-color:#ff3860;border-color:#ff3860;color:#fff}.button.is-danger.is-outlined.is-loading::after{border-color:transparent transparent #ff3860 #ff3860!important}.button.is-danger.is-outlined[disabled]{background-color:transparent;border-color:#ff3860;box-shadow:none;color:#ff3860}.button.is-danger.is-inverted.is-outlined{background-color:transparent;border-color:#fff;color:#fff}.button.is-danger.is-inverted.is-outlined:focus,.button.is-danger.is-inverted.is-outlined:hover{background-color:#fff;color:#ff3860}.button.is-danger.is-inverted.is-outlined[disabled]{background-color:transparent;border-color:#fff;box-shadow:none;color:#fff}.button.is-small{border-radius:2px;font-size:.75rem}.button.is-medium{font-size:1.25rem}.button.is-large{font-size:1.5rem}.button[disabled]{background-color:#fff;border-color:#dbdbdb;box-shadow:none;opacity:.5}.button.is-fullwidth{display:flex;width:100%}.button.is-loading{color:transparent!important;pointer-events:none}.button.is-loading::after{position:absolute;left:calc(50% - (1em / 2));top:calc(50% - (1em / 2));position:absolute!important}.button.is-static{background-color:#f5f5f5;border-color:#dbdbdb;color:#7a7a7a;box-shadow:none;pointer-events:none}.button.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.buttons{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.buttons .button{margin-bottom:.5rem}.buttons .button:not(:last-child){margin-right:.5rem}.buttons:last-child{margin-bottom:-.5rem}.buttons:not(:last-child){margin-bottom:1rem}.buttons.has-addons .button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.buttons.has-addons .button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0;margin-right:-1px}.buttons.has-addons .button:last-child{margin-right:0}.buttons.has-addons .button.is-hovered,.buttons.has-addons .button:hover{z-index:2}.buttons.has-addons .button.is-active,.buttons.has-addons .button.is-focused,.buttons.has-addons .button.is-selected,.buttons.has-addons .button:active,.buttons.has-addons .button:focus{z-index:3}.buttons.has-addons .button.is-active:hover,.buttons.has-addons .button.is-focused:hover,.buttons.has-addons .button.is-selected:hover,.buttons.has-addons .button:active:hover,.buttons.has-addons .button:focus:hover{z-index:4}.buttons.has-addons .button.is-expanded{flex-grow:1}.buttons.is-centered{justify-content:center}.buttons.is-right{justify-content:flex-end}.container{margin:0 auto;position:relative}@media screen and (min-width:1088px){.container{max-width:960px;width:960px}.container.is-fluid{margin-left:64px;margin-right:64px;max-width:none;width:auto}}@media screen and (max-width:1279px){.container.is-widescreen{max-width:1152px;width:auto}}@media screen and (max-width:1471px){.container.is-fullhd{max-width:1344px;width:auto}}@media screen and (min-width:1280px){.container{max-width:1152px;width:1152px}}@media screen and (min-width:1472px){.container{max-width:1344px;width:1344px}}.content li+li{margin-top:.25em}.content blockquote:not(:last-child),.content dl:not(:last-child),.content ol:not(:last-child),.content p:not(:last-child),.content pre:not(:last-child),.content table:not(:last-child),.content ul:not(:last-child){margin-bottom:1em}.content h1,.content h2,.content h3,.content h4,.content h5,.content h6{color:#363636;font-weight:600;line-height:1.125}.content h1{font-size:2em;margin-bottom:.5em}.content h1:not(:first-child){margin-top:1em}.content h2{font-size:1.75em;margin-bottom:.5714em}.content h2:not(:first-child){margin-top:1.1428em}.content h3{font-size:1.5em;margin-bottom:.6666em}.content h3:not(:first-child){margin-top:1.3333em}.content h4{font-size:1.25em;margin-bottom:.8em}.content h5{font-size:1.125em;margin-bottom:.8888em}.content h6{font-size:1em;margin-bottom:1em}.content blockquote{background-color:#f5f5f5;border-left:5px solid #dbdbdb;padding:1.25em 1.5em}.content ol{list-style:decimal outside;margin-left:2em;margin-top:1em}.content ul{list-style:disc outside;margin-left:2em;margin-top:1em}.content ul ul{list-style-type:circle;margin-top:.5em}.content ul ul ul{list-style-type:square}.content dd{margin-left:2em}.content figure{margin-left:2em;margin-right:2em;text-align:center}.content figure:not(:first-child){margin-top:2em}.content figure:not(:last-child){margin-bottom:2em}.content figure img{display:inline-block}.content figure figcaption{font-style:italic}.content pre{-webkit-overflow-scrolling:touch;overflow-x:auto;padding:1.25em 1.5em;white-space:pre;word-wrap:normal}.content sub,.content sup{font-size:75%}.content table{width:100%}.content table td,.content table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.content table th{color:#363636;text-align:left}.content table thead td,.content table thead th{border-width:0 0 2px;color:#363636}.content table tfoot td,.content table tfoot th{border-width:2px 0 0;color:#363636}.content table tbody tr:last-child td,.content table tbody tr:last-child th{border-bottom-width:0}.content.is-small{font-size:.75rem}.content.is-medium{font-size:1.25rem}.content.is-large{font-size:1.5rem}.input,.textarea{background-color:#fff;border-color:#dbdbdb;color:#363636;box-shadow:inset 0 1px 2px rgba(10,10,10,.1);max-width:100%;width:100%}.input::-moz-placeholder,.textarea::-moz-placeholder{color:rgba(54,54,54,.3)}.input::-webkit-input-placeholder,.textarea::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.input:-moz-placeholder,.textarea:-moz-placeholder{color:rgba(54,54,54,.3)}.input:-ms-input-placeholder,.textarea:-ms-input-placeholder{color:rgba(54,54,54,.3)}.input.is-hovered,.input:hover,.textarea.is-hovered,.textarea:hover{border-color:#b5b5b5}.input.is-active,.input.is-focused,.input:active,.input:focus,.textarea.is-active,.textarea.is-focused,.textarea:active,.textarea:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input[disabled],.textarea[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.input[disabled]::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]::-webkit-input-placeholder,.textarea[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-moz-placeholder,.textarea[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.input[disabled]:-ms-input-placeholder,.textarea[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.input[readonly],.textarea[readonly]{box-shadow:none}.input.is-white,.textarea.is-white{border-color:#fff}.input.is-white.is-active,.input.is-white.is-focused,.input.is-white:active,.input.is-white:focus,.textarea.is-white.is-active,.textarea.is-white.is-focused,.textarea.is-white:active,.textarea.is-white:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.input.is-black,.textarea.is-black{border-color:#0a0a0a}.input.is-black.is-active,.input.is-black.is-focused,.input.is-black:active,.input.is-black:focus,.textarea.is-black.is-active,.textarea.is-black.is-focused,.textarea.is-black:active,.textarea.is-black:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.input.is-light,.textarea.is-light{border-color:#f5f5f5}.input.is-light.is-active,.input.is-light.is-focused,.input.is-light:active,.input.is-light:focus,.textarea.is-light.is-active,.textarea.is-light.is-focused,.textarea.is-light:active,.textarea.is-light:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.input.is-dark,.textarea.is-dark{border-color:#363636}.input.is-dark.is-active,.input.is-dark.is-focused,.input.is-dark:active,.input.is-dark:focus,.textarea.is-dark.is-active,.textarea.is-dark.is-focused,.textarea.is-dark:active,.textarea.is-dark:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.input.is-primary,.textarea.is-primary{border-color:#00d1b2}.input.is-primary.is-active,.input.is-primary.is-focused,.input.is-primary:active,.input.is-primary:focus,.textarea.is-primary.is-active,.textarea.is-primary.is-focused,.textarea.is-primary:active,.textarea.is-primary:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.input.is-link,.textarea.is-link{border-color:#3273dc}.input.is-link.is-active,.input.is-link.is-focused,.input.is-link:active,.input.is-link:focus,.textarea.is-link.is-active,.textarea.is-link.is-focused,.textarea.is-link:active,.textarea.is-link:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.input.is-info,.textarea.is-info{border-color:#209cee}.input.is-info.is-active,.input.is-info.is-focused,.input.is-info:active,.input.is-info:focus,.textarea.is-info.is-active,.textarea.is-info.is-focused,.textarea.is-info:active,.textarea.is-info:focus{box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.input.is-success,.textarea.is-success{border-color:#23d160}.input.is-success.is-active,.input.is-success.is-focused,.input.is-success:active,.input.is-success:focus,.textarea.is-success.is-active,.textarea.is-success.is-focused,.textarea.is-success:active,.textarea.is-success:focus{box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.input.is-warning,.textarea.is-warning{border-color:#ffdd57}.input.is-warning.is-active,.input.is-warning.is-focused,.input.is-warning:active,.input.is-warning:focus,.textarea.is-warning.is-active,.textarea.is-warning.is-focused,.textarea.is-warning:active,.textarea.is-warning:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.input.is-danger,.textarea.is-danger{border-color:#ff3860}.input.is-danger.is-active,.input.is-danger.is-focused,.input.is-danger:active,.input.is-danger:focus,.textarea.is-danger.is-active,.textarea.is-danger.is-focused,.textarea.is-danger:active,.textarea.is-danger:focus{box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.input.is-small,.textarea.is-small{border-radius:2px;font-size:.75rem}.input.is-medium,.textarea.is-medium{font-size:1.25rem}.input.is-large,.textarea.is-large{font-size:1.5rem}.input.is-fullwidth,.textarea.is-fullwidth{display:block;width:100%}.input.is-inline,.textarea.is-inline{display:inline;width:auto}.input.is-rounded{border-radius:290486px;padding-left:1em;padding-right:1em}.input.is-static{background-color:transparent;border-color:transparent;box-shadow:none;padding-left:0;padding-right:0}.textarea{display:block;max-width:100%;min-width:100%;padding:.625em;resize:vertical}.textarea:not([rows]){max-height:600px;min-height:120px}.textarea[rows]{height:initial}.textarea.has-fixed-size{resize:none}.checkbox,.radio{cursor:pointer;display:inline-block;line-height:1.25;position:relative}.checkbox input,.radio input{cursor:pointer}.checkbox:hover,.radio:hover{color:#363636}.checkbox[disabled],.radio[disabled]{color:#7a7a7a;cursor:not-allowed}.radio+.radio{margin-left:.5em}.select{display:inline-block;max-width:100%;position:relative;vertical-align:top}.select:not(.is-multiple){height:2.25em}.select:not(.is-multiple):not(.is-loading)::after{border-color:#3273dc;right:1.125em;z-index:4}.select.is-rounded select{border-radius:290486px;padding-left:1em}.select select{background-color:#fff;border-color:#dbdbdb;color:#363636;cursor:pointer;display:block;font-size:1em;max-width:100%;outline:0}.select select::-moz-placeholder{color:rgba(54,54,54,.3)}.select select::-webkit-input-placeholder{color:rgba(54,54,54,.3)}.select select:-moz-placeholder{color:rgba(54,54,54,.3)}.select select:-ms-input-placeholder{color:rgba(54,54,54,.3)}.select select.is-hovered,.select select:hover{border-color:#b5b5b5}.select select.is-active,.select select.is-focused,.select select:active,.select select:focus{border-color:#3273dc;box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select select[disabled]{background-color:#f5f5f5;border-color:#f5f5f5;box-shadow:none;color:#7a7a7a}.select select[disabled]::-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]::-webkit-input-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-moz-placeholder{color:rgba(122,122,122,.3)}.select select[disabled]:-ms-input-placeholder{color:rgba(122,122,122,.3)}.select select::-ms-expand{display:none}.select select[disabled]:hover{border-color:#f5f5f5}.select select:not([multiple]){padding-right:2.5em}.select select[multiple]{height:initial;padding:0}.select select[multiple] option{padding:.5em 1em}.select:not(.is-multiple):not(.is-loading):hover::after{border-color:#363636}.select.is-white:not(:hover)::after{border-color:#fff}.select.is-white select{border-color:#fff}.select.is-white select.is-hovered,.select.is-white select:hover{border-color:#f2f2f2}.select.is-white select.is-active,.select.is-white select.is-focused,.select.is-white select:active,.select.is-white select:focus{box-shadow:0 0 0 .125em rgba(255,255,255,.25)}.select.is-black:not(:hover)::after{border-color:#0a0a0a}.select.is-black select{border-color:#0a0a0a}.select.is-black select.is-hovered,.select.is-black select:hover{border-color:#000}.select.is-black select.is-active,.select.is-black select.is-focused,.select.is-black select:active,.select.is-black select:focus{box-shadow:0 0 0 .125em rgba(10,10,10,.25)}.select.is-light:not(:hover)::after{border-color:#f5f5f5}.select.is-light select{border-color:#f5f5f5}.select.is-light select.is-hovered,.select.is-light select:hover{border-color:#e8e8e8}.select.is-light select.is-active,.select.is-light select.is-focused,.select.is-light select:active,.select.is-light select:focus{box-shadow:0 0 0 .125em rgba(245,245,245,.25)}.select.is-dark:not(:hover)::after{border-color:#363636}.select.is-dark select{border-color:#363636}.select.is-dark select.is-hovered,.select.is-dark select:hover{border-color:#292929}.select.is-dark select.is-active,.select.is-dark select.is-focused,.select.is-dark select:active,.select.is-dark select:focus{box-shadow:0 0 0 .125em rgba(54,54,54,.25)}.select.is-primary:not(:hover)::after{border-color:#00d1b2}.select.is-primary select{border-color:#00d1b2}.select.is-primary select.is-hovered,.select.is-primary select:hover{border-color:#00b89c}.select.is-primary select.is-active,.select.is-primary select.is-focused,.select.is-primary select:active,.select.is-primary select:focus{box-shadow:0 0 0 .125em rgba(0,209,178,.25)}.select.is-link:not(:hover)::after{border-color:#3273dc}.select.is-link select{border-color:#3273dc}.select.is-link select.is-hovered,.select.is-link select:hover{border-color:#2366d1}.select.is-link select.is-active,.select.is-link select.is-focused,.select.is-link select:active,.select.is-link select:focus{box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.select.is-info:not(:hover)::after{border-color:#209cee}.select.is-info select{border-color:#209cee}.select.is-info select.is-hovered,.select.is-info select:hover{border-color:#118fe4}.select.is-info select.is-active,.select.is-info select.is-focused,.select.is-info select:active,.select.is-info select:focus{box-shadow:0 0 0 .125em rgba(32,156,238,.25)}.select.is-success:not(:hover)::after{border-color:#23d160}.select.is-success select{border-color:#23d160}.select.is-success select.is-hovered,.select.is-success select:hover{border-color:#20bc56}.select.is-success select.is-active,.select.is-success select.is-focused,.select.is-success select:active,.select.is-success select:focus{box-shadow:0 0 0 .125em rgba(35,209,96,.25)}.select.is-warning:not(:hover)::after{border-color:#ffdd57}.select.is-warning select{border-color:#ffdd57}.select.is-warning select.is-hovered,.select.is-warning select:hover{border-color:#ffd83d}.select.is-warning select.is-active,.select.is-warning select.is-focused,.select.is-warning select:active,.select.is-warning select:focus{box-shadow:0 0 0 .125em rgba(255,221,87,.25)}.select.is-danger:not(:hover)::after{border-color:#ff3860}.select.is-danger select{border-color:#ff3860}.select.is-danger select.is-hovered,.select.is-danger select:hover{border-color:#ff1f4b}.select.is-danger select.is-active,.select.is-danger select.is-focused,.select.is-danger select:active,.select.is-danger select:focus{box-shadow:0 0 0 .125em rgba(255,56,96,.25)}.select.is-small{border-radius:2px;font-size:.75rem}.select.is-medium{font-size:1.25rem}.select.is-large{font-size:1.5rem}.select.is-disabled::after{border-color:#7a7a7a}.select.is-fullwidth{width:100%}.select.is-fullwidth select{width:100%}.select.is-loading::after{margin-top:0;position:absolute;right:.625em;top:.625em;-webkit-transform:none;transform:none}.select.is-loading.is-small:after{font-size:.75rem}.select.is-loading.is-medium:after{font-size:1.25rem}.select.is-loading.is-large:after{font-size:1.5rem}.file{align-items:stretch;display:flex;justify-content:flex-start;position:relative}.file.is-white .file-cta{background-color:#fff;border-color:transparent;color:#0a0a0a}.file.is-white.is-hovered .file-cta,.file.is-white:hover .file-cta{background-color:#f9f9f9;border-color:transparent;color:#0a0a0a}.file.is-white.is-focused .file-cta,.file.is-white:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,255,255,.25);color:#0a0a0a}.file.is-white.is-active .file-cta,.file.is-white:active .file-cta{background-color:#f2f2f2;border-color:transparent;color:#0a0a0a}.file.is-black .file-cta{background-color:#0a0a0a;border-color:transparent;color:#fff}.file.is-black.is-hovered .file-cta,.file.is-black:hover .file-cta{background-color:#040404;border-color:transparent;color:#fff}.file.is-black.is-focused .file-cta,.file.is-black:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(10,10,10,.25);color:#fff}.file.is-black.is-active .file-cta,.file.is-black:active .file-cta{background-color:#000;border-color:transparent;color:#fff}.file.is-light .file-cta{background-color:#f5f5f5;border-color:transparent;color:#363636}.file.is-light.is-hovered .file-cta,.file.is-light:hover .file-cta{background-color:#eee;border-color:transparent;color:#363636}.file.is-light.is-focused .file-cta,.file.is-light:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(245,245,245,.25);color:#363636}.file.is-light.is-active .file-cta,.file.is-light:active .file-cta{background-color:#e8e8e8;border-color:transparent;color:#363636}.file.is-dark .file-cta{background-color:#363636;border-color:transparent;color:#f5f5f5}.file.is-dark.is-hovered .file-cta,.file.is-dark:hover .file-cta{background-color:#2f2f2f;border-color:transparent;color:#f5f5f5}.file.is-dark.is-focused .file-cta,.file.is-dark:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(54,54,54,.25);color:#f5f5f5}.file.is-dark.is-active .file-cta,.file.is-dark:active .file-cta{background-color:#292929;border-color:transparent;color:#f5f5f5}.file.is-primary .file-cta{background-color:#00d1b2;border-color:transparent;color:#fff}.file.is-primary.is-hovered .file-cta,.file.is-primary:hover .file-cta{background-color:#00c4a7;border-color:transparent;color:#fff}.file.is-primary.is-focused .file-cta,.file.is-primary:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(0,209,178,.25);color:#fff}.file.is-primary.is-active .file-cta,.file.is-primary:active .file-cta{background-color:#00b89c;border-color:transparent;color:#fff}.file.is-link .file-cta{background-color:#3273dc;border-color:transparent;color:#fff}.file.is-link.is-hovered .file-cta,.file.is-link:hover .file-cta{background-color:#276cda;border-color:transparent;color:#fff}.file.is-link.is-focused .file-cta,.file.is-link:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(50,115,220,.25);color:#fff}.file.is-link.is-active .file-cta,.file.is-link:active .file-cta{background-color:#2366d1;border-color:transparent;color:#fff}.file.is-info .file-cta{background-color:#209cee;border-color:transparent;color:#fff}.file.is-info.is-hovered .file-cta,.file.is-info:hover .file-cta{background-color:#1496ed;border-color:transparent;color:#fff}.file.is-info.is-focused .file-cta,.file.is-info:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(32,156,238,.25);color:#fff}.file.is-info.is-active .file-cta,.file.is-info:active .file-cta{background-color:#118fe4;border-color:transparent;color:#fff}.file.is-success .file-cta{background-color:#23d160;border-color:transparent;color:#fff}.file.is-success.is-hovered .file-cta,.file.is-success:hover .file-cta{background-color:#22c65b;border-color:transparent;color:#fff}.file.is-success.is-focused .file-cta,.file.is-success:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(35,209,96,.25);color:#fff}.file.is-success.is-active .file-cta,.file.is-success:active .file-cta{background-color:#20bc56;border-color:transparent;color:#fff}.file.is-warning .file-cta{background-color:#ffdd57;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-hovered .file-cta,.file.is-warning:hover .file-cta{background-color:#ffdb4a;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-warning.is-focused .file-cta,.file.is-warning:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,221,87,.25);color:rgba(0,0,0,.7)}.file.is-warning.is-active .file-cta,.file.is-warning:active .file-cta{background-color:#ffd83d;border-color:transparent;color:rgba(0,0,0,.7)}.file.is-danger .file-cta{background-color:#ff3860;border-color:transparent;color:#fff}.file.is-danger.is-hovered .file-cta,.file.is-danger:hover .file-cta{background-color:#ff2b56;border-color:transparent;color:#fff}.file.is-danger.is-focused .file-cta,.file.is-danger:focus .file-cta{border-color:transparent;box-shadow:0 0 .5em rgba(255,56,96,.25);color:#fff}.file.is-danger.is-active .file-cta,.file.is-danger:active .file-cta{background-color:#ff1f4b;border-color:transparent;color:#fff}.file.is-small{font-size:.75rem}.file.is-medium{font-size:1.25rem}.file.is-medium .file-icon .fa{font-size:21px}.file.is-large{font-size:1.5rem}.file.is-large .file-icon .fa{font-size:28px}.file.has-name .file-cta{border-bottom-right-radius:0;border-top-right-radius:0}.file.has-name .file-name{border-bottom-left-radius:0;border-top-left-radius:0}.file.has-name.is-empty .file-cta{border-radius:4px}.file.has-name.is-empty .file-name{display:none}.file.is-boxed .file-label{flex-direction:column}.file.is-boxed .file-cta{flex-direction:column;height:auto;padding:1em 3em}.file.is-boxed .file-name{border-width:0 1px 1px}.file.is-boxed .file-icon{height:1.5em;width:1.5em}.file.is-boxed .file-icon .fa{font-size:21px}.file.is-boxed.is-small .file-icon .fa{font-size:14px}.file.is-boxed.is-medium .file-icon .fa{font-size:28px}.file.is-boxed.is-large .file-icon .fa{font-size:35px}.file.is-boxed.has-name .file-cta{border-radius:4px 4px 0 0}.file.is-boxed.has-name .file-name{border-radius:0 0 4px 4px;border-width:0 1px 1px}.file.is-centered{justify-content:center}.file.is-fullwidth .file-label{width:100%}.file.is-fullwidth .file-name{flex-grow:1;max-width:none}.file.is-right{justify-content:flex-end}.file.is-right .file-cta{border-radius:0 4px 4px 0}.file.is-right .file-name{border-radius:4px 0 0 4px;border-width:1px 0 1px 1px;order:-1}.file-label{align-items:stretch;display:flex;cursor:pointer;justify-content:flex-start;overflow:hidden;position:relative}.file-label:hover .file-cta{background-color:#eee;color:#363636}.file-label:hover .file-name{border-color:#d5d5d5}.file-label:active .file-cta{background-color:#e8e8e8;color:#363636}.file-label:active .file-name{border-color:#cfcfcf}.file-input{height:.01em;left:0;outline:0;position:absolute;top:0;width:.01em}.file-cta,.file-name{border-color:#dbdbdb;border-radius:4px;font-size:1em;padding-left:1em;padding-right:1em;white-space:nowrap}.file-cta{background-color:#f5f5f5;color:#4a4a4a}.file-name{border-color:#dbdbdb;border-style:solid;border-width:1px 1px 1px 0;display:block;max-width:16em;overflow:hidden;text-align:left;text-overflow:ellipsis}.file-icon{align-items:center;display:flex;height:1em;justify-content:center;margin-right:.5em;width:1em}.file-icon .fa{font-size:14px}.label{color:#363636;display:block;font-size:1rem;font-weight:700}.label:not(:last-child){margin-bottom:.5em}.label.is-small{font-size:.75rem}.label.is-medium{font-size:1.25rem}.label.is-large{font-size:1.5rem}.help{display:block;font-size:.75rem;margin-top:.25rem}.help.is-white{color:#fff}.help.is-black{color:#0a0a0a}.help.is-light{color:#f5f5f5}.help.is-dark{color:#363636}.help.is-primary{color:#00d1b2}.help.is-link{color:#3273dc}.help.is-info{color:#209cee}.help.is-success{color:#23d160}.help.is-warning{color:#ffdd57}.help.is-danger{color:#ff3860}.field:not(:last-child){margin-bottom:.75rem}.field.has-addons{display:flex;justify-content:flex-start}.field.has-addons .control:not(:last-child){margin-right:-1px}.field.has-addons .control:not(:first-child):not(:last-child) .button,.field.has-addons .control:not(:first-child):not(:last-child) .input,.field.has-addons .control:not(:first-child):not(:last-child) .select select{border-radius:0}.field.has-addons .control:first-child .button,.field.has-addons .control:first-child .input,.field.has-addons .control:first-child .select select{border-bottom-right-radius:0;border-top-right-radius:0}.field.has-addons .control:last-child .button,.field.has-addons .control:last-child .input,.field.has-addons .control:last-child .select select{border-bottom-left-radius:0;border-top-left-radius:0}.field.has-addons .control .button.is-hovered,.field.has-addons .control .button:hover,.field.has-addons .control .input.is-hovered,.field.has-addons .control .input:hover,.field.has-addons .control .select select.is-hovered,.field.has-addons .control .select select:hover{z-index:2}.field.has-addons .control .button.is-active,.field.has-addons .control .button.is-focused,.field.has-addons .control .button:active,.field.has-addons .control .button:focus,.field.has-addons .control .input.is-active,.field.has-addons .control .input.is-focused,.field.has-addons .control .input:active,.field.has-addons .control .input:focus,.field.has-addons .control .select select.is-active,.field.has-addons .control .select select.is-focused,.field.has-addons .control .select select:active,.field.has-addons .control .select select:focus{z-index:3}.field.has-addons .control .button.is-active:hover,.field.has-addons .control .button.is-focused:hover,.field.has-addons .control .button:active:hover,.field.has-addons .control .button:focus:hover,.field.has-addons .control .input.is-active:hover,.field.has-addons .control .input.is-focused:hover,.field.has-addons .control .input:active:hover,.field.has-addons .control .input:focus:hover,.field.has-addons .control .select select.is-active:hover,.field.has-addons .control .select select.is-focused:hover,.field.has-addons .control .select select:active:hover,.field.has-addons .control .select select:focus:hover{z-index:4}.field.has-addons .control.is-expanded{flex-grow:1}.field.has-addons.has-addons-centered{justify-content:center}.field.has-addons.has-addons-right{justify-content:flex-end}.field.has-addons.has-addons-fullwidth .control{flex-grow:1;flex-shrink:0}.field.is-grouped{display:flex;justify-content:flex-start}.field.is-grouped>.control{flex-shrink:0}.field.is-grouped>.control:not(:last-child){margin-bottom:0;margin-right:.75rem}.field.is-grouped>.control.is-expanded{flex-grow:1;flex-shrink:1}.field.is-grouped.is-grouped-centered{justify-content:center}.field.is-grouped.is-grouped-right{justify-content:flex-end}.field.is-grouped.is-grouped-multiline{flex-wrap:wrap}.field.is-grouped.is-grouped-multiline>.control:last-child,.field.is-grouped.is-grouped-multiline>.control:not(:last-child){margin-bottom:.75rem}.field.is-grouped.is-grouped-multiline:last-child{margin-bottom:-.75rem}.field.is-grouped.is-grouped-multiline:not(:last-child){margin-bottom:0}@media screen and (min-width:769px),print{.field.is-horizontal{display:flex}}.field-label .label{font-size:inherit}@media screen and (max-width:768px){.field-label{margin-bottom:.5rem}}@media screen and (min-width:769px),print{.field-label{flex-basis:0;flex-grow:1;flex-shrink:0;margin-right:1.5rem;text-align:right}.field-label.is-small{font-size:.75rem;padding-top:.375em}.field-label.is-normal{padding-top:.375em}.field-label.is-medium{font-size:1.25rem;padding-top:.375em}.field-label.is-large{font-size:1.5rem;padding-top:.375em}}.field-body .field .field{margin-bottom:0}@media screen and (min-width:769px),print{.field-body{display:flex;flex-basis:0;flex-grow:5;flex-shrink:1}.field-body .field{margin-bottom:0}.field-body>.field{flex-shrink:1}.field-body>.field:not(.is-narrow){flex-grow:1}.field-body>.field:not(:last-child){margin-right:.75rem}}.control{font-size:1rem;position:relative;text-align:left}.control.has-icon .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icon .input:focus+.icon{color:#7a7a7a}.control.has-icon .input.is-small+.icon{font-size:.75rem}.control.has-icon .input.is-medium+.icon{font-size:1.25rem}.control.has-icon .input.is-large+.icon{font-size:1.5rem}.control.has-icon:not(.has-icon-right) .icon{left:0}.control.has-icon:not(.has-icon-right) .input{padding-left:2.25em}.control.has-icon.has-icon-right .icon{right:0}.control.has-icon.has-icon-right .input{padding-right:2.25em}.control.has-icons-left .input:focus~.icon,.control.has-icons-left .select:focus~.icon,.control.has-icons-right .input:focus~.icon,.control.has-icons-right .select:focus~.icon{color:#7a7a7a}.control.has-icons-left .input.is-small~.icon,.control.has-icons-left .select.is-small~.icon,.control.has-icons-right .input.is-small~.icon,.control.has-icons-right .select.is-small~.icon{font-size:.75rem}.control.has-icons-left .input.is-medium~.icon,.control.has-icons-left .select.is-medium~.icon,.control.has-icons-right .input.is-medium~.icon,.control.has-icons-right .select.is-medium~.icon{font-size:1.25rem}.control.has-icons-left .input.is-large~.icon,.control.has-icons-left .select.is-large~.icon,.control.has-icons-right .input.is-large~.icon,.control.has-icons-right .select.is-large~.icon{font-size:1.5rem}.control.has-icons-left .icon,.control.has-icons-right .icon{color:#dbdbdb;height:2.25em;pointer-events:none;position:absolute;top:0;width:2.25em;z-index:4}.control.has-icons-left .input,.control.has-icons-left .select select{padding-left:2.25em}.control.has-icons-left .icon.is-left{left:0}.control.has-icons-right .input,.control.has-icons-right .select select{padding-right:2.25em}.control.has-icons-right .icon.is-right{right:0}.control.is-loading::after{position:absolute!important;right:.625em;top:.625em;z-index:4}.control.is-loading.is-small:after{font-size:.75rem}.control.is-loading.is-medium:after{font-size:1.25rem}.control.is-loading.is-large:after{font-size:1.5rem}.icon{align-items:center;display:inline-flex;justify-content:center;height:1.5rem;width:1.5rem}.icon.is-small{height:1rem;width:1rem}.icon.is-medium{height:2rem;width:2rem}.icon.is-large{height:3rem;width:3rem}.image{display:block;position:relative}.image img{display:block;height:auto;width:100%}.image img.is-rounded{border-radius:290486px}.image.is-16by9 img,.image.is-1by1 img,.image.is-1by2 img,.image.is-1by3 img,.image.is-2by1 img,.image.is-2by3 img,.image.is-3by1 img,.image.is-3by2 img,.image.is-3by4 img,.image.is-3by5 img,.image.is-4by3 img,.image.is-4by5 img,.image.is-5by3 img,.image.is-5by4 img,.image.is-9by16 img,.image.is-square img{height:100%;width:100%}.image.is-1by1,.image.is-square{padding-top:100%}.image.is-5by4{padding-top:80%}.image.is-4by3{padding-top:75%}.image.is-3by2{padding-top:66.6666%}.image.is-5by3{padding-top:60%}.image.is-16by9{padding-top:56.25%}.image.is-2by1{padding-top:50%}.image.is-3by1{padding-top:33.3333%}.image.is-4by5{padding-top:125%}.image.is-3by4{padding-top:133.3333%}.image.is-2by3{padding-top:150%}.image.is-3by5{padding-top:166.6666%}.image.is-9by16{padding-top:177.7777%}.image.is-1by2{padding-top:200%}.image.is-1by3{padding-top:300%}.image.is-16x16{height:16px;width:16px}.image.is-24x24{height:24px;width:24px}.image.is-32x32{height:32px;width:32px}.image.is-48x48{height:48px;width:48px}.image.is-64x64{height:64px;width:64px}.image.is-96x96{height:96px;width:96px}.image.is-128x128{height:128px;width:128px}.notification{background-color:#f5f5f5;border-radius:4px;padding:1.25rem 2.5rem 1.25rem 1.5rem;position:relative}.notification a:not(.button){color:currentColor;text-decoration:underline}.notification strong{color:currentColor}.notification code,.notification pre{background:#fff}.notification pre code{background:0 0}.notification>.delete{position:absolute;right:.5rem;top:.5rem}.notification .content,.notification .subtitle,.notification .title{color:currentColor}.notification.is-white{background-color:#fff;color:#0a0a0a}.notification.is-black{background-color:#0a0a0a;color:#fff}.notification.is-light{background-color:#f5f5f5;color:#363636}.notification.is-dark{background-color:#363636;color:#f5f5f5}.notification.is-primary{background-color:#00d1b2;color:#fff}.notification.is-link{background-color:#3273dc;color:#fff}.notification.is-info{background-color:#209cee;color:#fff}.notification.is-success{background-color:#23d160;color:#fff}.notification.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.notification.is-danger{background-color:#ff3860;color:#fff}.progress{-moz-appearance:none;-webkit-appearance:none;border:none;border-radius:290486px;display:block;height:1rem;overflow:hidden;padding:0;width:100%}.progress::-webkit-progress-bar{background-color:#dbdbdb}.progress::-webkit-progress-value{background-color:#4a4a4a}.progress::-moz-progress-bar{background-color:#4a4a4a}.progress::-ms-fill{background-color:#4a4a4a;border:none}.progress.is-white::-webkit-progress-value{background-color:#fff}.progress.is-white::-moz-progress-bar{background-color:#fff}.progress.is-white::-ms-fill{background-color:#fff}.progress.is-black::-webkit-progress-value{background-color:#0a0a0a}.progress.is-black::-moz-progress-bar{background-color:#0a0a0a}.progress.is-black::-ms-fill{background-color:#0a0a0a}.progress.is-light::-webkit-progress-value{background-color:#f5f5f5}.progress.is-light::-moz-progress-bar{background-color:#f5f5f5}.progress.is-light::-ms-fill{background-color:#f5f5f5}.progress.is-dark::-webkit-progress-value{background-color:#363636}.progress.is-dark::-moz-progress-bar{background-color:#363636}.progress.is-dark::-ms-fill{background-color:#363636}.progress.is-primary::-webkit-progress-value{background-color:#00d1b2}.progress.is-primary::-moz-progress-bar{background-color:#00d1b2}.progress.is-primary::-ms-fill{background-color:#00d1b2}.progress.is-link::-webkit-progress-value{background-color:#3273dc}.progress.is-link::-moz-progress-bar{background-color:#3273dc}.progress.is-link::-ms-fill{background-color:#3273dc}.progress.is-info::-webkit-progress-value{background-color:#209cee}.progress.is-info::-moz-progress-bar{background-color:#209cee}.progress.is-info::-ms-fill{background-color:#209cee}.progress.is-success::-webkit-progress-value{background-color:#23d160}.progress.is-success::-moz-progress-bar{background-color:#23d160}.progress.is-success::-ms-fill{background-color:#23d160}.progress.is-warning::-webkit-progress-value{background-color:#ffdd57}.progress.is-warning::-moz-progress-bar{background-color:#ffdd57}.progress.is-warning::-ms-fill{background-color:#ffdd57}.progress.is-danger::-webkit-progress-value{background-color:#ff3860}.progress.is-danger::-moz-progress-bar{background-color:#ff3860}.progress.is-danger::-ms-fill{background-color:#ff3860}.progress.is-small{height:.75rem}.progress.is-medium{height:1.25rem}.progress.is-large{height:1.5rem}.table{background-color:#fff;color:#363636}.table td,.table th{border:1px solid #dbdbdb;border-width:0 0 1px;padding:.5em .75em;vertical-align:top}.table td.is-white,.table th.is-white{background-color:#fff;border-color:#fff;color:#0a0a0a}.table td.is-black,.table th.is-black{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.table td.is-light,.table th.is-light{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.table td.is-dark,.table th.is-dark{background-color:#363636;border-color:#363636;color:#f5f5f5}.table td.is-primary,.table th.is-primary{background-color:#00d1b2;border-color:#00d1b2;color:#fff}.table td.is-link,.table th.is-link{background-color:#3273dc;border-color:#3273dc;color:#fff}.table td.is-info,.table th.is-info{background-color:#209cee;border-color:#209cee;color:#fff}.table td.is-success,.table th.is-success{background-color:#23d160;border-color:#23d160;color:#fff}.table td.is-warning,.table th.is-warning{background-color:#ffdd57;border-color:#ffdd57;color:rgba(0,0,0,.7)}.table td.is-danger,.table th.is-danger{background-color:#ff3860;border-color:#ff3860;color:#fff}.table td.is-narrow,.table th.is-narrow{white-space:nowrap;width:1%}.table td.is-selected,.table th.is-selected{background-color:#00d1b2;color:#fff}.table td.is-selected a,.table td.is-selected strong,.table th.is-selected a,.table th.is-selected strong{color:currentColor}.table th{color:#363636;text-align:left}.table tr.is-selected{background-color:#00d1b2;color:#fff}.table tr.is-selected a,.table tr.is-selected strong{color:currentColor}.table tr.is-selected td,.table tr.is-selected th{border-color:#fff;color:currentColor}.table thead td,.table thead th{border-width:0 0 2px;color:#363636}.table tfoot td,.table tfoot th{border-width:2px 0 0;color:#363636}.table tbody tr:last-child td,.table tbody tr:last-child th{border-bottom-width:0}.table.is-bordered td,.table.is-bordered th{border-width:1px}.table.is-bordered tr:last-child td,.table.is-bordered tr:last-child th{border-bottom-width:1px}.table.is-fullwidth{width:100%}.table.is-hoverable tbody tr:not(.is-selected):hover{background-color:#fafafa}.table.is-hoverable.is-striped tbody tr:not(.is-selected):hover{background-color:#f5f5f5}.table.is-narrow td,.table.is-narrow th{padding:.25em .5em}.table.is-striped tbody tr:not(.is-selected):nth-child(even){background-color:#fafafa}.table-container{-webkit-overflow-scrolling:touch;overflow:auto;overflow-y:hidden;max-width:100%}.tags{align-items:center;display:flex;flex-wrap:wrap;justify-content:flex-start}.tags .tag{margin-bottom:.5rem}.tags .tag:not(:last-child){margin-right:.5rem}.tags:last-child{margin-bottom:-.5rem}.tags:not(:last-child){margin-bottom:1rem}.tags.has-addons .tag{margin-right:0}.tags.has-addons .tag:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.tags.has-addons .tag:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.tags.is-centered{justify-content:center}.tags.is-centered .tag{margin-right:.25rem;margin-left:.25rem}.tags.is-right{justify-content:flex-end}.tags.is-right .tag:not(:first-child){margin-left:.5rem}.tags.is-right .tag:not(:last-child){margin-right:0}.tag:not(body){align-items:center;background-color:#f5f5f5;border-radius:4px;color:#4a4a4a;display:inline-flex;font-size:.75rem;height:2em;justify-content:center;line-height:1.5;padding-left:.75em;padding-right:.75em;white-space:nowrap}.tag:not(body) .delete{margin-left:.25rem;margin-right:-.375rem}.tag:not(body).is-white{background-color:#fff;color:#0a0a0a}.tag:not(body).is-black{background-color:#0a0a0a;color:#fff}.tag:not(body).is-light{background-color:#f5f5f5;color:#363636}.tag:not(body).is-dark{background-color:#363636;color:#f5f5f5}.tag:not(body).is-primary{background-color:#00d1b2;color:#fff}.tag:not(body).is-link{background-color:#3273dc;color:#fff}.tag:not(body).is-info{background-color:#209cee;color:#fff}.tag:not(body).is-success{background-color:#23d160;color:#fff}.tag:not(body).is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.tag:not(body).is-danger{background-color:#ff3860;color:#fff}.tag:not(body).is-medium{font-size:1rem}.tag:not(body).is-large{font-size:1.25rem}.tag:not(body) .icon:first-child:not(:last-child){margin-left:-.375em;margin-right:.1875em}.tag:not(body) .icon:last-child:not(:first-child){margin-left:.1875em;margin-right:-.375em}.tag:not(body) .icon:first-child:last-child{margin-left:-.375em;margin-right:-.375em}.tag:not(body).is-delete{margin-left:1px;padding:0;position:relative;width:2em}.tag:not(body).is-delete::after,.tag:not(body).is-delete::before{background-color:currentColor;content:"";display:block;left:50%;position:absolute;top:50%;-webkit-transform:translateX(-50%) translateY(-50%) rotate(45deg);transform:translateX(-50%) translateY(-50%) rotate(45deg);-webkit-transform-origin:center center;transform-origin:center center}.tag:not(body).is-delete::before{height:1px;width:50%}.tag:not(body).is-delete::after{height:50%;width:1px}.tag:not(body).is-delete:focus,.tag:not(body).is-delete:hover{background-color:#e8e8e8}.tag:not(body).is-delete:active{background-color:#dbdbdb}.tag:not(body).is-rounded{border-radius:290486px}a.tag:hover{text-decoration:underline}.subtitle,.title{word-break:break-word}.subtitle em,.subtitle span,.title em,.title span{font-weight:inherit}.subtitle sub,.title sub{font-size:.75em}.subtitle sup,.title sup{font-size:.75em}.subtitle .tag,.title .tag{vertical-align:middle}.title{color:#363636;font-size:2rem;font-weight:600;line-height:1.125}.title strong{color:inherit;font-weight:inherit}.title+.highlight{margin-top:-.75rem}.title:not(.is-spaced)+.subtitle{margin-top:-1.25rem}.title.is-1{font-size:3rem}.title.is-2{font-size:2.5rem}.title.is-3{font-size:2rem}.title.is-4{font-size:1.5rem}.title.is-5{font-size:1.25rem}.title.is-6{font-size:1rem}.title.is-7{font-size:.75rem}.subtitle{color:#4a4a4a;font-size:1.25rem;font-weight:400;line-height:1.25}.subtitle strong{color:#363636;font-weight:600}.subtitle:not(.is-spaced)+.title{margin-top:-1.25rem}.subtitle.is-1{font-size:3rem}.subtitle.is-2{font-size:2.5rem}.subtitle.is-3{font-size:2rem}.subtitle.is-4{font-size:1.5rem}.subtitle.is-5{font-size:1.25rem}.subtitle.is-6{font-size:1rem}.subtitle.is-7{font-size:.75rem}.heading{display:block;font-size:11px;letter-spacing:1px;margin-bottom:5px;text-transform:uppercase}.highlight{font-weight:400;max-width:100%;overflow:hidden;padding:0}.highlight pre{overflow:auto;max-width:100%}.number{align-items:center;background-color:#f5f5f5;border-radius:290486px;display:inline-flex;font-size:1.25rem;height:2em;justify-content:center;margin-right:1.5rem;min-width:2.5em;padding:.25rem .5rem;text-align:center;vertical-align:top}.breadcrumb{font-size:1rem;white-space:nowrap}.breadcrumb a{align-items:center;color:#3273dc;display:flex;justify-content:center;padding:0 .75em}.breadcrumb a:hover{color:#363636}.breadcrumb li{align-items:center;display:flex}.breadcrumb li:first-child a{padding-left:0}.breadcrumb li.is-active a{color:#363636;cursor:default;pointer-events:none}.breadcrumb li+li::before{color:#b5b5b5;content:"\0002f"}.breadcrumb ol,.breadcrumb ul{align-items:flex-start;display:flex;flex-wrap:wrap;justify-content:flex-start}.breadcrumb .icon:first-child{margin-right:.5em}.breadcrumb .icon:last-child{margin-left:.5em}.breadcrumb.is-centered ol,.breadcrumb.is-centered ul{justify-content:center}.breadcrumb.is-right ol,.breadcrumb.is-right ul{justify-content:flex-end}.breadcrumb.is-small{font-size:.75rem}.breadcrumb.is-medium{font-size:1.25rem}.breadcrumb.is-large{font-size:1.5rem}.breadcrumb.has-arrow-separator li+li::before{content:"\02192"}.breadcrumb.has-bullet-separator li+li::before{content:"\02022"}.breadcrumb.has-dot-separator li+li::before{content:"\000b7"}.breadcrumb.has-succeeds-separator li+li::before{content:"\0227B"}.card{background-color:#fff;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);color:#4a4a4a;max-width:100%;position:relative}.card-header{background-color:none;align-items:stretch;box-shadow:0 1px 2px rgba(10,10,10,.1);display:flex}.card-header-title{align-items:center;color:#363636;display:flex;flex-grow:1;font-weight:700;padding:.75rem}.card-header-title.is-centered{justify-content:center}.card-header-icon{align-items:center;cursor:pointer;display:flex;justify-content:center;padding:.75rem}.card-image{display:block;position:relative}.card-content{background-color:none;padding:1.5rem}.card-footer{background-color:none;border-top:1px solid #dbdbdb;align-items:stretch;display:flex}.card-footer-item{align-items:center;display:flex;flex-basis:0;flex-grow:1;flex-shrink:0;justify-content:center;padding:.75rem}.card-footer-item:not(:last-child){border-right:1px solid #dbdbdb}.card .media:not(:last-child){margin-bottom:.75rem}.dropdown{display:inline-flex;position:relative;vertical-align:top}.dropdown.is-active .dropdown-menu,.dropdown.is-hoverable:hover .dropdown-menu{display:block}.dropdown.is-right .dropdown-menu{left:auto;right:0}.dropdown.is-up .dropdown-menu{bottom:100%;padding-bottom:4px;padding-top:initial;top:auto}.dropdown-menu{display:none;left:0;min-width:12rem;padding-top:4px;position:absolute;top:100%;z-index:20}.dropdown-content{background-color:#fff;border-radius:4px;box-shadow:0 2px 3px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);padding-bottom:.5rem;padding-top:.5rem}.dropdown-item{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;padding:.375rem 1rem;position:relative}a.dropdown-item{padding-right:3rem;white-space:nowrap}a.dropdown-item:hover{background-color:#f5f5f5;color:#0a0a0a}a.dropdown-item.is-active{background-color:#3273dc;color:#fff}.dropdown-divider{background-color:#dbdbdb;border:none;display:block;height:1px;margin:.5rem 0}.level{align-items:center;justify-content:space-between}.level code{border-radius:4px}.level img{display:inline-block;vertical-align:top}.level.is-mobile{display:flex}.level.is-mobile .level-left,.level.is-mobile .level-right{display:flex}.level.is-mobile .level-left+.level-right{margin-top:0}.level.is-mobile .level-item{margin-right:.75rem}.level.is-mobile .level-item:not(:last-child){margin-bottom:0}.level.is-mobile .level-item:not(.is-narrow){flex-grow:1}@media screen and (min-width:769px),print{.level{display:flex}.level>.level-item:not(.is-narrow){flex-grow:1}}.level-item{align-items:center;display:flex;flex-basis:auto;flex-grow:0;flex-shrink:0;justify-content:center}.level-item .subtitle,.level-item .title{margin-bottom:0}@media screen and (max-width:768px){.level-item:not(:last-child){margin-bottom:.75rem}}.level-left,.level-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.level-left .level-item.is-flexible,.level-right .level-item.is-flexible{flex-grow:1}@media screen and (min-width:769px),print{.level-left .level-item:not(:last-child),.level-right .level-item:not(:last-child){margin-right:.75rem}}.level-left{align-items:center;justify-content:flex-start}@media screen and (max-width:768px){.level-left+.level-right{margin-top:1.5rem}}@media screen and (min-width:769px),print{.level-left{display:flex}}.level-right{align-items:center;justify-content:flex-end}@media screen and (min-width:769px),print{.level-right{display:flex}}.media{align-items:flex-start;display:flex;text-align:left}.media .content:not(:last-child){margin-bottom:.75rem}.media .media{border-top:1px solid rgba(219,219,219,.5);display:flex;padding-top:.75rem}.media .media .content:not(:last-child),.media .media .control:not(:last-child){margin-bottom:.5rem}.media .media .media{padding-top:.5rem}.media .media .media+.media{margin-top:.5rem}.media+.media{border-top:1px solid rgba(219,219,219,.5);margin-top:1rem;padding-top:1rem}.media.is-large+.media{margin-top:1.5rem;padding-top:1.5rem}.media-left,.media-right{flex-basis:auto;flex-grow:0;flex-shrink:0}.media-left{margin-right:1rem}.media-right{margin-left:1rem}.media-content{flex-basis:auto;flex-grow:1;flex-shrink:1;text-align:left}.menu{font-size:1rem}.menu.is-small{font-size:.75rem}.menu.is-medium{font-size:1.25rem}.menu.is-large{font-size:1.5rem}.menu-list{line-height:1.25}.menu-list a{border-radius:2px;color:#4a4a4a;display:block;padding:.5em .75em}.menu-list a:hover{background-color:#f5f5f5;color:#363636}.menu-list a.is-active{background-color:#3273dc;color:#fff}.menu-list li ul{border-left:1px solid #dbdbdb;margin:.75em;padding-left:.75em}.menu-label{color:#7a7a7a;font-size:.75em;letter-spacing:.1em;text-transform:uppercase}.menu-label:not(:first-child){margin-top:1em}.menu-label:not(:last-child){margin-bottom:1em}.message{background-color:#f5f5f5;border-radius:4px;font-size:1rem}.message strong{color:currentColor}.message a:not(.button):not(.tag){color:currentColor;text-decoration:underline}.message.is-small{font-size:.75rem}.message.is-medium{font-size:1.25rem}.message.is-large{font-size:1.5rem}.message.is-white{background-color:#fff}.message.is-white .message-header{background-color:#fff;color:#0a0a0a}.message.is-white .message-body{border-color:#fff;color:#4d4d4d}.message.is-black{background-color:#fafafa}.message.is-black .message-header{background-color:#0a0a0a;color:#fff}.message.is-black .message-body{border-color:#0a0a0a;color:#090909}.message.is-light{background-color:#fafafa}.message.is-light .message-header{background-color:#f5f5f5;color:#363636}.message.is-light .message-body{border-color:#f5f5f5;color:#505050}.message.is-dark{background-color:#fafafa}.message.is-dark .message-header{background-color:#363636;color:#f5f5f5}.message.is-dark .message-body{border-color:#363636;color:#2a2a2a}.message.is-primary{background-color:#f5fffd}.message.is-primary .message-header{background-color:#00d1b2;color:#fff}.message.is-primary .message-body{border-color:#00d1b2;color:#021310}.message.is-link{background-color:#f6f9fe}.message.is-link .message-header{background-color:#3273dc;color:#fff}.message.is-link .message-body{border-color:#3273dc;color:#22509a}.message.is-info{background-color:#f6fbfe}.message.is-info .message-header{background-color:#209cee;color:#fff}.message.is-info .message-body{border-color:#209cee;color:#12537e}.message.is-success{background-color:#f6fef9}.message.is-success .message-header{background-color:#23d160;color:#fff}.message.is-success .message-body{border-color:#23d160;color:#0e301a}.message.is-warning{background-color:#fffdf5}.message.is-warning .message-header{background-color:#ffdd57;color:rgba(0,0,0,.7)}.message.is-warning .message-body{border-color:#ffdd57;color:#3b3108}.message.is-danger{background-color:#fff5f7}.message.is-danger .message-header{background-color:#ff3860;color:#fff}.message.is-danger .message-body{border-color:#ff3860;color:#cd0930}.message-header{align-items:center;background-color:#4a4a4a;border-radius:4px 4px 0 0;color:#fff;display:flex;font-weight:700;justify-content:space-between;line-height:1.25;padding:.75em 1em;position:relative}.message-header .delete{flex-grow:0;flex-shrink:0;margin-left:.75em}.message-header+.message-body{border-width:0;border-top-left-radius:0;border-top-right-radius:0}.message-body{border-color:#dbdbdb;border-radius:4px;border-style:solid;border-width:0 0 0 4px;color:#4a4a4a;padding:1.25em 1.5em}.message-body code,.message-body pre{background-color:#fff}.message-body pre code{background-color:transparent}.modal{align-items:center;display:none;justify-content:center;overflow:hidden;position:fixed;z-index:40}.modal.is-active{display:flex}.modal-background{background-color:rgba(10,10,10,.86)}.modal-card,.modal-content{margin:0 20px;max-height:calc(100vh - 160px);overflow:auto;position:relative;width:100%}@media screen and (min-width:769px),print{.modal-card,.modal-content{margin:0 auto;max-height:calc(100vh - 40px);width:640px}}.modal-close{background:0 0;height:40px;position:fixed;right:20px;top:20px;width:40px}.modal-card{display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:hidden}.modal-card-foot,.modal-card-head{align-items:center;background-color:#f5f5f5;display:flex;flex-shrink:0;justify-content:flex-start;padding:20px;position:relative}.modal-card-head{border-bottom:1px solid #dbdbdb;border-top-left-radius:6px;border-top-right-radius:6px}.modal-card-title{color:#363636;flex-grow:1;flex-shrink:0;font-size:1.5rem;line-height:1}.modal-card-foot{border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:1px solid #dbdbdb}.modal-card-foot .button:not(:last-child){margin-right:10px}.modal-card-body{-webkit-overflow-scrolling:touch;background-color:#fff;flex-grow:1;flex-shrink:1;overflow:auto;padding:20px}.navbar{background-color:#fff;min-height:3.25rem;position:relative;z-index:30}.navbar.is-white{background-color:#fff;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link,.navbar.is-white .navbar-brand>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link.is-active,.navbar.is-white .navbar-brand .navbar-link:hover,.navbar.is-white .navbar-brand>a.navbar-item.is-active,.navbar.is-white .navbar-brand>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-brand .navbar-link::after{border-color:#0a0a0a}@media screen and (min-width:1088px){.navbar.is-white .navbar-end .navbar-link,.navbar.is-white .navbar-end>.navbar-item,.navbar.is-white .navbar-start .navbar-link,.navbar.is-white .navbar-start>.navbar-item{color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link.is-active,.navbar.is-white .navbar-end .navbar-link:hover,.navbar.is-white .navbar-end>a.navbar-item.is-active,.navbar.is-white .navbar-end>a.navbar-item:hover,.navbar.is-white .navbar-start .navbar-link.is-active,.navbar.is-white .navbar-start .navbar-link:hover,.navbar.is-white .navbar-start>a.navbar-item.is-active,.navbar.is-white .navbar-start>a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-end .navbar-link::after,.navbar.is-white .navbar-start .navbar-link::after{border-color:#0a0a0a}.navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-white .navbar-item.has-dropdown:hover .navbar-link{background-color:#f2f2f2;color:#0a0a0a}.navbar.is-white .navbar-dropdown a.navbar-item.is-active{background-color:#fff;color:#0a0a0a}}.navbar.is-black{background-color:#0a0a0a;color:#fff}.navbar.is-black .navbar-brand .navbar-link,.navbar.is-black .navbar-brand>.navbar-item{color:#fff}.navbar.is-black .navbar-brand .navbar-link.is-active,.navbar.is-black .navbar-brand .navbar-link:hover,.navbar.is-black .navbar-brand>a.navbar-item.is-active,.navbar.is-black .navbar-brand>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-black .navbar-end .navbar-link,.navbar.is-black .navbar-end>.navbar-item,.navbar.is-black .navbar-start .navbar-link,.navbar.is-black .navbar-start>.navbar-item{color:#fff}.navbar.is-black .navbar-end .navbar-link.is-active,.navbar.is-black .navbar-end .navbar-link:hover,.navbar.is-black .navbar-end>a.navbar-item.is-active,.navbar.is-black .navbar-end>a.navbar-item:hover,.navbar.is-black .navbar-start .navbar-link.is-active,.navbar.is-black .navbar-start .navbar-link:hover,.navbar.is-black .navbar-start>a.navbar-item.is-active,.navbar.is-black .navbar-start>a.navbar-item:hover{background-color:#000;color:#fff}.navbar.is-black .navbar-end .navbar-link::after,.navbar.is-black .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-black .navbar-item.has-dropdown:hover .navbar-link{background-color:#000;color:#fff}.navbar.is-black .navbar-dropdown a.navbar-item.is-active{background-color:#0a0a0a;color:#fff}}.navbar.is-light{background-color:#f5f5f5;color:#363636}.navbar.is-light .navbar-brand .navbar-link,.navbar.is-light .navbar-brand>.navbar-item{color:#363636}.navbar.is-light .navbar-brand .navbar-link.is-active,.navbar.is-light .navbar-brand .navbar-link:hover,.navbar.is-light .navbar-brand>a.navbar-item.is-active,.navbar.is-light .navbar-brand>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-brand .navbar-link::after{border-color:#363636}@media screen and (min-width:1088px){.navbar.is-light .navbar-end .navbar-link,.navbar.is-light .navbar-end>.navbar-item,.navbar.is-light .navbar-start .navbar-link,.navbar.is-light .navbar-start>.navbar-item{color:#363636}.navbar.is-light .navbar-end .navbar-link.is-active,.navbar.is-light .navbar-end .navbar-link:hover,.navbar.is-light .navbar-end>a.navbar-item.is-active,.navbar.is-light .navbar-end>a.navbar-item:hover,.navbar.is-light .navbar-start .navbar-link.is-active,.navbar.is-light .navbar-start .navbar-link:hover,.navbar.is-light .navbar-start>a.navbar-item.is-active,.navbar.is-light .navbar-start>a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-end .navbar-link::after,.navbar.is-light .navbar-start .navbar-link::after{border-color:#363636}.navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-light .navbar-item.has-dropdown:hover .navbar-link{background-color:#e8e8e8;color:#363636}.navbar.is-light .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#363636}}.navbar.is-dark{background-color:#363636;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link,.navbar.is-dark .navbar-brand>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link.is-active,.navbar.is-dark .navbar-brand .navbar-link:hover,.navbar.is-dark .navbar-brand>a.navbar-item.is-active,.navbar.is-dark .navbar-brand>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-brand .navbar-link::after{border-color:#f5f5f5}@media screen and (min-width:1088px){.navbar.is-dark .navbar-end .navbar-link,.navbar.is-dark .navbar-end>.navbar-item,.navbar.is-dark .navbar-start .navbar-link,.navbar.is-dark .navbar-start>.navbar-item{color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link.is-active,.navbar.is-dark .navbar-end .navbar-link:hover,.navbar.is-dark .navbar-end>a.navbar-item.is-active,.navbar.is-dark .navbar-end>a.navbar-item:hover,.navbar.is-dark .navbar-start .navbar-link.is-active,.navbar.is-dark .navbar-start .navbar-link:hover,.navbar.is-dark .navbar-start>a.navbar-item.is-active,.navbar.is-dark .navbar-start>a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-end .navbar-link::after,.navbar.is-dark .navbar-start .navbar-link::after{border-color:#f5f5f5}.navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link{background-color:#292929;color:#f5f5f5}.navbar.is-dark .navbar-dropdown a.navbar-item.is-active{background-color:#363636;color:#f5f5f5}}.navbar.is-primary{background-color:#00d1b2;color:#fff}.navbar.is-primary .navbar-brand .navbar-link,.navbar.is-primary .navbar-brand>.navbar-item{color:#fff}.navbar.is-primary .navbar-brand .navbar-link.is-active,.navbar.is-primary .navbar-brand .navbar-link:hover,.navbar.is-primary .navbar-brand>a.navbar-item.is-active,.navbar.is-primary .navbar-brand>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-primary .navbar-end .navbar-link,.navbar.is-primary .navbar-end>.navbar-item,.navbar.is-primary .navbar-start .navbar-link,.navbar.is-primary .navbar-start>.navbar-item{color:#fff}.navbar.is-primary .navbar-end .navbar-link.is-active,.navbar.is-primary .navbar-end .navbar-link:hover,.navbar.is-primary .navbar-end>a.navbar-item.is-active,.navbar.is-primary .navbar-end>a.navbar-item:hover,.navbar.is-primary .navbar-start .navbar-link.is-active,.navbar.is-primary .navbar-start .navbar-link:hover,.navbar.is-primary .navbar-start>a.navbar-item.is-active,.navbar.is-primary .navbar-start>a.navbar-item:hover{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-end .navbar-link::after,.navbar.is-primary .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link{background-color:#00b89c;color:#fff}.navbar.is-primary .navbar-dropdown a.navbar-item.is-active{background-color:#00d1b2;color:#fff}}.navbar.is-link{background-color:#3273dc;color:#fff}.navbar.is-link .navbar-brand .navbar-link,.navbar.is-link .navbar-brand>.navbar-item{color:#fff}.navbar.is-link .navbar-brand .navbar-link.is-active,.navbar.is-link .navbar-brand .navbar-link:hover,.navbar.is-link .navbar-brand>a.navbar-item.is-active,.navbar.is-link .navbar-brand>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-link .navbar-end .navbar-link,.navbar.is-link .navbar-end>.navbar-item,.navbar.is-link .navbar-start .navbar-link,.navbar.is-link .navbar-start>.navbar-item{color:#fff}.navbar.is-link .navbar-end .navbar-link.is-active,.navbar.is-link .navbar-end .navbar-link:hover,.navbar.is-link .navbar-end>a.navbar-item.is-active,.navbar.is-link .navbar-end>a.navbar-item:hover,.navbar.is-link .navbar-start .navbar-link.is-active,.navbar.is-link .navbar-start .navbar-link:hover,.navbar.is-link .navbar-start>a.navbar-item.is-active,.navbar.is-link .navbar-start>a.navbar-item:hover{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-end .navbar-link::after,.navbar.is-link .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-link .navbar-item.has-dropdown:hover .navbar-link{background-color:#2366d1;color:#fff}.navbar.is-link .navbar-dropdown a.navbar-item.is-active{background-color:#3273dc;color:#fff}}.navbar.is-info{background-color:#209cee;color:#fff}.navbar.is-info .navbar-brand .navbar-link,.navbar.is-info .navbar-brand>.navbar-item{color:#fff}.navbar.is-info .navbar-brand .navbar-link.is-active,.navbar.is-info .navbar-brand .navbar-link:hover,.navbar.is-info .navbar-brand>a.navbar-item.is-active,.navbar.is-info .navbar-brand>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-info .navbar-end .navbar-link,.navbar.is-info .navbar-end>.navbar-item,.navbar.is-info .navbar-start .navbar-link,.navbar.is-info .navbar-start>.navbar-item{color:#fff}.navbar.is-info .navbar-end .navbar-link.is-active,.navbar.is-info .navbar-end .navbar-link:hover,.navbar.is-info .navbar-end>a.navbar-item.is-active,.navbar.is-info .navbar-end>a.navbar-item:hover,.navbar.is-info .navbar-start .navbar-link.is-active,.navbar.is-info .navbar-start .navbar-link:hover,.navbar.is-info .navbar-start>a.navbar-item.is-active,.navbar.is-info .navbar-start>a.navbar-item:hover{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-end .navbar-link::after,.navbar.is-info .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-info .navbar-item.has-dropdown:hover .navbar-link{background-color:#118fe4;color:#fff}.navbar.is-info .navbar-dropdown a.navbar-item.is-active{background-color:#209cee;color:#fff}}.navbar.is-success{background-color:#23d160;color:#fff}.navbar.is-success .navbar-brand .navbar-link,.navbar.is-success .navbar-brand>.navbar-item{color:#fff}.navbar.is-success .navbar-brand .navbar-link.is-active,.navbar.is-success .navbar-brand .navbar-link:hover,.navbar.is-success .navbar-brand>a.navbar-item.is-active,.navbar.is-success .navbar-brand>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-success .navbar-end .navbar-link,.navbar.is-success .navbar-end>.navbar-item,.navbar.is-success .navbar-start .navbar-link,.navbar.is-success .navbar-start>.navbar-item{color:#fff}.navbar.is-success .navbar-end .navbar-link.is-active,.navbar.is-success .navbar-end .navbar-link:hover,.navbar.is-success .navbar-end>a.navbar-item.is-active,.navbar.is-success .navbar-end>a.navbar-item:hover,.navbar.is-success .navbar-start .navbar-link.is-active,.navbar.is-success .navbar-start .navbar-link:hover,.navbar.is-success .navbar-start>a.navbar-item.is-active,.navbar.is-success .navbar-start>a.navbar-item:hover{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-end .navbar-link::after,.navbar.is-success .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-success .navbar-item.has-dropdown:hover .navbar-link{background-color:#20bc56;color:#fff}.navbar.is-success .navbar-dropdown a.navbar-item.is-active{background-color:#23d160;color:#fff}}.navbar.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link,.navbar.is-warning .navbar-brand>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link.is-active,.navbar.is-warning .navbar-brand .navbar-link:hover,.navbar.is-warning .navbar-brand>a.navbar-item.is-active,.navbar.is-warning .navbar-brand>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-brand .navbar-link::after{border-color:rgba(0,0,0,.7)}@media screen and (min-width:1088px){.navbar.is-warning .navbar-end .navbar-link,.navbar.is-warning .navbar-end>.navbar-item,.navbar.is-warning .navbar-start .navbar-link,.navbar.is-warning .navbar-start>.navbar-item{color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link.is-active,.navbar.is-warning .navbar-end .navbar-link:hover,.navbar.is-warning .navbar-end>a.navbar-item.is-active,.navbar.is-warning .navbar-end>a.navbar-item:hover,.navbar.is-warning .navbar-start .navbar-link.is-active,.navbar.is-warning .navbar-start .navbar-link:hover,.navbar.is-warning .navbar-start>a.navbar-item.is-active,.navbar.is-warning .navbar-start>a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-end .navbar-link::after,.navbar.is-warning .navbar-start .navbar-link::after{border-color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link{background-color:#ffd83d;color:rgba(0,0,0,.7)}.navbar.is-warning .navbar-dropdown a.navbar-item.is-active{background-color:#ffdd57;color:rgba(0,0,0,.7)}}.navbar.is-danger{background-color:#ff3860;color:#fff}.navbar.is-danger .navbar-brand .navbar-link,.navbar.is-danger .navbar-brand>.navbar-item{color:#fff}.navbar.is-danger .navbar-brand .navbar-link.is-active,.navbar.is-danger .navbar-brand .navbar-link:hover,.navbar.is-danger .navbar-brand>a.navbar-item.is-active,.navbar.is-danger .navbar-brand>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-brand .navbar-link::after{border-color:#fff}@media screen and (min-width:1088px){.navbar.is-danger .navbar-end .navbar-link,.navbar.is-danger .navbar-end>.navbar-item,.navbar.is-danger .navbar-start .navbar-link,.navbar.is-danger .navbar-start>.navbar-item{color:#fff}.navbar.is-danger .navbar-end .navbar-link.is-active,.navbar.is-danger .navbar-end .navbar-link:hover,.navbar.is-danger .navbar-end>a.navbar-item.is-active,.navbar.is-danger .navbar-end>a.navbar-item:hover,.navbar.is-danger .navbar-start .navbar-link.is-active,.navbar.is-danger .navbar-start .navbar-link:hover,.navbar.is-danger .navbar-start>a.navbar-item.is-active,.navbar.is-danger .navbar-start>a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-end .navbar-link::after,.navbar.is-danger .navbar-start .navbar-link::after{border-color:#fff}.navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link{background-color:#ff1f4b;color:#fff}.navbar.is-danger .navbar-dropdown a.navbar-item.is-active{background-color:#ff3860;color:#fff}}.navbar>.container{align-items:stretch;display:flex;min-height:3.25rem;width:100%}.navbar.has-shadow{box-shadow:0 2px 0 0 #f5f5f5}.navbar.is-fixed-bottom,.navbar.is-fixed-top{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom{bottom:0}.navbar.is-fixed-bottom.has-shadow{box-shadow:0 -2px 0 0 #f5f5f5}.navbar.is-fixed-top{top:0}body.has-navbar-fixed-top,html.has-navbar-fixed-top{padding-top:3.25rem}body.has-navbar-fixed-bottom,html.has-navbar-fixed-bottom{padding-bottom:3.25rem}.navbar-brand,.navbar-tabs{align-items:stretch;display:flex;flex-shrink:0;min-height:3.25rem}.navbar-brand a.navbar-item:hover{background-color:transparent}.navbar-tabs{-webkit-overflow-scrolling:touch;max-width:100vw;overflow-x:auto;overflow-y:hidden}.navbar-burger{cursor:pointer;display:block;height:3.25rem;position:relative;width:3.25rem;margin-left:auto}.navbar-burger span{background-color:currentColor;display:block;height:1px;left:calc(50% - 8px);position:absolute;-webkit-transform-origin:center;transform-origin:center;transition-duration:86ms;transition-property:background-color,opacity,-webkit-transform;transition-property:background-color,opacity,transform;transition-property:background-color,opacity,transform,-webkit-transform;transition-timing-function:ease-out;width:16px}.navbar-burger span:nth-child(1){top:calc(50% - 6px)}.navbar-burger span:nth-child(2){top:calc(50% - 1px)}.navbar-burger span:nth-child(3){top:calc(50% + 4px)}.navbar-burger:hover{background-color:rgba(0,0,0,.05)}.navbar-burger.is-active span:nth-child(1){-webkit-transform:translateY(5px) rotate(45deg);transform:translateY(5px) rotate(45deg)}.navbar-burger.is-active span:nth-child(2){opacity:0}.navbar-burger.is-active span:nth-child(3){-webkit-transform:translateY(-5px) rotate(-45deg);transform:translateY(-5px) rotate(-45deg)}.navbar-menu{display:none}.navbar-item,.navbar-link{color:#4a4a4a;display:block;line-height:1.5;padding:.5rem .75rem;position:relative}.navbar-item .icon:only-child,.navbar-link .icon:only-child{margin-left:-.25rem;margin-right:-.25rem}.navbar-link,a.navbar-item{cursor:pointer}.navbar-link.is-active,.navbar-link:hover,a.navbar-item.is-active,a.navbar-item:hover{background-color:#fafafa;color:#3273dc}.navbar-item{display:block;flex-grow:0;flex-shrink:0}.navbar-item img{max-height:1.75rem}.navbar-item.has-dropdown{padding:0}.navbar-item.is-expanded{flex-grow:1;flex-shrink:1}.navbar-item.is-tab{border-bottom:1px solid transparent;min-height:3.25rem;padding-bottom:calc(.5rem - 1px)}.navbar-item.is-tab:hover{background-color:transparent;border-bottom-color:#3273dc}.navbar-item.is-tab.is-active{background-color:transparent;border-bottom-color:#3273dc;border-bottom-style:solid;border-bottom-width:3px;color:#3273dc;padding-bottom:calc(.5rem - 3px)}.navbar-content{flex-grow:1;flex-shrink:1}.navbar-link{padding-right:2.5em}.navbar-link::after{border-color:#3273dc;margin-top:-.375em;right:1.125em}.navbar-dropdown{font-size:.875rem;padding-bottom:.5rem;padding-top:.5rem}.navbar-dropdown .navbar-item{padding-left:1.5rem;padding-right:1.5rem}.navbar-divider{background-color:#f5f5f5;border:none;display:none;height:2px;margin:.5rem 0}@media screen and (max-width:1087px){.navbar>.container{display:block}.navbar-brand .navbar-item,.navbar-tabs .navbar-item{align-items:center;display:flex}.navbar-link::after{display:none}.navbar-menu{background-color:#fff;box-shadow:0 8px 16px rgba(10,10,10,.1);padding:.5rem 0}.navbar-menu.is-active{display:block}.navbar.is-fixed-bottom-touch,.navbar.is-fixed-top-touch{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-touch{bottom:0}.navbar.is-fixed-bottom-touch.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-touch{top:0}.navbar.is-fixed-top .navbar-menu,.navbar.is-fixed-top-touch .navbar-menu{-webkit-overflow-scrolling:touch;max-height:calc(100vh - 3.25rem);overflow:auto}body.has-navbar-fixed-top-touch,html.has-navbar-fixed-top-touch{padding-top:3.25rem}body.has-navbar-fixed-bottom-touch,html.has-navbar-fixed-bottom-touch{padding-bottom:3.25rem}}@media screen and (min-width:1088px){.navbar,.navbar-end,.navbar-menu,.navbar-start{align-items:stretch;display:flex}.navbar{min-height:3.25rem}.navbar.is-spaced{padding:1rem 2rem}.navbar.is-spaced .navbar-end,.navbar.is-spaced .navbar-start{align-items:center}.navbar.is-spaced .navbar-link,.navbar.is-spaced a.navbar-item{border-radius:4px}.navbar.is-transparent .navbar-link.is-active,.navbar.is-transparent .navbar-link:hover,.navbar.is-transparent a.navbar-item.is-active,.navbar.is-transparent a.navbar-item:hover{background-color:transparent!important}.navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link,.navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link{background-color:transparent!important}.navbar.is-transparent .navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar.is-transparent .navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-burger{display:none}.navbar-item,.navbar-link{align-items:center;display:flex}.navbar-item{display:flex}.navbar-item.has-dropdown{align-items:stretch}.navbar-item.has-dropdown-up .navbar-link::after{-webkit-transform:rotate(135deg) translate(.25em,-.25em);transform:rotate(135deg) translate(.25em,-.25em)}.navbar-item.has-dropdown-up .navbar-dropdown{border-bottom:2px solid #dbdbdb;border-radius:6px 6px 0 0;border-top:none;bottom:100%;box-shadow:0 -8px 8px rgba(10,10,10,.1);top:auto}.navbar-item.is-active .navbar-dropdown,.navbar-item.is-hoverable:hover .navbar-dropdown{display:block}.navbar-item.is-active .navbar-dropdown.is-boxed,.navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-item.is-active .navbar-dropdown,.navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown{opacity:1;pointer-events:auto;-webkit-transform:translateY(0);transform:translateY(0)}.navbar-menu{flex-grow:1;flex-shrink:0}.navbar-start{justify-content:flex-start;margin-right:auto}.navbar-end{justify-content:flex-end;margin-left:auto}.navbar-dropdown{background-color:#fff;border-bottom-left-radius:6px;border-bottom-right-radius:6px;border-top:2px solid #dbdbdb;box-shadow:0 8px 8px rgba(10,10,10,.1);display:none;font-size:.875rem;left:0;min-width:100%;position:absolute;top:100%;z-index:20}.navbar-dropdown .navbar-item{padding:.375rem 1rem;white-space:nowrap}.navbar-dropdown a.navbar-item{padding-right:3rem}.navbar-dropdown a.navbar-item:hover{background-color:#f5f5f5;color:#0a0a0a}.navbar-dropdown a.navbar-item.is-active{background-color:#f5f5f5;color:#3273dc}.navbar-dropdown.is-boxed,.navbar.is-spaced .navbar-dropdown{border-radius:6px;border-top:none;box-shadow:0 8px 8px rgba(10,10,10,.1),0 0 0 1px rgba(10,10,10,.1);display:block;opacity:0;pointer-events:none;top:calc(100% + (-4px));-webkit-transform:translateY(-5px);transform:translateY(-5px);transition-duration:86ms;transition-property:opacity,-webkit-transform;transition-property:opacity,transform;transition-property:opacity,transform,-webkit-transform}.navbar-dropdown.is-right{left:auto;right:0}.navbar-divider{display:block}.container>.navbar .navbar-brand,.navbar>.container .navbar-brand{margin-left:-1rem}.container>.navbar .navbar-menu,.navbar>.container .navbar-menu{margin-right:-1rem}.navbar.is-fixed-bottom-desktop,.navbar.is-fixed-top-desktop{left:0;position:fixed;right:0;z-index:30}.navbar.is-fixed-bottom-desktop{bottom:0}.navbar.is-fixed-bottom-desktop.has-shadow{box-shadow:0 -2px 3px rgba(10,10,10,.1)}.navbar.is-fixed-top-desktop{top:0}body.has-navbar-fixed-top-desktop,html.has-navbar-fixed-top-desktop{padding-top:3.25rem}body.has-navbar-fixed-bottom-desktop,html.has-navbar-fixed-bottom-desktop{padding-bottom:3.25rem}body.has-spaced-navbar-fixed-top,html.has-spaced-navbar-fixed-top{padding-top:5.25rem}body.has-spaced-navbar-fixed-bottom,html.has-spaced-navbar-fixed-bottom{padding-bottom:5.25rem}.navbar-link.is-active,a.navbar-item.is-active{color:#0a0a0a}.navbar-link.is-active:not(:hover),a.navbar-item.is-active:not(:hover){background-color:transparent}.navbar-item.has-dropdown.is-active .navbar-link,.navbar-item.has-dropdown:hover .navbar-link{background-color:#fafafa}}.pagination{font-size:1rem;margin:-.25rem}.pagination.is-small{font-size:.75rem}.pagination.is-medium{font-size:1.25rem}.pagination.is-large{font-size:1.5rem}.pagination.is-rounded .pagination-next,.pagination.is-rounded .pagination-previous{padding-left:1em;padding-right:1em;border-radius:290486px}.pagination.is-rounded .pagination-link{border-radius:290486px}.pagination,.pagination-list{align-items:center;display:flex;justify-content:center;text-align:center}.pagination-ellipsis,.pagination-link,.pagination-next,.pagination-previous{font-size:1em;padding-left:.5em;padding-right:.5em;justify-content:center;margin:.25rem;text-align:center}.pagination-link,.pagination-next,.pagination-previous{border-color:#dbdbdb;color:#363636;min-width:2.25em}.pagination-link:hover,.pagination-next:hover,.pagination-previous:hover{border-color:#b5b5b5;color:#363636}.pagination-link:focus,.pagination-next:focus,.pagination-previous:focus{border-color:#3273dc}.pagination-link:active,.pagination-next:active,.pagination-previous:active{box-shadow:inset 0 1px 2px rgba(10,10,10,.2)}.pagination-link[disabled],.pagination-next[disabled],.pagination-previous[disabled]{background-color:#dbdbdb;border-color:#dbdbdb;box-shadow:none;color:#7a7a7a;opacity:.5}.pagination-next,.pagination-previous{padding-left:.75em;padding-right:.75em;white-space:nowrap}.pagination-link.is-current{background-color:#3273dc;border-color:#3273dc;color:#fff}.pagination-ellipsis{color:#b5b5b5;pointer-events:none}.pagination-list{flex-wrap:wrap}@media screen and (max-width:768px){.pagination{flex-wrap:wrap}.pagination-next,.pagination-previous{flex-grow:1;flex-shrink:1}.pagination-list li{flex-grow:1;flex-shrink:1}}@media screen and (min-width:769px),print{.pagination-list{flex-grow:1;flex-shrink:1;justify-content:flex-start;order:1}.pagination-previous{order:2}.pagination-next{order:3}.pagination{justify-content:space-between}.pagination.is-centered .pagination-previous{order:1}.pagination.is-centered .pagination-list{justify-content:center;order:2}.pagination.is-centered .pagination-next{order:3}.pagination.is-right .pagination-previous{order:1}.pagination.is-right .pagination-next{order:2}.pagination.is-right .pagination-list{justify-content:flex-end;order:3}}.panel{font-size:1rem}.panel:not(:last-child){margin-bottom:1.5rem}.panel-block,.panel-heading,.panel-tabs{border-bottom:1px solid #dbdbdb;border-left:1px solid #dbdbdb;border-right:1px solid #dbdbdb}.panel-block:first-child,.panel-heading:first-child,.panel-tabs:first-child{border-top:1px solid #dbdbdb}.panel-heading{background-color:#f5f5f5;border-radius:4px 4px 0 0;color:#363636;font-size:1.25em;font-weight:300;line-height:1.25;padding:.5em .75em}.panel-tabs{align-items:flex-end;display:flex;font-size:.875em;justify-content:center}.panel-tabs a{border-bottom:1px solid #dbdbdb;margin-bottom:-1px;padding:.5em}.panel-tabs a.is-active{border-bottom-color:#4a4a4a;color:#363636}.panel-list a{color:#4a4a4a}.panel-list a:hover{color:#3273dc}.panel-block{align-items:center;color:#363636;display:flex;justify-content:flex-start;padding:.5em .75em}.panel-block input[type=checkbox]{margin-right:.75em}.panel-block>.control{flex-grow:1;flex-shrink:1;width:100%}.panel-block.is-wrapped{flex-wrap:wrap}.panel-block.is-active{border-left-color:#3273dc;color:#363636}.panel-block.is-active .panel-icon{color:#3273dc}a.panel-block,label.panel-block{cursor:pointer}a.panel-block:hover,label.panel-block:hover{background-color:#f5f5f5}.panel-icon{display:inline-block;font-size:14px;height:1em;line-height:1em;text-align:center;vertical-align:top;width:1em;color:#7a7a7a;margin-right:.75em}.panel-icon .fa{font-size:inherit;line-height:inherit}.tabs{-webkit-overflow-scrolling:touch;align-items:stretch;display:flex;font-size:1rem;justify-content:space-between;overflow:hidden;overflow-x:auto;white-space:nowrap}.tabs a{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;color:#4a4a4a;display:flex;justify-content:center;margin-bottom:-1px;padding:.5em 1em;vertical-align:top}.tabs a:hover{border-bottom-color:#363636;color:#363636}.tabs li{display:block}.tabs li.is-active a{border-bottom-color:#3273dc;color:#3273dc}.tabs ul{align-items:center;border-bottom-color:#dbdbdb;border-bottom-style:solid;border-bottom-width:1px;display:flex;flex-grow:1;flex-shrink:0;justify-content:flex-start}.tabs ul.is-left{padding-right:.75em}.tabs ul.is-center{flex:none;justify-content:center;padding-left:.75em;padding-right:.75em}.tabs ul.is-right{justify-content:flex-end;padding-left:.75em}.tabs .icon:first-child{margin-right:.5em}.tabs .icon:last-child{margin-left:.5em}.tabs.is-centered ul{justify-content:center}.tabs.is-right ul{justify-content:flex-end}.tabs.is-boxed a{border:1px solid transparent;border-radius:4px 4px 0 0}.tabs.is-boxed a:hover{background-color:#f5f5f5;border-bottom-color:#dbdbdb}.tabs.is-boxed li.is-active a{background-color:#fff;border-color:#dbdbdb;border-bottom-color:transparent!important}.tabs.is-fullwidth li{flex-grow:1;flex-shrink:0}.tabs.is-toggle a{border-color:#dbdbdb;border-style:solid;border-width:1px;margin-bottom:0;position:relative}.tabs.is-toggle a:hover{background-color:#f5f5f5;border-color:#b5b5b5;z-index:2}.tabs.is-toggle li+li{margin-left:-1px}.tabs.is-toggle li:first-child a{border-radius:4px 0 0 4px}.tabs.is-toggle li:last-child a{border-radius:0 4px 4px 0}.tabs.is-toggle li.is-active a{background-color:#3273dc;border-color:#3273dc;color:#fff;z-index:1}.tabs.is-toggle ul{border-bottom:none}.tabs.is-toggle.is-toggle-rounded li:first-child a{border-bottom-left-radius:290486px;border-top-left-radius:290486px;padding-left:1.25em}.tabs.is-toggle.is-toggle-rounded li:last-child a{border-bottom-right-radius:290486px;border-top-right-radius:290486px;padding-right:1.25em}.tabs.is-small{font-size:.75rem}.tabs.is-medium{font-size:1.25rem}.tabs.is-large{font-size:1.5rem}.column{display:block;flex-basis:0;flex-grow:1;flex-shrink:1;padding:.75rem}.columns.is-mobile>.column.is-narrow{flex:none}.columns.is-mobile>.column.is-full{flex:none;width:100%}.columns.is-mobile>.column.is-three-quarters{flex:none;width:75%}.columns.is-mobile>.column.is-two-thirds{flex:none;width:66.6666%}.columns.is-mobile>.column.is-half{flex:none;width:50%}.columns.is-mobile>.column.is-one-third{flex:none;width:33.3333%}.columns.is-mobile>.column.is-one-quarter{flex:none;width:25%}.columns.is-mobile>.column.is-one-fifth{flex:none;width:20%}.columns.is-mobile>.column.is-two-fifths{flex:none;width:40%}.columns.is-mobile>.column.is-three-fifths{flex:none;width:60%}.columns.is-mobile>.column.is-four-fifths{flex:none;width:80%}.columns.is-mobile>.column.is-offset-three-quarters{margin-left:75%}.columns.is-mobile>.column.is-offset-two-thirds{margin-left:66.6666%}.columns.is-mobile>.column.is-offset-half{margin-left:50%}.columns.is-mobile>.column.is-offset-one-third{margin-left:33.3333%}.columns.is-mobile>.column.is-offset-one-quarter{margin-left:25%}.columns.is-mobile>.column.is-offset-one-fifth{margin-left:20%}.columns.is-mobile>.column.is-offset-two-fifths{margin-left:40%}.columns.is-mobile>.column.is-offset-three-fifths{margin-left:60%}.columns.is-mobile>.column.is-offset-four-fifths{margin-left:80%}.columns.is-mobile>.column.is-1{flex:none;width:8.33333%}.columns.is-mobile>.column.is-offset-1{margin-left:8.33333%}.columns.is-mobile>.column.is-2{flex:none;width:16.66667%}.columns.is-mobile>.column.is-offset-2{margin-left:16.66667%}.columns.is-mobile>.column.is-3{flex:none;width:25%}.columns.is-mobile>.column.is-offset-3{margin-left:25%}.columns.is-mobile>.column.is-4{flex:none;width:33.33333%}.columns.is-mobile>.column.is-offset-4{margin-left:33.33333%}.columns.is-mobile>.column.is-5{flex:none;width:41.66667%}.columns.is-mobile>.column.is-offset-5{margin-left:41.66667%}.columns.is-mobile>.column.is-6{flex:none;width:50%}.columns.is-mobile>.column.is-offset-6{margin-left:50%}.columns.is-mobile>.column.is-7{flex:none;width:58.33333%}.columns.is-mobile>.column.is-offset-7{margin-left:58.33333%}.columns.is-mobile>.column.is-8{flex:none;width:66.66667%}.columns.is-mobile>.column.is-offset-8{margin-left:66.66667%}.columns.is-mobile>.column.is-9{flex:none;width:75%}.columns.is-mobile>.column.is-offset-9{margin-left:75%}.columns.is-mobile>.column.is-10{flex:none;width:83.33333%}.columns.is-mobile>.column.is-offset-10{margin-left:83.33333%}.columns.is-mobile>.column.is-11{flex:none;width:91.66667%}.columns.is-mobile>.column.is-offset-11{margin-left:91.66667%}.columns.is-mobile>.column.is-12{flex:none;width:100%}.columns.is-mobile>.column.is-offset-12{margin-left:100%}@media screen and (max-width:768px){.column.is-narrow-mobile{flex:none}.column.is-full-mobile{flex:none;width:100%}.column.is-three-quarters-mobile{flex:none;width:75%}.column.is-two-thirds-mobile{flex:none;width:66.6666%}.column.is-half-mobile{flex:none;width:50%}.column.is-one-third-mobile{flex:none;width:33.3333%}.column.is-one-quarter-mobile{flex:none;width:25%}.column.is-one-fifth-mobile{flex:none;width:20%}.column.is-two-fifths-mobile{flex:none;width:40%}.column.is-three-fifths-mobile{flex:none;width:60%}.column.is-four-fifths-mobile{flex:none;width:80%}.column.is-offset-three-quarters-mobile{margin-left:75%}.column.is-offset-two-thirds-mobile{margin-left:66.6666%}.column.is-offset-half-mobile{margin-left:50%}.column.is-offset-one-third-mobile{margin-left:33.3333%}.column.is-offset-one-quarter-mobile{margin-left:25%}.column.is-offset-one-fifth-mobile{margin-left:20%}.column.is-offset-two-fifths-mobile{margin-left:40%}.column.is-offset-three-fifths-mobile{margin-left:60%}.column.is-offset-four-fifths-mobile{margin-left:80%}.column.is-1-mobile{flex:none;width:8.33333%}.column.is-offset-1-mobile{margin-left:8.33333%}.column.is-2-mobile{flex:none;width:16.66667%}.column.is-offset-2-mobile{margin-left:16.66667%}.column.is-3-mobile{flex:none;width:25%}.column.is-offset-3-mobile{margin-left:25%}.column.is-4-mobile{flex:none;width:33.33333%}.column.is-offset-4-mobile{margin-left:33.33333%}.column.is-5-mobile{flex:none;width:41.66667%}.column.is-offset-5-mobile{margin-left:41.66667%}.column.is-6-mobile{flex:none;width:50%}.column.is-offset-6-mobile{margin-left:50%}.column.is-7-mobile{flex:none;width:58.33333%}.column.is-offset-7-mobile{margin-left:58.33333%}.column.is-8-mobile{flex:none;width:66.66667%}.column.is-offset-8-mobile{margin-left:66.66667%}.column.is-9-mobile{flex:none;width:75%}.column.is-offset-9-mobile{margin-left:75%}.column.is-10-mobile{flex:none;width:83.33333%}.column.is-offset-10-mobile{margin-left:83.33333%}.column.is-11-mobile{flex:none;width:91.66667%}.column.is-offset-11-mobile{margin-left:91.66667%}.column.is-12-mobile{flex:none;width:100%}.column.is-offset-12-mobile{margin-left:100%}}@media screen and (min-width:769px),print{.column.is-narrow,.column.is-narrow-tablet{flex:none}.column.is-full,.column.is-full-tablet{flex:none;width:100%}.column.is-three-quarters,.column.is-three-quarters-tablet{flex:none;width:75%}.column.is-two-thirds,.column.is-two-thirds-tablet{flex:none;width:66.6666%}.column.is-half,.column.is-half-tablet{flex:none;width:50%}.column.is-one-third,.column.is-one-third-tablet{flex:none;width:33.3333%}.column.is-one-quarter,.column.is-one-quarter-tablet{flex:none;width:25%}.column.is-one-fifth,.column.is-one-fifth-tablet{flex:none;width:20%}.column.is-two-fifths,.column.is-two-fifths-tablet{flex:none;width:40%}.column.is-three-fifths,.column.is-three-fifths-tablet{flex:none;width:60%}.column.is-four-fifths,.column.is-four-fifths-tablet{flex:none;width:80%}.column.is-offset-three-quarters,.column.is-offset-three-quarters-tablet{margin-left:75%}.column.is-offset-two-thirds,.column.is-offset-two-thirds-tablet{margin-left:66.6666%}.column.is-offset-half,.column.is-offset-half-tablet{margin-left:50%}.column.is-offset-one-third,.column.is-offset-one-third-tablet{margin-left:33.3333%}.column.is-offset-one-quarter,.column.is-offset-one-quarter-tablet{margin-left:25%}.column.is-offset-one-fifth,.column.is-offset-one-fifth-tablet{margin-left:20%}.column.is-offset-two-fifths,.column.is-offset-two-fifths-tablet{margin-left:40%}.column.is-offset-three-fifths,.column.is-offset-three-fifths-tablet{margin-left:60%}.column.is-offset-four-fifths,.column.is-offset-four-fifths-tablet{margin-left:80%}.column.is-1,.column.is-1-tablet{flex:none;width:8.33333%}.column.is-offset-1,.column.is-offset-1-tablet{margin-left:8.33333%}.column.is-2,.column.is-2-tablet{flex:none;width:16.66667%}.column.is-offset-2,.column.is-offset-2-tablet{margin-left:16.66667%}.column.is-3,.column.is-3-tablet{flex:none;width:25%}.column.is-offset-3,.column.is-offset-3-tablet{margin-left:25%}.column.is-4,.column.is-4-tablet{flex:none;width:33.33333%}.column.is-offset-4,.column.is-offset-4-tablet{margin-left:33.33333%}.column.is-5,.column.is-5-tablet{flex:none;width:41.66667%}.column.is-offset-5,.column.is-offset-5-tablet{margin-left:41.66667%}.column.is-6,.column.is-6-tablet{flex:none;width:50%}.column.is-offset-6,.column.is-offset-6-tablet{margin-left:50%}.column.is-7,.column.is-7-tablet{flex:none;width:58.33333%}.column.is-offset-7,.column.is-offset-7-tablet{margin-left:58.33333%}.column.is-8,.column.is-8-tablet{flex:none;width:66.66667%}.column.is-offset-8,.column.is-offset-8-tablet{margin-left:66.66667%}.column.is-9,.column.is-9-tablet{flex:none;width:75%}.column.is-offset-9,.column.is-offset-9-tablet{margin-left:75%}.column.is-10,.column.is-10-tablet{flex:none;width:83.33333%}.column.is-offset-10,.column.is-offset-10-tablet{margin-left:83.33333%}.column.is-11,.column.is-11-tablet{flex:none;width:91.66667%}.column.is-offset-11,.column.is-offset-11-tablet{margin-left:91.66667%}.column.is-12,.column.is-12-tablet{flex:none;width:100%}.column.is-offset-12,.column.is-offset-12-tablet{margin-left:100%}}@media screen and (max-width:1087px){.column.is-narrow-touch{flex:none}.column.is-full-touch{flex:none;width:100%}.column.is-three-quarters-touch{flex:none;width:75%}.column.is-two-thirds-touch{flex:none;width:66.6666%}.column.is-half-touch{flex:none;width:50%}.column.is-one-third-touch{flex:none;width:33.3333%}.column.is-one-quarter-touch{flex:none;width:25%}.column.is-one-fifth-touch{flex:none;width:20%}.column.is-two-fifths-touch{flex:none;width:40%}.column.is-three-fifths-touch{flex:none;width:60%}.column.is-four-fifths-touch{flex:none;width:80%}.column.is-offset-three-quarters-touch{margin-left:75%}.column.is-offset-two-thirds-touch{margin-left:66.6666%}.column.is-offset-half-touch{margin-left:50%}.column.is-offset-one-third-touch{margin-left:33.3333%}.column.is-offset-one-quarter-touch{margin-left:25%}.column.is-offset-one-fifth-touch{margin-left:20%}.column.is-offset-two-fifths-touch{margin-left:40%}.column.is-offset-three-fifths-touch{margin-left:60%}.column.is-offset-four-fifths-touch{margin-left:80%}.column.is-1-touch{flex:none;width:8.33333%}.column.is-offset-1-touch{margin-left:8.33333%}.column.is-2-touch{flex:none;width:16.66667%}.column.is-offset-2-touch{margin-left:16.66667%}.column.is-3-touch{flex:none;width:25%}.column.is-offset-3-touch{margin-left:25%}.column.is-4-touch{flex:none;width:33.33333%}.column.is-offset-4-touch{margin-left:33.33333%}.column.is-5-touch{flex:none;width:41.66667%}.column.is-offset-5-touch{margin-left:41.66667%}.column.is-6-touch{flex:none;width:50%}.column.is-offset-6-touch{margin-left:50%}.column.is-7-touch{flex:none;width:58.33333%}.column.is-offset-7-touch{margin-left:58.33333%}.column.is-8-touch{flex:none;width:66.66667%}.column.is-offset-8-touch{margin-left:66.66667%}.column.is-9-touch{flex:none;width:75%}.column.is-offset-9-touch{margin-left:75%}.column.is-10-touch{flex:none;width:83.33333%}.column.is-offset-10-touch{margin-left:83.33333%}.column.is-11-touch{flex:none;width:91.66667%}.column.is-offset-11-touch{margin-left:91.66667%}.column.is-12-touch{flex:none;width:100%}.column.is-offset-12-touch{margin-left:100%}}@media screen and (min-width:1088px){.column.is-narrow-desktop{flex:none}.column.is-full-desktop{flex:none;width:100%}.column.is-three-quarters-desktop{flex:none;width:75%}.column.is-two-thirds-desktop{flex:none;width:66.6666%}.column.is-half-desktop{flex:none;width:50%}.column.is-one-third-desktop{flex:none;width:33.3333%}.column.is-one-quarter-desktop{flex:none;width:25%}.column.is-one-fifth-desktop{flex:none;width:20%}.column.is-two-fifths-desktop{flex:none;width:40%}.column.is-three-fifths-desktop{flex:none;width:60%}.column.is-four-fifths-desktop{flex:none;width:80%}.column.is-offset-three-quarters-desktop{margin-left:75%}.column.is-offset-two-thirds-desktop{margin-left:66.6666%}.column.is-offset-half-desktop{margin-left:50%}.column.is-offset-one-third-desktop{margin-left:33.3333%}.column.is-offset-one-quarter-desktop{margin-left:25%}.column.is-offset-one-fifth-desktop{margin-left:20%}.column.is-offset-two-fifths-desktop{margin-left:40%}.column.is-offset-three-fifths-desktop{margin-left:60%}.column.is-offset-four-fifths-desktop{margin-left:80%}.column.is-1-desktop{flex:none;width:8.33333%}.column.is-offset-1-desktop{margin-left:8.33333%}.column.is-2-desktop{flex:none;width:16.66667%}.column.is-offset-2-desktop{margin-left:16.66667%}.column.is-3-desktop{flex:none;width:25%}.column.is-offset-3-desktop{margin-left:25%}.column.is-4-desktop{flex:none;width:33.33333%}.column.is-offset-4-desktop{margin-left:33.33333%}.column.is-5-desktop{flex:none;width:41.66667%}.column.is-offset-5-desktop{margin-left:41.66667%}.column.is-6-desktop{flex:none;width:50%}.column.is-offset-6-desktop{margin-left:50%}.column.is-7-desktop{flex:none;width:58.33333%}.column.is-offset-7-desktop{margin-left:58.33333%}.column.is-8-desktop{flex:none;width:66.66667%}.column.is-offset-8-desktop{margin-left:66.66667%}.column.is-9-desktop{flex:none;width:75%}.column.is-offset-9-desktop{margin-left:75%}.column.is-10-desktop{flex:none;width:83.33333%}.column.is-offset-10-desktop{margin-left:83.33333%}.column.is-11-desktop{flex:none;width:91.66667%}.column.is-offset-11-desktop{margin-left:91.66667%}.column.is-12-desktop{flex:none;width:100%}.column.is-offset-12-desktop{margin-left:100%}}@media screen and (min-width:1280px){.column.is-narrow-widescreen{flex:none}.column.is-full-widescreen{flex:none;width:100%}.column.is-three-quarters-widescreen{flex:none;width:75%}.column.is-two-thirds-widescreen{flex:none;width:66.6666%}.column.is-half-widescreen{flex:none;width:50%}.column.is-one-third-widescreen{flex:none;width:33.3333%}.column.is-one-quarter-widescreen{flex:none;width:25%}.column.is-one-fifth-widescreen{flex:none;width:20%}.column.is-two-fifths-widescreen{flex:none;width:40%}.column.is-three-fifths-widescreen{flex:none;width:60%}.column.is-four-fifths-widescreen{flex:none;width:80%}.column.is-offset-three-quarters-widescreen{margin-left:75%}.column.is-offset-two-thirds-widescreen{margin-left:66.6666%}.column.is-offset-half-widescreen{margin-left:50%}.column.is-offset-one-third-widescreen{margin-left:33.3333%}.column.is-offset-one-quarter-widescreen{margin-left:25%}.column.is-offset-one-fifth-widescreen{margin-left:20%}.column.is-offset-two-fifths-widescreen{margin-left:40%}.column.is-offset-three-fifths-widescreen{margin-left:60%}.column.is-offset-four-fifths-widescreen{margin-left:80%}.column.is-1-widescreen{flex:none;width:8.33333%}.column.is-offset-1-widescreen{margin-left:8.33333%}.column.is-2-widescreen{flex:none;width:16.66667%}.column.is-offset-2-widescreen{margin-left:16.66667%}.column.is-3-widescreen{flex:none;width:25%}.column.is-offset-3-widescreen{margin-left:25%}.column.is-4-widescreen{flex:none;width:33.33333%}.column.is-offset-4-widescreen{margin-left:33.33333%}.column.is-5-widescreen{flex:none;width:41.66667%}.column.is-offset-5-widescreen{margin-left:41.66667%}.column.is-6-widescreen{flex:none;width:50%}.column.is-offset-6-widescreen{margin-left:50%}.column.is-7-widescreen{flex:none;width:58.33333%}.column.is-offset-7-widescreen{margin-left:58.33333%}.column.is-8-widescreen{flex:none;width:66.66667%}.column.is-offset-8-widescreen{margin-left:66.66667%}.column.is-9-widescreen{flex:none;width:75%}.column.is-offset-9-widescreen{margin-left:75%}.column.is-10-widescreen{flex:none;width:83.33333%}.column.is-offset-10-widescreen{margin-left:83.33333%}.column.is-11-widescreen{flex:none;width:91.66667%}.column.is-offset-11-widescreen{margin-left:91.66667%}.column.is-12-widescreen{flex:none;width:100%}.column.is-offset-12-widescreen{margin-left:100%}}@media screen and (min-width:1472px){.column.is-narrow-fullhd{flex:none}.column.is-full-fullhd{flex:none;width:100%}.column.is-three-quarters-fullhd{flex:none;width:75%}.column.is-two-thirds-fullhd{flex:none;width:66.6666%}.column.is-half-fullhd{flex:none;width:50%}.column.is-one-third-fullhd{flex:none;width:33.3333%}.column.is-one-quarter-fullhd{flex:none;width:25%}.column.is-one-fifth-fullhd{flex:none;width:20%}.column.is-two-fifths-fullhd{flex:none;width:40%}.column.is-three-fifths-fullhd{flex:none;width:60%}.column.is-four-fifths-fullhd{flex:none;width:80%}.column.is-offset-three-quarters-fullhd{margin-left:75%}.column.is-offset-two-thirds-fullhd{margin-left:66.6666%}.column.is-offset-half-fullhd{margin-left:50%}.column.is-offset-one-third-fullhd{margin-left:33.3333%}.column.is-offset-one-quarter-fullhd{margin-left:25%}.column.is-offset-one-fifth-fullhd{margin-left:20%}.column.is-offset-two-fifths-fullhd{margin-left:40%}.column.is-offset-three-fifths-fullhd{margin-left:60%}.column.is-offset-four-fifths-fullhd{margin-left:80%}.column.is-1-fullhd{flex:none;width:8.33333%}.column.is-offset-1-fullhd{margin-left:8.33333%}.column.is-2-fullhd{flex:none;width:16.66667%}.column.is-offset-2-fullhd{margin-left:16.66667%}.column.is-3-fullhd{flex:none;width:25%}.column.is-offset-3-fullhd{margin-left:25%}.column.is-4-fullhd{flex:none;width:33.33333%}.column.is-offset-4-fullhd{margin-left:33.33333%}.column.is-5-fullhd{flex:none;width:41.66667%}.column.is-offset-5-fullhd{margin-left:41.66667%}.column.is-6-fullhd{flex:none;width:50%}.column.is-offset-6-fullhd{margin-left:50%}.column.is-7-fullhd{flex:none;width:58.33333%}.column.is-offset-7-fullhd{margin-left:58.33333%}.column.is-8-fullhd{flex:none;width:66.66667%}.column.is-offset-8-fullhd{margin-left:66.66667%}.column.is-9-fullhd{flex:none;width:75%}.column.is-offset-9-fullhd{margin-left:75%}.column.is-10-fullhd{flex:none;width:83.33333%}.column.is-offset-10-fullhd{margin-left:83.33333%}.column.is-11-fullhd{flex:none;width:91.66667%}.column.is-offset-11-fullhd{margin-left:91.66667%}.column.is-12-fullhd{flex:none;width:100%}.column.is-offset-12-fullhd{margin-left:100%}}.columns{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.columns:last-child{margin-bottom:-.75rem}.columns:not(:last-child){margin-bottom:calc(1.5rem - .75rem)}.columns.is-centered{justify-content:center}.columns.is-gapless{margin-left:0;margin-right:0;margin-top:0}.columns.is-gapless>.column{margin:0;padding:0!important}.columns.is-gapless:not(:last-child){margin-bottom:1.5rem}.columns.is-gapless:last-child{margin-bottom:0}.columns.is-mobile{display:flex}.columns.is-multiline{flex-wrap:wrap}.columns.is-vcentered{align-items:center}@media screen and (min-width:769px),print{.columns:not(.is-desktop){display:flex}}@media screen and (min-width:1088px){.columns.is-desktop{display:flex}}.columns.is-variable{--columnGap:0.75rem;margin-left:calc(-1 * var(--columnGap));margin-right:calc(-1 * var(--columnGap))}.columns.is-variable .column{padding-left:var(--columnGap);padding-right:var(--columnGap)}.columns.is-variable.is-0{--columnGap:0rem}.columns.is-variable.is-1{--columnGap:0.25rem}.columns.is-variable.is-2{--columnGap:0.5rem}.columns.is-variable.is-3{--columnGap:0.75rem}.columns.is-variable.is-4{--columnGap:1rem}.columns.is-variable.is-5{--columnGap:1.25rem}.columns.is-variable.is-6{--columnGap:1.5rem}.columns.is-variable.is-7{--columnGap:1.75rem}.columns.is-variable.is-8{--columnGap:2rem}.tile{align-items:stretch;display:block;flex-basis:0;flex-grow:1;flex-shrink:1;min-height:-webkit-min-content;min-height:-moz-min-content;min-height:min-content}.tile.is-ancestor{margin-left:-.75rem;margin-right:-.75rem;margin-top:-.75rem}.tile.is-ancestor:last-child{margin-bottom:-.75rem}.tile.is-ancestor:not(:last-child){margin-bottom:.75rem}.tile.is-child{margin:0!important}.tile.is-parent{padding:.75rem}.tile.is-vertical{flex-direction:column}.tile.is-vertical>.tile.is-child:not(:last-child){margin-bottom:1.5rem!important}@media screen and (min-width:769px),print{.tile:not(.is-child){display:flex}.tile.is-1{flex:none;width:8.33333%}.tile.is-2{flex:none;width:16.66667%}.tile.is-3{flex:none;width:25%}.tile.is-4{flex:none;width:33.33333%}.tile.is-5{flex:none;width:41.66667%}.tile.is-6{flex:none;width:50%}.tile.is-7{flex:none;width:58.33333%}.tile.is-8{flex:none;width:66.66667%}.tile.is-9{flex:none;width:75%}.tile.is-10{flex:none;width:83.33333%}.tile.is-11{flex:none;width:91.66667%}.tile.is-12{flex:none;width:100%}}.hero{align-items:stretch;display:flex;flex-direction:column;justify-content:space-between}.hero .navbar{background:0 0}.hero .tabs ul{border-bottom:none}.hero.is-white{background-color:#fff;color:#0a0a0a}.hero.is-white a:not(.button):not(.dropdown-item):not(.tag),.hero.is-white strong{color:inherit}.hero.is-white .title{color:#0a0a0a}.hero.is-white .subtitle{color:rgba(10,10,10,.9)}.hero.is-white .subtitle a:not(.button),.hero.is-white .subtitle strong{color:#0a0a0a}@media screen and (max-width:1087px){.hero.is-white .navbar-menu{background-color:#fff}}.hero.is-white .navbar-item,.hero.is-white .navbar-link{color:rgba(10,10,10,.7)}.hero.is-white .navbar-link.is-active,.hero.is-white .navbar-link:hover,.hero.is-white a.navbar-item.is-active,.hero.is-white a.navbar-item:hover{background-color:#f2f2f2;color:#0a0a0a}.hero.is-white .tabs a{color:#0a0a0a;opacity:.9}.hero.is-white .tabs a:hover{opacity:1}.hero.is-white .tabs li.is-active a{opacity:1}.hero.is-white .tabs.is-boxed a,.hero.is-white .tabs.is-toggle a{color:#0a0a0a}.hero.is-white .tabs.is-boxed a:hover,.hero.is-white .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-white .tabs.is-boxed li.is-active a,.hero.is-white .tabs.is-boxed li.is-active a:hover,.hero.is-white .tabs.is-toggle li.is-active a,.hero.is-white .tabs.is-toggle li.is-active a:hover{background-color:#0a0a0a;border-color:#0a0a0a;color:#fff}.hero.is-white.is-bold{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-white.is-bold .navbar-menu{background-image:linear-gradient(141deg,#e6e6e6 0,#fff 71%,#fff 100%)}}.hero.is-black{background-color:#0a0a0a;color:#fff}.hero.is-black a:not(.button):not(.dropdown-item):not(.tag),.hero.is-black strong{color:inherit}.hero.is-black .title{color:#fff}.hero.is-black .subtitle{color:rgba(255,255,255,.9)}.hero.is-black .subtitle a:not(.button),.hero.is-black .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-black .navbar-menu{background-color:#0a0a0a}}.hero.is-black .navbar-item,.hero.is-black .navbar-link{color:rgba(255,255,255,.7)}.hero.is-black .navbar-link.is-active,.hero.is-black .navbar-link:hover,.hero.is-black a.navbar-item.is-active,.hero.is-black a.navbar-item:hover{background-color:#000;color:#fff}.hero.is-black .tabs a{color:#fff;opacity:.9}.hero.is-black .tabs a:hover{opacity:1}.hero.is-black .tabs li.is-active a{opacity:1}.hero.is-black .tabs.is-boxed a,.hero.is-black .tabs.is-toggle a{color:#fff}.hero.is-black .tabs.is-boxed a:hover,.hero.is-black .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-black .tabs.is-boxed li.is-active a,.hero.is-black .tabs.is-boxed li.is-active a:hover,.hero.is-black .tabs.is-toggle li.is-active a,.hero.is-black .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#0a0a0a}.hero.is-black.is-bold{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}@media screen and (max-width:768px){.hero.is-black.is-bold .navbar-menu{background-image:linear-gradient(141deg,#000 0,#0a0a0a 71%,#181616 100%)}}.hero.is-light{background-color:#f5f5f5;color:#363636}.hero.is-light a:not(.button):not(.dropdown-item):not(.tag),.hero.is-light strong{color:inherit}.hero.is-light .title{color:#363636}.hero.is-light .subtitle{color:rgba(54,54,54,.9)}.hero.is-light .subtitle a:not(.button),.hero.is-light .subtitle strong{color:#363636}@media screen and (max-width:1087px){.hero.is-light .navbar-menu{background-color:#f5f5f5}}.hero.is-light .navbar-item,.hero.is-light .navbar-link{color:rgba(54,54,54,.7)}.hero.is-light .navbar-link.is-active,.hero.is-light .navbar-link:hover,.hero.is-light a.navbar-item.is-active,.hero.is-light a.navbar-item:hover{background-color:#e8e8e8;color:#363636}.hero.is-light .tabs a{color:#363636;opacity:.9}.hero.is-light .tabs a:hover{opacity:1}.hero.is-light .tabs li.is-active a{opacity:1}.hero.is-light .tabs.is-boxed a,.hero.is-light .tabs.is-toggle a{color:#363636}.hero.is-light .tabs.is-boxed a:hover,.hero.is-light .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-light .tabs.is-boxed li.is-active a,.hero.is-light .tabs.is-boxed li.is-active a:hover,.hero.is-light .tabs.is-toggle li.is-active a,.hero.is-light .tabs.is-toggle li.is-active a:hover{background-color:#363636;border-color:#363636;color:#f5f5f5}.hero.is-light.is-bold{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}@media screen and (max-width:768px){.hero.is-light.is-bold .navbar-menu{background-image:linear-gradient(141deg,#dfd8d9 0,#f5f5f5 71%,#fff 100%)}}.hero.is-dark{background-color:#363636;color:#f5f5f5}.hero.is-dark a:not(.button):not(.dropdown-item):not(.tag),.hero.is-dark strong{color:inherit}.hero.is-dark .title{color:#f5f5f5}.hero.is-dark .subtitle{color:rgba(245,245,245,.9)}.hero.is-dark .subtitle a:not(.button),.hero.is-dark .subtitle strong{color:#f5f5f5}@media screen and (max-width:1087px){.hero.is-dark .navbar-menu{background-color:#363636}}.hero.is-dark .navbar-item,.hero.is-dark .navbar-link{color:rgba(245,245,245,.7)}.hero.is-dark .navbar-link.is-active,.hero.is-dark .navbar-link:hover,.hero.is-dark a.navbar-item.is-active,.hero.is-dark a.navbar-item:hover{background-color:#292929;color:#f5f5f5}.hero.is-dark .tabs a{color:#f5f5f5;opacity:.9}.hero.is-dark .tabs a:hover{opacity:1}.hero.is-dark .tabs li.is-active a{opacity:1}.hero.is-dark .tabs.is-boxed a,.hero.is-dark .tabs.is-toggle a{color:#f5f5f5}.hero.is-dark .tabs.is-boxed a:hover,.hero.is-dark .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-dark .tabs.is-boxed li.is-active a,.hero.is-dark .tabs.is-boxed li.is-active a:hover,.hero.is-dark .tabs.is-toggle li.is-active a,.hero.is-dark .tabs.is-toggle li.is-active a:hover{background-color:#f5f5f5;border-color:#f5f5f5;color:#363636}.hero.is-dark.is-bold{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}@media screen and (max-width:768px){.hero.is-dark.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1f191a 0,#363636 71%,#46403f 100%)}}.hero.is-primary{background-color:#00d1b2;color:#fff}.hero.is-primary a:not(.button):not(.dropdown-item):not(.tag),.hero.is-primary strong{color:inherit}.hero.is-primary .title{color:#fff}.hero.is-primary .subtitle{color:rgba(255,255,255,.9)}.hero.is-primary .subtitle a:not(.button),.hero.is-primary .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-primary .navbar-menu{background-color:#00d1b2}}.hero.is-primary .navbar-item,.hero.is-primary .navbar-link{color:rgba(255,255,255,.7)}.hero.is-primary .navbar-link.is-active,.hero.is-primary .navbar-link:hover,.hero.is-primary a.navbar-item.is-active,.hero.is-primary a.navbar-item:hover{background-color:#00b89c;color:#fff}.hero.is-primary .tabs a{color:#fff;opacity:.9}.hero.is-primary .tabs a:hover{opacity:1}.hero.is-primary .tabs li.is-active a{opacity:1}.hero.is-primary .tabs.is-boxed a,.hero.is-primary .tabs.is-toggle a{color:#fff}.hero.is-primary .tabs.is-boxed a:hover,.hero.is-primary .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-primary .tabs.is-boxed li.is-active a,.hero.is-primary .tabs.is-boxed li.is-active a:hover,.hero.is-primary .tabs.is-toggle li.is-active a,.hero.is-primary .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#00d1b2}.hero.is-primary.is-bold{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}@media screen and (max-width:768px){.hero.is-primary.is-bold .navbar-menu{background-image:linear-gradient(141deg,#009e6c 0,#00d1b2 71%,#00e7eb 100%)}}.hero.is-link{background-color:#3273dc;color:#fff}.hero.is-link a:not(.button):not(.dropdown-item):not(.tag),.hero.is-link strong{color:inherit}.hero.is-link .title{color:#fff}.hero.is-link .subtitle{color:rgba(255,255,255,.9)}.hero.is-link .subtitle a:not(.button),.hero.is-link .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-link .navbar-menu{background-color:#3273dc}}.hero.is-link .navbar-item,.hero.is-link .navbar-link{color:rgba(255,255,255,.7)}.hero.is-link .navbar-link.is-active,.hero.is-link .navbar-link:hover,.hero.is-link a.navbar-item.is-active,.hero.is-link a.navbar-item:hover{background-color:#2366d1;color:#fff}.hero.is-link .tabs a{color:#fff;opacity:.9}.hero.is-link .tabs a:hover{opacity:1}.hero.is-link .tabs li.is-active a{opacity:1}.hero.is-link .tabs.is-boxed a,.hero.is-link .tabs.is-toggle a{color:#fff}.hero.is-link .tabs.is-boxed a:hover,.hero.is-link .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-link .tabs.is-boxed li.is-active a,.hero.is-link .tabs.is-boxed li.is-active a:hover,.hero.is-link .tabs.is-toggle li.is-active a,.hero.is-link .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#3273dc}.hero.is-link.is-bold{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}@media screen and (max-width:768px){.hero.is-link.is-bold .navbar-menu{background-image:linear-gradient(141deg,#1577c6 0,#3273dc 71%,#4366e5 100%)}}.hero.is-info{background-color:#209cee;color:#fff}.hero.is-info a:not(.button):not(.dropdown-item):not(.tag),.hero.is-info strong{color:inherit}.hero.is-info .title{color:#fff}.hero.is-info .subtitle{color:rgba(255,255,255,.9)}.hero.is-info .subtitle a:not(.button),.hero.is-info .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-info .navbar-menu{background-color:#209cee}}.hero.is-info .navbar-item,.hero.is-info .navbar-link{color:rgba(255,255,255,.7)}.hero.is-info .navbar-link.is-active,.hero.is-info .navbar-link:hover,.hero.is-info a.navbar-item.is-active,.hero.is-info a.navbar-item:hover{background-color:#118fe4;color:#fff}.hero.is-info .tabs a{color:#fff;opacity:.9}.hero.is-info .tabs a:hover{opacity:1}.hero.is-info .tabs li.is-active a{opacity:1}.hero.is-info .tabs.is-boxed a,.hero.is-info .tabs.is-toggle a{color:#fff}.hero.is-info .tabs.is-boxed a:hover,.hero.is-info .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-info .tabs.is-boxed li.is-active a,.hero.is-info .tabs.is-boxed li.is-active a:hover,.hero.is-info .tabs.is-toggle li.is-active a,.hero.is-info .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#209cee}.hero.is-info.is-bold{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}@media screen and (max-width:768px){.hero.is-info.is-bold .navbar-menu{background-image:linear-gradient(141deg,#04a6d7 0,#209cee 71%,#3287f5 100%)}}.hero.is-success{background-color:#23d160;color:#fff}.hero.is-success a:not(.button):not(.dropdown-item):not(.tag),.hero.is-success strong{color:inherit}.hero.is-success .title{color:#fff}.hero.is-success .subtitle{color:rgba(255,255,255,.9)}.hero.is-success .subtitle a:not(.button),.hero.is-success .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-success .navbar-menu{background-color:#23d160}}.hero.is-success .navbar-item,.hero.is-success .navbar-link{color:rgba(255,255,255,.7)}.hero.is-success .navbar-link.is-active,.hero.is-success .navbar-link:hover,.hero.is-success a.navbar-item.is-active,.hero.is-success a.navbar-item:hover{background-color:#20bc56;color:#fff}.hero.is-success .tabs a{color:#fff;opacity:.9}.hero.is-success .tabs a:hover{opacity:1}.hero.is-success .tabs li.is-active a{opacity:1}.hero.is-success .tabs.is-boxed a,.hero.is-success .tabs.is-toggle a{color:#fff}.hero.is-success .tabs.is-boxed a:hover,.hero.is-success .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-success .tabs.is-boxed li.is-active a,.hero.is-success .tabs.is-boxed li.is-active a:hover,.hero.is-success .tabs.is-toggle li.is-active a,.hero.is-success .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#23d160}.hero.is-success.is-bold{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}@media screen and (max-width:768px){.hero.is-success.is-bold .navbar-menu{background-image:linear-gradient(141deg,#12af2f 0,#23d160 71%,#2ce28a 100%)}}.hero.is-warning{background-color:#ffdd57;color:rgba(0,0,0,.7)}.hero.is-warning a:not(.button):not(.dropdown-item):not(.tag),.hero.is-warning strong{color:inherit}.hero.is-warning .title{color:rgba(0,0,0,.7)}.hero.is-warning .subtitle{color:rgba(0,0,0,.9)}.hero.is-warning .subtitle a:not(.button),.hero.is-warning .subtitle strong{color:rgba(0,0,0,.7)}@media screen and (max-width:1087px){.hero.is-warning .navbar-menu{background-color:#ffdd57}}.hero.is-warning .navbar-item,.hero.is-warning .navbar-link{color:rgba(0,0,0,.7)}.hero.is-warning .navbar-link.is-active,.hero.is-warning .navbar-link:hover,.hero.is-warning a.navbar-item.is-active,.hero.is-warning a.navbar-item:hover{background-color:#ffd83d;color:rgba(0,0,0,.7)}.hero.is-warning .tabs a{color:rgba(0,0,0,.7);opacity:.9}.hero.is-warning .tabs a:hover{opacity:1}.hero.is-warning .tabs li.is-active a{opacity:1}.hero.is-warning .tabs.is-boxed a,.hero.is-warning .tabs.is-toggle a{color:rgba(0,0,0,.7)}.hero.is-warning .tabs.is-boxed a:hover,.hero.is-warning .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-warning .tabs.is-boxed li.is-active a,.hero.is-warning .tabs.is-boxed li.is-active a:hover,.hero.is-warning .tabs.is-toggle li.is-active a,.hero.is-warning .tabs.is-toggle li.is-active a:hover{background-color:rgba(0,0,0,.7);border-color:rgba(0,0,0,.7);color:#ffdd57}.hero.is-warning.is-bold{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}@media screen and (max-width:768px){.hero.is-warning.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ffaf24 0,#ffdd57 71%,#fffa70 100%)}}.hero.is-danger{background-color:#ff3860;color:#fff}.hero.is-danger a:not(.button):not(.dropdown-item):not(.tag),.hero.is-danger strong{color:inherit}.hero.is-danger .title{color:#fff}.hero.is-danger .subtitle{color:rgba(255,255,255,.9)}.hero.is-danger .subtitle a:not(.button),.hero.is-danger .subtitle strong{color:#fff}@media screen and (max-width:1087px){.hero.is-danger .navbar-menu{background-color:#ff3860}}.hero.is-danger .navbar-item,.hero.is-danger .navbar-link{color:rgba(255,255,255,.7)}.hero.is-danger .navbar-link.is-active,.hero.is-danger .navbar-link:hover,.hero.is-danger a.navbar-item.is-active,.hero.is-danger a.navbar-item:hover{background-color:#ff1f4b;color:#fff}.hero.is-danger .tabs a{color:#fff;opacity:.9}.hero.is-danger .tabs a:hover{opacity:1}.hero.is-danger .tabs li.is-active a{opacity:1}.hero.is-danger .tabs.is-boxed a,.hero.is-danger .tabs.is-toggle a{color:#fff}.hero.is-danger .tabs.is-boxed a:hover,.hero.is-danger .tabs.is-toggle a:hover{background-color:rgba(10,10,10,.1)}.hero.is-danger .tabs.is-boxed li.is-active a,.hero.is-danger .tabs.is-boxed li.is-active a:hover,.hero.is-danger .tabs.is-toggle li.is-active a,.hero.is-danger .tabs.is-toggle li.is-active a:hover{background-color:#fff;border-color:#fff;color:#ff3860}.hero.is-danger.is-bold{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}@media screen and (max-width:768px){.hero.is-danger.is-bold .navbar-menu{background-image:linear-gradient(141deg,#ff0561 0,#ff3860 71%,#ff5257 100%)}}.hero.is-small .hero-body{padding-bottom:1.5rem;padding-top:1.5rem}@media screen and (min-width:769px),print{.hero.is-medium .hero-body{padding-bottom:9rem;padding-top:9rem}}@media screen and (min-width:769px),print{.hero.is-large .hero-body{padding-bottom:18rem;padding-top:18rem}}.hero.is-fullheight .hero-body,.hero.is-halfheight .hero-body{align-items:center;display:flex}.hero.is-fullheight .hero-body>.container,.hero.is-halfheight .hero-body>.container{flex-grow:1;flex-shrink:1}.hero.is-halfheight{min-height:50vh}.hero.is-fullheight{min-height:100vh}.hero-video{overflow:hidden}.hero-video video{left:50%;min-height:100%;min-width:100%;position:absolute;top:50%;-webkit-transform:translate3d(-50%,-50%,0);transform:translate3d(-50%,-50%,0)}.hero-video.is-transparent{opacity:.3}@media screen and (max-width:768px){.hero-video{display:none}}.hero-buttons{margin-top:1.5rem}@media screen and (max-width:768px){.hero-buttons .button{display:flex}.hero-buttons .button:not(:last-child){margin-bottom:.75rem}}@media screen and (min-width:769px),print{.hero-buttons{display:flex;justify-content:center}.hero-buttons .button:not(:last-child){margin-right:1.5rem}}.hero-foot,.hero-head{flex-grow:0;flex-shrink:0}.hero-body{flex-grow:1;flex-shrink:0;padding:3rem 1.5rem}.section{padding:3rem 1.5rem}@media screen and (min-width:1088px){.section.is-medium{padding:9rem 1.5rem}.section.is-large{padding:18rem 1.5rem}}.footer{background-color:#fafafa;padding:3rem 1.5rem 6rem} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/1.png b/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/1.png deleted file mode 100644 index 4bb428a7936203ba2187d78e090c71674a63652c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38997 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 diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/2.png b/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/images/2.png deleted file mode 100644 index a01a53ad67ca48284c8b9d5c234126a6dc4a5bbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16049 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 diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/start.html b/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/start.html deleted file mode 100644 index 9b883d4..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/Resources/AuthorizationCodeAuth/start.html +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - -
-
-

Spotify Authentication

-
-
-

Introduction

- -
-
- -
- -
-
-
- -
- -
-
- -
-
- -
-
-
-
-
- - - - - \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/ImplicitGrantAuth/index.html b/Source Files/SpotifyAPI.Web.Auth/Resources/ImplicitGrantAuth/index.html deleted file mode 100644 index 6197f88..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/Resources/ImplicitGrantAuth/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/logo.svg b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/logo.svg new file mode 100644 index 0000000..611a8f9 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/logo.svg @@ -0,0 +1,9 @@ + + +# \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.css b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.css new file mode 100644 index 0000000..56fcf5d --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.css @@ -0,0 +1,22 @@ +html, +body { + width : 100%; + height: 100%; +} + +body { + color : #f5f6fa; + background-color : #353b48; + width : 100%; + height : 100%; + background-attachment: fixed; +} + +main { + text-align: center; + margin-top: 100px; +} + +.logo { + margin-bottom: 50px; +} diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.js b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.js new file mode 100644 index 0000000..e03f01e --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Resources/auth_assets/main.js @@ -0,0 +1,57 @@ +function getUrlParams(hash, start) { + const hashes = hash.slice(hash.indexOf(start) + 1).split('&') + + if (!hashes || hashes.length === 0 || hashes[0] === "") { + return undefined; + } + + const params = {} + hashes.map(hash => { + const [key, val] = hash.split('=') + params[key] = decodeURIComponent(val) + }) + return params +} + +function handleImplicitGrant() { + const params = getUrlParams(window.location.hash, '#'); + if (!params) { + return; + } + params.request_type = "token"; + + console.log("Sent request_type token to server", params); + fetch('?' + new URLSearchParams(params).toString(), { + method: 'POST', + }); +} +handleImplicitGrant(); + +function handleAuthenticationCode() { + const params = getUrlParams(window.location.search, '?'); + if (!params) { + return; + } + params.request_type = "code"; + + console.log("Sent request_type code to server", params); + fetch('?' + new URLSearchParams(params).toString(), { + method: 'POST', + }); +} +handleAuthenticationCode(); + +function handlePkceAuth() { + const params = getUrlParams(window.location.search, '?'); + if (!params) { + return; + } + params.request_type = "pkce"; + + console.log("Sent request_type code to server", params); + fetch('?' + new URLSearchParams(params).toString(), { + method: 'POST', + }); +} +handlePkceAuth(); + diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/default_site/favicon.ico b/Source Files/SpotifyAPI.Web.Auth/Resources/default_site/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..5ecba01cd222cf5f8aa659b3e5c434fca0fe905f GIT binary patch literal 4286 zcmc&&F;7A<5U&5g$w4rZxG?GLV*Cq&Iysq0;@}TpaMXogpo0!B{sO`?CMKFVI0%E9 z_+TL{E*gvu4#0U|%PGDXc<+@*kCbZLyYFjzz4lOQia(i*!nZn~R%%8mmF2=sYLyGx zwQ%3UqA8|9DGDLoUWZzrbt*ScsZ=Y_-pvYaU1n*+o7V+@qpege=rI`EVI5lmZoOTl z$kua;=7GTX-# zyx}$YK?l090b5a|@m{0-yF6oJUW4--j{CbFW}MMaX-Id|a!%o1bcyqkC)Ew+iBxHT|=jl1jbT{0;i>7P3^?i_6Op`6IUPj zuGinS|KSX{Jb$j^kL&pB`u@Qk=<@yrzU%h~IJkU&0UzS>{b?AGej|_j4J>cpQSWcz vfLy`kAIP;Pn|}xg_=BtbOE_5NpZvbG$v=eyYUI+<@^3$M{w==)xT?PaxOp>z literal 0 HcmV?d00001 diff --git a/Source Files/SpotifyAPI.Web.Auth/Resources/default_site/index.html b/Source Files/SpotifyAPI.Web.Auth/Resources/default_site/index.html new file mode 100644 index 0000000..6c8c710 --- /dev/null +++ b/Source Files/SpotifyAPI.Web.Auth/Resources/default_site/index.html @@ -0,0 +1,38 @@ + + + + + + + Spotify Authorization + + + + + + + +
+ +

Success!

+

+ Spotify Authorization was successful. You can close this tab and go back to your app. +

+
+ +
+
+ + + diff --git a/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj b/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj index 6f40b62..8f47dbe 100644 --- a/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj +++ b/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.csproj @@ -1,25 +1,47 @@  - - net46;netstandard2.0 - - - - bin\Debug\netstandard2.0\SpotifyAPI.Web.Auth.xml - 1701;1702;1705;1591 + net5.0;netstandard2.1;netstandard2.0 + 9.0 + enable + SpotifyAPI.Web.Auth + SpotifyAPI.Web.Auth + Jonas Dellinger + MIT + https://github.com/JohnnyCrazy/SpotifyAPI-NET/ + False + + An embedded Web Server, based on EmbeddedIO, for Spotify Web API Authorization flows + + For more infos, visit https://github.com/JohnnyCrazy/SpotifyAPI-NET + + + spotify api music .net c# spotify-client + + true + true + snupkg + true + true + 1591 - - bin\Release\netstandard2.0\SpotifyAPI.Web.Auth.xml - 1701;1702;1705;1591 + + true - + + + None + + + False + None + - + @@ -30,22 +52,4 @@ - - - - - - - - ..\..\..\..\..\..\..\..\..\..\..\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35\System.Management.Automation.dll - - - ..\..\..\..\..\..\..\..\..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.2\System.Windows.Forms.dll - - - - - - - diff --git a/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.nuspec b/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.nuspec deleted file mode 100644 index 6675c4d..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/SpotifyAPI.Web.Auth.nuspec +++ /dev/null @@ -1,31 +0,0 @@ - - - - - SpotifyAPI.Web.Auth - 3.0.0 - SpotifyAPI.Web.Auth - JohnnyCrazy - JohnnyCrazy - https://github.com/JohnnyCrazy/SpotifyAPI-NET/blob/master/LICENSE - https://github.com/JohnnyCrazy/SpotifyAPI-NET/ - false - - Authorization Flows for the Spotify's Web API, written in .NET - - For more infos, visit https://github.com/JohnnyCrazy/SpotifyAPI-NET - - - spotify api music .net c# spotify-client - - - - - - - - - - - - diff --git a/Source Files/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs b/Source Files/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs deleted file mode 100644 index e4f668b..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/SpotifyAuthServer.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading; -using SpotifyAPI.Web.Enums; -using Unosquare.Labs.EmbedIO; -using Unosquare.Labs.EmbedIO.Modules; - -namespace SpotifyAPI.Web.Auth -{ - public abstract class SpotifyAuthServer - { - public string ClientId { get; set; } - public string ServerUri { get; set; } - public string RedirectUri { get; set; } - public string State { get; set; } - public Scope Scope { get; set; } - public bool ShowDialog { get; set; } - - private readonly string _folder; - private readonly string _type; - private WebServer _server; - protected CancellationTokenSource _serverSource; - - public delegate void OnAuthReceived(object sender, T payload); - public event OnAuthReceived AuthReceived; - - internal static readonly Dictionary> Instances = new Dictionary>(); - - internal SpotifyAuthServer(string type, string folder, string redirectUri, string serverUri, Scope scope = Scope.None, string state = "") - { - _type = type; - _folder = folder; - ServerUri = serverUri; - RedirectUri = redirectUri; - Scope = scope; - State = string.IsNullOrEmpty(state) ? string.Join("", Guid.NewGuid().ToString("n").Take(8)) : state; - } - - public void Start() - { - Instances.Add(State, this); - _serverSource = new CancellationTokenSource(); - - _server = WebServer.Create(ServerUri); - _server.RegisterModule(new WebApiModule()); - AdaptWebServer(_server); - _server.RegisterModule(new ResourceFilesModule(Assembly.GetExecutingAssembly(), $"SpotifyAPI.Web.Auth.Resources.{_folder}")); -#pragma warning disable 4014 - _server.RunAsync(_serverSource.Token); -#pragma warning restore 4014 - } - - public virtual string GetUri() - { - StringBuilder builder = new StringBuilder("https://accounts.spotify.com/authorize/?"); - builder.Append("client_id=" + ClientId); - builder.Append($"&response_type={_type}"); - builder.Append("&redirect_uri=" + RedirectUri); - builder.Append("&state=" + State); - builder.Append("&scope=" + Scope.GetStringAttribute(" ")); - builder.Append("&show_dialog=false"); - return Uri.EscapeUriString(builder.ToString()); - } - - public void Stop(int delay = 2000) - { - if (_serverSource == null) return; - _serverSource.CancelAfter(delay); - Instances.Remove(State); - } - - public void OpenBrowser(bool AR) - { - string uri = GetUri(); - AuthUtil.OpenBrowser(uri, AR); - } - - // Attempt to silently automate renewal of tokens. Broken due to Javascript redirect, most likely. - /* - public void TryCURL() - { - string uri = GetUri(); - AuthUtil.TryCURL(uri); - }*/ - - internal void TriggerAuth(T payload) - { - AuthReceived?.Invoke(this, payload); - } - - internal static SpotifyAuthServer GetByState(string state) - { - return Instances.TryGetValue(state, out SpotifyAuthServer auth) ? auth : null; - } - - protected abstract void AdaptWebServer(WebServer webServer); - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web.Auth/TokenSwapAuth.cs b/Source Files/SpotifyAPI.Web.Auth/TokenSwapAuth.cs deleted file mode 100644 index 73e7b0d..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/TokenSwapAuth.cs +++ /dev/null @@ -1,217 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using System.Threading.Tasks; -using SpotifyAPI.Web.Enums; -using Unosquare.Labs.EmbedIO; -using Unosquare.Labs.EmbedIO.Constants; -using Unosquare.Labs.EmbedIO.Modules; -using SpotifyAPI.Web.Models; -using Newtonsoft.Json; -#if NETSTANDARD2_0 -using System.Net.Http; -#endif -#if NET46 -using System.Net.Http; -using HttpListenerContext = Unosquare.Net.HttpListenerContext; -#endif - -namespace SpotifyAPI.Web.Auth -{ - /// - /// - /// A version of that does not store your client secret, client ID or redirect URI, enforcing a secure authorization flow. Requires an exchange server that will return the authorization code to its callback server via GET request. - /// - /// - /// It's recommended that you use if you would like to use the TokenSwap method. - /// - /// - public class TokenSwapAuth : SpotifyAuthServer - { - string exchangeServerUri; - - /// - /// The HTML to respond with when the callback server (serverUri) is reached. The default value will close the window on arrival. - /// - public string HtmlResponse { get; set; } = ""; - /// - /// If true, will time how long it takes for access to expire. On expiry, the event fires. - /// - public bool TimeAccessExpiry { get; set; } - - /// The URI to an exchange server that will perform the key exchange. - /// The URI to host the server at that your exchange server should return the authorization code to by GET request. (e.g. http://localhost:4002) - /// - /// Stating none will randomly generate a state parameter. - /// The HTML to respond with when the callback server (serverUri) is reached. The default value will close the window on arrival. - public TokenSwapAuth(string exchangeServerUri, string serverUri, Scope scope = Scope.None, string state = "", string htmlResponse = "") : base("code", "", "", serverUri, scope, state) - { - if (!string.IsNullOrEmpty(htmlResponse)) - { - HtmlResponse = htmlResponse; - } - - this.exchangeServerUri = exchangeServerUri; - } - - protected override void AdaptWebServer(WebServer webServer) - { - webServer.Module().RegisterController(); - } - - public override string GetUri() - { - StringBuilder builder = new StringBuilder(exchangeServerUri); - builder.Append("?"); - builder.Append("response_type=code"); - builder.Append("&state=" + State); - builder.Append("&scope=" + Scope.GetStringAttribute(" ")); - builder.Append("&show_dialog=" + ShowDialog); - return Uri.EscapeUriString(builder.ToString()); - } - - static readonly HttpClient httpClient = new HttpClient(); - - /// - /// The maximum amount of times to retry getting a token. - /// - /// A token get is attempted every time you and . - /// - public int MaxGetTokenRetries { get; set; } = 10; - - /// - /// Creates a HTTP request to obtain a token object. - /// Parameter grantType can only be "refresh_token" or "authorization_code". authorizationCode and refreshToken are not mandatory, but at least one must be provided for your desired grant_type request otherwise an invalid response will be given and an exception is likely to be thrown. - /// - /// Will re-attempt on error, on null or on no access token times before finally returning null. - /// - /// - /// Can only be "refresh_token" or "authorization_code". - /// This needs to be defined if "grantType" is "authorization_code". - /// This needs to be defined if "grantType" is "refresh_token". - /// Does not need to be defined. Used internally for retry attempt recursion. - /// Attempts to return a full , but after retry attempts, may return a with no , or null. - async Task GetToken(string grantType, string authorizationCode = "", string refreshToken = "", int currentRetries = 0) - { - var content = new FormUrlEncodedContent(new Dictionary - { - { "grant_type", grantType }, - { "code", authorizationCode }, - { "refresh_token", refreshToken } - }); - - try - { - var siteResponse = await httpClient.PostAsync(exchangeServerUri, content); - Token token = JsonConvert.DeserializeObject(await siteResponse.Content.ReadAsStringAsync()); - // Don't need to check if it was null - if it is, it will resort to the catch block. - if (!token.HasError() && !string.IsNullOrEmpty(token.AccessToken)) - { - return token; - } - } - catch { } - - if (currentRetries >= MaxGetTokenRetries) - { - return null; - } - else - { - currentRetries++; - // The reason I chose to implement the retries system this way is because a static or instance - // variable keeping track would inhibit parallelism i.e. using this function on multiple threads/tasks. - // It's not clear why someone would like to do that, but it's better to cater for all kinds of uses. - return await GetToken(grantType, authorizationCode, refreshToken, currentRetries); - } - } - - System.Timers.Timer accessTokenExpireTimer; - /// - /// When Spotify authorization has expired. Will only trigger if is true. - /// - public event EventHandler OnAccessTokenExpired; - - /// - /// If is true, sets a timer for how long access will take to expire. - /// - /// - void SetAccessExpireTimer(Token token) - { - if (!TimeAccessExpiry) return; - - if (accessTokenExpireTimer != null) - { - accessTokenExpireTimer.Stop(); - accessTokenExpireTimer.Dispose(); - } - - accessTokenExpireTimer = new System.Timers.Timer - { - Enabled = true, - Interval = token.ExpiresIn * 1000, - AutoReset = false - }; - accessTokenExpireTimer.Elapsed += (sender, e) => OnAccessTokenExpired?.Invoke(this, EventArgs.Empty); - } - - /// - /// Uses the authorization code to silently (doesn't open a browser) obtain both an access token and refresh token, where the refresh token would be required for you to use . - /// - /// - /// - public async Task ExchangeCodeAsync(string authorizationCode) - { - Token token = await GetToken("authorization_code", authorizationCode: authorizationCode); - if (token != null && !token.HasError() && !string.IsNullOrEmpty(token.AccessToken)) - { - SetAccessExpireTimer(token); - } - return token; - } - - /// - /// Uses the refresh token to silently (doesn't open a browser) obtain a fresh access token, no refresh token is given however (as it does not change). - /// - /// - /// - public async Task RefreshAuthAsync(string refreshToken) - { - Token token = await GetToken("refresh_token", refreshToken: refreshToken); - if (token != null && !token.HasError() && !string.IsNullOrEmpty(token.AccessToken)) - { - SetAccessExpireTimer(token); - } - return token; - } - } - - internal class TokenSwapAuthController : WebApiController - { - public TokenSwapAuthController(IHttpContext context) : base(context) - { - } - - [WebApiHandler(HttpVerbs.Get, "/auth")] - public Task GetAuth() - { - string state = Request.QueryString["state"]; - SpotifyAuthServer auth = TokenSwapAuth.GetByState(state); - - string code = null; - string error = Request.QueryString["error"]; - if (error == null) - { - code = Request.QueryString["code"]; - } - - Task.Factory.StartNew(() => auth?.TriggerAuth(new AuthorizationCode - { - Code = code, - Error = error - })); - return this.StringResponseAsync(((TokenSwapAuth)auth).HtmlResponse); - } - } -} diff --git a/Source Files/SpotifyAPI.Web.Auth/TokenSwapWebAPIFactory.cs b/Source Files/SpotifyAPI.Web.Auth/TokenSwapWebAPIFactory.cs deleted file mode 100644 index 1cc9128..0000000 --- a/Source Files/SpotifyAPI.Web.Auth/TokenSwapWebAPIFactory.cs +++ /dev/null @@ -1,282 +0,0 @@ -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; -using System; -using System.Collections.Generic; -using System.Text; -using System.Threading.Tasks; - -namespace SpotifyAPI.Web.Auth -{ - /// - /// Returns a using the TokenSwapAuth process. - /// - public class TokenSwapWebAPIFactory - { - /// - /// Access provided by Spotify expires after 1 hour. If true, will time the access tokens, and access will attempt to be silently (without opening a browser) refreshed automatically. This will not make fire, see for that. - /// - public bool AutoRefresh { get; set; } - /// - /// If true when calling , will time how long it takes for access to Spotify to expire. The event fires when the timer elapses. - /// - public bool TimeAccessExpiry { get; set; } - /// - /// The maximum time in seconds to wait for a SpotifyWebAPI to be returned. The timeout is cancelled early regardless if an auth success or failure occured. - /// - public int Timeout { get; set; } - public Scope Scope { get; set; } - /// - /// The URI (or URL) of the exchange server which exchanges the auth code for access and refresh tokens. - /// - public string ExchangeServerUri { get; set; } - /// - /// The URI (or URL) of where a callback server to receive the auth code will be hosted. e.g. http://localhost:4002 - /// - public string HostServerUri { get; set; } - /// - /// Opens the user's browser and visits the exchange server for you, triggering the key exchange. This should be true unless you want to handle the key exchange in a nicer way. - /// - public bool OpenBrowser { get; set; } - /// - /// The HTML to respond with when the callback server has been reached. By default, it is set to close the window on arrival. - /// - public string HtmlResponse { get; set; } - /// - /// Whether or not to show a dialog saying "Is this you?" during the initial key exchange. It should be noted that this would allow a user the opportunity to change accounts. - /// - public bool ShowDialog { get; set; } - /// - /// The maximum amount of times to retry getting a token. - /// - /// A token get is attempted every time you and . Increasing this may improve how often these actions succeed - although it won't solve any underlying problems causing a get token failure. - /// - public int MaxGetTokenRetries { get; set; } = 10; - /// - /// Returns a SpotifyWebAPI using the TokenSwapAuth process. - /// - /// The URI (or URL) of the exchange server which exchanges the auth code for access and refresh tokens. - /// - /// The URI (or URL) of where a callback server to receive the auth code will be hosted. e.g. http://localhost:4002 - /// The maximum time in seconds to wait for a SpotifyWebAPI to be returned. The timeout is cancelled early regardless if an auth success or failure occured. - /// Access provided by Spotify expires after 1 hour. If true, access will attempt to be silently (without opening a browser) refreshed automatically. - /// Opens the user's browser and visits the exchange server for you, triggering the key exchange. This should be true unless you want to handle the key exchange in a nicer way. - public TokenSwapWebAPIFactory(string exchangeServerUri, Scope scope = Scope.None, string hostServerUri = "http://localhost:4002", int timeout = 10, bool autoRefresh = false, bool openBrowser = true) - { - AutoRefresh = autoRefresh; - Timeout = timeout; - Scope = scope; - ExchangeServerUri = exchangeServerUri; - HostServerUri = hostServerUri; - OpenBrowser = openBrowser; - - OnAccessTokenExpired += async (sender, e) => - { - if (AutoRefresh) - { - await RefreshAuthAsync(); - } - }; - } - - Token lastToken; - SpotifyWebAPI lastWebApi; - TokenSwapAuth lastAuth; - - public class ExchangeReadyEventArgs : EventArgs - { - public string ExchangeUri { get; set; } - } - /// - /// When the URI to get an authorization code is ready to be used to be visited. Not required if is true as the exchange URI will automatically be visited for you. - /// - public event EventHandler OnExchangeReady; - - /// - /// Refreshes the access for a SpotifyWebAPI returned by this factory. - /// - /// - public async Task RefreshAuthAsync() - { - Token token = await lastAuth.RefreshAuthAsync(lastToken.RefreshToken); - - if (token == null) - { - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs($"Token not returned by server.")); - } - else if (token.HasError()) - { - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs($"{token.Error} {token.ErrorDescription}")); - } - else if (string.IsNullOrEmpty(token.AccessToken)) - { - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs("Token had no access token attached.")); - } - else - { - lastWebApi.AccessToken = token.AccessToken; - OnAuthSuccess?.Invoke(this, new AuthSuccessEventArgs()); - } - } - - // By defining empty EventArgs objects, you can specify additional information later on as you see fit and it won't - // be considered a breaking change to consumers of this API. - // - // They don't even need to be constructed for their associated events to be invoked - just pass the static Empty property. - public class AccessTokenExpiredEventArgs : EventArgs - { - public static new AccessTokenExpiredEventArgs Empty { get; } = new AccessTokenExpiredEventArgs(); - - public AccessTokenExpiredEventArgs() - { - } - } - /// - /// When the authorization from Spotify expires. This will only occur if is true. - /// - public event EventHandler OnAccessTokenExpired; - - public class AuthSuccessEventArgs : EventArgs - { - public static new AuthSuccessEventArgs Empty { get; } = new AuthSuccessEventArgs(); - - public AuthSuccessEventArgs() - { - } - } - /// - /// When an authorization attempt succeeds and gains authorization. - /// - public event EventHandler OnAuthSuccess; - - public class AuthFailureEventArgs : EventArgs - { - public static new AuthFailureEventArgs Empty { get; } = new AuthFailureEventArgs(""); - - public string Error { get; } - - public AuthFailureEventArgs(string error) - { - Error = error; - } - } - /// - /// When an authorization attempt fails to gain authorization. - /// - public event EventHandler OnAuthFailure; - - /// - /// Manually triggers the timeout for any ongoing get web API request. - /// - public void CancelGetWebApiRequest() - { - if (webApiTimeoutTimer == null) return; - - // The while loop in GetWebApiSync() will react and trigger the timeout. - webApiTimeoutTimer.Stop(); - webApiTimeoutTimer.Dispose(); - webApiTimeoutTimer = null; - } - - System.Timers.Timer webApiTimeoutTimer; - - /// - /// Gets an authorized and ready to use SpotifyWebAPI by following the SecureAuthorizationCodeAuth process with its current settings. - /// - /// - public async Task GetWebApiAsync() - { - return await Task.Factory.StartNew(() => - { - bool currentlyAuthorizing = true; - - // Cancel any ongoing get web API requests - CancelGetWebApiRequest(); - - lastAuth = new TokenSwapAuth( - exchangeServerUri: ExchangeServerUri, - serverUri: HostServerUri, - scope: Scope, - htmlResponse: HtmlResponse) - { - ShowDialog = ShowDialog, - MaxGetTokenRetries = MaxGetTokenRetries, - TimeAccessExpiry = AutoRefresh || TimeAccessExpiry - }; - lastAuth.AuthReceived += async (sender, response) => - { - if (!string.IsNullOrEmpty(response.Error) || string.IsNullOrEmpty(response.Code)) - { - // We only want one auth failure to be fired, if the request timed out then don't bother. - if (!webApiTimeoutTimer.Enabled) return; - - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs(response.Error)); - currentlyAuthorizing = false; - return; - } - - lastToken = await lastAuth.ExchangeCodeAsync(response.Code); - - if (lastToken == null || lastToken.HasError() || string.IsNullOrEmpty(lastToken.AccessToken)) - { - // We only want one auth failure to be fired, if the request timed out then don't bother. - if (!webApiTimeoutTimer.Enabled) return; - - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs("Exchange token not returned by server.")); - currentlyAuthorizing = false; - return; - } - - if (lastWebApi != null) - { - lastWebApi.Dispose(); - } - lastWebApi = new SpotifyWebAPI() - { - TokenType = lastToken.TokenType, - AccessToken = lastToken.AccessToken - }; - - lastAuth.Stop(); - - OnAuthSuccess?.Invoke(this, AuthSuccessEventArgs.Empty); - currentlyAuthorizing = false; - }; - lastAuth.OnAccessTokenExpired += async (sender, e) => - { - if (TimeAccessExpiry) - { - OnAccessTokenExpired?.Invoke(sender, AccessTokenExpiredEventArgs.Empty); - } - - if (AutoRefresh) - { - await RefreshAuthAsync(); - } - }; - lastAuth.Start(); - OnExchangeReady?.Invoke(this, new ExchangeReadyEventArgs { ExchangeUri = lastAuth.GetUri() }); - if (OpenBrowser) - { - lastAuth.OpenBrowser(false); - } - - webApiTimeoutTimer = new System.Timers.Timer - { - AutoReset = false, - Enabled = true, - Interval = Timeout * 1000 - }; - - while (currentlyAuthorizing && webApiTimeoutTimer.Enabled) ; - - // If a timeout occurred - if (lastWebApi == null && currentlyAuthorizing) - { - OnAuthFailure?.Invoke(this, new AuthFailureEventArgs("Authorization request has timed out.")); - } - - return lastWebApi; - }); - } - } -} diff --git a/Source Files/SpotifyAPI.Web/Assembly.cs b/Source Files/SpotifyAPI.Web/Assembly.cs new file mode 100644 index 0000000..661cd81 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Assembly.cs @@ -0,0 +1,5 @@ +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("SpotifyAPI.Web.Tests")] +[assembly: CLSCompliant(true)] diff --git a/Source Files/SpotifyAPI.Web/Authenticators/AuthorizationCodeAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/AuthorizationCodeAuthenticator.cs new file mode 100644 index 0000000..c116900 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Authenticators/AuthorizationCodeAuthenticator.cs @@ -0,0 +1,71 @@ +using System; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + /// + /// This Authenticator requests new credentials token on demand and stores them into memory. + /// It is unable to query user specifc details. + /// + public class AuthorizationCodeAuthenticator : IAuthenticator + { + /// + /// Initiate a new instance. The token will be refreshed once it expires. + /// The initialToken will be updated with the new values on refresh! + /// + public AuthorizationCodeAuthenticator(string clientId, string clientSecret, AuthorizationCodeTokenResponse initialToken) + { + Ensure.ArgumentNotNull(clientId, nameof(clientId)); + Ensure.ArgumentNotNull(clientSecret, nameof(clientSecret)); + Ensure.ArgumentNotNull(initialToken, nameof(initialToken)); + + InitialToken = initialToken; + ClientId = clientId; + ClientSecret = clientSecret; + } + + /// + /// This event is called once a new refreshed token was aquired + /// + public event EventHandler? TokenRefreshed; + + + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard + /// + public string ClientId { get; } + + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard + /// + public string ClientSecret { get; } + + /// + /// The inital token passed to the authenticator. Fields will be updated on refresh. + /// + /// + public AuthorizationCodeTokenResponse InitialToken { get; } + + public async Task Apply(IRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + if (InitialToken.IsExpired) + { + var tokenRequest = new AuthorizationCodeRefreshRequest(ClientId, ClientSecret, InitialToken.RefreshToken); + var refreshedToken = await OAuthClient.RequestToken(tokenRequest, apiConnector).ConfigureAwait(false); + + InitialToken.AccessToken = refreshedToken.AccessToken; + InitialToken.CreatedAt = refreshedToken.CreatedAt; + InitialToken.ExpiresIn = refreshedToken.ExpiresIn; + InitialToken.Scope = refreshedToken.Scope; + InitialToken.TokenType = refreshedToken.TokenType; + + TokenRefreshed?.Invoke(this, InitialToken); + } + + request.Headers["Authorization"] = $"{InitialToken.TokenType} {InitialToken.AccessToken}"; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Authenticators/ClientCredentialsAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/ClientCredentialsAuthenticator.cs new file mode 100644 index 0000000..00e42ed --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Authenticators/ClientCredentialsAuthenticator.cs @@ -0,0 +1,70 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + /// + /// This Authenticator requests new credentials token on demand and stores them into memory. + /// It is unable to query user specifc details. + /// + public class ClientCredentialsAuthenticator : IAuthenticator + { + /// + /// Initiate a new instance. The initial token will be fetched when the first API call occurs. + /// + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard. + /// + /// + /// The ClientSecret, defined in a spotify application in your Spotify Developer Dashboard. + /// + public ClientCredentialsAuthenticator(string clientId, string clientSecret) : this(clientId, clientSecret, null) { } + + /// + /// Initiate a new instance. The initial token is provided and will be used if not expired + /// + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard. + /// + /// + /// The ClientSecret, defined in a spotify application in your Spotify Developer Dashboard. + /// + /// + /// An optional inital token received earlier. + /// + public ClientCredentialsAuthenticator(string clientId, string clientSecret, ClientCredentialsTokenResponse? token) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(clientSecret, nameof(clientSecret)); + + ClientId = clientId; + ClientSecret = clientSecret; + Token = token; + } + + public ClientCredentialsTokenResponse? Token { get; private set; } + + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard + /// + public string ClientId { get; } + + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard + /// + public string ClientSecret { get; } + + public async Task Apply(IRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + if (Token == null || Token.IsExpired) + { + var tokenRequest = new ClientCredentialsRequest(ClientId, ClientSecret); + Token = await OAuthClient.RequestToken(tokenRequest, apiConnector).ConfigureAwait(false); + } + + request.Headers["Authorization"] = $"{Token.TokenType} {Token.AccessToken}"; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Authenticators/IAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/IAuthenticator.cs new file mode 100644 index 0000000..ccb14b9 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Authenticators/IAuthenticator.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public interface IAuthenticator + { + Task Apply(IRequest request, IAPIConnector apiConnector); + } +} diff --git a/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs new file mode 100644 index 0000000..4cfb99d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs @@ -0,0 +1,65 @@ +using System; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + /// + /// This Authenticator requests new credentials token on demand and stores them into memory. + /// It is unable to query user specifc details. + /// + public class PKCEAuthenticator : IAuthenticator + { + /// + /// Initiate a new instance. The token will be refreshed once it expires. + /// The initialToken will be updated with the new values on refresh! + /// + public PKCEAuthenticator(string clientId, PKCETokenResponse initialToken) + { + Ensure.ArgumentNotNull(clientId, nameof(clientId)); + Ensure.ArgumentNotNull(initialToken, nameof(initialToken)); + + InitialToken = initialToken; + ClientId = clientId; + } + + /// + /// This event is called once a new refreshed token was aquired + /// + public event EventHandler? TokenRefreshed; + + + /// + /// The ClientID, defined in a spotify application in your Spotify Developer Dashboard + /// + public string ClientId { get; } + + /// + /// The inital token passed to the authenticator. Fields will be updated on refresh. + /// + /// + public PKCETokenResponse InitialToken { get; } + + public async Task Apply(IRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + if (InitialToken.IsExpired) + { + var tokenRequest = new PKCETokenRefreshRequest(ClientId, InitialToken.RefreshToken); + var refreshedToken = await OAuthClient.RequestToken(tokenRequest, apiConnector).ConfigureAwait(false); + + InitialToken.AccessToken = refreshedToken.AccessToken; + InitialToken.CreatedAt = refreshedToken.CreatedAt; + InitialToken.ExpiresIn = refreshedToken.ExpiresIn; + InitialToken.Scope = refreshedToken.Scope; + InitialToken.TokenType = refreshedToken.TokenType; + InitialToken.RefreshToken = refreshedToken.RefreshToken; + + TokenRefreshed?.Invoke(this, InitialToken); + } + + request.Headers["Authorization"] = $"{InitialToken.TokenType} {InitialToken.AccessToken}"; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Authenticators/TokenAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/TokenAuthenticator.cs new file mode 100644 index 0000000..186a972 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Authenticators/TokenAuthenticator.cs @@ -0,0 +1,26 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class TokenAuthenticator : IAuthenticator + { + public TokenAuthenticator(string token, string tokenType) + { + Token = token; + TokenType = tokenType; + } + + public string Token { get; set; } + + public string TokenType { get; set; } + + public Task Apply(IRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + request.Headers["Authorization"] = $"{TokenType} {Token}"; + return Task.CompletedTask; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/APIClient.cs b/Source Files/SpotifyAPI.Web/Clients/APIClient.cs new file mode 100644 index 0000000..c12c983 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/APIClient.cs @@ -0,0 +1,16 @@ +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public abstract class APIClient + { + protected APIClient(IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + API = apiConnector; + } + + protected IAPIConnector API { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/AlbumsClient.cs b/Source Files/SpotifyAPI.Web/Clients/AlbumsClient.cs new file mode 100644 index 0000000..f70c307 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/AlbumsClient.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class AlbumsClient : APIClient, IAlbumsClient + { + public AlbumsClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Get(string albumId) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + + return API.Get(URLs.Album(albumId)); + } + + public Task Get(string albumId, AlbumRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Album(albumId), request.BuildQueryParams()); + } + + public Task GetSeveral(AlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Albums(), request.BuildQueryParams()); + } + + public Task> GetTracks(string albumId) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + + return API.Get>(URLs.AlbumTracks(albumId)); + } + + public Task> GetTracks(string albumId, AlbumTracksRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(albumId, nameof(albumId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.AlbumTracks(albumId), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/ArtistsClient.cs b/Source Files/SpotifyAPI.Web/Clients/ArtistsClient.cs new file mode 100644 index 0000000..42bea3c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/ArtistsClient.cs @@ -0,0 +1,55 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class ArtistsClient : APIClient, IArtistsClient + { + public ArtistsClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Get(string artistId) + { + Ensure.ArgumentNotNullOrEmptyString(artistId, nameof(artistId)); + + return API.Get(URLs.Artist(artistId)); + } + + public Task> GetAlbums(string artistId) + { + Ensure.ArgumentNotNullOrEmptyString(artistId, nameof(artistId)); + + return API.Get>(URLs.ArtistAlbums(artistId)); + } + + public Task> GetAlbums(string artistId, ArtistsAlbumsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(artistId, nameof(artistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.ArtistAlbums(artistId), request.BuildQueryParams()); + } + + public Task GetRelatedArtists(string artistId) + { + Ensure.ArgumentNotNullOrEmptyString(artistId, nameof(artistId)); + + return API.Get(URLs.ArtistRelatedArtists(artistId)); + } + + public Task GetSeveral(ArtistsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Artists(), request.BuildQueryParams()); + } + + public Task GetTopTracks(string artistId, ArtistsTopTracksRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(artistId, nameof(artistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.ArtistTopTracks(artistId), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/BrowseClient.cs b/Source Files/SpotifyAPI.Web/Clients/BrowseClient.cs new file mode 100644 index 0000000..0cf183f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/BrowseClient.cs @@ -0,0 +1,90 @@ +using System; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class BrowseClient : APIClient, IBrowseClient + { + public BrowseClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task GetCategories() + { + return API.Get(URLs.Categories()); + } + + public Task GetCategories(CategoriesRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Categories(), request.BuildQueryParams()); + } + + public Task GetCategory(string categoryId) + { + Ensure.ArgumentNotNullOrEmptyString(categoryId, nameof(categoryId)); + + return API.Get(URLs.Category(categoryId)); + } + + public Task GetCategory(string categoryId, CategoryRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(categoryId, nameof(categoryId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Category(categoryId), request.BuildQueryParams()); + } + + public Task GetCategoryPlaylists(string categoryId) + { + Ensure.ArgumentNotNullOrEmptyString(categoryId, nameof(categoryId)); + + return API.Get(URLs.CategoryPlaylists(categoryId)); + } + + public Task GetCategoryPlaylists(string categoryId, CategoriesPlaylistsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(categoryId, nameof(categoryId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.CategoryPlaylists(categoryId), request.BuildQueryParams()); + } + + public Task GetRecommendations(RecommendationsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Recommendations(), request.BuildQueryParams()); + } + + public Task GetRecommendationGenres() + { + return API.Get(URLs.RecommendationGenres()); + } + + public Task GetNewReleases() + { + return API.Get(URLs.NewReleases()); + } + + public Task GetNewReleases(NewReleasesRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.NewReleases(), request.BuildQueryParams()); + } + + public Task GetFeaturedPlaylists() + { + return API.Get(URLs.FeaturedPlaylists()); + } + + public Task GetFeaturedPlaylists(FeaturedPlaylistsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.FeaturedPlaylists(), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/EpisodesClient.cs b/Source Files/SpotifyAPI.Web/Clients/EpisodesClient.cs new file mode 100644 index 0000000..f9bd117 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/EpisodesClient.cs @@ -0,0 +1,33 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class EpisodesClient : APIClient, IEpisodesClient + { + public EpisodesClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Get(string episodeId) + { + Ensure.ArgumentNotNullOrEmptyString(episodeId, nameof(episodeId)); + + return API.Get(URLs.Episode(episodeId)); + } + + public Task Get(string episodeId, EpisodeRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(episodeId, nameof(episodeId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Episode(episodeId), request.BuildQueryParams()); + } + + public Task GetSeveral(EpisodesRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Episodes(), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/FollowClient.cs b/Source Files/SpotifyAPI.Web/Clients/FollowClient.cs new file mode 100644 index 0000000..a1ad28c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/FollowClient.cs @@ -0,0 +1,93 @@ +using System.Net; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class FollowClient : APIClient, IFollowClient + { + public FollowClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task> CheckCurrentUser(FollowCheckCurrentUserRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.CurrentUserFollowerContains(), request.BuildQueryParams()); + } + + public Task> CheckPlaylist(string playlistId, FollowCheckPlaylistRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PlaylistFollowersContains(playlistId), request.BuildQueryParams()); + } + + public async Task Follow(FollowRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API + .Put(URLs.CurrentUserFollower(), request.BuildQueryParams(), request.BuildBodyParams()) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task FollowPlaylist(string playlistId) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + + var statusCode = await API + .Put(URLs.PlaylistFollowers(playlistId), null, null) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task FollowPlaylist(string playlistId, FollowPlaylistRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API + .Put(URLs.PlaylistFollowers(playlistId), null, request.BuildBodyParams()) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public Task OfCurrentUser() + { + var request = new FollowOfCurrentUserRequest(); + + return OfCurrentUser(request); + } + + public Task OfCurrentUser(FollowOfCurrentUserRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.CurrentUserFollower(), request.BuildQueryParams()); + } + + public async Task Unfollow(UnfollowRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API + .Delete(URLs.CurrentUserFollower(), request.BuildQueryParams(), request.BuildBodyParams()) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task UnfollowPlaylist(string playlistId) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + + var statusCode = await API + .Delete(URLs.PlaylistFollowers(playlistId), null, null) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs new file mode 100644 index 0000000..0c2f9c6 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IAlbumsClient.cs @@ -0,0 +1,66 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about one or more albums from the Spotify catalog. + /// + public interface IAlbumsClient + { + /// + /// Get Spotify catalog information for multiple albums identified by their Spotify IDs. + /// + /// The request-model which contains required and optional parameters + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-multiple-albums + /// + /// + Task GetSeveral(AlbumsRequest request); + + /// + /// Get Spotify catalog information for a single album. + /// + /// The Spotify ID of the album. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-album + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string albumId); + + /// + /// Get Spotify catalog information for a single album. + /// + /// The Spotify ID of the album. + /// The request-model which contains required and optional parameters + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-album + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string albumId, AlbumRequest request); + + /// + /// Get Spotify catalog information about an album’s tracks. + /// Optional parameters can be used to limit the number of tracks returned. + /// + /// The Spotify ID of the album. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-albums-tracks + /// + /// + Task> GetTracks(string albumId); + + /// + /// Get Spotify catalog information about an album’s tracks. + /// Optional parameters can be used to limit the number of tracks returned. + /// + /// The Spotify ID of the album. + /// The request-model which contains required and optional parameters + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-albums-tracks + /// + /// + Task> GetTracks(string albumId, AlbumTracksRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IArtistsClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IArtistsClient.cs new file mode 100644 index 0000000..b74675d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IArtistsClient.cs @@ -0,0 +1,78 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about one or more artists from the Spotify catalog. + /// + public interface IArtistsClient + { + /// + /// Get Spotify catalog information for several artists based on their Spotify IDs. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-multiple-artists + /// + /// The request-model which contains required and optional parameters + /// + Task GetSeveral(ArtistsRequest request); + + /// + /// Get Spotify catalog information for a single artist identified by their unique Spotify ID. + /// + /// The Spotify ID of the artist. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-artist + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string artistId); + + /// + /// Get Spotify catalog information about an artist’s albums. + /// Optional parameters can be specified in the query string to filter and sort the response. + /// + /// The Spotify ID for the artist. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-artists-albums + /// + /// + Task> GetAlbums(string artistId); + + /// + /// Get Spotify catalog information about an artist’s albums. + /// Optional parameters can be specified in the query string to filter and sort the response. + /// + /// The Spotify ID for the artist. + /// The request-model which contains required and optional parameters + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-artists-albums + /// + /// + Task> GetAlbums(string artistId, ArtistsAlbumsRequest request); + + + /// + /// Get Spotify catalog information about an artist’s top tracks by country. + /// + /// The Spotify ID for the artist + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-artists-top-tracks + /// + /// + Task GetTopTracks(string artistId, ArtistsTopTracksRequest request); + + + /// + /// Get Spotify catalog information about artists similar to a given artist. + /// Similarity is based on analysis of the Spotify community’s listening history. + /// + /// The Spotify ID for the artist + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-artists-related-artists + /// + /// + Task GetRelatedArtists(string artistId); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IBrowseClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IBrowseClient.cs new file mode 100644 index 0000000..7ee3636 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IBrowseClient.cs @@ -0,0 +1,130 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for getting playlists and new album releases featured on Spotify’s Browse tab. + /// + public interface IBrowseClient + { + /// + /// Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-categories + /// + /// + Task GetCategories(); + + /// + /// Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-categories + /// + /// + Task GetCategories(CategoriesRequest request); + + /// + /// Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). + /// + /// The Spotify category ID for the category. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-category + /// + /// + Task GetCategory(string categoryId); + + /// + /// Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). + /// + /// The Spotify category ID for the category. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-category + /// + /// + Task GetCategory(string categoryId, CategoryRequest request); + + /// + /// Get a list of Spotify playlists tagged with a particular category. + /// + /// The Spotify category ID for the category. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-categories-playlists + /// + /// + Task GetCategoryPlaylists(string categoryId); + + /// + /// Get a list of Spotify playlists tagged with a particular category. + /// + /// The Spotify category ID for the category. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-categories-playlists + /// + /// + Task GetCategoryPlaylists(string categoryId, CategoriesPlaylistsRequest request); + + /// + /// Recommendations are generated based on the available information for a given seed entity and matched against + /// similar artists and tracks. If there is sufficient information about the provided seeds, + /// a list of tracks will be returned together with pool size details. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-recommendations + /// + /// + Task GetRecommendations(RecommendationsRequest request); + + /// + /// Retrieve a list of available genres seed parameter values for recommendations. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-recommendation-genres + /// + /// + Task GetRecommendationGenres(); + + /// + /// Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-new-releases + /// + /// + Task GetNewReleases(); + + /// + /// Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-new-releases + /// + /// + Task GetNewReleases(NewReleasesRequest request); + + /// + /// Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s ‘Browse’ tab). + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-featured-playlists + /// + /// + Task GetFeaturedPlaylists(); + + /// + /// Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s ‘Browse’ tab). + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-featured-playlists + /// + /// + Task GetFeaturedPlaylists(FeaturedPlaylistsRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IEpisodesClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IEpisodesClient.cs new file mode 100644 index 0000000..0c18eba --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IEpisodesClient.cs @@ -0,0 +1,43 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about one or more episodes from the Spotify catalog. + /// + public interface IEpisodesClient + { + /// + /// Get Spotify catalog information for a single episode identified by its unique Spotify ID. + /// + /// The Spotify ID for the episode. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-episode + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string episodeId); + + /// + /// Get Spotify catalog information for a single episode identified by its unique Spotify ID. + /// + /// The Spotify ID for the episode. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-an-episode + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string episodeId, EpisodeRequest request); + + /// + /// Get Spotify catalog information for several episodes based on their Spotify IDs. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-multiple-episodes + /// + /// + Task GetSeveral(EpisodesRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IFollowClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IFollowClient.cs new file mode 100644 index 0000000..0874c6a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IFollowClient.cs @@ -0,0 +1,110 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for managing the artists, users, and playlists that a Spotify user follows. + /// + public interface IFollowClient + { + /// + /// Check to see if the current user is following one or more artists or other Spotify users. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-current-user-follows + /// + /// + Task> CheckCurrentUser(FollowCheckCurrentUserRequest request); + + /// + /// Check to see if one or more Spotify users are following a specified playlist. + /// + /// The Spotify ID of the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-if-user-follows-playlist + /// + /// + Task> CheckPlaylist(string playlistId, FollowCheckPlaylistRequest request); + + /// + /// Add the current user as a follower of one or more artists or other Spotify users. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-follow-artists-users + /// + /// + Task Follow(FollowRequest request); + + /// + /// Add the current user as a follower of a playlist. + /// + /// + /// The Spotify ID of the playlist. + /// Any playlist can be followed, regardless of its public/private status, + /// as long as you know its playlist ID. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-follow-playlist + /// + /// + Task FollowPlaylist(string playlistId); + + /// + /// Add the current user as a follower of a playlist. + /// + /// + /// The Spotify ID of the playlist. + /// Any playlist can be followed, regardless of its public/private status, + /// as long as you know its playlist ID. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-follow-playlist + /// + /// + Task FollowPlaylist(string playlistId, FollowPlaylistRequest request); + + /// + /// Get the current user’s followed artists. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-followed + /// + /// + Task OfCurrentUser(); + + /// + /// Get the current user’s followed artists. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-followed + /// + /// + Task OfCurrentUser(FollowOfCurrentUserRequest request); + + /// + /// Remove the current user as a follower of one or more artists or other Spotify users. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-unfollow-artists-users + /// + /// + Task Unfollow(UnfollowRequest request); + + /// + /// Remove the current user as a follower of a playlist. + /// + /// The Spotify ID of the playlist that is to be no longer followed. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-unfollow-playlist + /// + Task UnfollowPlaylist(string playlistId); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/ILibraryClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ILibraryClient.cs new file mode 100644 index 0000000..5e84d35 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ILibraryClient.cs @@ -0,0 +1,161 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about, + /// and managing, tracks that the current user has saved in their “Your Music” library. + /// + public interface ILibraryClient + { + /// + /// Remove one or more albums from the current user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-remove-albums-user + /// + /// + Task RemoveAlbums(LibraryRemoveAlbumsRequest request); + + /// + /// Remove one or more tracks from the current user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-remove-tracks-user + /// + /// + Task RemoveTracks(LibraryRemoveTracksRequest request); + + /// + /// Delete one or more shows from current Spotify user’s library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-remove-shows-user + /// + /// + Task RemoveShows(LibraryRemoveShowsRequest request); + + /// + /// Save one or more tracks to the current user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-save-tracks-user + /// + /// + Task SaveTracks(LibrarySaveTracksRequest request); + + /// + /// Save one or more albums to the current user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-save-albums-user + /// + /// + Task SaveAlbums(LibrarySaveAlbumsRequest request); + + /// + /// Save one or more shows to current Spotify user’s library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-save-shows-user + /// + /// + Task SaveShows(LibrarySaveShowsRequest request); + + /// + /// Check if one or more tracks is already saved in the current Spotify user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-users-saved-tracks + /// + /// + Task> CheckTracks(LibraryCheckTracksRequest request); + + /// + /// Check if one or more albums is already saved in the current Spotify user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-users-saved-albums + /// + /// + Task> CheckAlbums(LibraryCheckAlbumsRequest request); + + /// + /// Check if one or more shows is already saved in the current Spotify user’s library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-check-users-saved-shows + /// + /// + Task> CheckShows(LibraryCheckShowsRequest request); + + /// + /// Get a list of the songs saved in the current Spotify user’s ‘Your Music’ library. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-tracks + /// + /// + Task> GetTracks(); + + /// + /// Get a list of the songs saved in the current Spotify user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-tracks + /// + /// + Task> GetTracks(LibraryTracksRequest request); + + /// + /// Get a list of the albums saved in the current Spotify user’s ‘Your Music’ library. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-albums + /// + /// + Task> GetAlbums(); + + /// + /// Get a list of the albums saved in the current Spotify user’s ‘Your Music’ library. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-albums + /// + /// + Task> GetAlbums(LibraryAlbumsRequest request); + + /// + /// Get a list of shows saved in the current Spotify user’s library. + /// Optional parameters can be used to limit the number of shows returned. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-shows + /// + /// + Task> GetShows(); + + /// + /// Get a list of shows saved in the current Spotify user’s library. + /// Optional parameters can be used to limit the number of shows returned. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-saved-shows + /// + /// + Task> GetShows(LibraryShowsRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IOAuthClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IOAuthClient.cs new file mode 100644 index 0000000..45060fc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IOAuthClient.cs @@ -0,0 +1,61 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// An OAuth Client, which allows to get inital and updated tokens from the Spotify Service + /// + public interface IOAuthClient + { + /// + /// Requests a new token using client_ids and client_secrets. + /// If the token is expired, simply call the funtion again to get a new token + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow + /// + /// + Task RequestToken(ClientCredentialsRequest request); + + /// + /// Refresh an already received token via Authorization Code Auth + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow + /// + /// + Task RequestToken(AuthorizationCodeRefreshRequest request); + + /// + /// Reequest an initial token via Authorization Code Auth + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow + /// + /// + Task RequestToken(AuthorizationCodeTokenRequest request); + + /// + /// Swaps out a received code with a access token using a remote server + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/ios/guides/token-swap-and-refresh/ + /// + /// + Task RequestToken(TokenSwapTokenRequest request); + + /// + /// Gets a refreshed access token using an already received refresh token using a remote server + /// + /// + /// + /// https://developer.spotify.com/documentation/ios/guides/token-swap-and-refresh/ + /// + /// + Task RequestToken(TokenSwapRefreshRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPaginator.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPaginator.cs new file mode 100644 index 0000000..7ca0fa1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPaginator.cs @@ -0,0 +1,74 @@ +using System.Threading; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using SpotifyAPI.Web; + +namespace SpotifyAPI.Web +{ + /// + /// A paginator allows to cycle through all resources of the spotify API + /// + public interface IPaginator + { + /// + /// Fetches all pages and returns them grouped in a list + /// + /// The first page. Will be included in the result list! + /// An API Connector to make requests to spotify + /// Paging Type + /// A list containing all pages, including the firstPage + Task> PaginateAll(IPaginatable firstPage, IAPIConnector connector); + + /// + /// Fetches all pages and returns them grouped in a list. + /// Supports a mapping method which takes care of JSON mapping problems. + /// To give an example, the Search method always returns the paging objects nested in a key. The mapper functions + /// tells the paginate function where to find the actual paging object in the response. + /// + /// The first page. Will be included in the result list! + /// A function which returns the actual paging object in another response object + /// An API Connector to make requests to spotify + /// Paging Type + /// Outer response Type + /// A list containing all pages, including the firstPage + Task> PaginateAll( + IPaginatable firstPage, + Func> mapper, + IAPIConnector connector + ); + +#if !NETSTANDARD2_0 + /// + /// Fetches all pages and returns one by one using IAsyncEnumerable + /// + /// The first page. Will be included in the result list! + /// An API Connector to make requests to spotify + /// A CancellationToken + /// Paging Type + /// + IAsyncEnumerable Paginate(IPaginatable firstPage, IAPIConnector connector, CancellationToken cancel = default); + + /// + /// Fetches all pages and returns them grouped in a list. + /// Supports a mapping method which takes care of JSON mapping problems. + /// To give an example, the Search method always returns the paging objects nested in a key. The mapper functions + /// tells the paginate function where to find the actual paging object in the response. + /// + /// The first page. Will be included in the result list! + /// A function which returns the actual paging object in another response object + /// An API Connector to make requests to spotify + /// A CancellationToken + /// Paging Type + /// Outer response Type + /// + IAsyncEnumerable Paginate( + IPaginatable firstPage, + Func> mapper, + IAPIConnector connector, + CancellationToken cancel = default + ); +#endif + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs new file mode 100644 index 0000000..e80dcce --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPersonalizationClient.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about the user’s listening habits. + /// + public interface IPersonalizationClient + { + /// + /// Get the current user’s top tracks based on calculated affinity. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-top-artists-and-tracks + /// + /// + Task> GetTopTracks(); + + /// + /// Get the current user’s top tracks based on calculated affinity. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-top-artists-and-tracks + /// + /// + Task> GetTopTracks(PersonalizationTopRequest request); + + /// + /// Get the current user’s top artists based on calculated affinity. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-top-artists-and-tracks + /// + /// + Task> GetTopArtists(); + + /// + /// Get the current user’s top artists based on calculated affinity. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-top-artists-and-tracks + /// + /// + Task> GetTopArtists(PersonalizationTopRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlayerClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlayerClient.cs new file mode 100644 index 0000000..de7d9ca --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlayerClient.cs @@ -0,0 +1,208 @@ +using System.Net; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Player Endpoints. + /// These endpoints are in beta. + /// While we encourage you to build with them, a situation may arise + /// where we need to disable some or all of the functionality and/or change how + /// they work without prior notice. Please report any issues via our developer community forum. + /// + public interface IPlayerClient + { + /// + /// Skips to next track in the user’s queue. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-skip-users-playback-to-next-track + /// + /// + Task SkipNext(); + + /// + /// Skips to next track in the user’s queue. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-skip-users-playback-to-next-track + /// + /// + Task SkipNext(PlayerSkipNextRequest request); + + /// + /// Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-set-repeat-mode-on-users-playback + /// + /// + Task SetRepeat(PlayerSetRepeatRequest request); + + /// + /// Transfer playback to a new device and determine if it should start playing. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-transfer-a-users-playback + /// + /// + Task TransferPlayback(PlayerTransferPlaybackRequest request); + + /// + /// Get the object currently being played on the user’s Spotify account. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-the-users-currently-playing-track + /// + /// + Task GetCurrentlyPlaying(PlayerCurrentlyPlayingRequest request); + + /// + /// Get information about the user’s current playback state, including track or episode, progress, and active device. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-information-about-the-users-current-playback + /// + /// + Task GetCurrentPlayback(); + + /// + /// Get information about the user’s current playback state, including track or episode, progress, and active device. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-information-about-the-users-current-playback + /// + /// + Task GetCurrentPlayback(PlayerCurrentPlaybackRequest request); + + /// + /// Seeks to the given position in the user’s currently playing track. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-seek-to-position-in-currently-playing-track + /// + /// + Task SeekTo(PlayerSeekToRequest request); + + /// + /// Skips to previous track in the user’s queue. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-skip-users-playback-to-previous-track + /// + /// + Task SkipPrevious(); + + /// + /// Skips to previous track in the user’s queue. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-skip-users-playback-to-previous-track + /// + /// + Task SkipPrevious(PlayerSkipPreviousRequest request); + + /// + /// Start a new context or resume current playback on the user’s active device. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-start-a-users-playback + /// + /// + Task ResumePlayback(); + + /// + /// Start a new context or resume current playback on the user’s active device. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-start-a-users-playback + /// + /// + Task ResumePlayback(PlayerResumePlaybackRequest request); + + /// + /// Pause playback on the user’s account. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-pause-a-users-playback + /// + /// + Task PausePlayback(); + + /// + /// Pause playback on the user’s account. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-pause-a-users-playback + /// + /// + Task PausePlayback(PlayerPausePlaybackRequest request); + + /// + /// Set the volume for the user’s current playback device. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-set-volume-for-users-playback + /// + /// + Task SetVolume(PlayerVolumeRequest request); + + /// + /// Get tracks from the current user’s recently played tracks. Note: Currently doesn’t support podcast episodes. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-recently-played + /// + /// + Task> GetRecentlyPlayed(); + + /// + /// Get tracks from the current user’s recently played tracks. Note: Currently doesn’t support podcast episodes. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-recently-played + /// + /// + Task> GetRecentlyPlayed(PlayerRecentlyPlayedRequest request); + + /// + /// Get information about a user’s available devices. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-users-available-devices + /// + /// + Task GetAvailableDevices(); + + /// + /// Toggle shuffle on or off for user’s playback. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-toggle-shuffle-for-users-playback + /// + /// + Task SetShuffle(PlayerShuffleRequest request); + + /// + /// Add an item to the end of the user’s current playback queue. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-add-to-queue + /// + /// + Task AddToQueue(PlayerAddToQueueRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlaylistsClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlaylistsClient.cs new file mode 100644 index 0000000..ce6c078 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IPlaylistsClient.cs @@ -0,0 +1,183 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about a user’s playlists and for managing a user’s playlists. + /// + public interface IPlaylistsClient + { + /// + /// Remove one or more items from a user’s playlist. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-remove-tracks-playlist + /// + /// + Task RemoveItems(string playlistId, PlaylistRemoveItemsRequest request); + + /// + /// Add one or more items to a user’s playlist. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-add-tracks-to-playlist + /// + /// + Task AddItems(string playlistId, PlaylistAddItemsRequest request); + + /// + /// Get full details of the items of a playlist owned by a Spotify user. + /// + /// The Spotify ID for the playlist. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-playlists-tracks + /// + /// + Task>> GetItems(string playlistId); + + /// + /// Get full details of the items of a playlist owned by a Spotify user. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-playlists-tracks + /// + /// + Task>> GetItems(string playlistId, PlaylistGetItemsRequest request); + + /// + /// Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) + /// + /// The user’s Spotify user ID. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-create-playlist + /// + /// + Task Create(string userId, PlaylistCreateRequest request); + + /// + /// Replace the image used to represent a specific playlist. + /// + /// The Spotify ID for the playlist. + /// Base64 encoded JPEG image data, maximum payload size is 256 KB. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-upload-custom-playlist-cover + /// + /// + Task UploadCover(string playlistId, string base64JpgData); + + /// + /// Get the current image associated with a specific playlist. + /// + /// The Spotify ID for the playlist. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-playlist-cover + /// + /// + Task> GetCovers(string playlistId); + + /// + /// Get a list of the playlists owned or followed by a Spotify user. + /// + /// The user’s Spotify user ID. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists + /// + /// + Task> GetUsers(string userId); + + /// + /// Get a list of the playlists owned or followed by a Spotify user. + /// + /// The user’s Spotify user ID. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-list-users-playlists + /// + /// + Task> GetUsers(string userId, PlaylistGetUsersRequest request); + + /// + /// Get a playlist owned by a Spotify user. + /// + /// The Spotify ID for the playlist. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-playlist + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string playlistId); + + /// + /// Get a playlist owned by a Spotify user. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-playlist + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string playlistId, PlaylistGetRequest request); + + /// + /// Replace all the items in a playlist, overwriting its existing items. + /// This powerful request can be useful for replacing items, re-ordering existing items, or clearing the playlist. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-replace-playlists-tracks + /// + /// + Task ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request); + + /// + /// Get a list of the playlists owned or followed by the current Spotify user. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists + /// + /// + Task> CurrentUsers(); + + /// + /// Get a list of the playlists owned or followed by the current Spotify user. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-list-of-current-users-playlists + /// + /// + Task> CurrentUsers(PlaylistCurrentUsersRequest request); + + /// + /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-change-playlist-details + /// + /// + Task ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request); + + /// + /// Reorder an item or a group of items in a playlist. + /// + /// The Spotify ID for the playlist. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-reorder-playlists-tracks + /// + /// + Task ReorderItems(string playlistId, PlaylistReorderItemsRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISearchClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISearchClient.cs new file mode 100644 index 0000000..ddb5be6 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISearchClient.cs @@ -0,0 +1,21 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Search Endpoints + /// + public interface ISearchClient + { + /// + /// Get Spotify Catalog information about albums, artists, playlists, + /// tracks, shows or episodes that match a keyword string. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-search + /// + /// + Task Item(SearchRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IShowsClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IShowsClient.cs new file mode 100644 index 0000000..06a671d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IShowsClient.cs @@ -0,0 +1,66 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about one or more shows from the Spotify catalog. + /// + public interface IShowsClient + { + /// + /// Get Spotify catalog information for a single show identified by its unique Spotify ID. + /// + /// The Spotify ID for the show. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-show + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string showId); + + /// + /// Get Spotify catalog information for a single show identified by its unique Spotify ID. + /// + /// The Spotify ID for the show. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-show + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string showId, ShowRequest request); + + /// + /// Get Spotify catalog information for several shows based on their Spotify IDs. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-multiple-shows + /// + /// + Task GetSeveral(ShowsRequest request); + + /// + /// Get Spotify catalog information about an show’s episodes. + /// Optional parameters can be used to limit the number of episodes returned. + /// + /// The Spotify ID for the show. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-shows-episodes + /// + /// + Task> GetEpisodes(string showId); + + /// + /// Get Spotify catalog information about an show’s episodes. + /// Optional parameters can be used to limit the number of episodes returned. + /// + /// The Spotify ID for the show. + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-a-shows-episodes + /// + /// + Task> GetEpisodes(string showId, ShowEpisodesRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs new file mode 100644 index 0000000..dfa7227 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ISpotifyClient.cs @@ -0,0 +1,181 @@ +using System.Threading; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public interface ISpotifyClient + { + /// + /// The default paginator used by the Paginator methods + /// + /// + IPaginator DefaultPaginator { get; } + + /// + /// Operations related to Spotify User Profiles + /// + /// + IUserProfileClient UserProfile { get; } + + /// + /// Operations related to Spotify Browse Endpoints + /// + /// + IBrowseClient Browse { get; } + + /// + /// Operations related to Spotify Shows + /// + /// + IShowsClient Shows { get; } + + /// + /// Operations related to Spotify Playlists + /// + /// + IPlaylistsClient Playlists { get; } + + /// + /// Operations related to Spotify Search + /// + /// + ISearchClient Search { get; } + + /// + /// Operations related to Spotify Follows + /// + /// + IFollowClient Follow { get; } + + /// + /// Operations related to Spotify Tracks + /// + /// + ITracksClient Tracks { get; } + + /// + /// Operations related to Spotify Player Endpoints + /// + /// + IPlayerClient Player { get; } + + /// + /// Operations related to Spotify Albums + /// + /// + IAlbumsClient Albums { get; } + + /// + /// Operations related to Spotify Artists + /// + /// + IArtistsClient Artists { get; } + + /// + /// Operations related to Spotify Personalization Endpoints + /// + /// + IPersonalizationClient Personalization { get; } + + /// + /// Operations related to Spotify Podcast Episodes + /// + /// + IEpisodesClient Episodes { get; } + + /// + /// Operations related to Spotify User Library + /// + /// + ILibraryClient Library { get; } + + /// + /// Returns the last response received by an API call. + /// + /// + IResponse? LastResponse { get; } + + /// + /// Fetches all pages and returns them grouped in a list. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// The first page, will be included in the output list! + /// Optional. If not supplied, DefaultPaginator will be used + /// The Paging-Type + /// A list containing all fetched pages + Task> PaginateAll(IPaginatable firstPage, IPaginator? paginator = default!); + + /// + /// Fetches all pages and returns them grouped in a list. + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// The Paging-Type + /// The Response-Type + /// A list containing all fetched pages + Task> PaginateAll( + IPaginatable firstPage, + Func> mapper, + IPaginator? paginator = default! + ); + +#if !NETSTANDARD2_0 + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// An iterable IAsyncEnumerable + IAsyncEnumerable Paginate( + IPaginatable firstPage, + IPaginator? paginator = default!, + CancellationToken cancellationToken = default! + ); + + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// The Response-Type + /// + IAsyncEnumerable Paginate( + IPaginatable firstPage, + Func> mapper, + IPaginator? paginator = default!, + CancellationToken cancellationToken = default! + ); + +#endif + + public Task> NextPage(Paging paging); + + public Task> NextPage(CursorPaging cursorPaging); + + public Task NextPage(IPaginatable paginatable); + + public Task> PreviousPage(Paging paging); + + public Task PreviousPage(Paging paging); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/ITracksClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ITracksClient.cs new file mode 100644 index 0000000..06f2f20 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/ITracksClient.cs @@ -0,0 +1,70 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about one or more tracks from the Spotify catalog. + /// + public interface ITracksClient + { + /// + /// Get Spotify catalog information for multiple tracks based on their Spotify IDs. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-several-tracks + /// + /// + Task GetSeveral(TracksRequest request); + + /// + /// Get a detailed audio analysis for a single track identified by its unique Spotify ID. + /// + /// The Spotify ID for the track. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-audio-analysis + /// + /// + Task GetAudioAnalysis(string trackId); + + /// + /// Get audio feature information for a single track identified by its unique Spotify ID. + /// + /// The Spotify ID for the track. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-audio-features + /// + /// + Task GetAudioFeatures(string trackId); + + /// + /// Get Spotify catalog information for a single track identified by its unique Spotify ID. + /// + /// The Spotify ID for the track. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-track + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string trackId); + + /// + /// Get Spotify catalog information for a single track identified by its unique Spotify ID. + /// + /// The Spotify ID for the track. + /// The request-model which contains required and optional parameters. + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string trackId, TrackRequest request); + + /// + /// Get audio features for multiple tracks based on their Spotify IDs. + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-several-audio-features + /// + /// + Task GetSeveralAudioFeatures(TracksAudioFeaturesRequest request); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/Interfaces/IUserProfileClient.cs b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IUserProfileClient.cs new file mode 100644 index 0000000..ae71699 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/Interfaces/IUserProfileClient.cs @@ -0,0 +1,28 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web +{ + /// + /// Endpoints for retrieving information about a user’s profile. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#category-user-profile + public interface IUserProfileClient + { + /// + /// Get detailed profile information about the current user (including the current user’s username). + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-current-users-profile + /// + /// Thrown if the client is not authenticated. + Task Current(); + + /// + /// Get public profile information about a Spotify user. + /// + /// https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint-get-users-profile + /// Thrown if the client is not authenticated. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(string userId); + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/LibraryClient.cs b/Source Files/SpotifyAPI.Web/Clients/LibraryClient.cs new file mode 100644 index 0000000..7c8639f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/LibraryClient.cs @@ -0,0 +1,117 @@ +using System.Net; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class LibraryClient : APIClient, ILibraryClient + { + public LibraryClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task> CheckAlbums(LibraryCheckAlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryAlbumsContains(), request.BuildQueryParams()); + } + + public Task> CheckShows(LibraryCheckShowsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryShowsContains(), request.BuildQueryParams()); + } + + public Task> CheckTracks(LibraryCheckTracksRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryTracksContains(), request.BuildQueryParams()); + } + + public Task> GetAlbums() + { + return API.Get>(SpotifyUrls.LibraryAlbums()); + } + + public Task> GetAlbums(LibraryAlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryAlbums(), request.BuildQueryParams()); + } + + public Task> GetShows() + { + return API.Get>(SpotifyUrls.LibraryShows()); + } + + public Task> GetShows(LibraryShowsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryShows(), request.BuildQueryParams()); + } + + public Task> GetTracks() + { + return API.Get>(SpotifyUrls.LibraryTracks()); + } + + public Task> GetTracks(LibraryTracksRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(SpotifyUrls.LibraryTracks(), request.BuildQueryParams()); + } + + public async Task RemoveAlbums(LibraryRemoveAlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Delete(SpotifyUrls.LibraryAlbums(), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task RemoveShows(LibraryRemoveShowsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Delete(SpotifyUrls.LibraryShows(), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task RemoveTracks(LibraryRemoveTracksRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Delete(SpotifyUrls.LibraryTracks(), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task SaveAlbums(LibrarySaveAlbumsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(SpotifyUrls.LibraryAlbums(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task SaveShows(LibrarySaveShowsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(SpotifyUrls.LibraryShows(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public async Task SaveTracks(LibrarySaveTracksRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(SpotifyUrls.LibraryTracks(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/OAuthClient.cs b/Source Files/SpotifyAPI.Web/Clients/OAuthClient.cs new file mode 100644 index 0000000..06bfb7c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/OAuthClient.cs @@ -0,0 +1,267 @@ +using System.Text; +using System; +using System.Net.Http; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class OAuthClient : APIClient, IOAuthClient + { + public OAuthClient() : this(SpotifyClientConfig.CreateDefault()) { } + public OAuthClient(IAPIConnector apiConnector) : base(apiConnector) { } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062")] + public OAuthClient(SpotifyClientConfig config) : base(ValidateConfig(config)) { } + + /// + /// Requests a new token using pkce flow + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow-with-proof-key-for-code-exchange-pkce + /// + /// 1 + public Task RequestToken(PKCETokenRequest request) + { + return RequestToken(request, API); + } + + /// + /// Refreshes a token using pkce flow + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow-with-proof-key-for-code-exchange-pkce + /// + /// 1 + public Task RequestToken(PKCETokenRefreshRequest request) + { + return RequestToken(request, API); + } + + /// + /// Requests a new token using client_ids and client_secrets. + /// If the token is expired, simply call the funtion again to get a new token + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#client-credentials-flow + /// + /// 1 + public Task RequestToken(ClientCredentialsRequest request) + { + return RequestToken(request, API); + } + + /// + /// Refresh an already received token via Authorization Code Auth + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow + /// + /// + public Task RequestToken(AuthorizationCodeRefreshRequest request) + { + return RequestToken(request, API); + } + + /// + /// Reequest an initial token via Authorization Code Auth + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/general/guides/authorization-guide/#authorization-code-flow + /// + /// + public Task RequestToken(AuthorizationCodeTokenRequest request) + { + return RequestToken(request, API); + } + + /// + /// Swaps out a received code with a access token using a remote server + /// + /// The request-model which contains required and optional parameters. + /// + /// https://developer.spotify.com/documentation/ios/guides/token-swap-and-refresh/ + /// + /// + public Task RequestToken(TokenSwapTokenRequest request) + { + return RequestToken(request, API); + } + + /// + /// Gets a refreshed access token using an already received refresh token using a remote server + /// + /// + /// + /// https://developer.spotify.com/documentation/ios/guides/token-swap-and-refresh/ + /// + /// + public Task RequestToken(TokenSwapRefreshRequest request) + { + return RequestToken(request, API); + } + + public static Task RequestToken(PKCETokenRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("client_id", request.ClientId), + new KeyValuePair("grant_type", "authorization_code"), + new KeyValuePair("code", request.Code), + new KeyValuePair("redirect_uri", request.RedirectUri.ToString()), + new KeyValuePair("code_verifier", request.CodeVerifier), + }; + + return SendOAuthRequest(apiConnector, form, null, null); + } + + public static Task RequestToken(PKCETokenRefreshRequest request, IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("client_id", request.ClientId), + new KeyValuePair("grant_type", "refresh_token"), + new KeyValuePair("refresh_token", request.RefreshToken), + }; + + return SendOAuthRequest(apiConnector, form, null, null); + } + + public static Task RequestToken( + TokenSwapRefreshRequest request, IAPIConnector apiConnector + ) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("refresh_token", request.RefreshToken) + }; +#pragma warning disable CA2000 + return apiConnector.Post( + request.RefreshUri, null, new FormUrlEncodedContent(form) + ); +#pragma warning restore CA2000 + } + + public static Task RequestToken( + TokenSwapTokenRequest request, IAPIConnector apiConnector + ) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("code", request.Code) + }; + +#pragma warning disable CA2000 + return apiConnector.Post( + request.TokenUri, null, new FormUrlEncodedContent(form) + ); +#pragma warning restore CA2000 + } + + public static Task RequestToken( + ClientCredentialsRequest request, IAPIConnector apiConnector + ) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("grant_type", "client_credentials") + }; + + return SendOAuthRequest(apiConnector, form, request.ClientId, request.ClientSecret); + } + + public static Task RequestToken( + AuthorizationCodeRefreshRequest request, IAPIConnector apiConnector + ) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("grant_type", "refresh_token"), + new KeyValuePair("refresh_token", request.RefreshToken) + }; + + return SendOAuthRequest(apiConnector, form, request.ClientId, request.ClientSecret); + } + + public static Task RequestToken( + AuthorizationCodeTokenRequest request, IAPIConnector apiConnector + ) + { + Ensure.ArgumentNotNull(request, nameof(request)); + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + var form = new List> + { + new KeyValuePair("grant_type", "authorization_code"), + new KeyValuePair("code", request.Code), + new KeyValuePair("redirect_uri", request.RedirectUri.ToString()) + }; + + return SendOAuthRequest(apiConnector, form, request.ClientId, request.ClientSecret); + } + + private static Task SendOAuthRequest( + IAPIConnector apiConnector, + List> form, + string? clientId, + string? clientSecret) + { + var headers = BuildAuthHeader(clientId, clientSecret); +#pragma warning disable CA2000 + return apiConnector.Post(SpotifyUrls.OAuthToken, null, new FormUrlEncodedContent(form), headers); +#pragma warning restore CA2000 + } + + private static Dictionary BuildAuthHeader(string? clientId, string? clientSecret) + { + if (clientId == null || clientSecret == null) + { + return new Dictionary(); + } + + var base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{clientId}:{clientSecret}")); + return new Dictionary + { + { "Authorization", $"Basic {base64}"} + }; + } + + private static APIConnector ValidateConfig(SpotifyClientConfig config) + { + Ensure.ArgumentNotNull(config, nameof(config)); + + return new APIConnector( + config.BaseAddress, + config.Authenticator, + config.JSONSerializer, + config.HTTPClient, + config.RetryHandler, + config.HTTPLogger + ); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/PersonalizationClient.cs b/Source Files/SpotifyAPI.Web/Clients/PersonalizationClient.cs new file mode 100644 index 0000000..e9af2c6 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/PersonalizationClient.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class PersonalizationClient : APIClient, IPersonalizationClient + { + public PersonalizationClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task> GetTopArtists() + { + return API.Get>(URLs.PersonalizationTop("artists")); + } + + public Task> GetTopArtists(PersonalizationTopRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PersonalizationTop("artists"), request.BuildQueryParams()); + } + + public Task> GetTopTracks() + { + return API.Get>(URLs.PersonalizationTop("tracks")); + } + + public Task> GetTopTracks(PersonalizationTopRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PersonalizationTop("tracks"), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/PlayerClient.cs b/Source Files/SpotifyAPI.Web/Clients/PlayerClient.cs new file mode 100644 index 0000000..87b3318 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/PlayerClient.cs @@ -0,0 +1,154 @@ +using System.Net; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class PlayerClient : APIClient, IPlayerClient + { + public PlayerClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public async Task AddToQueue(PlayerAddToQueueRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Post(URLs.PlayerQueue(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public Task GetAvailableDevices() + { + return API.Get(URLs.PlayerDevices()); + } + + public Task GetCurrentlyPlaying(PlayerCurrentlyPlayingRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.PlayerCurrentlyPlaying(), request.BuildQueryParams()); + } + + public Task GetCurrentPlayback() + { + return API.Get(URLs.Player()); + } + + public Task GetCurrentPlayback(PlayerCurrentPlaybackRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Player(), request.BuildQueryParams()); + } + + public Task> GetRecentlyPlayed() + { + return API.Get>(URLs.PlayerRecentlyPlayed()); + } + + public Task> GetRecentlyPlayed(PlayerRecentlyPlayedRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.PlayerRecentlyPlayed(), request.BuildQueryParams()); + } + + public async Task PausePlayback() + { + var statusCode = await API.Put(URLs.PlayerPause(), null, null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task PausePlayback(PlayerPausePlaybackRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlayerPause(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task ResumePlayback() + { + var statusCode = await API.Put(URLs.PlayerResume(), null, null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task ResumePlayback(PlayerResumePlaybackRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API + .Put(URLs.PlayerResume(), request.BuildQueryParams(), request.BuildBodyParams()) + .ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SeekTo(PlayerSeekToRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlayerSeek(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SetRepeat(PlayerSetRepeatRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlayerRepeat(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SetShuffle(PlayerShuffleRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlayerShuffle(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SetVolume(PlayerVolumeRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlayerVolume(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SkipNext() + { + var statusCode = await API.Post(URLs.PlayerNext(), null, null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SkipNext(PlayerSkipNextRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Post(URLs.PlayerNext(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SkipPrevious() + { + var statusCode = await API.Post(URLs.PlayerPrevious(), null, null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task SkipPrevious(PlayerSkipPreviousRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Post(URLs.PlayerPrevious(), request.BuildQueryParams(), null).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + + public async Task TransferPlayback(PlayerTransferPlaybackRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.Player(), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.NoContent; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/PlaylistsClient.cs b/Source Files/SpotifyAPI.Web/Clients/PlaylistsClient.cs new file mode 100644 index 0000000..6a598d0 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/PlaylistsClient.cs @@ -0,0 +1,136 @@ +using System.Collections.Generic; +using System.Net; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class PlaylistsClient : APIClient, IPlaylistsClient + { + public PlaylistsClient(IAPIConnector connector) : base(connector) { } + + public Task RemoveItems(string playlistId, PlaylistRemoveItemsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Delete(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); + } + + public Task AddItems(string playlistId, PlaylistAddItemsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Post(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); + } + + public Task>> GetItems(string playlistId) + { + var request = new PlaylistGetItemsRequest(); + + return GetItems(playlistId, request); + } + + public Task>> GetItems(string playlistId, PlaylistGetItemsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>>(URLs.PlaylistTracks(playlistId), request.BuildQueryParams()); + } + + public Task Create(string userId, PlaylistCreateRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Post(URLs.UserPlaylists(userId), null, request.BuildBodyParams()); + } + + public async Task UploadCover(string playlistId, string base64JpgData) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNullOrEmptyString(base64JpgData, nameof(base64JpgData)); + + var statusCode = await API.PutRaw(URLs.PlaylistImages(playlistId), null, base64JpgData).ConfigureAwait(false); + return statusCode == HttpStatusCode.Accepted; + } + + public Task> GetCovers(string playlistId) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + + return API.Get>(URLs.PlaylistImages(playlistId)); + } + + public Task> GetUsers(string userId) + { + Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); + + return API.Get>(URLs.UserPlaylists(userId)); + } + + public Task> GetUsers(string userId, PlaylistGetUsersRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.UserPlaylists(userId), request.BuildQueryParams()); + } + + public Task Get(string playlistId) + { + var request = new PlaylistGetRequest(); // We need some defaults + + return Get(playlistId, request); + } + + public Task Get(string playlistId, PlaylistGetRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Playlist(playlistId), request.BuildQueryParams()); + } + + public async Task ReplaceItems(string playlistId, PlaylistReplaceItemsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.Created; + } + + public Task> CurrentUsers() + { + return API.Get>(URLs.CurrentUserPlaylists()); + } + + public Task> CurrentUsers(PlaylistCurrentUsersRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.CurrentUserPlaylists(), request.BuildQueryParams()); + } + + public async Task ChangeDetails(string playlistId, PlaylistChangeDetailsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + var statusCode = await API.Put(URLs.Playlist(playlistId), null, request.BuildBodyParams()).ConfigureAwait(false); + return statusCode == HttpStatusCode.OK; + } + + public Task ReorderItems(string playlistId, PlaylistReorderItemsRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(playlistId, nameof(playlistId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Put(URLs.PlaylistTracks(playlistId), null, request.BuildBodyParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/SearchClient.cs b/Source Files/SpotifyAPI.Web/Clients/SearchClient.cs new file mode 100644 index 0000000..b7e9b1b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/SearchClient.cs @@ -0,0 +1,18 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class SearchClient : APIClient, ISearchClient + { + public SearchClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Item(SearchRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Search(), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/ShowsClient.cs b/Source Files/SpotifyAPI.Web/Clients/ShowsClient.cs new file mode 100644 index 0000000..c90fcf3 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/ShowsClient.cs @@ -0,0 +1,48 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class ShowsClient : APIClient, IShowsClient + { + public ShowsClient(IAPIConnector connector) : base(connector) { } + + public Task Get(string showId) + { + Ensure.ArgumentNotNullOrEmptyString(showId, nameof(showId)); + + return API.Get(URLs.Show(showId)); + } + + public Task Get(string showId, ShowRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(showId, nameof(showId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Show(showId), request.BuildQueryParams()); + } + + public Task GetSeveral(ShowsRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Shows(), request.BuildQueryParams()); + } + + public Task> GetEpisodes(string showId) + { + Ensure.ArgumentNotNullOrEmptyString(showId, nameof(showId)); + + return API.Get>(URLs.ShowEpisodes(showId)); + } + + public Task> GetEpisodes(string showId, ShowEpisodesRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(showId, nameof(showId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get>(URLs.ShowEpisodes(showId), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/SimplePaginator.cs b/Source Files/SpotifyAPI.Web/Clients/SimplePaginator.cs new file mode 100644 index 0000000..76edf8d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/SimplePaginator.cs @@ -0,0 +1,130 @@ +using System.Threading; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using System.Runtime.CompilerServices; + +namespace SpotifyAPI.Web +{ + public class SimplePaginator : IPaginator + { + protected virtual Task ShouldContinue(List results, IPaginatable page) + { + return Task.FromResult(true); + } + protected virtual Task ShouldContinue(List results, IPaginatable page) + { + return Task.FromResult(true); + } + + public async Task> PaginateAll(IPaginatable firstPage, IAPIConnector connector) + { + Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); + Ensure.ArgumentNotNull(connector, nameof(connector)); + + var page = firstPage; + var results = new List(); + if (page.Items != null) + { + results.AddRange(page.Items); + } + while (page.Next != null && await ShouldContinue(results, page).ConfigureAwait(false)) + { + page = await connector.Get>(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); + if (page.Items != null) + { + results.AddRange(page.Items); + } + } + + return results; + } + + public async Task> PaginateAll( + IPaginatable firstPage, Func> mapper, IAPIConnector connector + ) + { + Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); + Ensure.ArgumentNotNull(mapper, nameof(mapper)); + Ensure.ArgumentNotNull(connector, nameof(connector)); + + var page = firstPage; + var results = new List(); + if (page.Items != null) + { + results.AddRange(page.Items); + } + while (page.Next != null && await ShouldContinue(results, page).ConfigureAwait(false)) + { + var next = await connector.Get(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); + page = mapper(next); + if (page.Items != null) + { + results.AddRange(page.Items); + } + } + + return results; + } + +#if !NETSTANDARD2_0 + public async IAsyncEnumerable Paginate( + IPaginatable firstPage, + IAPIConnector connector, + [EnumeratorCancellation] CancellationToken cancel = default) + { + Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); + Ensure.ArgumentNotNull(connector, nameof(connector)); + if (firstPage.Items == null) + { + throw new ArgumentException("The first page has to contain an Items list!", nameof(firstPage)); + } + + var page = firstPage; + foreach (var item in page.Items) + { + yield return item; + } + while (page.Next != null) + { + page = await connector.Get>(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); + foreach (var item in page.Items!) + { + yield return item; + } + } + } + + public async IAsyncEnumerable Paginate( + IPaginatable firstPage, + Func> mapper, + IAPIConnector connector, + [EnumeratorCancellation] CancellationToken cancel = default) + { + Ensure.ArgumentNotNull(firstPage, nameof(firstPage)); + Ensure.ArgumentNotNull(mapper, nameof(mapper)); + Ensure.ArgumentNotNull(connector, nameof(connector)); + if (firstPage.Items == null) + { + throw new ArgumentException("The first page has to contain an Items list!", nameof(firstPage)); + } + + var page = firstPage; + foreach (var item in page.Items) + { + yield return item; + } + while (page.Next != null) + { + var next = await connector.Get(new Uri(page.Next, UriKind.Absolute)).ConfigureAwait(false); + page = mapper(next); + foreach (var item in page.Items!) + { + yield return item; + } + } + } +#endif + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/SpotifyClient.cs b/Source Files/SpotifyAPI.Web/Clients/SpotifyClient.cs new file mode 100644 index 0000000..92f7710 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/SpotifyClient.cs @@ -0,0 +1,303 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace SpotifyAPI.Web +{ + public class SpotifyClient : ISpotifyClient + { + private readonly IAPIConnector _apiConnector; + + public SpotifyClient(IToken token) : + this(SpotifyClientConfig.CreateDefault(token?.AccessToken ?? throw new ArgumentNullException(nameof(token)), token.TokenType)) + { } + + public SpotifyClient(string token, string tokenType = "Bearer") : + this(SpotifyClientConfig.CreateDefault(token, tokenType)) + { } + + public SpotifyClient(SpotifyClientConfig config) + { + Ensure.ArgumentNotNull(config, nameof(config)); + if (config.Authenticator == null) + { +#pragma warning disable CA2208 + throw new ArgumentNullException("Authenticator in config is null. Please supply it via `WithAuthenticator` or `WithToken`"); +#pragma warning restore CA2208 + } + + _apiConnector = config.BuildAPIConnector(); + _apiConnector.ResponseReceived += (sender, response) => + { + LastResponse = response; + }; + + DefaultPaginator = config.DefaultPaginator; + UserProfile = new UserProfileClient(_apiConnector); + Browse = new BrowseClient(_apiConnector); + Shows = new ShowsClient(_apiConnector); + Playlists = new PlaylistsClient(_apiConnector); + Search = new SearchClient(_apiConnector); + Follow = new FollowClient(_apiConnector); + Tracks = new TracksClient(_apiConnector); + Player = new PlayerClient(_apiConnector); + Albums = new AlbumsClient(_apiConnector); + Artists = new ArtistsClient(_apiConnector); + Personalization = new PersonalizationClient(_apiConnector); + Episodes = new EpisodesClient(_apiConnector); + Library = new LibraryClient(_apiConnector); + } + + public IPaginator DefaultPaginator { get; } + + public IUserProfileClient UserProfile { get; } + + public IBrowseClient Browse { get; } + + public IShowsClient Shows { get; } + + public IPlaylistsClient Playlists { get; } + + public ISearchClient Search { get; } + + public IFollowClient Follow { get; } + + public ITracksClient Tracks { get; } + + public IPlayerClient Player { get; } + + public IAlbumsClient Albums { get; } + + public IArtistsClient Artists { get; } + + public IPersonalizationClient Personalization { get; } + + public IEpisodesClient Episodes { get; } + + public ILibraryClient Library { get; } + + public IResponse? LastResponse { get; private set; } + + /// + /// Fetches all pages and returns them grouped in a list. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// The first page, will be included in the output list! + /// Optional. If not supplied, DefaultPaginator will be used + /// The Paging-Type + /// A list containing all fetched pages + public Task> PaginateAll(IPaginatable firstPage, IPaginator? paginator = null) + { + return (paginator ?? DefaultPaginator).PaginateAll(firstPage, _apiConnector); + } + + /// + /// Fetches all pages and returns them grouped in a list. + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// The Paging-Type + /// The Response-Type + /// A list containing all fetched pages + public Task> PaginateAll( + IPaginatable firstPage, + Func> mapper, + IPaginator? paginator = null + ) + { + return (paginator ?? DefaultPaginator).PaginateAll(firstPage, mapper, _apiConnector); + } + + private Task FetchPage(string? nextUrl) + { + if (nextUrl == null) + { + throw new APIPagingException("The paging object has no next page"); + } + + return _apiConnector.Get(new Uri(nextUrl, UriKind.Absolute)); + } + + /// + /// Fetches the next page of the paging object + /// + /// A paging object which has a next page + /// + /// + public Task> NextPage(Paging paging) + { + Ensure.ArgumentNotNull(paging, nameof(paging)); + return FetchPage>(paging.Next); + } + + /// + /// Fetches the next page of the cursor paging object + /// + /// A cursor paging object which has a next page + /// + /// + public Task> NextPage(CursorPaging cursorPaging) + { + Ensure.ArgumentNotNull(cursorPaging, nameof(cursorPaging)); + return FetchPage>(cursorPaging.Next); + } + + /// + /// Fetches the next page of the complex IPaginatable object. + /// + /// A complex IPaginatable object with a next page + /// + /// The type of the next page + /// + public Task NextPage(IPaginatable paginatable) + { + Ensure.ArgumentNotNull(paginatable, nameof(paginatable)); + return FetchPage(paginatable.Next); + } + + /// + /// Fetches the previous page of the paging object. + /// + /// A paging object with a previous page + /// + /// + public Task> PreviousPage(Paging paging) + { + Ensure.ArgumentNotNull(paging, nameof(paging)); + return FetchPage>(paging.Previous); + } + + + /// + /// Fetches the previous page of the complex paging object. + /// + /// A complex paging object with a previous page + /// + /// The type of the next page + /// + public Task PreviousPage(Paging paging) + { + Ensure.ArgumentNotNull(paging, nameof(paging)); + return FetchPage(paging.Previous); + } + +#if !NETSTANDARD2_0 + + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// An iterable IAsyncEnumerable + public IAsyncEnumerable Paginate( + IPaginatable firstPage, + IPaginator? paginator = null, + CancellationToken cancellationToken = default + ) + { + return (paginator ?? DefaultPaginator).Paginate(firstPage, _apiConnector, cancellationToken); + } + + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// The Response-Type + /// + public IAsyncEnumerable Paginate( + IPaginatable firstPage, + Func> mapper, + IPaginator? paginator = null, + CancellationToken cancellationToken = default + ) + { + return (paginator ?? DefaultPaginator).Paginate(firstPage, mapper, _apiConnector, cancellationToken); + } + + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A Function to retrive the first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// The Response-Type + /// + public async IAsyncEnumerable Paginate( + Func>> getFirstPage, + Func> mapper, + IPaginator? paginator = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + Ensure.ArgumentNotNull(getFirstPage, nameof(getFirstPage)); + + var firstPage = await getFirstPage().ConfigureAwait(false); + await foreach (var item in (paginator ?? DefaultPaginator) + .Paginate(firstPage, mapper, _apiConnector, cancellationToken) + .WithCancellation(cancellationToken) + ) + { + yield return item; + } + } + + /// + /// Paginate through pages by using IAsyncEnumerable, introduced in C# 8 + /// Some responses (e.g search response) have the pagination nested in a JSON Property. + /// To workaround this limitation, the mapper is required and needs to point to the correct next pagination. + /// The default paginator will fetch all available resources without a delay between requests. + /// This can drain your request limit quite fast, so consider using a custom paginator with delays. + /// + /// A Task to retrive the first page, will be included in the output list! + /// A function which maps response objects to the next paging object + /// Optional. If not supplied, DefaultPaginator will be used + /// An optional Cancellation Token + /// The Paging-Type + /// The Response-Type + /// + public async IAsyncEnumerable Paginate( + Task> firstPageTask, + Func> mapper, + IPaginator? paginator = null, + [EnumeratorCancellation] CancellationToken cancellationToken = default) + { + Ensure.ArgumentNotNull(firstPageTask, nameof(firstPageTask)); + + var firstPage = await firstPageTask.ConfigureAwait(false); + await foreach (var item in (paginator ?? DefaultPaginator) + .Paginate(firstPage, mapper, _apiConnector, cancellationToken) + .WithCancellation(cancellationToken) + ) + { + yield return item; + } + } +#endif + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/SpotifyClientConfig.cs b/Source Files/SpotifyAPI.Web/Clients/SpotifyClientConfig.cs new file mode 100644 index 0000000..56a419c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/SpotifyClientConfig.cs @@ -0,0 +1,198 @@ +using System.Net.Http; +using System; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class SpotifyClientConfig + { + public Uri BaseAddress { get; private set; } + public IAuthenticator? Authenticator { get; private set; } + public IJSONSerializer JSONSerializer { get; private set; } + public IHTTPClient HTTPClient { get; private set; } + public IHTTPLogger? HTTPLogger { get; private set; } + public IRetryHandler? RetryHandler { get; private set; } + public IPaginator DefaultPaginator { get; private set; } + public IAPIConnector? APIConnector { get; private set; } + + /// + /// This config spefies the internal parts of the SpotifyClient. + /// + /// + /// + /// + /// + /// + /// + /// + /// + public SpotifyClientConfig( + Uri baseAddress, + IAuthenticator? authenticator, + IJSONSerializer jsonSerializer, + IHTTPClient httpClient, + IRetryHandler? retryHandler, + IHTTPLogger? httpLogger, + IPaginator defaultPaginator, + IAPIConnector? apiConnector = null + ) + { + BaseAddress = baseAddress; + Authenticator = authenticator; + JSONSerializer = jsonSerializer; + HTTPClient = httpClient; + RetryHandler = retryHandler; + HTTPLogger = httpLogger; + DefaultPaginator = defaultPaginator; + APIConnector = apiConnector; + } + + public SpotifyClientConfig WithToken(string token, string tokenType = "Bearer") + { + Ensure.ArgumentNotNull(token, nameof(token)); + + return new SpotifyClientConfig( + BaseAddress, + new TokenAuthenticator(token, tokenType), + JSONSerializer, + HTTPClient, + RetryHandler, + HTTPLogger, + DefaultPaginator + ); + } + + public SpotifyClientConfig WithRetryHandler(IRetryHandler retryHandler) + { + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + JSONSerializer, + HTTPClient, + retryHandler, + HTTPLogger, + DefaultPaginator + ); + } + + public SpotifyClientConfig WithAuthenticator(IAuthenticator authenticator) + { + Ensure.ArgumentNotNull(authenticator, nameof(authenticator)); + + return new SpotifyClientConfig( + BaseAddress, + authenticator, + JSONSerializer, + HTTPClient, + RetryHandler, + HTTPLogger, + DefaultPaginator + ); + } + + public SpotifyClientConfig WithHTTPLogger(IHTTPLogger httpLogger) + { + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + JSONSerializer, + HTTPClient, + RetryHandler, + httpLogger, + DefaultPaginator + ); + } + + public SpotifyClientConfig WithHTTPClient(IHTTPClient httpClient) + { + Ensure.ArgumentNotNull(httpClient, nameof(httpClient)); + + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + JSONSerializer, + httpClient, + RetryHandler, + HTTPLogger, + DefaultPaginator + ); + } + + public SpotifyClientConfig WithJSONSerializer(IJSONSerializer jsonSerializer) + { + Ensure.ArgumentNotNull(jsonSerializer, nameof(jsonSerializer)); + + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + jsonSerializer, + HTTPClient, + RetryHandler, + HTTPLogger, + DefaultPaginator + ); + } + + + public SpotifyClientConfig WithDefaultPaginator(IPaginator defaultPaginator) + { + Ensure.ArgumentNotNull(defaultPaginator, nameof(defaultPaginator)); + + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + JSONSerializer, + HTTPClient, + RetryHandler, + HTTPLogger, + defaultPaginator + ); + } + + public SpotifyClientConfig WithAPIConnector(IAPIConnector apiConnector) + { + Ensure.ArgumentNotNull(apiConnector, nameof(apiConnector)); + + return new SpotifyClientConfig( + BaseAddress, + Authenticator, + JSONSerializer, + HTTPClient, + RetryHandler, + HTTPLogger, + DefaultPaginator, + apiConnector + ); + } + + public IAPIConnector BuildAPIConnector() + { + return APIConnector ?? new APIConnector( + BaseAddress, + Authenticator, + JSONSerializer, + HTTPClient, + RetryHandler, + HTTPLogger + ); + } + + public static SpotifyClientConfig CreateDefault(string token, string tokenType = "Bearer") + { + return CreateDefault().WithAuthenticator(new TokenAuthenticator(token, tokenType)); + } + + public static SpotifyClientConfig CreateDefault() + { + return new SpotifyClientConfig( + SpotifyUrls.APIV1, + null, + new NewtonsoftJSONSerializer(), + new NetHttpClient(), + null, + null, + new SimplePaginator() + ); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/TracksClient.cs b/Source Files/SpotifyAPI.Web/Clients/TracksClient.cs new file mode 100644 index 0000000..4e51511 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/TracksClient.cs @@ -0,0 +1,54 @@ +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; +using URLs = SpotifyAPI.Web.SpotifyUrls; + +namespace SpotifyAPI.Web +{ + public class TracksClient : APIClient, ITracksClient + { + public TracksClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Get(string trackId) + { + Ensure.ArgumentNotNullOrEmptyString(trackId, nameof(trackId)); + + return API.Get(URLs.Track(trackId)); + } + + public Task Get(string trackId, TrackRequest request) + { + Ensure.ArgumentNotNullOrEmptyString(trackId, nameof(trackId)); + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Track(trackId), request.BuildQueryParams()); + } + + public Task GetAudioAnalysis(string trackId) + { + Ensure.ArgumentNotNullOrEmptyString(trackId, nameof(trackId)); + + return API.Get(URLs.AudioAnalysis(trackId)); + } + + public Task GetAudioFeatures(string trackId) + { + Ensure.ArgumentNotNullOrEmptyString(trackId, nameof(trackId)); + + return API.Get(URLs.AudioFeatures(trackId)); + } + + public Task GetSeveral(TracksRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.Tracks(), request.BuildQueryParams()); + } + + public Task GetSeveralAudioFeatures(TracksAudioFeaturesRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + return API.Get(URLs.AudioFeatures(), request.BuildQueryParams()); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Clients/UserProfileClient.cs b/Source Files/SpotifyAPI.Web/Clients/UserProfileClient.cs new file mode 100644 index 0000000..514776d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Clients/UserProfileClient.cs @@ -0,0 +1,23 @@ +using System; +using System.Threading.Tasks; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class UserProfileClient : APIClient, IUserProfileClient + { + public UserProfileClient(IAPIConnector apiConnector) : base(apiConnector) { } + + public Task Current() + { + return API.Get(SpotifyUrls.Me()); + } + + public Task Get(string userId) + { + Ensure.ArgumentNotNullOrEmptyString(userId, nameof(userId)); + + return API.Get(SpotifyUrls.User(userId)); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Enums/AlbumType.cs b/Source Files/SpotifyAPI.Web/Enums/AlbumType.cs deleted file mode 100644 index c05df33..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/AlbumType.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum AlbumType - { - [String("album")] - Album = 1, - - [String("single")] - Single = 2, - - [String("compilation")] - Compilation = 4, - - [String("appears_on")] - AppearsOn = 8, - - [String("album,single,compilation,appears_on")] - All = 16 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Enums/FollowType.cs b/Source Files/SpotifyAPI.Web/Enums/FollowType.cs deleted file mode 100644 index 6cd802b..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/FollowType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum FollowType - { - [String("artist")] - Artist = 1, - - [String("user")] - User = 2 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Enums/RepeatState.cs b/Source Files/SpotifyAPI.Web/Enums/RepeatState.cs deleted file mode 100644 index d4abcf6..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/RepeatState.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum RepeatState - { - [String("track")] - Track = 1, - - [String("context")] - Context = 2, - - [String("off")] - Off = 4 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Enums/Scope.cs b/Source Files/SpotifyAPI.Web/Enums/Scope.cs deleted file mode 100644 index 5b500b9..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/Scope.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum Scope - { - [String("")] - None = 1, - - [String("playlist-modify-public")] - PlaylistModifyPublic = 2, - - [String("playlist-modify-private")] - PlaylistModifyPrivate = 4, - - [String("playlist-read-private")] - PlaylistReadPrivate = 8, - - [String("streaming")] - Streaming = 16, - - [String("user-read-private")] - UserReadPrivate = 32, - - [String("user-read-email")] - UserReadEmail = 64, - - [String("user-library-read")] - UserLibraryRead = 128, - - [String("user-library-modify")] - UserLibraryModify = 256, - - [String("user-follow-modify")] - UserFollowModify = 512, - - [String("user-follow-read")] - UserFollowRead = 1024, - - [String("user-read-birthdate")] - UserReadBirthdate = 2048, - - [String("user-top-read")] - UserTopRead = 4096, - - [String("playlist-read-collaborative")] - PlaylistReadCollaborative = 8192, - - [String("user-read-recently-played")] - UserReadRecentlyPlayed = 16384, - - [String("user-read-playback-state")] - UserReadPlaybackState = 32768, - - [String("user-modify-playback-state")] - UserModifyPlaybackState = 65536, - - [String("user-read-currently-playing")] - UserReadCurrentlyPlaying = 131072, - - [String("app-remote-control")] - AppRemoteControl = 262144, - - [String("ugc-image-upload")] - UgcImageUpload = 524288 - } -} diff --git a/Source Files/SpotifyAPI.Web/Enums/SearchType.cs b/Source Files/SpotifyAPI.Web/Enums/SearchType.cs deleted file mode 100644 index 652161c..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/SearchType.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum SearchType - { - [String("artist")] - Artist = 1, - - [String("album")] - Album = 2, - - [String("track")] - Track = 4, - - [String("playlist")] - Playlist = 8, - - [String("track,album,artist,playlist")] - All = 16 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Enums/TimeRangeType.cs b/Source Files/SpotifyAPI.Web/Enums/TimeRangeType.cs deleted file mode 100644 index 468a808..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/TimeRangeType.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - /// - /// Only one value allowed - /// - [Flags] - public enum TimeRangeType - { - [String("long_term")] - LongTerm = 1, - - [String("medium_term")] - MediumTerm = 2, - - [String("short_term")] - ShortTerm = 4 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Enums/TrackType.cs b/Source Files/SpotifyAPI.Web/Enums/TrackType.cs deleted file mode 100644 index 63c4341..0000000 --- a/Source Files/SpotifyAPI.Web/Enums/TrackType.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace SpotifyAPI.Web.Enums -{ - [Flags] - public enum TrackType - { - [String("track")] - Track = 1, - - [String("episode")] - Episode = 2, - - [String("ad")] - Ad = 4, - - [String("unknown")] - Unknown = 8 - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Exceptions/APIException.cs b/Source Files/SpotifyAPI.Web/Exceptions/APIException.cs new file mode 100644 index 0000000..b7c36e5 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Exceptions/APIException.cs @@ -0,0 +1,73 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using SpotifyAPI.Web.Http; +using System; +using System.Runtime.Serialization; + +namespace SpotifyAPI.Web +{ + [Serializable] + public class APIException : Exception + { + public IResponse? Response { get; set; } + + public APIException(IResponse response) : base(ParseAPIErrorMessage(response)) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + Response = response; + } + + public APIException() + { + } + + public APIException(string message) : base(message) + { + } + + public APIException(string message, Exception innerException) : base(message, innerException) + { + } + + protected APIException(SerializationInfo info, StreamingContext context) : base(info, context) + { + Response = info.GetValue("APIException.Response", typeof(IResponse)) as IResponse; + } + + private static string? ParseAPIErrorMessage(IResponse response) + { + var body = response.Body as string; + if (string.IsNullOrEmpty(body)) + { + return null; + } + try + { + JObject bodyObject = JObject.Parse(body!); + + + var error = bodyObject.Value("error"); + if (error.Type == JTokenType.String) + { + return error.ToString(); + } + else if (error.Type == JTokenType.Object) + { + return error.Value("message"); + } + } + catch (JsonReaderException) + { + return null; + } + return null; + } + + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + base.GetObjectData(info, context); + info.AddValue("APIException.Response", Response); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Exceptions/APIPagingException.cs b/Source Files/SpotifyAPI.Web/Exceptions/APIPagingException.cs new file mode 100644 index 0000000..b5fd5c4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Exceptions/APIPagingException.cs @@ -0,0 +1,31 @@ +using System.Globalization; +using System.Runtime.Serialization; +using System; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + [Serializable] + public class APIPagingException : APIException + { + public TimeSpan RetryAfter { get; } + + public APIPagingException(IResponse response) : base(response) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + if (response.Headers.TryGetValue("Retry-After", out string? retryAfter)) + { + RetryAfter = TimeSpan.FromSeconds(int.Parse(retryAfter, CultureInfo.InvariantCulture)); + } + } + + public APIPagingException() { } + + public APIPagingException(string message) : base(message) { } + + public APIPagingException(string message, Exception innerException) : base(message, innerException) { } + + protected APIPagingException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/Source Files/SpotifyAPI.Web/Exceptions/APITooManyRequestsException.cs b/Source Files/SpotifyAPI.Web/Exceptions/APITooManyRequestsException.cs new file mode 100644 index 0000000..2ea206d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Exceptions/APITooManyRequestsException.cs @@ -0,0 +1,31 @@ +using System.Globalization; +using System.Runtime.Serialization; +using System; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + [Serializable] + public class APITooManyRequestsException : APIException + { + public TimeSpan RetryAfter { get; } + + public APITooManyRequestsException(IResponse response) : base(response) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + if (response.Headers.TryGetValue("Retry-After", out string? retryAfter)) + { + RetryAfter = TimeSpan.FromSeconds(int.Parse(retryAfter, CultureInfo.InvariantCulture)); + } + } + + public APITooManyRequestsException() { } + + public APITooManyRequestsException(string message) : base(message) { } + + public APITooManyRequestsException(string message, Exception innerException) : base(message, innerException) { } + + protected APITooManyRequestsException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/Source Files/SpotifyAPI.Web/Exceptions/APIUnauthorizedException.cs b/Source Files/SpotifyAPI.Web/Exceptions/APIUnauthorizedException.cs new file mode 100644 index 0000000..0bd0b40 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Exceptions/APIUnauthorizedException.cs @@ -0,0 +1,20 @@ +using System.Runtime.Serialization; +using System; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + [Serializable] + public class APIUnauthorizedException : APIException + { + public APIUnauthorizedException(IResponse response) : base(response) { } + + public APIUnauthorizedException() { } + + public APIUnauthorizedException(string message) : base(message) { } + + public APIUnauthorizedException(string message, Exception innerException) : base(message, innerException) { } + + protected APIUnauthorizedException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/APIConnector.cs b/Source Files/SpotifyAPI.Web/Http/APIConnector.cs new file mode 100644 index 0000000..2196181 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/APIConnector.cs @@ -0,0 +1,291 @@ +using System.Net.Http; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Net; + +namespace SpotifyAPI.Web.Http +{ + public class APIConnector : IAPIConnector + { + private readonly Uri _baseAddress; + private readonly IAuthenticator? _authenticator; + private readonly IJSONSerializer _jsonSerializer; + private readonly IHTTPClient _httpClient; + private readonly IRetryHandler? _retryHandler; + private readonly IHTTPLogger? _httpLogger; + + public event EventHandler? ResponseReceived; + + public APIConnector(Uri baseAddress, IAuthenticator authenticator) : + this(baseAddress, authenticator, new NewtonsoftJSONSerializer(), new NetHttpClient(), null, null) + { } + public APIConnector( + Uri baseAddress, + IAuthenticator? authenticator, + IJSONSerializer jsonSerializer, + IHTTPClient httpClient, + IRetryHandler? retryHandler, + IHTTPLogger? httpLogger) + { + _baseAddress = baseAddress; + _authenticator = authenticator; + _jsonSerializer = jsonSerializer; + _httpClient = httpClient; + _retryHandler = retryHandler; + _httpLogger = httpLogger; + } + + public Task Delete(Uri uri) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Delete); + } + + public Task Delete(Uri uri, IDictionary? parameters) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Delete, parameters); + } + + public Task Delete(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Delete, parameters, body); + } + + public async Task Delete(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + var response = await SendAPIRequestDetailed(uri, HttpMethod.Delete, parameters, body).ConfigureAwait(false); + return response.StatusCode; + } + + public Task Get(Uri uri) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Get); + } + + public Task Get(Uri uri, IDictionary? parameters) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Get, parameters); + } + + public async Task Get(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + var response = await SendAPIRequestDetailed(uri, HttpMethod.Get, parameters, body).ConfigureAwait(false); + return response.StatusCode; + } + + public Task Post(Uri uri) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Post); + } + + public Task Post(Uri uri, IDictionary? parameters) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Post, parameters); + } + + public Task Post(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Post, parameters, body); + } + + public Task Post(Uri uri, IDictionary? parameters, object? body, Dictionary? headers) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Post, parameters, body, headers); + } + + public async Task Post(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + var response = await SendAPIRequestDetailed(uri, HttpMethod.Post, parameters, body).ConfigureAwait(false); + return response.StatusCode; + } + + public Task Put(Uri uri) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Put); + } + + public Task Put(Uri uri, IDictionary? parameters) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Put, parameters); + } + + public Task Put(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + return SendAPIRequest(uri, HttpMethod.Put, parameters, body); + } + + public async Task Put(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + var response = await SendAPIRequestDetailed(uri, HttpMethod.Put, parameters, body).ConfigureAwait(false); + return response.StatusCode; + } + + public async Task PutRaw(Uri uri, IDictionary? parameters, object? body) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + var response = await SendRawRequest(uri, HttpMethod.Put, parameters, body).ConfigureAwait(false); + return response.StatusCode; + } + + public void SetRequestTimeout(TimeSpan timeout) + { + _httpClient.SetRequestTimeout(timeout); + } + + private IRequest CreateRequest( + Uri uri, + HttpMethod method, + IDictionary? parameters, + object? body, + IDictionary? headers + ) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + Ensure.ArgumentNotNull(method, nameof(method)); + + return new Request( + _baseAddress, + uri, + method, + headers ?? new Dictionary(), + parameters ?? new Dictionary()) + { + Body = body + }; + } + + private async Task> DoSerializedRequest(IRequest request) + { + _jsonSerializer.SerializeRequest(request); + var response = await DoRequest(request).ConfigureAwait(false); + return _jsonSerializer.DeserializeResponse(response); + } + + private async Task DoRequest(IRequest request) + { + await ApplyAuthenticator(request).ConfigureAwait(false); + _httpLogger?.OnRequest(request); + IResponse response = await _httpClient.DoRequest(request).ConfigureAwait(false); + _httpLogger?.OnResponse(response); + ResponseReceived?.Invoke(this, response); + if (_retryHandler != null) + { + response = await _retryHandler.HandleRetry(request, response, async (newRequest) => + { + await ApplyAuthenticator(request).ConfigureAwait(false); + var newResponse = await _httpClient.DoRequest(request).ConfigureAwait(false); + _httpLogger?.OnResponse(newResponse); + ResponseReceived?.Invoke(this, response); + return newResponse; + }).ConfigureAwait(false); + } + ProcessErrors(response); + return response; + } + + private async Task ApplyAuthenticator(IRequest request) + { +#if NETSTANDARD2_0 + if (_authenticator != null + && !request.Endpoint.IsAbsoluteUri + || request.Endpoint.AbsoluteUri.Contains("https://api.spotify.com")) +#else + if (_authenticator != null + && !request.Endpoint.IsAbsoluteUri + || request.Endpoint.AbsoluteUri.Contains("https://api.spotify.com", StringComparison.InvariantCulture)) +#endif + { + await _authenticator!.Apply(request, this).ConfigureAwait(false); + } + } + + public Task SendRawRequest( + Uri uri, + HttpMethod method, + IDictionary? parameters = null, + object? body = null, + IDictionary? headers = null + ) + { + var request = CreateRequest(uri, method, parameters, body, headers); + return DoRequest(request); + } + + public async Task SendAPIRequest( + Uri uri, + HttpMethod method, + IDictionary? parameters = null, + object? body = null, + IDictionary? headers = null + ) + { + var request = CreateRequest(uri, method, parameters, body, headers); + IAPIResponse apiResponse = await DoSerializedRequest(request).ConfigureAwait(false); + return apiResponse.Body!; + } + + public async Task SendAPIRequestDetailed( + Uri uri, + HttpMethod method, + IDictionary? parameters = null, + object? body = null, + IDictionary? headers = null + ) + { + var request = CreateRequest(uri, method, parameters, body, headers); + var response = await DoSerializedRequest(request).ConfigureAwait(false); + return response.Response; + } + + private static void ProcessErrors(IResponse response) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + if ((int)response.StatusCode >= 200 && (int)response.StatusCode < 400) + { + return; + } + + throw response.StatusCode switch + { + HttpStatusCode.Unauthorized => new APIUnauthorizedException(response), + // TODO: Remove hack once .netstandard 2.0 is not supported + (HttpStatusCode)429 => new APITooManyRequestsException(response), + _ => new APIException(response), + }; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/APIResponse.cs b/Source Files/SpotifyAPI.Web/Http/APIResponse.cs new file mode 100644 index 0000000..6700a17 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/APIResponse.cs @@ -0,0 +1,17 @@ +namespace SpotifyAPI.Web.Http +{ + public class APIResponse : IAPIResponse + { + public APIResponse(IResponse response, T? body = default) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + Body = body; + Response = response; + } + + public T? Body { get; set; } + + public IResponse Response { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIConnector.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIConnector.cs new file mode 100644 index 0000000..9fd1294 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIConnector.cs @@ -0,0 +1,51 @@ +using System.Net; +using System; +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Http +{ + public interface IAPIConnector + { + // IAuthenticator Authenticator { get; } + + // IJSONSerializer JSONSerializer { get; } + + // IHTTPClient HTTPClient { get; } + + event EventHandler? ResponseReceived; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(Uri uri); + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(Uri uri, IDictionary? parameters); + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + Task Get(Uri uri, IDictionary? parameters, object? body); + + Task Post(Uri uri); + Task Post(Uri uri, IDictionary? parameters); + Task Post(Uri uri, IDictionary? parameters, object? body); + Task Post(Uri uri, IDictionary? parameters, object? body, Dictionary? headers); + Task Post(Uri uri, IDictionary? parameters, object? body); + + Task Put(Uri uri); + Task Put(Uri uri, IDictionary? parameters); + Task Put(Uri uri, IDictionary? parameters, object? body); + Task Put(Uri uri, IDictionary? parameters, object? body); + Task PutRaw(Uri uri, IDictionary? parameters, object? body); + + Task Delete(Uri uri); + Task Delete(Uri uri, IDictionary? parameters); + Task Delete(Uri uri, IDictionary? parameters, object? body); + Task Delete(Uri uri, IDictionary? parameters, object? body); + + Task SendAPIRequest( + Uri uri, HttpMethod method, + IDictionary? parameters = null, + object? body = null, + IDictionary? headers = null); + + void SetRequestTimeout(TimeSpan timeout); + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIResponse.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIResponse.cs new file mode 100644 index 0000000..aa2513b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IAPIResponse.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web.Http +{ + public interface IAPIResponse + { + T? Body { get; } + + IResponse Response { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IHTTPLogger.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IHTTPLogger.cs new file mode 100644 index 0000000..48525cc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IHTTPLogger.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web.Http +{ + public interface IHTTPLogger + { + void OnRequest(IRequest request); + void OnResponse(IResponse response); + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IHttpClient.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IHttpClient.cs new file mode 100644 index 0000000..78a74ef --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IHttpClient.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Http +{ + public interface IHTTPClient : IDisposable + { + Task DoRequest(IRequest request); + void SetRequestTimeout(TimeSpan timeout); + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IJSONSerializer.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IJSONSerializer.cs new file mode 100644 index 0000000..6561b26 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IJSONSerializer.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Http +{ + public interface IJSONSerializer + { + void SerializeRequest(IRequest request); + IAPIResponse DeserializeResponse(IResponse response); + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IProxyConfig.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IProxyConfig.cs new file mode 100644 index 0000000..7a6f281 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IProxyConfig.cs @@ -0,0 +1,15 @@ +namespace SpotifyAPI.Web +{ + public interface IProxyConfig + { + string Host { get; } + int Port { get; } + string? User { get; } + string? Password { get; } + bool SkipSSLCheck { get; } + /// + /// Whether to bypass the proxy server for local addresses. + /// + bool BypassProxyOnLocal { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IRequest.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IRequest.cs new file mode 100644 index 0000000..c5d9153 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IRequest.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; + +namespace SpotifyAPI.Web.Http +{ + public interface IRequest + { + Uri BaseAddress { get; } + + Uri Endpoint { get; } + + IDictionary Headers { get; } + + IDictionary Parameters { get; } + + HttpMethod Method { get; } + + object? Body { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Interfaces/IResponse.cs b/Source Files/SpotifyAPI.Web/Http/Interfaces/IResponse.cs new file mode 100644 index 0000000..b4ace42 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Interfaces/IResponse.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Net; + +namespace SpotifyAPI.Web.Http +{ + public interface IResponse + { + object? Body { get; } + + IReadOnlyDictionary Headers { get; } + + HttpStatusCode StatusCode { get; } + + string? ContentType { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/NetHttpClient.cs b/Source Files/SpotifyAPI.Web/Http/NetHttpClient.cs new file mode 100644 index 0000000..5a8a72c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/NetHttpClient.cs @@ -0,0 +1,141 @@ +using System.Net; +using System.Text; +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Http +{ + public class NetHttpClient : IHTTPClient + { + private readonly HttpMessageHandler? _httpMessageHandler; + private readonly HttpClient _httpClient; + + public NetHttpClient() + { + _httpClient = new HttpClient(); + } + + public NetHttpClient(HttpClient httpClient) + { + _httpClient = httpClient; + } + + public NetHttpClient(IProxyConfig proxyConfig) + { + Ensure.ArgumentNotNull(proxyConfig, nameof(proxyConfig)); + + _httpMessageHandler = CreateMessageHandler(proxyConfig); + _httpClient = new HttpClient(_httpMessageHandler); + } + + public async Task DoRequest(IRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + using HttpRequestMessage requestMsg = BuildRequestMessage(request); + var responseMsg = await _httpClient + .SendAsync(requestMsg, HttpCompletionOption.ResponseContentRead) + .ConfigureAwait(false); + + return await BuildResponse(responseMsg).ConfigureAwait(false); + } + + private static async Task BuildResponse(HttpResponseMessage responseMsg) + { + Ensure.ArgumentNotNull(responseMsg, nameof(responseMsg)); + + // We only support text stuff for now + using var content = responseMsg.Content; + var headers = responseMsg.Headers.ToDictionary(header => header.Key, header => header.Value.First()); + var body = await responseMsg.Content.ReadAsStringAsync().ConfigureAwait(false); + var contentType = content.Headers?.ContentType?.MediaType; + + return new Response(headers) + { + ContentType = contentType, + StatusCode = responseMsg.StatusCode, + Body = body + }; + } + + private static HttpRequestMessage BuildRequestMessage(IRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + var fullUri = new Uri(request.BaseAddress, request.Endpoint).ApplyParameters(request.Parameters); + var requestMsg = new HttpRequestMessage(request.Method, fullUri); + foreach (var header in request.Headers) + { + requestMsg.Headers.Add(header.Key, header.Value); + } + + switch (request.Body) + { + case HttpContent body: + requestMsg.Content = body; + break; + case string body: + requestMsg.Content = new StringContent(body, Encoding.UTF8, "application/json"); + break; + case Stream body: + requestMsg.Content = new StreamContent(body); + break; + } + + return requestMsg; + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _httpClient?.Dispose(); + _httpMessageHandler?.Dispose(); + } + } + + public void SetRequestTimeout(TimeSpan timeout) + { + _httpClient.Timeout = timeout; + } + + private static HttpMessageHandler CreateMessageHandler(IProxyConfig proxyConfig) + { + var proxy = new WebProxy + { + Address = new UriBuilder(proxyConfig.Host) { Port = proxyConfig.Port }.Uri, + UseDefaultCredentials = true, + BypassProxyOnLocal = proxyConfig.BypassProxyOnLocal + }; + + if (!string.IsNullOrEmpty(proxyConfig.User) || !string.IsNullOrEmpty(proxyConfig.Password)) + { + proxy.UseDefaultCredentials = false; + proxy.Credentials = new NetworkCredential(proxyConfig.User, proxyConfig.Password); + } + + var httpClientHandler = new HttpClientHandler + { + PreAuthenticate = proxy.UseDefaultCredentials, + UseDefaultCredentials = proxy.UseDefaultCredentials, + UseProxy = true, + Proxy = proxy, + }; + if (proxyConfig.SkipSSLCheck) + { + httpClientHandler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; + } + + return httpClientHandler; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/NewtonsoftJSONSerializer.cs b/Source Files/SpotifyAPI.Web/Http/NewtonsoftJSONSerializer.cs new file mode 100644 index 0000000..2db938a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/NewtonsoftJSONSerializer.cs @@ -0,0 +1,68 @@ +using System.Collections.Generic; +using System.Reflection; +using System; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; +using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; + +namespace SpotifyAPI.Web.Http +{ + public class NewtonsoftJSONSerializer : IJSONSerializer + { + private readonly JsonSerializerSettings _serializerSettings; + + public NewtonsoftJSONSerializer() + { + var contractResolver = new PrivateFieldDefaultContractResolver + { + NamingStrategy = new SnakeCaseNamingStrategy() + }; + + _serializerSettings = new JsonSerializerSettings + { + NullValueHandling = NullValueHandling.Ignore, + ContractResolver = contractResolver + }; + } + + public IAPIResponse DeserializeResponse(IResponse response) + { + Ensure.ArgumentNotNull(response, nameof(response)); + + if ( + ( + response.ContentType?.Equals("application/json", StringComparison.Ordinal) is true || response.ContentType == null + )) + { + var body = JsonConvert.DeserializeObject(response.Body as string ?? "", _serializerSettings); + return new APIResponse(response, body!); + } + return new APIResponse(response); + } + + public void SerializeRequest(IRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + if (request.Body is string || request.Body is Stream || request.Body is HttpContent || request.Body is null) + { + return; + } + + request.Body = JsonConvert.SerializeObject(request.Body, _serializerSettings); + } + + private class PrivateFieldDefaultContractResolver : DefaultContractResolver + { + protected override List GetSerializableMembers(Type objectType) + { + // Does not seem to work, still need DefaultMembersSearchFlags |= BindingFlags.NonPublic + var list = base.GetSerializableMembers(objectType); + list.AddRange(objectType.GetProperties(BindingFlags.NonPublic)); + return list; + } + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/ProxyConfig.cs b/Source Files/SpotifyAPI.Web/Http/ProxyConfig.cs new file mode 100644 index 0000000..0392c4d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/ProxyConfig.cs @@ -0,0 +1,20 @@ +namespace SpotifyAPI.Web +{ + public class ProxyConfig : IProxyConfig + { + public ProxyConfig(string host, int port) + { + Ensure.ArgumentNotNullOrEmptyString(host, nameof(host)); + + Host = host; + Port = port; + } + + public string Host { get; } + public int Port { get; } + public string? User { get; set; } + public string? Password { get; set; } + public bool BypassProxyOnLocal { get; set; } + public bool SkipSSLCheck { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Request.cs b/Source Files/SpotifyAPI.Web/Http/Request.cs new file mode 100644 index 0000000..42dd4cc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Request.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Net.Http; + +namespace SpotifyAPI.Web.Http +{ + public class Request : IRequest + { + public Request(Uri baseAddress, Uri endpoint, HttpMethod method) + { + Headers = new Dictionary(); + Parameters = new Dictionary(); + BaseAddress = baseAddress; + Endpoint = endpoint; + Method = method; + } + + public Request(Uri baseAddress, Uri endpoint, HttpMethod method, IDictionary headers) + { + Headers = headers; + Parameters = new Dictionary(); + BaseAddress = baseAddress; + Endpoint = endpoint; + Method = method; + } + + public Request( + Uri baseAddress, + Uri endpoint, + HttpMethod method, + IDictionary headers, + IDictionary parameters) + { + Headers = headers; + Parameters = parameters; + BaseAddress = baseAddress; + Endpoint = endpoint; + Method = method; + } + + public Uri BaseAddress { get; set; } + + public Uri Endpoint { get; set; } + + public IDictionary Headers { get; } + + public IDictionary Parameters { get; } + + public HttpMethod Method { get; set; } + + public object? Body { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/Response.cs b/Source Files/SpotifyAPI.Web/Http/Response.cs new file mode 100644 index 0000000..de16744 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/Response.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Net; + +namespace SpotifyAPI.Web.Http +{ + public class Response : IResponse + { + public Response(IDictionary headers) + { + Ensure.ArgumentNotNull(headers, nameof(headers)); + + Headers = new ReadOnlyDictionary(headers); + } + + public object? Body { get; set; } + + public IReadOnlyDictionary Headers { get; set; } + + public HttpStatusCode StatusCode { get; set; } + + public string? ContentType { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Http/SimpleConsoleHTTPLogger.cs b/Source Files/SpotifyAPI.Web/Http/SimpleConsoleHTTPLogger.cs new file mode 100644 index 0000000..6049e17 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Http/SimpleConsoleHTTPLogger.cs @@ -0,0 +1,40 @@ +using System.Linq; +using System; + +namespace SpotifyAPI.Web.Http +{ + public class SimpleConsoleHTTPLogger : IHTTPLogger + { + private const string OnRequestFormat = "\n{0} {1} [{2}] {3}"; + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303")] + public void OnRequest(IRequest request) + { + Ensure.ArgumentNotNull(request, nameof(request)); + + string? parameters = null; + if (request.Parameters != null) + { + parameters = string.Join(",", + request.Parameters.Select(kv => kv.Key + "=" + kv.Value)?.ToArray() ?? Array.Empty() + ); + } + + Console.WriteLine(OnRequestFormat, request.Method, request.Endpoint, parameters, request.Body); + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Globalization", "CA1303")] + public void OnResponse(IResponse response) + { + Ensure.ArgumentNotNull(response, nameof(response)); +#if NETSTANDARD2_0 + string? body = response.Body?.ToString().Replace("\n", ""); +#else + string? body = response.Body?.ToString()?.Replace("\n", "", StringComparison.InvariantCulture); +#endif + + body = body?.Substring(0, Math.Min(50, body.Length)); + Console.WriteLine("--> {0} {1} {2}\n", response.StatusCode, response.ContentType, body); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/IClient.cs b/Source Files/SpotifyAPI.Web/IClient.cs deleted file mode 100644 index c0960a6..0000000 --- a/Source Files/SpotifyAPI.Web/IClient.cs +++ /dev/null @@ -1,125 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using SpotifyAPI.Web.Models; - -namespace SpotifyAPI.Web -{ - public interface IClient : IDisposable - { - JsonSerializerSettings JsonSettings { get; set; } - - /// - /// Downloads data from an URL and returns it - /// - /// An URL - /// - /// - Tuple Download(string url, Dictionary headers = null); - - /// - /// Downloads data async from an URL and returns it - /// - /// - /// - /// - Task> DownloadAsync(string url, Dictionary headers = null); - - /// - /// Downloads data from an URL and returns it - /// - /// An URL - /// - /// - Tuple DownloadRaw(string url, Dictionary headers = null); - - /// - /// Downloads data async from an URL and returns it - /// - /// - /// - /// - Task> DownloadRawAsync(string url, Dictionary headers = null); - - /// - /// Downloads data from an URL and converts it to an object - /// - /// The Type which the object gets converted to - /// An URL - /// - /// - Tuple DownloadJson(string url, Dictionary headers = null); - - /// - /// Downloads data async from an URL and converts it to an object - /// - /// The Type which the object gets converted to - /// An URL - /// - /// - Task> DownloadJsonAsync(string url, Dictionary headers = null); - - /// - /// Uploads data from an URL and returns the response - /// - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Tuple Upload(string url, string body, string method, Dictionary headers = null); - - /// - /// Uploads data async from an URL and returns the response - /// - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Task> UploadAsync(string url, string body, string method, Dictionary headers = null); - - /// - /// Uploads data from an URL and returns the response - /// - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Tuple UploadRaw(string url, string body, string method, Dictionary headers = null); - - /// - /// Uploads data async from an URL and returns the response - /// - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Task> UploadRawAsync(string url, string body, string method, Dictionary headers = null); - - /// - /// Uploads data from an URL and converts the response to an object - /// - /// The Type which the object gets converted to - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Tuple UploadJson(string url, string body, string method, Dictionary headers = null); - - /// - /// Uploads data async from an URL and converts the response to an object - /// - /// The Type which the object gets converted to - /// An URL - /// The Body-Data (most likely a JSON String) - /// The Upload-method (POST,DELETE,PUT) - /// - /// - Task> UploadJsonAsync(string url, string body, string method, Dictionary headers = null); - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/AnalysisMeta.cs b/Source Files/SpotifyAPI.Web/Models/AnalysisMeta.cs deleted file mode 100644 index bb9b777..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AnalysisMeta.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AnalysisMeta - { - [JsonProperty("analyzer_platform")] - public string AnalyzerVersion { get; set; } - - [JsonProperty("platform")] - public string Platform { get; set; } - - [JsonProperty("status_code")] - public int StatusCode { get; set; } - - [JsonProperty("detailed_status")] - public string DetailedStatus { get; set; } - - [JsonProperty("timestamp")] - public long Timestamp { get; set; } - - [JsonProperty("analysis_time")] - public double AnalysisTime { get; set; } - - [JsonProperty("input_process")] - public string InputProcess { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/AnalysisSection.cs b/Source Files/SpotifyAPI.Web/Models/AnalysisSection.cs deleted file mode 100644 index bcb92bc..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AnalysisSection.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AnalysisSection - { - [JsonProperty("start")] - public double Start { get; set; } - - [JsonProperty("duration")] - public double Duration { get; set; } - - [JsonProperty("confidence")] - public double Confidence { get; set; } - - [JsonProperty("loudness")] - public double Loudness { get; set; } - - [JsonProperty("tempo")] - public double Tempo { get; set; } - - [JsonProperty("tempo_confidence")] - public double TempoConfidence { get; set; } - - [JsonProperty("key")] - public int Key { get; set; } - - [JsonProperty("key_confidence")] - public double KeyConfidence { get; set; } - - [JsonProperty("mode")] - public int Mode { get; set; } - - [JsonProperty("mode_confidence")] - public double ModeConfidence { get; set; } - - [JsonProperty("time_signature")] - public int TimeSignature { get; set; } - - [JsonProperty("time_signature_confidence")] - public double TimeSignatureConfidence { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/AnalysisSegment.cs b/Source Files/SpotifyAPI.Web/Models/AnalysisSegment.cs deleted file mode 100644 index bdf5270..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AnalysisSegment.cs +++ /dev/null @@ -1,35 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class AnalysisSegment - { - [JsonProperty("start")] - public double Start { get; set; } - - [JsonProperty("duration")] - public double Duration { get; set; } - - [JsonProperty("confidence")] - public double Confidence { get; set; } - - [JsonProperty("loudness_start")] - public double LoudnessStart { get; set; } - - [JsonProperty("loudness_max_time")] - public double LoudnessMaxTime { get; set; } - - [JsonProperty("loudness_max")] - public double LoudnessMax { get; set; } - - [JsonProperty("loudness_end")] - public double LoudnessEnd { get; set; } - - [JsonProperty("pitches")] - public List Pitches { get; set; } - - [JsonProperty("timbre")] - public List Timbre { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/AnalysisTimeSlice.cs b/Source Files/SpotifyAPI.Web/Models/AnalysisTimeSlice.cs deleted file mode 100644 index 41ab5f1..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AnalysisTimeSlice.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AnalysisTimeSlice - { - [JsonProperty("start")] - public double Start { get; set; } - - [JsonProperty("duration")] - public double Duration { get; set; } - - [JsonProperty("confidence")] - public double Confidence { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/AnalysisTrack.cs b/Source Files/SpotifyAPI.Web/Models/AnalysisTrack.cs deleted file mode 100644 index e84bc62..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AnalysisTrack.cs +++ /dev/null @@ -1,86 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AnalysisTrack - { - [JsonProperty("num_samples")] - public int NumSamples { get; set; } - - [JsonProperty("duration")] - public double Duration { get; set; } - - [JsonProperty("sample_md5")] - public string SampleMD5 { get; set; } - - [JsonProperty("offset_seconds")] - public double OffsetSeconds { get; set; } - - [JsonProperty("window_seconds")] - public double WindowSeconds { get; set; } - - [JsonProperty("analysis_sample_rate")] - public int AnalysisSampleRate { get; set; } - - [JsonProperty("analysis_channels")] - public int AnalysisChannels { get; set; } - - [JsonProperty("end_of_fade_in")] - public double EndOfFadeIn { get; set; } - - [JsonProperty("start_of_fade_out")] - public double StartOfFadeOut { get; set; } - - [JsonProperty("loudness")] - public double Loudness { get; set; } - - [JsonProperty("tempo")] - public double Tempo { get; set; } - - [JsonProperty("tempo_confidence")] - public double TempoConfidence { get; set; } - - [JsonProperty("time_signature")] - public double TimeSignature { get; set; } - - [JsonProperty("time_signature_confidence")] - public double TimeSignatureConfidence { get; set; } - - [JsonProperty("key")] - public int Key { get; set; } - - [JsonProperty("key_confidence")] - public double KeyConfidence { get; set; } - - [JsonProperty("mode")] - public int Mode { get; set; } - - [JsonProperty("mode_confidence")] - public double ModeConfidence { get; set; } - - [JsonProperty("codestring")] - public string Codestring { get; set; } - - [JsonProperty("code_version")] - public double CodeVersion { get; set; } - - [JsonProperty("echoprintstring")] - public string Echoprintstring { get; set; } - - [JsonProperty("echoprint_version")] - public double EchoprintVersion { get; set; } - - [JsonProperty("synchstring")] - public string Synchstring { get; set; } - - [JsonProperty("synch_version")] - public double SynchVersion { get; set; } - - [JsonProperty("rhythmstring")] - public string Rhythmstring { get; set; } - - [JsonProperty("rhythm_version")] - public double RhythmVersion { get; set; } - - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/ArrayResponse.cs b/Source Files/SpotifyAPI.Web/Models/ArrayResponse.cs deleted file mode 100644 index eea3be6..0000000 --- a/Source Files/SpotifyAPI.Web/Models/ArrayResponse.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class ListResponse : BasicModel - { - public List List { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/AudioAnalysis.cs b/Source Files/SpotifyAPI.Web/Models/AudioAnalysis.cs deleted file mode 100644 index bc8f622..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AudioAnalysis.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class AudioAnalysis : BasicModel - { - [JsonProperty("bars")] - public List Bars { get; set; } - - [JsonProperty("beats")] - public List Beats { get; set; } - - [JsonProperty("meta")] - public AnalysisMeta Meta { get; set; } - - [JsonProperty("sections")] - public List Sections { get; set; } - - [JsonProperty("segments")] - public List Segments { get; set; } - - [JsonProperty("tatums")] - public List Tatums { get; set; } - - [JsonProperty("track")] - public AnalysisTrack Track { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/AudioFeatures.cs b/Source Files/SpotifyAPI.Web/Models/AudioFeatures.cs deleted file mode 100644 index a3b029f..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AudioFeatures.cs +++ /dev/null @@ -1,61 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AudioFeatures : BasicModel - { - [JsonProperty("acousticness")] - public float Acousticness { get; set; } - - [JsonProperty("analysis_url")] - public string AnalysisUrl { get; set; } - - [JsonProperty("danceability")] - public float Danceability { get; set; } - - [JsonProperty("duration_ms")] - public int DurationMs { get; set; } - - [JsonProperty("energy")] - public float Energy { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("instrumentalness")] - public float Instrumentalness { get; set; } - - [JsonProperty("key")] - public int Key { get; set; } - - [JsonProperty("liveness")] - public float Liveness { get; set; } - - [JsonProperty("loudness")] - public float Loudness { get; set; } - - [JsonProperty("mode")] - public int Mode { get; set; } - - [JsonProperty("speechiness")] - public float Speechiness { get; set; } - - [JsonProperty("tempo")] - public float Tempo { get; set; } - - [JsonProperty("time_signature")] - public int TimeSignature { get; set; } - - [JsonProperty("track_href")] - public string TrackHref { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - - [JsonProperty("valence")] - public float Valence { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/AvailabeDevices.cs b/Source Files/SpotifyAPI.Web/Models/AvailabeDevices.cs deleted file mode 100644 index 6275ec0..0000000 --- a/Source Files/SpotifyAPI.Web/Models/AvailabeDevices.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class AvailabeDevices : BasicModel - { - [JsonProperty("devices")] - public List Devices { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/BasicModel.cs b/Source Files/SpotifyAPI.Web/Models/BasicModel.cs deleted file mode 100644 index d888dc2..0000000 --- a/Source Files/SpotifyAPI.Web/Models/BasicModel.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Newtonsoft.Json; -using System.Net; - -namespace SpotifyAPI.Web.Models -{ - public abstract class BasicModel - { - [JsonProperty("error")] - public Error Error { get; set; } - - private ResponseInfo _info; - - public bool HasError() => Error != null; - - internal void AddResponseInfo(ResponseInfo info) => _info = info; - - public string Header(string key) => _info.Headers?.Get(key); - - public WebHeaderCollection Headers() => _info.Headers; - - public HttpStatusCode StatusCode() => _info.StatusCode; - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Category.cs b/Source Files/SpotifyAPI.Web/Models/Category.cs deleted file mode 100644 index 03be7a0..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Category.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class Category : BasicModel - { - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("icons")] - public List Icons { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/CategoryList.cs b/Source Files/SpotifyAPI.Web/Models/CategoryList.cs deleted file mode 100644 index c46d5cb..0000000 --- a/Source Files/SpotifyAPI.Web/Models/CategoryList.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class CategoryList : BasicModel - { - [JsonProperty("categories")] - public Paging Categories { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/CategoryPlaylist.cs b/Source Files/SpotifyAPI.Web/Models/CategoryPlaylist.cs deleted file mode 100644 index 02875d5..0000000 --- a/Source Files/SpotifyAPI.Web/Models/CategoryPlaylist.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class CategoryPlaylist : BasicModel - { - [JsonProperty("playlists")] - public Paging Playlists { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Converters/PlayableItemConverter.cs b/Source Files/SpotifyAPI.Web/Models/Converters/PlayableItemConverter.cs new file mode 100644 index 0000000..bb5d5ef --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Converters/PlayableItemConverter.cs @@ -0,0 +1,51 @@ +using System; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace SpotifyAPI.Web +{ + public class PlayableItemConverter : JsonConverter + { + public override bool CanWrite { get => false; } + + public override bool CanConvert(Type objectType) => true; + + public override object? ReadJson(JsonReader reader, Type objectType, + object? existingValue, JsonSerializer serializer) + { + Ensure.ArgumentNotNull(serializer, nameof(serializer)); + + var token = JToken.ReadFrom(reader); + if (token.Type == JTokenType.Null) + { + return null; + } + + var type = token["type"]?.Value(); + if (type == "track") + { + var obj = new FullTrack(); + serializer.Populate(token.CreateReader(), obj); + return obj; + } + else if (type == "episode") + { + var obj = new FullEpisode(); + serializer.Populate(token.CreateReader(), obj); + return obj; + } + else + { + throw new APIException($@"Received unkown playlist element type: {type}. +If you're requesting a subset of available fields via the fields query paramter, +make sure to include at least the type field. Often it's `items(track(type))` or `item(type)`"); + } + } + + public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) + { + throw new NotSupportedException(); + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/CursorPaging.cs b/Source Files/SpotifyAPI.Web/Models/CursorPaging.cs deleted file mode 100644 index 3496212..0000000 --- a/Source Files/SpotifyAPI.Web/Models/CursorPaging.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class CursorPaging : BasicModel - { - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("items")] - public List Items { get; set; } - - [JsonProperty("limit")] - public int Limit { get; set; } - - [JsonProperty("next")] - public string Next { get; set; } - - [JsonProperty("cursors")] - public Cursor Cursors { get; set; } - - [JsonProperty("total")] - public int Total { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Device.cs b/Source Files/SpotifyAPI.Web/Models/Device.cs deleted file mode 100644 index 3a0d79c..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Device.cs +++ /dev/null @@ -1,25 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class Device - { - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("is_active")] - public bool IsActive { get; set; } - - [JsonProperty("is_restricted")] - public bool IsRestricted { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("volume_percent")] - public int VolumePercent { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/FeaturedPlaylists.cs b/Source Files/SpotifyAPI.Web/Models/FeaturedPlaylists.cs deleted file mode 100644 index ab1dc09..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FeaturedPlaylists.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class FeaturedPlaylists : BasicModel - { - [JsonProperty("message")] - public string Message { get; set; } - - [JsonProperty("playlists")] - public Paging Playlists { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/FollowedArtists.cs b/Source Files/SpotifyAPI.Web/Models/FollowedArtists.cs deleted file mode 100644 index 163ce87..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FollowedArtists.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class FollowedArtists : BasicModel - { - [JsonProperty("artists")] - public CursorPaging Artists { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/FullAlbum.cs b/Source Files/SpotifyAPI.Web/Models/FullAlbum.cs deleted file mode 100644 index b22e4f2..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FullAlbum.cs +++ /dev/null @@ -1,65 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class FullAlbum : BasicModel - { - [JsonProperty("album_type")] - public string AlbumType { get; set; } - - [JsonProperty("artists")] - public List Artists { get; set; } - - [JsonProperty("available_markets")] - public List AvailableMarkets { get; set; } - - [JsonProperty("copyrights")] - public List Copyrights { get; set; } - - [JsonProperty("external_ids")] - public Dictionary ExternalIds { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("genres")] - public List Genres { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("label")] - public string Label { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("popularity")] - public int Popularity { get; set; } - - [JsonProperty("release_date")] - public string ReleaseDate { get; set; } - - [JsonProperty("release_date_precision")] - public string ReleaseDatePrecision { get; set; } - - [JsonProperty("tracks")] - public Paging Tracks { get; set; } - - [JsonProperty("restrictions")] - public Dictionary Restrictions { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} diff --git a/Source Files/SpotifyAPI.Web/Models/FullArtist.cs b/Source Files/SpotifyAPI.Web/Models/FullArtist.cs deleted file mode 100644 index 1b38a74..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FullArtist.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class FullArtist : BasicModel - { - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("followers")] - public Followers Followers { get; set; } - - [JsonProperty("genres")] - public List Genres { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("popularity")] - public int Popularity { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/FullPlaylist.cs b/Source Files/SpotifyAPI.Web/Models/FullPlaylist.cs deleted file mode 100644 index aec32d0..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FullPlaylist.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class FullPlaylist : BasicModel - { - [JsonProperty("collaborative")] - public bool Collaborative { get; set; } - - [JsonProperty("description")] - public string Description { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("followers")] - public Followers Followers { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("owner")] - public PublicProfile Owner { get; set; } - - [JsonProperty("public")] - public bool Public { get; set; } - - [JsonProperty("snapshot_id")] - public string SnapshotId { get; set; } - - [JsonProperty("tracks")] - public Paging Tracks { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/FullTrack.cs b/Source Files/SpotifyAPI.Web/Models/FullTrack.cs deleted file mode 100644 index bab52fe..0000000 --- a/Source Files/SpotifyAPI.Web/Models/FullTrack.cs +++ /dev/null @@ -1,71 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class FullTrack : BasicModel - { - [JsonProperty("album")] - public SimpleAlbum Album { get; set; } - - [JsonProperty("artists")] - public List Artists { get; set; } - - [JsonProperty("available_markets")] - public List AvailableMarkets { get; set; } - - [JsonProperty("disc_number")] - public int DiscNumber { get; set; } - - [JsonProperty("duration_ms")] - public int DurationMs { get; set; } - - [JsonProperty("explicit")] - public bool Explicit { get; set; } - - [JsonProperty("external_ids")] - public Dictionary ExternalIds { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("popularity")] - public int Popularity { get; set; } - - [JsonProperty("preview_url")] - public string PreviewUrl { get; set; } - - [JsonProperty("track_number")] - public int TrackNumber { get; set; } - - [JsonProperty("restrictions")] - public Dictionary Restrictions { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - - /// - /// Only filled when the "market"-parameter was supplied! - /// - [JsonProperty("is_playable")] - public bool? IsPlayable { get; set; } - - /// - /// Only filled when the "market"-parameter was supplied! - /// - [JsonProperty("linked_from")] - public LinkedFrom LinkedFrom { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/GeneralModels.cs b/Source Files/SpotifyAPI.Web/Models/GeneralModels.cs deleted file mode 100644 index 8dffd92..0000000 --- a/Source Files/SpotifyAPI.Web/Models/GeneralModels.cs +++ /dev/null @@ -1,159 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Linq; - -namespace SpotifyAPI.Web.Models -{ - public class Image - { - [JsonProperty("url")] - public string Url { get; set; } - - [JsonProperty("width")] - public int Width { get; set; } - - [JsonProperty("height")] - public int Height { get; set; } - } - - public class ErrorResponse : BasicModel - { - } - - public class Error - { - [JsonProperty("status")] - public int Status { get; set; } - - [JsonProperty("message")] - public string Message { get; set; } - } - - public class PlaylistTrackCollection - { - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("total")] - public int Total { get; set; } - } - - public class Followers - { - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("total")] - public int Total { get; set; } - } - - public class PlaylistTrack - { - [JsonProperty("added_at")] - public DateTime AddedAt { get; set; } - - [JsonProperty("added_by")] - public PublicProfile AddedBy { get; set; } - - [JsonProperty("track")] - public FullTrack Track { get; set; } - - [JsonProperty("is_local")] - public bool IsLocal { get; set; } - } - - public class DeleteTrackUri - { - /// - /// Delete-Track Wrapper - /// - /// An Spotify-URI - /// Optional positions - public DeleteTrackUri(string uri, params int[] positions) - { - Positions = positions.ToList(); - Uri = uri; - } - - [JsonProperty("uri")] - public string Uri { get; set; } - - [JsonProperty("positions")] - public List Positions { get; set; } - - public bool ShouldSerializePositions() - { - return Positions.Count > 0; - } - } - - public class Copyright - { - [JsonProperty("text")] - public string Text { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - } - - public class LinkedFrom - { - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } - - public class SavedTrack - { - [JsonProperty("added_at")] - public DateTime AddedAt { get; set; } - - [JsonProperty("track")] - public FullTrack Track { get; set; } - } - - public class SavedAlbum - { - [JsonProperty("added_at")] - public DateTime AddedAt { get; set; } - - [JsonProperty("album")] - public FullAlbum Album { get; set; } - } - - public class Cursor - { - [JsonProperty("after")] - public string After { get; set; } - - [JsonProperty("before")] - public string Before { get; set; } - } - - public class Context - { - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/IPaginatable.cs b/Source Files/SpotifyAPI.Web/Models/IPaginatable.cs new file mode 100644 index 0000000..682c5ac --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/IPaginatable.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public interface IPaginatable + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + string? Next { get; set; } + + List? Items { get; set; } + } + + public interface IPaginatable + { + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1716")] + string? Next { get; set; } + + List? Items { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/NewAlbumReleases.cs b/Source Files/SpotifyAPI.Web/Models/NewAlbumReleases.cs deleted file mode 100644 index c85139e..0000000 --- a/Source Files/SpotifyAPI.Web/Models/NewAlbumReleases.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class NewAlbumReleases : BasicModel - { - [JsonProperty("albums")] - public Paging Albums { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Paging.cs b/Source Files/SpotifyAPI.Web/Models/Paging.cs deleted file mode 100644 index 03e5305..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Paging.cs +++ /dev/null @@ -1,39 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class Paging : BasicModel - { - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("items")] - public List Items { get; set; } - - [JsonProperty("limit")] - public int Limit { get; set; } - - [JsonProperty("next")] - public string Next { get; set; } - - [JsonProperty("offset")] - public int Offset { get; set; } - - [JsonProperty("previous")] - public string Previous { get; set; } - - [JsonProperty("total")] - public int Total { get; set; } - - public bool HasNextPage() - { - return Next != null; - } - - public bool HasPreviousPage() - { - return Next != null; - } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/PlayHistory.cs b/Source Files/SpotifyAPI.Web/Models/PlayHistory.cs deleted file mode 100644 index ae1c28e..0000000 --- a/Source Files/SpotifyAPI.Web/Models/PlayHistory.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class PlayHistory : BasicModel - { - [JsonProperty("track")] - public SimpleTrack Track { get; set; } - - [JsonProperty("played_at")] - public DateTime PlayedAt { get; set; } - - [JsonProperty("context")] - public Context Context { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/PlaybackContext.cs b/Source Files/SpotifyAPI.Web/Models/PlaybackContext.cs deleted file mode 100644 index 37d6d4a..0000000 --- a/Source Files/SpotifyAPI.Web/Models/PlaybackContext.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Converters; -using SpotifyAPI.Web.Enums; - -namespace SpotifyAPI.Web.Models -{ - public class PlaybackContext : BasicModel - { - [JsonProperty("device")] - public Device Device { get; set; } - - [JsonProperty("repeat_state")] - [JsonConverter(typeof(StringEnumConverter))] - public RepeatState RepeatState { get; set; } - - [JsonProperty("shuffle_state")] - public bool ShuffleState { get; set; } - - [JsonProperty("context")] - public Context Context { get; set; } - - [JsonProperty("timestamp")] - public long Timestamp { get; set; } - - [JsonProperty("progress_ms")] - public int ProgressMs { get; set; } - - [JsonProperty("is_playing")] - public bool IsPlaying { get; set; } - - [JsonProperty("item")] - public FullTrack Item { get; set; } - - [JsonProperty("currently_playing_type")] - [JsonConverter(typeof(StringEnumConverter))] - public TrackType CurrentlyPlayingType { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/PrivateProfile.cs b/Source Files/SpotifyAPI.Web/Models/PrivateProfile.cs deleted file mode 100644 index 243d6b9..0000000 --- a/Source Files/SpotifyAPI.Web/Models/PrivateProfile.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class PrivateProfile : BasicModel - { - [JsonProperty("birthdate")] - public string Birthdate { get; set; } - - [JsonProperty("country")] - public string Country { get; set; } - - [JsonProperty("display_name")] - public string DisplayName { get; set; } - - [JsonProperty("email")] - public string Email { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("followers")] - public Followers Followers { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("product")] - public string Product { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/PublicProfile.cs b/Source Files/SpotifyAPI.Web/Models/PublicProfile.cs deleted file mode 100644 index a28b8ea..0000000 --- a/Source Files/SpotifyAPI.Web/Models/PublicProfile.cs +++ /dev/null @@ -1,32 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class PublicProfile : BasicModel - { - [JsonProperty("display_name")] - public string DisplayName { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("followers")] - public Followers Followers { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/RecommendationSeed .cs b/Source Files/SpotifyAPI.Web/Models/RecommendationSeed .cs deleted file mode 100644 index b0cd94a..0000000 --- a/Source Files/SpotifyAPI.Web/Models/RecommendationSeed .cs +++ /dev/null @@ -1,25 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class RecommendationSeed - { - [JsonProperty("afterFilteringSize")] - public int AfterFilteringSize { get; set; } - - [JsonProperty("afterRelinkingSize")] - public int AfterRelinkingSize { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("initialPoolSize")] - public int InitialPoolSize { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/RecommendationSeedGenres.cs b/Source Files/SpotifyAPI.Web/Models/RecommendationSeedGenres.cs deleted file mode 100644 index 663c8bf..0000000 --- a/Source Files/SpotifyAPI.Web/Models/RecommendationSeedGenres.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class RecommendationSeedGenres : BasicModel - { - [JsonProperty("genres")] - public List Genres { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Recommendations.cs b/Source Files/SpotifyAPI.Web/Models/Recommendations.cs deleted file mode 100644 index 921522e..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Recommendations.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class Recommendations : BasicModel - { - [JsonProperty("seeds")] - public List Seeds { get; set; } - - [JsonProperty("tracks")] - public List Tracks { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Request/AlbumRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/AlbumRequest.cs new file mode 100644 index 0000000..db30953 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/AlbumRequest.cs @@ -0,0 +1,12 @@ +namespace SpotifyAPI.Web +{ + public class AlbumRequest : RequestParams + { + /// + /// The market you’d like to request. Synonym for country. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs new file mode 100644 index 0000000..00a165e --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/AlbumTracksRequest.cs @@ -0,0 +1,29 @@ +namespace SpotifyAPI.Web +{ + public class AlbumTracksRequest : RequestParams + { + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// The maximum number of tracks to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first track to return. Default: 0 (the first object). + /// Use with limit to get the next set of tracks. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs new file mode 100644 index 0000000..e858893 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/AlbumsRequest.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class AlbumsRequest : RequestParams + { + /// + /// AlbumsRequest + /// + /// A comma-separated list of the Spotify IDs for the albums. Maximum: 20 IDs. + public AlbumsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the albums. Maximum: 20 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ArtistsAlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsAlbumsRequest.cs new file mode 100644 index 0000000..b159427 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsAlbumsRequest.cs @@ -0,0 +1,58 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class ArtistsAlbumsRequest : RequestParams + { + /// + /// A comma-separated list of keywords that will be used to filter the response. + /// If not supplied, all album types will be returned. + /// + /// + [QueryParam("include_groups")] + public IncludeGroups? IncludeGroupsParam { get; set; } + + /// + /// Synonym for country. An ISO 3166-1 alpha-2 country code or the string from_token. + /// Supply this parameter to limit the response to one particular geographical market. + /// For example, for albums available in Sweden: market=SE. + /// If not given, results will be returned for all markets and you are likely to get duplicate results per album, + /// one for each market in which the album is available! + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// The number of album objects to return. Default: 20. Minimum: 1. Maximum: 50. For example: limit=2 + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first album to return. Default: 0 (i.e., the first album). Use with limit to get the next set of albums. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + [Flags] + public enum IncludeGroups + { + [String("album")] + Album = 1, + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1720")] + [String("single")] + Single = 2, + + [String("appears_on")] + AppearsOn = 4, + + [String("compilation")] + Compilation = 8, + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ArtistsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsRequest.cs new file mode 100644 index 0000000..a5305e6 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsRequest.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ArtistsRequest : RequestParams + { + /// + /// ArtistsRequest + /// + /// A comma-separated list of the Spotify IDs for the artists. Maximum: 50 IDs. + public ArtistsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the artists. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ArtistsTopTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsTopTracksRequest.cs new file mode 100644 index 0000000..26cecbc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ArtistsTopTracksRequest.cs @@ -0,0 +1,24 @@ +namespace SpotifyAPI.Web +{ + public class ArtistsTopTracksRequest : RequestParams + { + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. Synonym for country. + /// + /// + public ArtistsTopTracksRequest(string market) + { + Ensure.ArgumentNotNullOrEmptyString(market, nameof(market)); + + Market = market; + } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. Synonym for country. + /// + /// + [QueryParam("market")] + public string Market { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeRefreshRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeRefreshRequest.cs new file mode 100644 index 0000000..ce3debb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeRefreshRequest.cs @@ -0,0 +1,44 @@ +namespace SpotifyAPI.Web +{ + /// + /// Used when requesting a refreshed token from spotify oauth services (Authorization Code Auth) + /// + public class AuthorizationCodeRefreshRequest + { + /// + /// + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard) + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard) + /// The refresh token received from an earlier authorization code grant + public AuthorizationCodeRefreshRequest(string clientId, string clientSecret, string refreshToken) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(clientSecret, nameof(clientSecret)); + Ensure.ArgumentNotNullOrEmptyString(refreshToken, nameof(refreshToken)); + + ClientId = clientId; + ClientSecret = clientSecret; + RefreshToken = refreshToken; + } + + /// + /// The refresh token received from an earlier authorization code grant + /// + /// + public string RefreshToken { get; } + + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard) + /// + /// + public string ClientId { get; } + + /// + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard) + /// + /// + public string ClientSecret { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeTokenRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeTokenRequest.cs new file mode 100644 index 0000000..10cf0d3 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/AuthorizationCodeTokenRequest.cs @@ -0,0 +1,54 @@ +using System; +namespace SpotifyAPI.Web +{ + /// + /// Used when requesting a token from spotify oauth services (Authorization Code Auth) + /// + public class AuthorizationCodeTokenRequest + { + /// + /// + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard). + /// The code received from the spotify response. + /// The redirectUri which was used to initiate the authentication. + public AuthorizationCodeTokenRequest(string clientId, string clientSecret, string code, Uri redirectUri) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(clientSecret, nameof(clientSecret)); + Ensure.ArgumentNotNullOrEmptyString(code, nameof(code)); + Ensure.ArgumentNotNull(redirectUri, nameof(redirectUri)); + + ClientId = clientId; + ClientSecret = clientSecret; + Code = code; + RedirectUri = redirectUri; + } + + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// + /// + public string ClientId { get; } + + /// + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard). + /// + /// + public string ClientSecret { get; } + + /// + /// The code received from the spotify response. + /// + /// + public string Code { get; } + + /// + /// The redirectUri which was used to initiate the authentication. + /// + /// + public Uri RedirectUri { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/CategoriesRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/CategoriesRequest.cs new file mode 100644 index 0000000..5b0a5b8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/CategoriesRequest.cs @@ -0,0 +1,42 @@ +namespace SpotifyAPI.Web +{ + public class CategoriesRequest : RequestParams + { + /// + /// A country: an ISO 3166-1 alpha-2 country code. + /// Provide this parameter if you want to narrow the list of returned categories to those relevant to a particular country. + /// If omitted, the returned items will be globally relevant. + /// + /// + [QueryParam("country")] + public string? Country { get; set; } + + /// + /// The desired language, consisting of an ISO 639-1 language code and an ISO 3166-1 alpha-2 country code, + /// joined by an underscore. For example: es_MX, meaning “Spanish (Mexico)”. Provide this parameter if + /// you want the category metadata returned in a particular language. + /// Note that, if locale is not supplied, or if the specified language is not available, all strings will + /// be returned in the Spotify default language (American English). + /// The locale parameter, combined with the country parameter, may give odd results if not carefully matched. + /// For example country=SE&locale=de_DE will return a list of categories relevant to Sweden but as German language strings. + /// + /// + [QueryParam("locale")] + public string? Locale { get; set; } + + /// + /// The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first item to return. Default: 0 (the first object). Use with limit to get the next set of categories. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/CategoryPlaylistsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/CategoryPlaylistsRequest.cs new file mode 100644 index 0000000..84e6b18 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/CategoryPlaylistsRequest.cs @@ -0,0 +1,28 @@ +namespace SpotifyAPI.Web +{ + public class CategoriesPlaylistsRequest : RequestParams + { + /// + /// A country: an ISO 3166-1 alpha-2 country code. + /// Provide this parameter to ensure that the category exists for a particular country. + /// + /// + [QueryParam("country")] + public string? Country { get; set; } + + /// + /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first item to return. Default: 0 (the first object). Use with limit to get the next set of items. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/CategoryRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/CategoryRequest.cs new file mode 100644 index 0000000..9cf14c4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/CategoryRequest.cs @@ -0,0 +1,25 @@ +namespace SpotifyAPI.Web +{ + public class CategoryRequest : RequestParams + { + /// + /// A country: an ISO 3166-1 alpha-2 country code. + /// Provide this parameter to ensure that the category exists for a particular country. + /// + /// + [QueryParam("country")] + public string? Country { get; set; } + + /// + /// The desired language, consisting of an ISO 639-1 language code and an ISO 3166-1 alpha-2 country code, + /// joined by an underscore. For example: es_MX, meaning "Spanish (Mexico)". + /// Provide this parameter if you want the category strings returned in a particular language. + /// Note that, if locale is not supplied, or if the specified language is not available, + /// the category strings returned will be in the Spotify default language (American English). + /// + /// + [QueryParam("locale")] + public string? Locale { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ClientCredentialsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ClientCredentialsRequest.cs new file mode 100644 index 0000000..bb4bedd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ClientCredentialsRequest.cs @@ -0,0 +1,35 @@ +namespace SpotifyAPI.Web +{ + /// + /// Used when requesting a token from spotify oauth services (Client Credentials Auth) + /// + public class ClientCredentialsRequest + { + /// + /// + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard) + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard) + public ClientCredentialsRequest(string clientId, string clientSecret) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(clientSecret, nameof(clientSecret)); + + ClientId = clientId; + ClientSecret = clientSecret; + } + + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard) + /// + /// + public string ClientId { get; } + + /// + /// The Client Secret of your Spotify Application (See Spotify Dev Dashboard) + /// + /// + public string ClientSecret { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/EpisodeRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/EpisodeRequest.cs new file mode 100644 index 0000000..2a45657 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/EpisodeRequest.cs @@ -0,0 +1,18 @@ +namespace SpotifyAPI.Web +{ + public class EpisodeRequest : RequestParams + { + /// + /// An ISO 3166-1 alpha-2 country code. If a country code is specified, + /// only shows and episodes that are available in that market will be returned. + /// If a valid user access token is specified in the request header, the country + /// associated with the user account will take priority over this parameter. + /// Note: If neither market or user country are provided, the content is considered unavailable for the client. + /// Users can view the country that is associated with their account in the account settings. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/EpisodesRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/EpisodesRequest.cs new file mode 100644 index 0000000..01b0c69 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/EpisodesRequest.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class EpisodesRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the episodes. Maximum: 50 IDs. + public EpisodesRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the episodes. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + + /// + /// An ISO 3166-1 alpha-2 country code. If a country code is specified, only shows and episodes + /// that are available in that market will be returned.If a valid user access token is specified + /// in the request header, the country associated with the user account will take priority over + /// this parameter.Note: If neither market or user country are provided, the content is considered + /// unavailable for the client.Users can view the country that is associated with their account + /// in the account settings. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FeaturedPlaylistsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FeaturedPlaylistsRequest.cs new file mode 100644 index 0000000..6aeab6d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FeaturedPlaylistsRequest.cs @@ -0,0 +1,60 @@ +using System.Globalization; +using System; +namespace SpotifyAPI.Web +{ + public class FeaturedPlaylistsRequest : RequestParams + { + /// + /// A country: an ISO 3166-1 alpha-2 country code. + /// Provide this parameter if you want the list of returned items to be relevant to a particular country. + /// If omitted, the returned items will be relevant to all countries. + /// + /// + [QueryParam("country")] + public string? Country { get; set; } + + /// + /// The desired language, consisting of a lowercase ISO 639-1 language code and an uppercase ISO 3166-1 + /// alpha-2 country code, joined by an underscore. For example: es_MX, meaning “Spanish (Mexico)”. Provide + /// this parameter if you want the results returned in a particular language (where available). Note that, + /// if locale is not supplied, or if the specified language is not available, all strings will be returned + /// in the Spotify default language (American English). The locale parameter, combined with the country + /// parameter, may give odd results if not carefully matched. + /// For example country=SE&locale=de_DE will return a list of categories relevant to Sweden but as German language strings. + /// + /// + [QueryParam("locale")] + public string? Locale { get; set; } + + /// + /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first item to return. Default: 0 (the first object). Use with limit to get the next set of items. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// A timestamp in ISO 8601 format: yyyy-MM-ddTHH:mm:ss. Use this parameter to specify the user’s + /// local time to get results tailored for that specific date and time in the day. If not provided, + /// the response defaults to the current UTC time. Example: “2014-10-23T09:00:00” for a user whose local + /// time is 9AM. If there were no featured playlists (or there is no data) at the specified time, + /// the response will revert to the current UTC time. + /// + /// + public DateTime? Timestamp { get; set; } + + [QueryParam("timestamp")] + protected string? TimestampFormatted + { + get => Timestamp?.ToString("o", CultureInfo.InvariantCulture); + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckCurrentUserRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckCurrentUserRequest.cs new file mode 100644 index 0000000..e9515fd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckCurrentUserRequest.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FollowCheckCurrentUserRequest : RequestParams + { + /// + /// + /// + /// The ID type: either artist or user. + /// + /// A list of the artist or the user Spotify IDs to check. + /// For example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + public FollowCheckCurrentUserRequest(Type type, IList ids) + { + Ensure.ArgumentNotNull(type, nameof(type)); + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + TypeParam = type; + Ids = ids; + } + + /// + /// The ID type: either artist or user. + /// + /// + [QueryParam("type")] + public Type TypeParam { get; } + + /// + /// A list of the artist or the user Spotify IDs to check. + /// For example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + + public enum Type + { + [String("artist")] + Artist, + [String("user")] + User + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckPlaylistRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckPlaylistRequest.cs new file mode 100644 index 0000000..24d76db --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FollowCheckPlaylistRequest.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FollowCheckPlaylistRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of Spotify User IDs ; + /// the ids of the users that you want to check to see if they follow the playlist. + /// Maximum: 5 ids. + /// + public FollowCheckPlaylistRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of Spotify User IDs ; + /// the ids of the users that you want to check to see if they follow the playlist. + /// Maximum: 5 ids. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FollowGetCurrentUserRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FollowGetCurrentUserRequest.cs new file mode 100644 index 0000000..f58be57 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FollowGetCurrentUserRequest.cs @@ -0,0 +1,42 @@ +namespace SpotifyAPI.Web +{ + public class FollowOfCurrentUserRequest : RequestParams + { + /// + /// The ID type: currently only artist is supported. + /// + /// + public FollowOfCurrentUserRequest(Type type = Type.Artist) + { + TypeParam = type; + } + + /// + /// The ID type: currently only artist is supported. + /// + /// + [QueryParam("type")] + public Type TypeParam { get; set; } + + /// + /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The last artist ID retrieved from the previous request. + /// + /// + [QueryParam("after")] + public string? After { get; set; } + + public enum Type + { + [String("artist")] + Artist + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FollowPlaylistRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FollowPlaylistRequest.cs new file mode 100644 index 0000000..714a3fc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FollowPlaylistRequest.cs @@ -0,0 +1,15 @@ +namespace SpotifyAPI.Web +{ + public class FollowPlaylistRequest : RequestParams + { + /// + /// Defaults to true. If true the playlist will be included in user’s public playlists, + /// if false it will remain private. To be able to follow playlists privately, + /// the user must have granted the playlist-modify-private scope. + /// + /// + [BodyParam("public")] + public bool? Public { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/FollowRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/FollowRequest.cs new file mode 100644 index 0000000..96b932b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/FollowRequest.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FollowRequest : RequestParams + { + /// + /// + /// + /// The ID type: either artist or user. + /// + /// A comma-separated list of the artist or the user Spotify IDs. + /// For example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + public FollowRequest(Type type, IList ids) + { + Ensure.ArgumentNotNull(type, nameof(type)); + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + TypeParam = type; + Ids = ids; + } + + /// + /// The ID type: either artist or user. + /// + /// + [QueryParam("type")] + public Type? TypeParam { get; set; } + + /// + /// A comma-separated list of the artist or the user Spotify IDs. + /// For example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + /// + [BodyParam("ids")] + public IList Ids { get; } + + public enum Type + { + [String("artist")] + Artist, + [String("user")] + User + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryAlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryAlbumsRequest.cs new file mode 100644 index 0000000..0b867f1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryAlbumsRequest.cs @@ -0,0 +1,29 @@ +namespace SpotifyAPI.Web +{ + public class LibraryAlbumsRequest : RequestParams + { + /// + /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first object to return. Default: 0 (i.e., the first object). + /// Use with limit to get the next set of objects. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. Provide this parameter + /// if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckAlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckAlbumsRequest.cs new file mode 100644 index 0000000..9ab3e54 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckAlbumsRequest.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryCheckAlbumsRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the albums. Maximum: 50 IDs. + /// + public LibraryCheckAlbumsRequest(IList ids) + { + Ensure.ArgumentNotNull(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the albums. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckShowsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckShowsRequest.cs new file mode 100644 index 0000000..dbe830c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckShowsRequest.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryCheckShowsRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the shows. Maximum: 50 ids. + public LibraryCheckShowsRequest(IList ids) + { + Ensure.ArgumentNotNull(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the shows. Maximum: 50 ids. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckTracksRequest.cs new file mode 100644 index 0000000..2be35b4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryCheckTracksRequest.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryCheckTracksRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 50 IDs. + /// + public LibraryCheckTracksRequest(IList ids) + { + Ensure.ArgumentNotNull(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveAlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveAlbumsRequest.cs new file mode 100644 index 0000000..4221cdd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveAlbumsRequest.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryRemoveAlbumsRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + public LibraryRemoveAlbumsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + /// + [BodyParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveShowsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveShowsRequest.cs new file mode 100644 index 0000000..05a462a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveShowsRequest.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryRemoveShowsRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of Spotify IDs for the shows to be deleted from the user’s library. + /// + public LibraryRemoveShowsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of Spotify IDs for the shows to be deleted from the user’s library. + /// + /// + [BodyParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveTracksRequest.cs new file mode 100644 index 0000000..e21d190 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryRemoveTracksRequest.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibraryRemoveTracksRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of the Spotify IDs. For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. + /// Maximum: 50 IDs. + /// + public LibraryRemoveTracksRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs. For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. + /// Maximum: 50 IDs. + /// + /// + [BodyParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveAlbumsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveAlbumsRequest.cs new file mode 100644 index 0000000..c7394b4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveAlbumsRequest.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibrarySaveAlbumsRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + public LibrarySaveAlbumsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveShowsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveShowsRequest.cs new file mode 100644 index 0000000..6dd617b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveShowsRequest.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibrarySaveShowsRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of Spotify IDs for the shows to be added to the user’s library. + public LibrarySaveShowsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of Spotify IDs for the shows to be added to the user’s library. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveTracksRequest.cs new file mode 100644 index 0000000..1991de1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibrarySaveTracksRequest.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class LibrarySaveTracksRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + public LibrarySaveTracksRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs. + /// For example: ids=4iV5W9uYEdYUVa79Axb7Rh,1301WleyT98MSxVHPZCA6M. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryShowsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryShowsRequest.cs new file mode 100644 index 0000000..0105a5b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryShowsRequest.cs @@ -0,0 +1,21 @@ +namespace SpotifyAPI.Web +{ + public class LibraryShowsRequest : RequestParams + { + /// + /// The maximum number of shows to return. Default: 20. Minimum: 1. Maximum: 50 + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first show to return. Default: 0 (the first object). + /// Use with limit to get the next set of shows. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LibraryTracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LibraryTracksRequest.cs new file mode 100644 index 0000000..3256b05 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LibraryTracksRequest.cs @@ -0,0 +1,29 @@ +namespace SpotifyAPI.Web +{ + public class LibraryTracksRequest : RequestParams + { + /// + /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first object to return. + /// Default: 0 (i.e., the first object). Use with limit to get the next set of objects. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/LoginRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/LoginRequest.cs new file mode 100644 index 0000000..40a9fa9 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/LoginRequest.cs @@ -0,0 +1,67 @@ +using System.Globalization; +using System; +using System.Collections.Generic; +using System.Text; +using System.Web; + +namespace SpotifyAPI.Web +{ + public class LoginRequest + { + public LoginRequest(Uri redirectUri, string clientId, ResponseType responseType) + { + Ensure.ArgumentNotNull(redirectUri, nameof(redirectUri)); + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + + RedirectUri = redirectUri; + ClientId = clientId; + ResponseTypeParam = responseType; + } + + public Uri RedirectUri { get; } + public ResponseType ResponseTypeParam { get; } + public string ClientId { get; } + public string? State { get; set; } + public ICollection? Scope { get; set; } + public bool? ShowDialog { get; set; } + public string? CodeChallengeMethod { get; set; } + public string? CodeChallenge { get; set; } + + public Uri ToUri() + { + var builder = new StringBuilder(SpotifyUrls.Authorize.ToString()); + builder.Append($"?client_id={ClientId}"); + builder.Append($"&response_type={ResponseTypeParam.ToString().ToLower(CultureInfo.InvariantCulture)}"); + builder.Append($"&redirect_uri={HttpUtility.UrlEncode(RedirectUri.ToString())}"); + if (!string.IsNullOrEmpty(State)) + { + builder.Append($"&state={HttpUtility.UrlEncode(State)}"); + } + if (Scope != null) + { + builder.Append($"&scope={HttpUtility.UrlEncode(string.Join(" ", Scope))}"); + } + if (ShowDialog != null) + { + builder.Append($"&show_dialog={ShowDialog.Value}"); + } + if (CodeChallenge != null) + { + builder.Append($"&code_challenge={CodeChallenge}"); + } + if (CodeChallengeMethod != null) + { + builder.Append($"&code_challenge_method={CodeChallengeMethod}"); + } + + return new Uri(builder.ToString()); + } + + public enum ResponseType + { + Code, + Token + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/NewReleasesRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/NewReleasesRequest.cs new file mode 100644 index 0000000..0123bbd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/NewReleasesRequest.cs @@ -0,0 +1,30 @@ +namespace SpotifyAPI.Web +{ + public class NewReleasesRequest : RequestParams + { + /// + /// A country: an ISO 3166-1 alpha-2 country code. + /// Provide this parameter if you want the list of returned items to be relevant to a particular country. + /// If omitted, the returned items will be relevant to all countries. + /// + /// + [QueryParam("country")] + public string? Country { get; set; } + + /// + /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first item to return. Default: 0 (the first object). + /// Use with limit to get the next set of items. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRefreshRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRefreshRequest.cs new file mode 100644 index 0000000..5cfe754 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRefreshRequest.cs @@ -0,0 +1,33 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class PKCETokenRefreshRequest + { + /// + /// Request model for refreshing a access token via PKCE Token + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// The received refresh token. Expires after one refresh + public PKCETokenRefreshRequest(string clientId, string refreshToken) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(refreshToken, nameof(refreshToken)); + + ClientId = clientId; + RefreshToken = refreshToken; + } + + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// + /// + public string ClientId { get; } + + /// + /// The received refresh token. + /// + /// + public string RefreshToken { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRequest.cs new file mode 100644 index 0000000..00a0a57 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PKCETokenRequest.cs @@ -0,0 +1,55 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class PKCETokenRequest + { + /// + /// + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// The code received from the spotify response. + /// The redirectUri which was used to initiate the authentication. + /// + /// The value of this parameter must match the value of the code_verifier + /// that your app generated in step 1. + /// + public PKCETokenRequest(string clientId, string code, Uri redirectUri, string codeVerifier) + { + Ensure.ArgumentNotNullOrEmptyString(clientId, nameof(clientId)); + Ensure.ArgumentNotNullOrEmptyString(code, nameof(code)); + Ensure.ArgumentNotNullOrEmptyString(codeVerifier, nameof(codeVerifier)); + Ensure.ArgumentNotNull(redirectUri, nameof(redirectUri)); + + ClientId = clientId; + CodeVerifier = codeVerifier; + Code = code; + RedirectUri = redirectUri; + } + + /// + /// The Client ID of your Spotify Application (See Spotify Dev Dashboard). + /// + /// + public string ClientId { get; } + + /// + /// The value of this parameter must match the value of the code_verifier + /// that your app generated in step 1. + /// + /// + public string CodeVerifier { get; } + + /// + /// The code received from the spotify response. + /// + /// + public string Code { get; } + + /// + /// The redirectUri which was used to initiate the authentication. + /// + /// + public Uri RedirectUri { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs new file mode 100644 index 0000000..d4e1f26 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PersonalizationTopRequest.cs @@ -0,0 +1,41 @@ +namespace SpotifyAPI.Web +{ + public class PersonalizationTopRequest : RequestParams + { + /// + /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50. For example: limit=2 + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// Over what time frame the affinities are computed. Valid values: long_term + /// (calculated from several years of data and including all new data as it becomes available), + /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). Default: medium_term + /// + /// + [QueryParam("time_range")] + public TimeRange? TimeRangeParam { get; set; } + + public enum TimeRange + { + [String("long_term")] + LongTerm, + + [String("medium_term")] + MediumTerm, + + [String("short_term")] + ShortTerm + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerAddToQueueRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerAddToQueueRequest.cs new file mode 100644 index 0000000..c75d074 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerAddToQueueRequest.cs @@ -0,0 +1,32 @@ +namespace SpotifyAPI.Web +{ + public class PlayerAddToQueueRequest : RequestParams + { + /// + /// + /// + /// The uri of the item to add to the queue. Must be a track or an episode uri. + public PlayerAddToQueueRequest(string uri) + { + Ensure.ArgumentNotNullOrEmptyString(uri, nameof(uri)); + + Uri = uri; + } + + /// + /// The uri of the item to add to the queue. Must be a track or an episode uri. + /// + /// + [QueryParam("uri")] + public string Uri { get; } + + /// + /// The id of the device this command is targeting. + /// If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentPlaybackRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentPlaybackRequest.cs new file mode 100644 index 0000000..c593627 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentPlaybackRequest.cs @@ -0,0 +1,46 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class PlayerCurrentPlaybackRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of item types that your client supports besides the default track type. + /// Valid types are: track and episode. An unsupported type in the response is expected to be represented + /// as null value in the item field. Note: This parameter was introduced to allow existing clients to + /// maintain their current behaviour and might be deprecated in the future. In addition to providing + /// this parameter, make sure that your client properly handles cases of new types in the future by + /// checking against the currently_playing_type field. + /// + public PlayerCurrentPlaybackRequest(AdditionalTypes types = AdditionalTypes.All) + { + Ensure.ArgumentNotNull(types, nameof(types)); + + AdditionalTypesParam = types; + } + + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// This is set to `"track", "episode"` by default. + /// + /// + [QueryParam("additional_types")] + public AdditionalTypes AdditionalTypesParam { get; } + + [Flags] + public enum AdditionalTypes + { + [String("track")] + Track = 1, + [String("episode")] + Episode = 2, + All = Track | Episode + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentlyPlayingRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentlyPlayingRequest.cs new file mode 100644 index 0000000..022d3fa --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerCurrentlyPlayingRequest.cs @@ -0,0 +1,55 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class PlayerCurrentlyPlayingRequest : RequestParams + { + + /// + /// A comma-separated list of item types that your client supports besides the default track type. + /// Valid types are: track and episode. An unsupported type in the response is expected to be represented + /// as null value in the item field. Note: This parameter was introduced to allow existing clients to + /// maintain their current behaviour and might be deprecated in the future. In addition to providing + /// this parameter, make sure that your client properly handles cases of new types in the future by + /// checking against the currently_playing_type field. Defaults to AdditionalTypes.All + /// + /// + public PlayerCurrentlyPlayingRequest(AdditionalTypes types = AdditionalTypes.All) + { + Ensure.ArgumentNotNull(types, nameof(types)); + + AdditionalTypesParam = types; + } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// A comma-separated list of item types that your client supports besides the default track type. + /// Valid types are: track and episode. An unsupported type in the response is expected to be represented + /// as null value in the item field. Note: This parameter was introduced to allow existing clients to + /// maintain their current behaviour and might be deprecated in the future. In addition to providing + /// this parameter, make sure that your client properly handles cases of new types in the future by + /// checking against the currently_playing_type field. Defaults to AdditionalTypes.All + /// + /// + [QueryParam("additional_types")] + public AdditionalTypes AdditionalTypesParam { get; } + + [Flags] + public enum AdditionalTypes + { + [String("track")] + Track = 1, + [String("episode")] + Episode = 2, + All = Track | Episode + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerPausePlaybackRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerPausePlaybackRequest.cs new file mode 100644 index 0000000..1af4e44 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerPausePlaybackRequest.cs @@ -0,0 +1,13 @@ +namespace SpotifyAPI.Web +{ + public class PlayerPausePlaybackRequest : RequestParams + { + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerRecentlyPlayedRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerRecentlyPlayedRequest.cs new file mode 100644 index 0000000..8fc5586 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerRecentlyPlayedRequest.cs @@ -0,0 +1,29 @@ +namespace SpotifyAPI.Web +{ + public class PlayerRecentlyPlayedRequest : RequestParams + { + /// + /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// A Unix timestamp in milliseconds. Returns all items after (but not including) this cursor position. + /// If after is specified, before must not be specified. + /// + /// + [QueryParam("after")] + public long? After { get; set; } + + /// + /// A Unix timestamp in milliseconds. Returns all items before (but not including) this cursor position. + /// If before is specified, after must not be specified. + /// + /// + [QueryParam("before")] + public long? Before { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerResumePlaybackRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerResumePlaybackRequest.cs new file mode 100644 index 0000000..ea617ad --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerResumePlaybackRequest.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class PlayerResumePlaybackRequest : RequestParams + { + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [BodyParam("context_uri")] + public string? ContextUri { get; set; } + + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227")] + [BodyParam("uris")] + public IList? Uris { get; set; } + + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [BodyParam("offset")] + public Offset? OffsetParam { get; set; } + + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [BodyParam("position_ms")] + public int? PositionMs { get; set; } + + public class Offset + { + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [JsonProperty("uri", NullValueHandling = NullValueHandling.Ignore)] + public string? Uri { get; set; } + + /// + /// Undocumented by Spotify Beta Docs + /// + /// + [JsonProperty("position", NullValueHandling = NullValueHandling.Ignore)] + public int? Position { get; set; } + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerSeekToRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSeekToRequest.cs new file mode 100644 index 0000000..1951c12 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSeekToRequest.cs @@ -0,0 +1,35 @@ +namespace SpotifyAPI.Web +{ + public class PlayerSeekToRequest : RequestParams + { + /// + /// + /// + /// + /// The position in milliseconds to seek to. Must be a positive number. + /// Passing in a position that is greater than the length of the track will + /// cause the player to start playing the next song. + /// + public PlayerSeekToRequest(long positionMs) + { + PositonMs = positionMs; + } + + /// + /// The position in milliseconds to seek to. Must be a positive number. + /// Passing in a position that is greater than the length of the track will cause + /// the player to start playing the next song. + /// + /// + [QueryParam("position_ms")] + public long PositonMs { get; } + + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerSetRepeatRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSetRepeatRequest.cs new file mode 100644 index 0000000..7ab2834 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSetRepeatRequest.cs @@ -0,0 +1,45 @@ +namespace SpotifyAPI.Web +{ + public class PlayerSetRepeatRequest : RequestParams + { + /// + /// + /// track, context or off. track will repeat the current track. context will repeat the current context. + /// off will turn repeat off. + /// + public PlayerSetRepeatRequest(State state) + { + Ensure.ArgumentNotNull(state, nameof(state)); + + StateParam = state; + } + + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + + /// + /// track, context or off. track will repeat the current track. context will repeat the current context. + /// off will turn repeat off. + /// + /// + [QueryParam("state")] + public State StateParam { get; } + + public enum State + { + [String("track")] + Track, + + [String("context")] + Context, + + [String("off")] + Off + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerShuffleRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerShuffleRequest.cs new file mode 100644 index 0000000..4c333f8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerShuffleRequest.cs @@ -0,0 +1,30 @@ +namespace SpotifyAPI.Web +{ + public class PlayerShuffleRequest : RequestParams + { + /// + /// + /// + /// true : Shuffle user’s playback false : Do not shuffle user’s playback. + public PlayerShuffleRequest(bool state) + { + State = state; + } + + /// + /// true : Shuffle user’s playback false : Do not shuffle user’s playback. + /// + /// + [QueryParam("state")] + public bool State { get; } + + /// + /// The id of the device this command is targeting. If not supplied, + /// the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipNextRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipNextRequest.cs new file mode 100644 index 0000000..5a33fcd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipNextRequest.cs @@ -0,0 +1,13 @@ +namespace SpotifyAPI.Web +{ + public class PlayerSkipNextRequest : RequestParams + { + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipPreviousRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipPreviousRequest.cs new file mode 100644 index 0000000..6e6cacb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerSkipPreviousRequest.cs @@ -0,0 +1,14 @@ +namespace SpotifyAPI.Web +{ + public class PlayerSkipPreviousRequest : RequestParams + { + /// + /// The id of the device this command is targeting. + /// If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerTransferPlaybackRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerTransferPlaybackRequest.cs new file mode 100644 index 0000000..d0ba154 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerTransferPlaybackRequest.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class PlayerTransferPlaybackRequest : RequestParams + { + /// + /// + /// + /// + /// A JSON array containing the ID of the device on which playback should be started/transferred. + /// For example:{device_ids:["74ASZWbe4lXaubB36ztrGX"]} + /// Note: Although an array is accepted, only a single device_id is currently supported. + /// Supplying more than one will return 400 Bad Request + /// + public PlayerTransferPlaybackRequest(IList deviceIds) + { + Ensure.ArgumentNotNullOrEmptyList(deviceIds, nameof(deviceIds)); + + DeviceIds = deviceIds; + } + + /// + /// A JSON array containing the ID of the device on which playback should be started/transferred. + /// For example:{device_ids:["74ASZWbe4lXaubB36ztrGX"]} + /// Note: Although an array is accepted, only a single device_id is currently supported. + /// Supplying more than one will return 400 Bad Request + /// + /// + [BodyParam("device_ids")] + public IList DeviceIds { get; } + + /// + /// true: ensure playback happens on new device. false or not provided: keep the current playback state. + /// + /// + [BodyParam("play")] + public bool? Play { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlayerVolumeRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlayerVolumeRequest.cs new file mode 100644 index 0000000..bbd5a1c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlayerVolumeRequest.cs @@ -0,0 +1,29 @@ +namespace SpotifyAPI.Web +{ + public class PlayerVolumeRequest : RequestParams + { + /// + /// + /// + /// The volume to set. Must be a value from 0 to 100 inclusive. + public PlayerVolumeRequest(int volumePercent) + { + VolumePercent = volumePercent; + } + + /// + /// The volume to set. Must be a value from 0 to 100 inclusive. + /// + /// + [QueryParam("volume_percent")] + public int VolumePercent { get; } + + /// + /// The id of the device this command is targeting. If not supplied, the user’s currently active device is the target. + /// + /// + [QueryParam("device_id")] + public string? DeviceId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistAddItemsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistAddItemsRequest.cs new file mode 100644 index 0000000..ba6bca7 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistAddItemsRequest.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class PlaylistAddItemsRequest : RequestParams + { + /// + /// + /// + /// + /// A JSON array of the Spotify URIs to add. + /// For example: {"uris": ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh", + /// "spotify:track:1301WleyT98MSxVHPZCA6M", "spotify:episode:512ojhOuo1ktJprKbVcKyQ"]} + /// A maximum of 100 items can be added in one request. + /// + public PlaylistAddItemsRequest(IList uris) + { + Ensure.ArgumentNotNull(uris, nameof(uris)); + + Uris = uris; + } + + /// + /// A JSON array of the Spotify URIs to add. + /// For example: {"uris": ["spotify:track:4iV5W9uYEdYUVa79Axb7Rh", + /// "spotify:track:1301WleyT98MSxVHPZCA6M", "spotify:episode:512ojhOuo1ktJprKbVcKyQ"]} + /// A maximum of 100 items can be added in one request. + /// + /// + [BodyParam("uris")] + public IList Uris { get; } + + /// + /// The position to insert the items, a zero-based index. + /// For example, to insert the items in the first position: position=0 ; + /// to insert the items in the third position: position=2. If omitted, the items will be appended to the playlist. + /// Items are added in the order they appear in the uris array. + /// + /// + [BodyParam("position")] + public int? Position { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistChangeDetailsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistChangeDetailsRequest.cs new file mode 100644 index 0000000..f4acc01 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistChangeDetailsRequest.cs @@ -0,0 +1,35 @@ +namespace SpotifyAPI.Web +{ + public class PlaylistChangeDetailsRequest : RequestParams + { + /// + /// The new name for the playlist, for example "My New Playlist Title" + /// + /// + [BodyParam("name")] + public string? Name { get; set; } + + /// + /// If true the playlist will be public, if false it will be private. + /// + /// + [BodyParam("public")] + public bool? Public { get; set; } + + /// + /// If true , the playlist will become collaborative and other users will be able to modify the + /// playlist in their Spotify client. Note: You can only set collaborative to true on non-public playlists. + /// + /// + [BodyParam("collaborative")] + public bool? Collaborative { get; set; } + + /// + /// Value for playlist description as displayed in Spotify Clients and in the Web API. + /// + /// + [BodyParam("description")] + public string? Description { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCreateRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCreateRequest.cs new file mode 100644 index 0000000..c4f879f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCreateRequest.cs @@ -0,0 +1,52 @@ +namespace SpotifyAPI.Web +{ + public class PlaylistCreateRequest : RequestParams + { + /// + /// + /// + /// The name for the new playlist, for example "Your Coolest Playlist" . + /// This name does not need to be unique; a user may have several playlists with the same name. + /// + public PlaylistCreateRequest(string name) + { + Ensure.ArgumentNotNullOrEmptyString(name, nameof(name)); + + Name = name; + } + + /// + /// The name for the new playlist, for example "Your Coolest Playlist" . + /// This name does not need to be unique; a user may have several playlists with the same name. + /// + /// + [BodyParam("name")] + public string Name { get; } + + /// + /// Defaults to true . If true the playlist will be public, if false it will be private. + /// To be able to create private playlists, the user must have granted the playlist-modify-private scope + /// + /// + [BodyParam("public")] + public bool? Public { get; set; } + + /// + /// Defaults to false . If true the playlist will be collaborative. + /// Note that to create a collaborative playlist you must also set public to false . + /// To create collaborative playlists you must have + /// granted playlist-modify-private and playlist-modify-public scopes . + /// + /// + [BodyParam("collaborative")] + public bool? Collaborative { get; set; } + + /// + /// value for playlist description as displayed in Spotify Clients and in the Web API. + /// + /// + [BodyParam("description")] + public string? Description { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCurrentUsersRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCurrentUsersRequest.cs new file mode 100644 index 0000000..da41e5c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistCurrentUsersRequest.cs @@ -0,0 +1,21 @@ +namespace SpotifyAPI.Web +{ + public class PlaylistCurrentUsersRequest : RequestParams + { + /// + /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first playlist to return. + /// Default: 0 (the first object). Maximum offset: 100.000. Use with limit to get the next set of playlists. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetItemsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetItemsRequest.cs new file mode 100644 index 0000000..a175e03 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetItemsRequest.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class PlaylistGetItemsRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of item types that your client supports + /// besides the default track type. Valid types are: track and episode. + /// Note: This parameter was introduced to allow existing clients to maintain + /// their current behaviour and might be deprecated in the future. In addition to + /// providing this parameter, make sure that your client properly handles cases of new types in the + /// future by checking against the type field of each object. Defaults to ALL + /// + public PlaylistGetItemsRequest(AdditionalTypes types = AdditionalTypes.All) + { + Ensure.ArgumentNotNull(types, nameof(types)); + + AdditionalTypesParam = types; + Fields = new List(); + } + + /// + /// Filters for the query: a comma-separated list of the fields to return. + /// If omitted, all fields are returned. For example, to get just the total number of items and the request limit: + /// fields=total,limit + /// A dot separator can be used to specify non-reoccurring fields, while parentheses can be used to specify + /// reoccurring fields within objects. For example, to get just the added date and user ID of the adder: + /// fields=items(added_at,added_by.id) + /// Use multiple parentheses to drill down into nested objects, for example: + /// fields=items(track(name,href,album(name,href))) + /// Fields can be excluded by prefixing them with an exclamation mark, for example: + /// fields=items.track.album(!external_urls,images) + /// + /// + [QueryParam("fields")] + public IList Fields { get; } + + /// + /// The maximum number of items to return. Default: 100. Minimum: 1. Maximum: 100. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first item to return. Default: 0 (the first object). + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. For episodes, if a valid user access token is + /// specified in the request header, the country associated with the user account will take priority over this + /// parameter. Note: If neither market or user country are provided, + /// the episode is considered unavailable for the client. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// This is set to `"track", "episode"` by default. + /// + /// + [QueryParam("additional_types")] + public AdditionalTypes AdditionalTypesParam { get; } + + [Flags] + public enum AdditionalTypes + { + [String("track")] + Track = 1, + [String("episode")] + Episode = 2, + All = Track | Episode + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetRequest.cs new file mode 100644 index 0000000..558ed9d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetRequest.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class PlaylistGetRequest : RequestParams + { + public PlaylistGetRequest(AdditionalTypes types = AdditionalTypes.All) + { + Ensure.ArgumentNotNull(types, nameof(types)); + + AdditionalTypesParam = types; + Fields = new List(); + } + + /// + /// Filters for the query: a comma-separated list of the fields to return. + /// If omitted, all fields are returned. For example, to get just the playlist’s description and URI: fields=description,uri. + /// A dot separator can be used to specify non-reoccurring fields, + /// while parentheses can be used to specify reoccurring fields within objects. + /// For example, to get just the added date and user ID of the adder: + /// fields=tracks.items(added_at,added_by.id). Use multiple parentheses to drill down into nested objects, for example: + /// fields=tracks.items(track(name,href,album(name,href))). + /// Fields can be excluded by prefixing them with an exclamation mark, for example: + /// fields=tracks.items(track(name,href,album(!name,href))) + /// + /// + [QueryParam("fields")] + public IList Fields { get; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// For episodes, if a valid user access token is specified in the request header, + /// the country associated with the user account will take priority over this parameter. + /// Note: If neither market or user country are provided, the episode is considered unavailable for the client. + /// + /// + [QueryParam("market")] + public string? Market { get; } + + /// + /// This is set to `"track", "episode"` by default. + /// + /// + [QueryParam("additional_types")] + public AdditionalTypes AdditionalTypesParam { get; } + + [Flags] + public enum AdditionalTypes + { + [String("track")] + Track = 1, + [String("episode")] + Episode = 2, + All = Track | Episode + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetUsersRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetUsersRequest.cs new file mode 100644 index 0000000..e553d53 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistGetUsersRequest.cs @@ -0,0 +1,21 @@ +namespace SpotifyAPI.Web +{ + public class PlaylistGetUsersRequest : RequestParams + { + /// + /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first playlist to return. Default: 0 (the first object). + /// Maximum offset: 100.000. Use with limit to get the next set of playlists. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistRemoveItemsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistRemoveItemsRequest.cs new file mode 100644 index 0000000..595f280 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistRemoveItemsRequest.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class PlaylistRemoveItemsRequest : RequestParams + { + /// + /// An array of objects containing Spotify URIs of the tracks or episodes to remove. + /// For example: { "tracks": [{ "uri": "spotify:track:4iV5W9uYEdYUVa79Axb7Rh" }, + /// { "uri": "spotify:track:1301WleyT98MSxVHPZCA6M" }] }. + /// A maximum of 100 objects can be sent at once. + /// + /// + [BodyParam("tracks")] + public IList? Tracks { get; set; } + + /// + /// An array of positions to delete. This also supports local tracks. + /// SnapshotId MUST be supplied when using this parameter + /// + /// + [BodyParam("positions")] + public IList? Positions { get; set; } + + /// + /// The playlist’s snapshot ID against which you want to make the changes. + /// The API will validate that the specified items exist and in the specified positions and make the changes, + /// even if more recent changes have been made to the playlist. + /// + /// + [BodyParam("snapshot_id")] + public string? SnapshotId { get; set; } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034")] + public class Item + { + [JsonProperty("uri", NullValueHandling = NullValueHandling.Ignore)] + public string? Uri { get; set; } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227")] + [JsonProperty("positions", NullValueHandling = NullValueHandling.Ignore)] + public List? Positions { get; set; } + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReorderItemsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReorderItemsRequest.cs new file mode 100644 index 0000000..c0c5ebc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReorderItemsRequest.cs @@ -0,0 +1,63 @@ +namespace SpotifyAPI.Web +{ + public class PlaylistReorderItemsRequest : RequestParams + { + /// + /// + /// + /// + /// The position of the first item to be reordered. + /// + /// + /// The position where the items should be inserted. + /// To reorder the items to the end of the playlist, + /// simply set insert_before to the position after the last item. + /// Examples: To reorder the first item to the last position in a playlist with 10 items, + /// set range_start to 0, and insert_before to 10. To reorder the last item in a playlist + /// with 10 items to the start of the playlist, set range_start to 9, and insert_before to 0. + /// + public PlaylistReorderItemsRequest(int rangeStart, int insertBefore) + { + RangeStart = rangeStart; + InsertBefore = insertBefore; + } + + /// + /// The position of the first item to be reordered. + /// + /// + [BodyParam("range_start")] + public int RangeStart { get; set; } + + /// + /// The position where the items should be inserted. + /// To reorder the items to the end of the playlist, + /// simply set insert_before to the position after the last item. + /// Examples: To reorder the first item to the last position in a playlist with 10 items, + /// set range_start to 0, and insert_before to 10. To reorder the last item in a playlist + /// with 10 items to the start of the playlist, set range_start to 9, and insert_before to 0. + /// + /// + [BodyParam("insert_before")] + public int InsertBefore { get; set; } + + /// + /// The amount of items to be reordered. Defaults to 1 if not set. + /// The range of items to be reordered begins from the range_start position, and + /// includes the range_length subsequent items. + /// Example: To move the items at index 9-10 to the start of the playlist, + /// range_start is set to 9, and range_length is set to 2. + /// + /// + [BodyParam("range_length")] + public int? RangeLength { get; set; } + + /// + /// The playlist’s snapshot ID against which you want to make the changes. + /// + /// + [BodyParam("snapshot_id")] + public string? SnapshotId { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReplaceItemsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReplaceItemsRequest.cs new file mode 100644 index 0000000..45458b9 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/PlaylistReplaceItemsRequest.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class PlaylistReplaceItemsRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of Spotify URIs to set, can be track or episode URIs. + /// A maximum of 100 items can be set in one request. + /// + public PlaylistReplaceItemsRequest(List uris) + { + Ensure.ArgumentNotNull(uris, nameof(uris)); + + Uris = uris; + } + + /// + /// A comma-separated list of Spotify URIs to set, can be track or episode URIs. + /// A maximum of 100 items can be set in one request. + /// + /// + [BodyParam("uris")] + public IList Uris { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/RecommendationsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/RecommendationsRequest.cs new file mode 100644 index 0000000..c463e2f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/RecommendationsRequest.cs @@ -0,0 +1,118 @@ +using System; +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class RecommendationsRequest : RequestParams + { + public RecommendationsRequest() + { + Min = new Dictionary(); + Max = new Dictionary(); + Target = new Dictionary(); + SeedArtists = new List(); + SeedGenres = new List(); + SeedTracks = new List(); + } + + /// + /// A comma separated list of Spotify IDs for seed artists. + /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. + /// + /// + [QueryParam("seed_artists")] + public IList SeedArtists { get; } + + /// + /// A comma separated list of any genres in the set of available genre seeds. + /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. + /// + /// + [QueryParam("seed_genres")] + public IList SeedGenres { get; } + + /// + /// A comma separated list of Spotify IDs for a seed track. + /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. + /// + /// + [QueryParam("seed_tracks")] + public IList SeedTracks { get; } + + /// + /// The target size of the list of recommended tracks. + /// For seeds with unusually small pools or when highly restrictive filtering is applied, + /// it may be impossible to generate the requested number of recommended tracks. + /// Debugging information for such cases is available in the response. Default: 20. Minimum: 1. Maximum: 100. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// Because min_*, max_* and target_* are applied to pools before relinking, the generated results + /// may not precisely match the filters applied. Original, + /// non-relinked tracks are available via the linked_from attribute of the relinked track response. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// Multiple values. For each tunable track attribute, a hard floor on the selected track attribute’s value can be provided. + /// See tunable track attributes below for the list of available options. + /// For example, min_tempo=140 would restrict results to only those tracks with a tempo of greater than 140 beats per minute. + /// DO NOT INCLUDE min_ IN THE KEY + /// + /// + public Dictionary Min { get; } + + /// + /// Multiple values. For each tunable track attribute, a hard ceiling on the selected track attribute’s value can be provided. + /// See tunable track attributes below for the list of available options. + /// For example, max_instrumentalness=0.35 would filter out most tracks that are likely to be instrumental. + /// DO NOT INCLUDE max_ IN THE KEY + /// + /// + public Dictionary Max { get; } + + /// + /// Multiple values. For each of the tunable track attributes (below) a target value may be provided. + /// Tracks with the attribute values nearest to the target values will be preferred. + /// For example, you might request target_energy=0.6 and target_danceability=0.8. + /// All target values will be weighed equally in ranking results. + /// DO NOT INCLUDE target_ IN THE KEY + /// + /// + public Dictionary Target { get; } + + protected override void CustomEnsure() + { + if (SeedArtists.Count == 0 && SeedGenres.Count == 0 && SeedTracks.Count == 0) + { + throw new ArgumentException("At least one of the seeds has to be non-empty"); + } + } + + protected override void AddCustomQueryParams(Dictionary queryParams) + { + Ensure.ArgumentNotNull(queryParams, nameof(queryParams)); + + foreach (KeyValuePair pair in Min) + { + queryParams.Add($"min_{pair.Key}", pair.Value); + } + foreach (KeyValuePair pair in Max) + { + queryParams.Add($"max_{pair.Key}", pair.Value); + } + foreach (KeyValuePair pair in Target) + { + queryParams.Add($"target_{pair.Key}", pair.Value); + } + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/RequestParams.cs b/Source Files/SpotifyAPI.Web/Models/Request/RequestParams.cs new file mode 100644 index 0000000..564ffdd --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/RequestParams.cs @@ -0,0 +1,182 @@ +using System.Collections.Concurrent; +using System.Reflection; +using System; +using System.Linq; +using System.Collections.Generic; +using System.Collections; +using Newtonsoft.Json.Linq; + +namespace SpotifyAPI.Web +{ + public abstract class RequestParams + { + private static readonly ConcurrentDictionary> _bodyParamsCache = + new(); + + public JObject BuildBodyParams() + { + // Make sure everything is okay before building body params + CustomEnsure(); + + var body = new JObject(); + var type = GetType(); + + if (!_bodyParamsCache.IsEmpty && _bodyParamsCache.ContainsKey(type)) + { + foreach (var (info, attribute) in _bodyParamsCache[type]) + { + AddBodyParam(body, info, attribute); + } + } + else + { + var bodyProps = GetType() + .GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) + .Where(prop => prop.GetCustomAttributes(typeof(BodyParamAttribute), true).Length > 0); + + var cachedParams = new List<(PropertyInfo, BodyParamAttribute)>(); + foreach (var prop in bodyProps) + { + var attribute = prop.GetCustomAttribute(); + if (attribute != null) + { + cachedParams.Add((prop, attribute)); + AddBodyParam(body, prop, attribute); + } + } + _bodyParamsCache[type] = cachedParams; + } + + return body; + } + + private void AddBodyParam(JObject body, PropertyInfo prop, BodyParamAttribute attribute) + { + object? value = prop.GetValue(this); + if (value != null) + { + body[attribute.Key ?? prop.Name] = JToken.FromObject(value); + } + } + + private static readonly ConcurrentDictionary> _queryParamsCache = + new(); + + public Dictionary BuildQueryParams() + { + // Make sure everything is okay before building query params + CustomEnsure(); + + var queryParams = new Dictionary(); + var type = GetType(); + + if (!_queryParamsCache.IsEmpty && _queryParamsCache.ContainsKey(type)) + { + foreach (var (info, attribute) in _queryParamsCache[type]) + { + AddQueryParam(queryParams, info, attribute); + } + } + else + { + var queryProps = GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public) + .Where(prop => prop.GetCustomAttributes(typeof(QueryParamAttribute), true).Length > 0); + + var cachedParams = new List<(PropertyInfo, QueryParamAttribute)>(); + foreach (var prop in queryProps) + { + var attribute = prop.GetCustomAttribute(); + if (attribute != null) + { + cachedParams.Add((prop, attribute)); + AddQueryParam(queryParams, prop, attribute); + } + } + _queryParamsCache[type] = cachedParams; + } + + AddCustomQueryParams(queryParams); + + return queryParams; + } + + private void AddQueryParam(Dictionary queryParams, PropertyInfo prop, QueryParamAttribute attribute) + { + object? value = prop.GetValue(this); + if (value != null) + { + if (value is IList list) + { + if (list.Count > 0) + { + var str = string.Join(",", list); + queryParams.Add(attribute.Key ?? prop.Name, str); + } + } + else if (value is bool valueAsBool) + { + queryParams.Add(attribute.Key ?? prop.Name, valueAsBool ? "true" : "false"); + } + else if (value is Enum valueAsEnum) + { + var enumType = valueAsEnum.GetType(); + var valueList = new List(); + + if (enumType.IsDefined(typeof(FlagsAttribute), false)) + { + foreach (Enum enumVal in Enum.GetValues(valueAsEnum.GetType())) + { + if (valueAsEnum.HasFlag(enumVal)) + { + if (StringAttribute.GetValue(enumType, enumVal, out var stringVal)) + { + // .netstandard2.0 requires ! + valueList.Add(stringVal!); + } + } + } + } + else + { + if (StringAttribute.GetValue(enumType, valueAsEnum, out var stringVal)) + { + // .netstandard2.0 requires ! + valueList.Add(stringVal!); + } + } + queryParams.Add(attribute.Key ?? prop.Name, string.Join(",", valueList)); + } + else + { + queryParams.Add(attribute.Key ?? prop.Name, value.ToString() ?? throw new APIException("ToString returned null for query parameter")); + } + } + } + + protected virtual void CustomEnsure() { } + protected virtual void AddCustomQueryParams(Dictionary queryParams) { } + } + + [AttributeUsage(AttributeTargets.Property)] + public sealed class QueryParamAttribute : Attribute + { + public string Key { get; } + + public QueryParamAttribute(string key) + { + Key = key; + } + } + + [AttributeUsage(AttributeTargets.Property)] + public sealed class BodyParamAttribute : Attribute + { + public string Key { get; } + + public BodyParamAttribute(string key) + { + Key = key; + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/SearchRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/SearchRequest.cs new file mode 100644 index 0000000..5d645b8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/SearchRequest.cs @@ -0,0 +1,120 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class SearchRequest : RequestParams + { + /// + /// + /// + /// + /// A comma-separated list of item types to search across. + /// Valid types are: album , artist, playlist, track, show and episode. + /// Search results include hits from all the specified item types. + /// + /// + /// Search query keywords and optional field filters and operators. + /// + /// + /// https://developer.spotify.com/documentation/web-api/reference/search/search/ + /// + public SearchRequest(Types type, string query) + { + Ensure.ArgumentNotNull(type, nameof(type)); + Ensure.ArgumentNotNullOrEmptyString(query, nameof(query)); + + Type = type; + Query = query; + } + + /// + /// A comma-separated list of item types to search across. + /// Valid types are: album , artist, playlist, track, show and episode. + /// Search results include hits from all the specified item types. + /// + /// + [QueryParam("type")] + public Types Type { get; set; } + + /// + /// Search query keywords and optional field filters and operators. + /// + /// + [QueryParam("q")] + public string Query { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// If a country code is specified, only content that is playable in that market is returned. + /// Note: + /// - Playlist results are not affected by the market parameter. + /// - If market is set to from_token, and a valid access token is + /// specified in the request header, only content playable in the country + /// associated with the user account, is returned. + /// - Users can view the country that is associated with their account in the + /// account settings. A user must grant access to the user-read-private scope + /// prior to when the access token is issued. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + + /// + /// Maximum number of results to return. + /// Default: 20 + /// Minimum: 1 + /// Maximum: 50 + /// Note: The limit is applied within each type, not on the total response. + /// For example, if the limit value is 3 and the type is artist,album, + /// the response contains 3 artists and 3 albums. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first result to return. + /// Default: 0 (the first result). Maximum offset (including limit): 2,000. + /// Use with limit to get the next page of search results. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// Possible values: audio + /// If include_external = audio is specified the response + /// will include any relevant audio content that is hosted externally. + /// By default external content is filtered out from responses. + /// + /// + [QueryParam("include_external")] + public IncludeExternals? IncludeExternal { get; set; } + + [Flags] + public enum IncludeExternals + { + [String("audio")] + Audio = 1, + } + + [Flags] + public enum Types + { + [String("album")] + Album = 1, + [String("artist")] + Artist = 2, + [String("playlist")] + Playlist = 4, + [String("track")] + Track = 8, + [String("show")] + Show = 16, + [String("episode")] + Episode = 32, + All = Album | Artist | Playlist | Track | Show | Episode + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ShowEpisodesRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ShowEpisodesRequest.cs new file mode 100644 index 0000000..8f355eb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ShowEpisodesRequest.cs @@ -0,0 +1,33 @@ +namespace SpotifyAPI.Web +{ + public class ShowEpisodesRequest : RequestParams + { + /// + /// The maximum number of episodes to return. Default: 20. Minimum: 1. Maximum: 50. + /// + /// + [QueryParam("limit")] + public int? Limit { get; set; } + + /// + /// The index of the first episode to return. + /// Default: 0 (the first object). Use with limit to get the next set of episodes. + /// + /// + [QueryParam("offset")] + public int? Offset { get; set; } + + /// + /// An ISO 3166-1 alpha-2 country code. If a country code is specified, only shows and episodes + /// that are available in that market will be returned. + /// If a valid user access token is specified in the request header, + /// the country associated with the user account will take priority over this parameter. + /// Note: If neither market or user country are provided, the content is considered unavailable for the client. + /// Users can view the country that is associated with their account in the account settings. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ShowRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ShowRequest.cs new file mode 100644 index 0000000..e2cd1fb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ShowRequest.cs @@ -0,0 +1,19 @@ +namespace SpotifyAPI.Web +{ + public class ShowRequest : RequestParams + { + /// + /// An ISO 3166-1 alpha-2 country code. If a country code is specified, + /// only shows and episodes that are available in that market will be returned. + /// If a valid user access token is specified in the request header, + /// the country associated with the user account will take priority over this parameter. + /// Note: If neither market or user country are provided, the content + /// is considered unavailable for the client. + /// Users can view the country that is associated with their account in the account settings. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/ShowsRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/ShowsRequest.cs new file mode 100644 index 0000000..edccc42 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/ShowsRequest.cs @@ -0,0 +1,41 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ShowsRequest : RequestParams + { + /// + /// Get Spotify catalog information for several shows based on their Spotify IDs. + /// + /// + /// A comma-separated list of the Spotify IDs for the shows. Maximum: 50 IDs. + /// + public ShowsRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the shows. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + + /// + /// An ISO 3166-1 alpha-2 country code. If a country code is specified, only shows and episodes + /// that are available in that market will be returned. + /// If a valid user access token is specified in the request header, + /// the country associated with the user account will take priority over this parameter. + /// Note: If neither market or user country are provided, + /// the content is considered unavailable for the client. + /// Users can view the country that is associated with their account in the account settings. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapRefreshRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapRefreshRequest.cs new file mode 100644 index 0000000..8f0ddd9 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapRefreshRequest.cs @@ -0,0 +1,20 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class TokenSwapRefreshRequest + { + public TokenSwapRefreshRequest(Uri refreshUri, string refreshToken) + { + Ensure.ArgumentNotNull(refreshUri, nameof(refreshUri)); + Ensure.ArgumentNotNullOrEmptyString(refreshToken, nameof(refreshToken)); + + RefreshUri = refreshUri; + RefreshToken = refreshToken; + } + + public string RefreshToken { get; } + + public Uri RefreshUri { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapTokenRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapTokenRequest.cs new file mode 100644 index 0000000..068dc7a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/TokenSwapTokenRequest.cs @@ -0,0 +1,20 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class TokenSwapTokenRequest + { + public TokenSwapTokenRequest(Uri tokenUri, string code) + { + Ensure.ArgumentNotNull(tokenUri, nameof(tokenUri)); + Ensure.ArgumentNotNullOrEmptyString(code, nameof(code)); + + TokenUri = tokenUri; + Code = code; + } + + public string Code { get; } + + public Uri TokenUri { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Request/TrackRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/TrackRequest.cs new file mode 100644 index 0000000..17536d7 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/TrackRequest.cs @@ -0,0 +1,14 @@ +namespace SpotifyAPI.Web +{ + public class TrackRequest : RequestParams + { + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/TracksAudioFeaturesRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/TracksAudioFeaturesRequest.cs new file mode 100644 index 0000000..31d9e4a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/TracksAudioFeaturesRequest.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class TracksAudioFeaturesRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 100 IDs. + public TracksAudioFeaturesRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 100 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/TracksRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/TracksRequest.cs new file mode 100644 index 0000000..1edd2fa --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/TracksRequest.cs @@ -0,0 +1,34 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class TracksRequest : RequestParams + { + /// + /// + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 50 IDs. + public TracksRequest(IList ids) + { + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + Ids = ids; + } + + /// + /// A comma-separated list of the Spotify IDs for the tracks. Maximum: 50 IDs. + /// + /// + [QueryParam("ids")] + public IList Ids { get; } + + /// + /// An ISO 3166-1 alpha-2 country code or the string from_token. + /// Provide this parameter if you want to apply Track Relinking. + /// + /// + [QueryParam("market")] + public string? Market { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Request/UnfollowRequest.cs b/Source Files/SpotifyAPI.Web/Models/Request/UnfollowRequest.cs new file mode 100644 index 0000000..91acf8f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Request/UnfollowRequest.cs @@ -0,0 +1,49 @@ +using System.Collections.Generic; +namespace SpotifyAPI.Web +{ + public class UnfollowRequest : RequestParams + { + /// + /// + /// + /// The ID type: either artist or user. + /// + /// A comma-separated list of the artist or the user Spotify IDs. F + /// or example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + public UnfollowRequest(Type type, IList ids) + { + Ensure.ArgumentNotNull(type, nameof(type)); + Ensure.ArgumentNotNullOrEmptyList(ids, nameof(ids)); + + TypeParam = type; + Ids = ids; + } + + /// + /// The ID type: either artist or user. + /// + /// + [QueryParam("type")] + public Type TypeParam { get; } + + /// + /// A comma-separated list of the artist or the user Spotify IDs. F + /// or example: ids=74ASZWbe4lXaubB36ztrGX,08td7MxkoHQkXnWAYD8d6Q. + /// A maximum of 50 IDs can be sent in one request. + /// + /// + [BodyParam("ids")] + public IList Ids { get; } + + public enum Type + { + [String("artist")] + Artist, + [String("user")] + User + } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Actions.cs b/Source Files/SpotifyAPI.Web/Models/Response/Actions.cs new file mode 100644 index 0000000..2114a48 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Actions.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class Actions + { + public Dictionary Disallows { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs new file mode 100644 index 0000000..887a6ed --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/AlbumsResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class AlbumsResponse + { + public List Albums { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ArtistsRelatedArtistsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsRelatedArtistsResponse.cs new file mode 100644 index 0000000..ea03366 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsRelatedArtistsResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ArtistsRelatedArtistsResponse + { + public List Artists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ArtistsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsResponse.cs new file mode 100644 index 0000000..c47e70f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ArtistsResponse + { + public List Artists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ArtistsTopTracksResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsTopTracksResponse.cs new file mode 100644 index 0000000..abf120d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ArtistsTopTracksResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ArtistsTopTracksResponse + { + public List Tracks { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeRefreshResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeRefreshResponse.cs new file mode 100644 index 0000000..b4dc1c4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeRefreshResponse.cs @@ -0,0 +1,21 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class AuthorizationCodeRefreshResponse: IUserToken + { + public string AccessToken { get; set; } = default!; + public string TokenType { get; set; } = default!; + public int ExpiresIn { get; set; } + public string Scope { get; set; } = default!; + + /// + /// Auto-Initalized to UTC Now + /// + /// + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + public bool IsExpired { get => CreatedAt.AddSeconds(ExpiresIn) <= DateTime.UtcNow; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeTokenResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeTokenResponse.cs new file mode 100644 index 0000000..05cea2a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/AuthorizationCodeTokenResponse.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class AuthorizationCodeTokenResponse: IRefreshableToken + { + public string AccessToken { get; set; } = default!; + public string TokenType { get; set; } = default!; + public int ExpiresIn { get; set; } + public string Scope { get; set; } = default!; + public string RefreshToken { get; set; } = default!; + + /// + /// Auto-Initalized to UTC Now + /// + /// + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + public bool IsExpired { get => CreatedAt.AddSeconds(ExpiresIn) <= DateTime.UtcNow; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/CategoriesResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/CategoriesResponse.cs new file mode 100644 index 0000000..ca63e5b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/CategoriesResponse.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web +{ + public class CategoriesResponse + { + public Paging Categories { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Category.cs b/Source Files/SpotifyAPI.Web/Models/Response/Category.cs new file mode 100644 index 0000000..66e300f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Category.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class Category + { + public string Href { get; set; } = default!; + public List Icons { get; set; } = default!; + public string Id { get; set; } = default!; + public string Name { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/CategoryPlaylistsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/CategoryPlaylistsResponse.cs new file mode 100644 index 0000000..e65fa8a --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/CategoryPlaylistsResponse.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web +{ + public class CategoryPlaylistsResponse + { + public Paging Playlists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ClientCredentialsTokenResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/ClientCredentialsTokenResponse.cs new file mode 100644 index 0000000..3261c44 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ClientCredentialsTokenResponse.cs @@ -0,0 +1,20 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class ClientCredentialsTokenResponse: IToken + { + public string AccessToken { get; set; } = default!; + public string TokenType { get; set; } = default!; + public int ExpiresIn { get; set; } + + /// + /// Auto-Initalized to UTC Now + /// + /// + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + public bool IsExpired { get => CreatedAt.AddSeconds(ExpiresIn) <= DateTime.UtcNow; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Context.cs b/Source Files/SpotifyAPI.Web/Models/Response/Context.cs new file mode 100644 index 0000000..924f9f8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Context.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class Context + { + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Copyright.cs b/Source Files/SpotifyAPI.Web/Models/Response/Copyright.cs new file mode 100644 index 0000000..59dac4c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Copyright.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web +{ + public class Copyright + { + public string Text { get; set; } = default!; + public string Type { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlaying.cs b/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlaying.cs new file mode 100644 index 0000000..e39fd6e --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlaying.cs @@ -0,0 +1,22 @@ +using System; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class CurrentlyPlaying + { + public Context Context { get; set; } = default!; + public string CurrentlyPlayingType { get; set; } = default!; + public bool IsPlaying { get; set; } + + /// + /// Can be a FullTrack or FullEpisode + /// + /// + [JsonConverter(typeof(PlayableItemConverter))] + public IPlayableItem Item { get; set; } = default!; + public int? ProgressMs { get; set; } + public long Timestamp { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlayingContext.cs b/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlayingContext.cs new file mode 100644 index 0000000..0ac9c4c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/CurrentlyPlayingContext.cs @@ -0,0 +1,26 @@ +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class CurrentlyPlayingContext + { + public Device Device { get; set; } = default!; + public string RepeatState { get; set; } = default!; + public bool ShuffleState { get; set; } + public Context Context { get; set; } = default!; + public long Timestamp { get; set; } + public int ProgressMs { get; set; } + public bool IsPlaying { get; set; } + + /// + /// Can be a FullTrack or FullEpisode + /// + /// + [JsonConverter(typeof(PlayableItemConverter))] + public IPlayableItem Item { get; set; } = default!; + + public string CurrentlyPlayingType { get; set; } = default!; + public Actions Actions { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Cursor.cs b/Source Files/SpotifyAPI.Web/Models/Response/Cursor.cs new file mode 100644 index 0000000..2033342 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Cursor.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web +{ + public class Cursor + { + public string Before { get; set; } = default!; + public string After { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/CursorPaging.cs b/Source Files/SpotifyAPI.Web/Models/Response/CursorPaging.cs new file mode 100644 index 0000000..262c1fb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/CursorPaging.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class CursorPaging : IPaginatable + { + public string Href { get; set; } = default!; + public List? Items { get; set; } = default!; + public int Limit { get; set; } + public string? Next { get; set; } = default!; + public Cursor Cursors { get; set; } = default!; + public int Total { get; set; } + } + + public class CursorPaging : IPaginatable + { + public string Href { get; set; } = default!; + public List? Items { get; set; } = default!; + public int Limit { get; set; } + public string? Next { get; set; } = default!; + public Cursor Cursors { get; set; } = default!; + public int Total { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Device.cs b/Source Files/SpotifyAPI.Web/Models/Response/Device.cs new file mode 100644 index 0000000..670e856 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Device.cs @@ -0,0 +1,14 @@ +namespace SpotifyAPI.Web +{ + public class Device + { + public string Id { get; set; } = default!; + public bool IsActive { get; set; } + public bool IsPrivateSession { get; set; } + public bool IsRestricted { get; set; } + public string Name { get; set; } = default!; + public string Type { get; set; } = default!; + public int? VolumePercent { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/DeviceResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/DeviceResponse.cs new file mode 100644 index 0000000..fa901bc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/DeviceResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class DeviceResponse + { + public List Devices { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/EpisodesResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/EpisodesResponse.cs new file mode 100644 index 0000000..f231a5c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/EpisodesResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class EpisodesResponse + { + public List Episodes { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FeaturedPlaylistsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/FeaturedPlaylistsResponse.cs new file mode 100644 index 0000000..f38b734 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FeaturedPlaylistsResponse.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web +{ + public class FeaturedPlaylistsResponse + { + public string Message { get; set; } = default!; + public Paging Playlists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FollowedArtistsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/FollowedArtistsResponse.cs new file mode 100644 index 0000000..8c37a29 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FollowedArtistsResponse.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web +{ + public class FollowedArtistsResponse + { + public CursorPaging Artists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Followers.cs b/Source Files/SpotifyAPI.Web/Models/Response/Followers.cs new file mode 100644 index 0000000..21d7365 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Followers.cs @@ -0,0 +1,10 @@ +namespace SpotifyAPI.Web +{ + public class Followers + { + public string Href { get; set; } = default!; + + public int Total { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullAlbum.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullAlbum.cs new file mode 100644 index 0000000..1595a07 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullAlbum.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FullAlbum + { + public string AlbumType { get; set; } = default!; + public List Artists { get; set; } = default!; + public List AvailableMarkets { get; set; } = default!; + public List Copyrights { get; set; } = default!; + public Dictionary ExternalIds { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public List Genres { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public string Label { get; set; } = default!; + public string Name { get; set; } = default!; + public int Popularity { get; set; } + public string ReleaseDate { get; set; } = default!; + public string ReleaseDatePrecision { get; set; } = default!; + public Dictionary Restrictions { get; set; } = default!; + public Paging Tracks { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullArtist.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullArtist.cs new file mode 100644 index 0000000..dad2844 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullArtist.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FullArtist + { + public Dictionary ExternalUrls { get; set; } = default!; + public Followers Followers { get; set; } = default!; + public List Genres { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public string Name { get; set; } = default!; + public int Popularity { get; set; } + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullEpisode.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullEpisode.cs new file mode 100644 index 0000000..733595d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullEpisode.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SpotifyAPI.Web +{ + public class FullEpisode : IPlayableItem + { + public string AudioPreviewUrl { get; set; } = default!; + public string Description { get; set; } = default!; + public int DurationMs { get; set; } + public bool Explicit { get; set; } + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public bool IsExternallyHosted { get; set; } + public bool IsPlayable { get; set; } + public List Languages { get; set; } = default!; + public string Name { get; set; } = default!; + public string ReleaseDate { get; set; } = default!; + public string ReleaseDatePrecision { get; set; } = default!; + public ResumePoint ResumePoint { get; set; } = default!; + public SimpleShow Show { get; set; } = default!; + + [JsonConverter(typeof(StringEnumConverter))] + public ItemType Type { get; set; } + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullPlaylist.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullPlaylist.cs new file mode 100644 index 0000000..0a6bc64 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullPlaylist.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +namespace SpotifyAPI.Web +{ + public class FullPlaylist + { + public bool? Collaborative { get; set; } + public string? Description { get; set; } = default!; + public Dictionary? ExternalUrls { get; set; } = default!; + public Followers Followers { get; set; } = default!; + public string? Href { get; set; } = default!; + public string? Id { get; set; } = default!; + public List? 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!; + + /// + /// A list of PlaylistTracks, which items can be a FullTrack or FullEpisode + /// + /// + public Paging>? Tracks { get; set; } = default!; + public string? Type { get; set; } = default!; + public string? Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullShow.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullShow.cs new file mode 100644 index 0000000..44c4ee1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullShow.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class FullShow + { + public List AvailableMarkets { get; set; } = default!; + public List Copyrights { get; set; } = default!; + public string Description { get; set; } = default!; + public Paging Episodes { get; set; } = default!; + public bool Explicit { get; set; } + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public bool IsExternallyHosted { get; set; } + public List Languages { get; set; } = default!; + public string MediaType { get; set; } = default!; + public string Name { get; set; } = default!; + public string Publisher { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/FullTrack.cs b/Source Files/SpotifyAPI.Web/Models/Response/FullTrack.cs new file mode 100644 index 0000000..71331bc --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/FullTrack.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SpotifyAPI.Web +{ + public class FullTrack : IPlayableItem + { + public SimpleAlbum Album { get; set; } = default!; + public List Artists { get; set; } = default!; + public List AvailableMarkets { get; set; } = default!; + public int DiscNumber { get; set; } + public int DurationMs { get; set; } + public bool Explicit { get; set; } + public Dictionary ExternalIds { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public bool IsPlayable { get; set; } + public LinkedTrack LinkedFrom { get; set; } = default!; + public Dictionary Restrictions { get; set; } = default!; + public string Name { get; set; } = default!; + public int Popularity { get; set; } + public string PreviewUrl { get; set; } = default!; + public int TrackNumber { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public ItemType Type { get; set; } + public string Uri { get; set; } = default!; + public bool IsLocal { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Image.cs b/Source Files/SpotifyAPI.Web/Models/Response/Image.cs new file mode 100644 index 0000000..83d70e5 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Image.cs @@ -0,0 +1,10 @@ +namespace SpotifyAPI.Web +{ + public class Image + { + public int Height { get; set; } + public int Width { get; set; } + public string Url { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IPlaylistElement.cs b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IPlaylistElement.cs new file mode 100644 index 0000000..56a5f5e --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IPlaylistElement.cs @@ -0,0 +1,18 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SpotifyAPI.Web +{ + public enum ItemType + { + Track, + Episode + } + + public interface IPlayableItem + { + [JsonConverter(typeof(StringEnumConverter))] + ItemType Type { get; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IRefreshableToken.cs b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IRefreshableToken.cs new file mode 100644 index 0000000..ddb83eb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IRefreshableToken.cs @@ -0,0 +1,13 @@ +namespace SpotifyAPI.Web +{ + /// + /// An user token, which can be refreshed + /// + public interface IRefreshableToken : IUserToken + { + /// + /// Refresh token + /// + public string RefreshToken { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IToken.cs b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IToken.cs new file mode 100644 index 0000000..e9e6e93 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IToken.cs @@ -0,0 +1,30 @@ +using System; + +namespace SpotifyAPI.Web +{ + /// + /// A token to access the Spotify API + /// + public interface IToken + { + /// + /// Access token string + /// + public string AccessToken { get; set; } + + /// + /// Type of this token (eg. Bearer) + /// + public string TokenType { get; set; } + + /// + /// Auto-Initalized to UTC Now + /// + public DateTime CreatedAt { get; set; } + + /// + /// Is the token still valid? + /// + public bool IsExpired { get; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IUserToken.cs b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IUserToken.cs new file mode 100644 index 0000000..0745561 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Interfaces/IUserToken.cs @@ -0,0 +1,13 @@ +namespace SpotifyAPI.Web +{ + /// + /// A token which allows you to access the API as user + /// + public interface IUserToken : IToken + { + /// + /// Comma-Seperated list of scopes + /// + public string Scope { get; set; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Response/LinkedTrack.cs b/Source Files/SpotifyAPI.Web/Models/Response/LinkedTrack.cs new file mode 100644 index 0000000..093f578 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/LinkedTrack.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; +namespace SpotifyAPI.Web +{ + public class LinkedTrack + { + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/NewReleasesResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/NewReleasesResponse.cs new file mode 100644 index 0000000..d9ec7aa --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/NewReleasesResponse.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web +{ + public class NewReleasesResponse + { + public string Message { get; set; } = default!; + public Paging Albums { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/PKCETokenResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/PKCETokenResponse.cs new file mode 100644 index 0000000..d274858 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/PKCETokenResponse.cs @@ -0,0 +1,21 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class PKCETokenResponse: IRefreshableToken + { + public string AccessToken { get; set; } = default!; + public string TokenType { get; set; } = default!; + public int ExpiresIn { get; set; } + public string Scope { get; set; } = default!; + public string RefreshToken { get; set; } = default!; + + /// + /// Auto-Initalized to UTC Now + /// + /// + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; + + public bool IsExpired { get => CreatedAt.AddSeconds(ExpiresIn) <= DateTime.UtcNow; } + } +} diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Paging.cs b/Source Files/SpotifyAPI.Web/Models/Response/Paging.cs new file mode 100644 index 0000000..a03756c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Paging.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class Paging : IPaginatable + { + public string? Href { get; set; } = default!; + public List? Items { get; set; } = default!; + public int? Limit { get; set; } = default!; + public string? Next { get; set; } = default!; + public int? Offset { get; set; } = default!; + public string? Previous { get; set; } = default!; + public int? Total { get; set; } = default!; + } + + public class Paging : IPaginatable + { + public string? Href { get; set; } = default!; + public List? Items { get; set; } = default!; + public int? Limit { get; set; } = default!; + public string? Next { get; set; } = default!; + public int? Offset { get; set; } = default!; + public string? Previous { get; set; } = default!; + public int? Total { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/PlayHistoryItem.cs b/Source Files/SpotifyAPI.Web/Models/Response/PlayHistoryItem.cs new file mode 100644 index 0000000..9aa127c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/PlayHistoryItem.cs @@ -0,0 +1,11 @@ +using System; +namespace SpotifyAPI.Web +{ + public class PlayHistoryItem + { + public SimpleTrack Track { get; set; } = default!; + public DateTime PlayedAt { get; set; } + public Context Context { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/PlaylistTrack.cs b/Source Files/SpotifyAPI.Web/Models/Response/PlaylistTrack.cs new file mode 100644 index 0000000..ecdf511 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/PlaylistTrack.cs @@ -0,0 +1,16 @@ +using System; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class PlaylistTrack + { + public DateTime? AddedAt { get; set; } + public PublicUser AddedBy { get; set; } = default!; + public bool IsLocal { get; set; } + + [JsonConverter(typeof(PlayableItemConverter))] + public T Track { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/PrivateUser.cs b/Source Files/SpotifyAPI.Web/Models/Response/PrivateUser.cs new file mode 100644 index 0000000..7995df4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/PrivateUser.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class PrivateUser + { + public string Country { get; set; } = default!; + public string DisplayName { get; set; } = default!; + public string Email { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public Followers Followers { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public string Product { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/PublicUser.cs b/Source Files/SpotifyAPI.Web/Models/Response/PublicUser.cs new file mode 100644 index 0000000..b7d0cff --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/PublicUser.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class PublicUser + { + public string DisplayName { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public Followers Followers { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/RecommendationGenresResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationGenresResponse.cs new file mode 100644 index 0000000..07027b0 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationGenresResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class RecommendationGenresResponse + { + public List Genres { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/RecommendationSeed.cs b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationSeed.cs new file mode 100644 index 0000000..abb6c7e --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationSeed.cs @@ -0,0 +1,19 @@ +using Newtonsoft.Json; + +namespace SpotifyAPI.Web +{ + public class RecommendationSeed + { + [JsonProperty("afterFilteringSize")] + public int AfterFiliteringSize { get; set; } + + [JsonProperty("afterRelinkingSize")] + public int AfterRelinkingSize { get; set; } + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + [JsonProperty("initialPoolSize")] + public int InitialPoolSize { get; set; } + public string Type { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/RecommendationsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationsResponse.cs new file mode 100644 index 0000000..f97b59e --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/RecommendationsResponse.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class RecommendationsResponse + { + public List Seeds { get; set; } = default!; + public List Tracks { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ResumePointObject.cs b/Source Files/SpotifyAPI.Web/Models/Response/ResumePointObject.cs new file mode 100644 index 0000000..a5d9173 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ResumePointObject.cs @@ -0,0 +1,9 @@ +namespace SpotifyAPI.Web +{ + public class ResumePoint + { + public bool FullyPlayed { get; set; } + public int ResumePositionMs { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SavedAlbum.cs b/Source Files/SpotifyAPI.Web/Models/Response/SavedAlbum.cs new file mode 100644 index 0000000..0415e27 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SavedAlbum.cs @@ -0,0 +1,11 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class SavedAlbum + { + public DateTime AddedAt { get; set; } + public FullAlbum Album { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SavedShow.cs b/Source Files/SpotifyAPI.Web/Models/Response/SavedShow.cs new file mode 100644 index 0000000..48402d1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SavedShow.cs @@ -0,0 +1,11 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class SavedShow + { + public DateTime AddedAt { get; set; } + public FullShow Show { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SavedTrack.cs b/Source Files/SpotifyAPI.Web/Models/Response/SavedTrack.cs new file mode 100644 index 0000000..b6d0b1b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SavedTrack.cs @@ -0,0 +1,11 @@ +using System; + +namespace SpotifyAPI.Web +{ + public class SavedTrack + { + public DateTime AddedAt { get; set; } + public FullTrack Track { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SearchResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/SearchResponse.cs new file mode 100644 index 0000000..064acfb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SearchResponse.cs @@ -0,0 +1,13 @@ +namespace SpotifyAPI.Web +{ + public class SearchResponse + { + public Paging Artists { get; set; } = default!; + public Paging Albums { get; set; } = default!; + public Paging Tracks { get; set; } = default!; + public Paging Shows { get; set; } = default!; + public Paging Episodes { get; set; } = default!; + public Paging Playlists { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Section.cs b/Source Files/SpotifyAPI.Web/Models/Response/Section.cs new file mode 100644 index 0000000..a2aaa32 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Section.cs @@ -0,0 +1,19 @@ +namespace SpotifyAPI.Web +{ + public class Section + { + 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; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/Segment.cs b/Source Files/SpotifyAPI.Web/Models/Response/Segment.cs new file mode 100644 index 0000000..cb90683 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/Segment.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class Segment + { + 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 Pitches { get; set; } = default!; + public List Timbre { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/ShowsResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/ShowsResponse.cs new file mode 100644 index 0000000..08e001c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/ShowsResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class ShowsResponse + { + public List Shows { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimpleAlbum.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimpleAlbum.cs new file mode 100644 index 0000000..b9140b6 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimpleAlbum.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class SimpleAlbum + { + public string AlbumGroup { get; set; } = default!; + public string AlbumType { get; set; } = default!; + public List Artists { get; set; } = default!; + public List AvailableMarkets { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public string Name { get; set; } = default!; + public string ReleaseDate { get; set; } = default!; + public string ReleaseDatePrecision { get; set; } = default!; + public Dictionary Restrictions { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimpleArtist.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimpleArtist.cs new file mode 100644 index 0000000..da8ae4b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimpleArtist.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +namespace SpotifyAPI.Web +{ + public class SimpleArtist + { + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public string Name { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimpleEpisode.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimpleEpisode.cs new file mode 100644 index 0000000..eb48e0f --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimpleEpisode.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SpotifyAPI.Web +{ + public class SimpleEpisode + { + public string AudioPreviewUrl { get; set; } = default!; + public string Description { get; set; } = default!; + public int DurationMs { get; set; } + public bool Explicit { get; set; } + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + 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; set; } = default!; + public List Languages { get; set; } = default!; + public string Name { get; set; } = default!; + public string ReleaseDate { get; set; } = default!; + public string ReleaseDatePrecision { get; set; } = default!; + public ResumePoint ResumePoint { get; set; } = default!; + + [JsonConverter(typeof(StringEnumConverter))] + public ItemType Type { get; set; } + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimplePlaylist.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimplePlaylist.cs new file mode 100644 index 0000000..3dc4255 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimplePlaylist.cs @@ -0,0 +1,29 @@ +using System.Collections.Generic; +namespace SpotifyAPI.Web +{ + /// + /// Docs + /// + public class SimplePlaylist + { + public bool Collaborative { get; set; } + public string Description { get; set; } = default!; + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List 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!; + + /// + /// A list of PlaylistTracks, which items can be a FullTrack or FullEpisode + /// + /// + public Paging> Tracks { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimpleShow.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimpleShow.cs new file mode 100644 index 0000000..d5e56f5 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimpleShow.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class SimpleShow + { + public List AvailableMarkets { get; set; } = default!; + public List Copyrights { get; set; } = default!; + public string Description { get; set; } = default!; + public bool Explicit { get; set; } + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public List Images { get; set; } = default!; + public bool IsExternallyHosted { get; set; } + public List Languages { get; set; } = default!; + public string MediaType { get; set; } = default!; + public string Name { get; set; } = default!; + public string Publisher { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SimpleTrack.cs b/Source Files/SpotifyAPI.Web/Models/Response/SimpleTrack.cs new file mode 100644 index 0000000..c395f14 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SimpleTrack.cs @@ -0,0 +1,28 @@ +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace SpotifyAPI.Web +{ + public class SimpleTrack + { + public List Artists { get; set; } = default!; + public List AvailableMarkets { get; set; } = default!; + public int DiscNumber { get; set; } + public int DurationMs { get; set; } + public bool Explicit { get; set; } + public Dictionary ExternalUrls { get; set; } = default!; + public string Href { get; set; } = default!; + public string Id { get; set; } = default!; + public bool IsPlayable { get; set; } + public LinkedTrack LinkedFrom { get; set; } = default!; + public string Name { get; set; } = default!; + public string PreviewUrl { get; set; } = default!; + public int TrackNumber { get; set; } + + [JsonConverter(typeof(StringEnumConverter))] + public ItemType Type { get; set; } + public string Uri { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/SnapshotResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/SnapshotResponse.cs new file mode 100644 index 0000000..ccf6a07 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/SnapshotResponse.cs @@ -0,0 +1,8 @@ +namespace SpotifyAPI.Web +{ + public class SnapshotResponse + { + public string SnapshotId { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/TimeInterval.cs b/Source Files/SpotifyAPI.Web/Models/Response/TimeInterval.cs new file mode 100644 index 0000000..036c50d --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/TimeInterval.cs @@ -0,0 +1,10 @@ +namespace SpotifyAPI.Web +{ + public class TimeInterval + { + public float Start { get; set; } + public float Duration { get; set; } + public float Confidence { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioAnalysis.cs b/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioAnalysis.cs new file mode 100644 index 0000000..e62fef4 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioAnalysis.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class TrackAudioAnalysis + { + public List Bars { get; set; } = default!; + public List Beats { get; set; } = default!; + public List
Sections { get; set; } = default!; + public List Segments { get; set; } = default!; + public List Tatums { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioFeatures.cs b/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioFeatures.cs new file mode 100644 index 0000000..99d0d65 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/TrackAudioFeatures.cs @@ -0,0 +1,25 @@ +namespace SpotifyAPI.Web +{ + public class TrackAudioFeatures + { + public float Acousticness { get; set; } + public string AnalysisUrl { get; set; } = default!; + public float Danceability { get; set; } + public int DurationMs { get; set; } + public float Energy { get; set; } + public string Id { get; set; } = default!; + public float Instrumentalness { get; set; } + public int Key { get; set; } + public float Liveness { get; set; } + public float Loudness { get; set; } + public int Mode { get; set; } + public float Speechiness { get; set; } + public float Tempo { get; set; } + public int TimeSignature { get; set; } + public string TrackHref { get; set; } = default!; + public string Type { get; set; } = default!; + public string Uri { get; set; } = default!; + public float Valence { get; set; } + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/TracksAudioFeaturesResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/TracksAudioFeaturesResponse.cs new file mode 100644 index 0000000..0640dcb --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/TracksAudioFeaturesResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class TracksAudioFeaturesResponse + { + public List AudioFeatures { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/Response/TracksResponse.cs b/Source Files/SpotifyAPI.Web/Models/Response/TracksResponse.cs new file mode 100644 index 0000000..6bb2d62 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Response/TracksResponse.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace SpotifyAPI.Web +{ + public class TracksResponse + { + public List Tracks { get; set; } = default!; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/ResponseInfo.cs b/Source Files/SpotifyAPI.Web/Models/ResponseInfo.cs deleted file mode 100644 index 1a8a12c..0000000 --- a/Source Files/SpotifyAPI.Web/Models/ResponseInfo.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.Net; - -namespace SpotifyAPI.Web.Models -{ - public class ResponseInfo - { - public WebHeaderCollection Headers { get; set; } - - public HttpStatusCode StatusCode { get; set; } - - public static readonly ResponseInfo Empty = new ResponseInfo(); - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Scopes.cs b/Source Files/SpotifyAPI.Web/Models/Scopes.cs new file mode 100644 index 0000000..5b311b8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Models/Scopes.cs @@ -0,0 +1,26 @@ +namespace SpotifyAPI.Web +{ + public static class Scopes + { + public const string UgcImageUpload = "ugc-image-upload"; + public const string UserReadPlaybackState = "user-read-playback-state"; + public const string UserModifyPlaybackState = "user-modify-playback-state"; + public const string UserReadCurrentlyPlaying = "user-read-currently-playing"; + public const string Streaming = "streaming"; + public const string AppRemoteControl = "app-remote-control"; + public const string UserReadEmail = "user-read-email"; + public const string UserReadPrivate = "user-read-private"; + public const string PlaylistReadCollaborative = "playlist-read-collaborative"; + public const string PlaylistModifyPublic = "playlist-modify-public"; + public const string PlaylistReadPrivate = "playlist-read-private"; + public const string PlaylistModifyPrivate = "playlist-modify-private"; + public const string UserLibraryModify = "user-library-modify"; + public const string UserLibraryRead = "user-library-read"; + public const string UserTopRead = "user-top-read"; + public const string UserReadPlaybackPosition = "user-read-playback-position"; + public const string UserReadRecentlyPlayed = "user-read-recently-played"; + public const string UserFollowRead = "user-follow-read"; + public const string UserFollowModify = "user-follow-modify"; + } +} + diff --git a/Source Files/SpotifyAPI.Web/Models/SearchItem.cs b/Source Files/SpotifyAPI.Web/Models/SearchItem.cs deleted file mode 100644 index 65b76c5..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SearchItem.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class SearchItem : BasicModel - { - [JsonProperty("artists")] - public Paging Artists { get; set; } - - [JsonProperty("albums")] - public Paging Albums { get; set; } - - [JsonProperty("tracks")] - public Paging Tracks { get; set; } - - [JsonProperty("playlists")] - public Paging Playlists { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SeveralAlbums.cs b/Source Files/SpotifyAPI.Web/Models/SeveralAlbums.cs deleted file mode 100644 index 74025da..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SeveralAlbums.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class SeveralAlbums : BasicModel - { - [JsonProperty("albums")] - public List Albums { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SeveralArtists.cs b/Source Files/SpotifyAPI.Web/Models/SeveralArtists.cs deleted file mode 100644 index 28df5db..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SeveralArtists.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class SeveralArtists : BasicModel - { - [JsonProperty("artists")] - public List Artists { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SeveralAudioFeatures.cs b/Source Files/SpotifyAPI.Web/Models/SeveralAudioFeatures.cs deleted file mode 100644 index 34ea651..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SeveralAudioFeatures.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class SeveralAudioFeatures : BasicModel - { - [JsonProperty("audio_features")] - public List AudioFeatures { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SeveralTracks.cs b/Source Files/SpotifyAPI.Web/Models/SeveralTracks.cs deleted file mode 100644 index a72c216..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SeveralTracks.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class SeveralTracks : BasicModel - { - [JsonProperty("tracks")] - public List Tracks { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SimpleAlbum.cs b/Source Files/SpotifyAPI.Web/Models/SimpleAlbum.cs deleted file mode 100644 index 2e2aa0f..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SimpleAlbum.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class SimpleAlbum : BasicModel - { - [JsonProperty("album_group")] - public string AlbumGroup { get; set; } - - [JsonProperty("album_type")] - public string AlbumType { get; set; } - - [JsonProperty("artists")] - public List Artists { get; set; } - - [JsonProperty("available_markets")] - public List AvailableMarkets { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("release_date")] - public string ReleaseDate { get; set; } - - [JsonProperty("release_date_precision")] - public string ReleaseDatePrecision { get; set; } - - [JsonProperty("restrictions")] - public Dictionary Restrictions { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SimpleArtist.cs b/Source Files/SpotifyAPI.Web/Models/SimpleArtist.cs deleted file mode 100644 index c1294ee..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SimpleArtist.cs +++ /dev/null @@ -1,26 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class SimpleArtist : BasicModel - { - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SimplePlaylist.cs b/Source Files/SpotifyAPI.Web/Models/SimplePlaylist.cs deleted file mode 100644 index 37b3760..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SimplePlaylist.cs +++ /dev/null @@ -1,44 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class SimplePlaylist : BasicModel - { - [JsonProperty("collaborative")] - public bool Collaborative { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternalUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("images")] - public List Images { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("owner")] - public PublicProfile Owner { get; set; } - - [JsonProperty("public")] - public bool Public { get; set; } - - [JsonProperty("snapshot_id")] - public string SnapshotId { get; set; } - - [JsonProperty("tracks")] - public PlaylistTrackCollection Tracks { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/SimpleTrack.cs b/Source Files/SpotifyAPI.Web/Models/SimpleTrack.cs deleted file mode 100644 index 85702a3..0000000 --- a/Source Files/SpotifyAPI.Web/Models/SimpleTrack.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Newtonsoft.Json; -using System.Collections.Generic; - -namespace SpotifyAPI.Web.Models -{ - public class SimpleTrack : BasicModel - { - [JsonProperty("artists")] - public List Artists { get; set; } - - [JsonProperty("available_markets")] - public List AvailableMarkets { get; set; } - - [JsonProperty("disc_number")] - public int DiscNumber { get; set; } - - [JsonProperty("duration_ms")] - public int DurationMs { get; set; } - - [JsonProperty("explicit")] - public bool Explicit { get; set; } - - [JsonProperty("external_urls")] - public Dictionary ExternUrls { get; set; } - - [JsonProperty("href")] - public string Href { get; set; } - - [JsonProperty("id")] - public string Id { get; set; } - - [JsonProperty("name")] - public string Name { get; set; } - - [JsonProperty("preview_url")] - public string PreviewUrl { get; set; } - - [JsonProperty("track_number")] - public int TrackNumber { get; set; } - - [JsonProperty("restrictions")] - public Dictionary Restrictions { get; set; } - - [JsonProperty("type")] - public string Type { get; set; } - - [JsonProperty("uri")] - public string Uri { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Snapshot.cs b/Source Files/SpotifyAPI.Web/Models/Snapshot.cs deleted file mode 100644 index 4a7e3e7..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Snapshot.cs +++ /dev/null @@ -1,10 +0,0 @@ -using Newtonsoft.Json; - -namespace SpotifyAPI.Web.Models -{ - public class Snapshot : BasicModel - { - [JsonProperty("snapshot_id")] - public string SnapshotId { get; set; } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/Token.cs b/Source Files/SpotifyAPI.Web/Models/Token.cs deleted file mode 100644 index 941d6f9..0000000 --- a/Source Files/SpotifyAPI.Web/Models/Token.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Newtonsoft.Json; -using System; - -namespace SpotifyAPI.Web.Models -{ - public class Token - { - public Token() - { - CreateDate = DateTime.Now; - } - - [JsonProperty("access_token")] - public string AccessToken { get; set; } - - [JsonProperty("token_type")] - public string TokenType { get; set; } - - [JsonProperty("expires_in")] - public double ExpiresIn { get; set; } - - [JsonProperty("refresh_token")] - public string RefreshToken { get; set; } - - [JsonProperty("error")] - public string Error { get; set; } - - [JsonProperty("error_description")] - public string ErrorDescription { get; set; } - - public DateTime CreateDate { get; set; } - - /// - /// Checks if the token has expired - /// - /// - public bool IsExpired() - { - return CreateDate.Add(TimeSpan.FromSeconds(ExpiresIn)) <= DateTime.Now; - } - - public bool HasError() - { - return Error != null; - } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Models/TuneableTrack.cs b/Source Files/SpotifyAPI.Web/Models/TuneableTrack.cs deleted file mode 100644 index 9f3943b..0000000 --- a/Source Files/SpotifyAPI.Web/Models/TuneableTrack.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System.Collections.Generic; -using System.Globalization; -using System.Reflection; - -namespace SpotifyAPI.Web.Models -{ - public class TuneableTrack - { - [String("acousticness")] - public float? Acousticness { get; set; } - - [String("danceability")] - public float? Danceability { get; set; } - - [String("duration_ms")] - public int? DurationMs { get; set; } - - [String("energy")] - public float? Energy { get; set; } - - [String("instrumentalness")] - public float? Instrumentalness { get; set; } - - [String("key")] - public int? Key { get; set; } - - [String("liveness")] - public float? Liveness { get; set; } - - [String("loudness")] - public float? Loudness { get; set; } - - [String("mode")] - public int? Mode { get; set; } - - [String("popularity")] - public int? Popularity { get; set; } - - [String("speechiness")] - public float? Speechiness { get; set; } - - [String("tempo")] - public float? Tempo { get; set; } - - [String("time_signature")] - public int? TimeSignature { get; set; } - - [String("valence")] - public float? Valence { get; set; } - - public string BuildUrlParams(string prefix) - { - List urlParams = new List(); - foreach (PropertyInfo info in GetType().GetProperties()) - { - object value = info.GetValue(this); - string name = info.GetCustomAttribute()?.Text; - if(name == null || value == null) - continue; - urlParams.Add(value is float valueAsFloat - ? $"{prefix}_{name}={valueAsFloat.ToString(CultureInfo.InvariantCulture)}" - : $"{prefix}_{name}={value}"); - } - if (urlParams.Count > 0) - return "&" + string.Join("&", urlParams); - return ""; - } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/ProxyConfig.cs b/Source Files/SpotifyAPI.Web/ProxyConfig.cs deleted file mode 100644 index 309f577..0000000 --- a/Source Files/SpotifyAPI.Web/ProxyConfig.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Net; - -namespace SpotifyAPI.Web -{ - public class ProxyConfig - { - public string Host { get; set; } - - public int Port { get; set; } = 80; - - public string Username { get; set; } - - public string Password { get; set; } - - /// - /// Whether to bypass the proxy server for local addresses. - /// - public bool BypassProxyOnLocal { get; set; } - - public void Set(ProxyConfig proxyConfig) - { - Host = proxyConfig?.Host; - Port = proxyConfig?.Port ?? 80; - Username = proxyConfig?.Username; - Password = proxyConfig?.Password; - BypassProxyOnLocal = proxyConfig?.BypassProxyOnLocal ?? false; - } - - /// - /// Whether both and have valid values. - /// - /// - public bool IsValid() - { - return !string.IsNullOrWhiteSpace(Host) && Port > 0; - } - - /// - /// Create a from the host and port number - /// - /// A URI - public Uri GetUri() - { - UriBuilder uriBuilder = new UriBuilder(Host) - { - Port = Port - }; - return uriBuilder.Uri; - } - - /// - /// Creates a from the proxy details of this object. - /// - /// A or null if the proxy details are invalid. - public WebProxy CreateWebProxy() - { - if (!IsValid()) - return null; - - WebProxy proxy = new WebProxy - { - Address = GetUri(), - UseDefaultCredentials = true, - BypassProxyOnLocal = BypassProxyOnLocal - }; - - if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password)) - return proxy; - - proxy.UseDefaultCredentials = false; - proxy.Credentials = new NetworkCredential(Username, Password); - - return proxy; - } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/RetryHandlers/IRetryHandler.cs b/Source Files/SpotifyAPI.Web/RetryHandlers/IRetryHandler.cs new file mode 100644 index 0000000..1e0d9db --- /dev/null +++ b/Source Files/SpotifyAPI.Web/RetryHandlers/IRetryHandler.cs @@ -0,0 +1,15 @@ +using System; +using System.Threading.Tasks; + +namespace SpotifyAPI.Web.Http +{ + /// + /// The Retry Handler will be directly called after the response is retrived and before errors and body are processed. + /// + public interface IRetryHandler + { + delegate Task RetryFunc(IRequest request); + + Task HandleRetry(IRequest request, IResponse response, RetryFunc retry); + } +} diff --git a/Source Files/SpotifyAPI.Web/RetryHandlers/SimpleRetryHandler.cs b/Source Files/SpotifyAPI.Web/RetryHandlers/SimpleRetryHandler.cs new file mode 100644 index 0000000..9bb5f34 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/RetryHandlers/SimpleRetryHandler.cs @@ -0,0 +1,103 @@ +using System.Linq; +using System.Net; +using System; +using System.Threading.Tasks; +using System.Collections.Generic; +using SpotifyAPI.Web.Http; + +namespace SpotifyAPI.Web +{ + public class SimpleRetryHandler : IRetryHandler + { + private readonly Func _sleep; + + /// + /// Specifies after how many miliseconds should a failed request be retried. + /// + public TimeSpan RetryAfter { get; set; } + + /// + /// Maximum number of tries for one failed request. + /// + public int RetryTimes { get; set; } + + /// + /// Whether a failure of type "Too Many Requests" should use up one of the allocated retry attempts. + /// + public bool TooManyRequestsConsumesARetry { get; set; } + + /// + /// Error codes that will trigger auto-retry + /// + public IEnumerable RetryErrorCodes { get; set; } + + /// + /// A simple retry handler which retries a request based on status codes with a fixed sleep interval. + /// It also supports Retry-After headers sent by spotify. The execution will be delayed by the amount in + /// the Retry-After header + /// + /// + public SimpleRetryHandler() : this(Task.Delay) { } + public SimpleRetryHandler(Func sleep) + { + _sleep = sleep; + RetryAfter = TimeSpan.FromMilliseconds(50); + RetryTimes = 10; + TooManyRequestsConsumesARetry = false; + RetryErrorCodes = new[] { + HttpStatusCode.InternalServerError, + HttpStatusCode.BadGateway, + HttpStatusCode.ServiceUnavailable + }; + } + + private static TimeSpan? ParseTooManyRetries(IResponse response) + { + if (response.StatusCode != (HttpStatusCode)429) + { + return null; + } + if ( + (response.Headers.ContainsKey("Retry-After") && int.TryParse(response.Headers["Retry-After"], out int secondsToWait)) + || (response.Headers.ContainsKey("retry-after") && int.TryParse(response.Headers["retry-after"], out secondsToWait))) + { + return TimeSpan.FromSeconds(secondsToWait); + } + + throw new APIException("429 received, but unable to parse Retry-After Header. This should not happen!"); + } + + public Task HandleRetry(IRequest request, IResponse response, IRetryHandler.RetryFunc retry) + { + Ensure.ArgumentNotNull(response, nameof(response)); + Ensure.ArgumentNotNull(retry, nameof(retry)); + + return HandleRetryInternally(request, response, retry, RetryTimes); + } + + private async Task HandleRetryInternally( + IRequest request, + IResponse response, + IRetryHandler.RetryFunc retry, + int triesLeft) + { + var secondsToWait = ParseTooManyRetries(response); + if (secondsToWait != null && (!TooManyRequestsConsumesARetry || triesLeft > 0)) + { + await _sleep(secondsToWait.Value).ConfigureAwait(false); + response = await retry(request).ConfigureAwait(false); + var newTriesLeft = TooManyRequestsConsumesARetry ? triesLeft - 1 : triesLeft; + return await HandleRetryInternally(request, response, retry, newTriesLeft).ConfigureAwait(false); + } + + while (RetryErrorCodes.Contains(response.StatusCode) && triesLeft > 0) + { + await _sleep(RetryAfter).ConfigureAwait(false); + response = await retry(request).ConfigureAwait(false); + return await HandleRetryInternally(request, response, retry, triesLeft - 1).ConfigureAwait(false); + } + + return response; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.csproj b/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.csproj index 9021175..f70019e 100644 --- a/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.csproj +++ b/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.csproj @@ -1,30 +1,43 @@  - net46;netstandard2.0 - + net5.0;netstandard2.1;netstandard2.0 + 9.0 + enable + SpotifyAPI.Web + SpotifyAPI.Web + Jonas Dellinger + MIT + https://github.com/JohnnyCrazy/SpotifyAPI-NET/ + False + + A Client for Spotify's Web API, written in .NET - - bin\Debug\netstandard2.0\SpotifyAPI.Web.xml - 1701;1702;1705;1591 + For more infos, visit https://github.com/JohnnyCrazy/SpotifyAPI-NET + + + spotify api music .net c# spotify-client + + true + true + snupkg + true + true + 1591 - - bin\Release\netstandard2.0\SpotifyAPI.Web.xml - 1701;1702;1705;1591 + + true - - - - - - + + + None + - - - - + + AllEnabledByDefault + diff --git a/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.nuspec b/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.nuspec deleted file mode 100644 index a154e5b..0000000 --- a/Source Files/SpotifyAPI.Web/SpotifyAPI.Web.nuspec +++ /dev/null @@ -1,30 +0,0 @@ - - - - - SpotifyAPI.Web - 3.0.0 - SpotifyAPI.Web - JohnnyCrazy - JohnnyCrazy - https://github.com/JohnnyCrazy/SpotifyAPI-NET/blob/master/LICENSE - https://github.com/JohnnyCrazy/SpotifyAPI-NET/ - false - - An API for Spotify's Web API, written in .NET - - For more infos, visit https://github.com/JohnnyCrazy/SpotifyAPI-NET - - - spotify api music .net c# spotify-client - - - - - - - - - - - diff --git a/Source Files/SpotifyAPI.Web/SpotifyUrls.cs b/Source Files/SpotifyAPI.Web/SpotifyUrls.cs new file mode 100644 index 0000000..b41364c --- /dev/null +++ b/Source Files/SpotifyAPI.Web/SpotifyUrls.cs @@ -0,0 +1,130 @@ +using System; +namespace SpotifyAPI.Web +{ + public static class SpotifyUrls + { + static private readonly URIParameterFormatProvider _provider = new(); + + public static readonly Uri APIV1 = new("https://api.spotify.com/v1/"); + + public static readonly Uri Authorize = new("https://accounts.spotify.com/authorize"); + + public static readonly Uri OAuthToken = new("https://accounts.spotify.com/api/token"); + + public static Uri Me() => EUri($"me"); + + public static Uri User(string userId) => EUri($"users/{userId}"); + + public static Uri Categories() => EUri($"browse/categories"); + + public static Uri Category(string categoryId) => EUri($"browse/categories/{categoryId}"); + + public static Uri CategoryPlaylists(string categoryId) => EUri($"browse/categories/{categoryId}/playlists"); + + public static Uri Recommendations() => EUri($"recommendations"); + + public static Uri RecommendationGenres() => EUri($"recommendations/available-genre-seeds"); + + public static Uri NewReleases() => EUri($"browse/new-releases"); + + public static Uri FeaturedPlaylists() => EUri($"browse/featured-playlists"); + + public static Uri Show(string showId) => EUri($"shows/{showId}"); + + public static Uri Shows() => EUri($"shows"); + + public static Uri ShowEpisodes(string showId) => EUri($"shows/{showId}/episodes"); + + public static Uri PlaylistTracks(string playlistId) => EUri($"playlists/{playlistId}/tracks"); + + public static Uri UserPlaylists(string userId) => EUri($"users/{userId}/playlists"); + + public static Uri PlaylistImages(string playlistId) => EUri($"playlists/{playlistId}/images"); + + public static Uri Playlist(string playlistId) => EUri($"playlists/{playlistId}"); + + public static Uri CurrentUserPlaylists() => EUri($"me/playlists"); + + public static Uri Search() => EUri($"search"); + + public static Uri CurrentUserFollowerContains() => EUri($"me/following/contains"); + + public static Uri PlaylistFollowersContains(string playlistId) => EUri($"playlists/{playlistId}/followers/contains"); + + public static Uri CurrentUserFollower() => EUri($"me/following"); + + public static Uri PlaylistFollowers(string playlistId) => EUri($"playlists/{playlistId}/followers"); + + public static Uri Tracks() => EUri($"tracks"); + + public static Uri Track(string trackId) => EUri($"tracks/{trackId}"); + + public static Uri AudioAnalysis(string trackId) => EUri($"audio-analysis/{trackId}"); + + public static Uri AudioFeatures(string trackId) => EUri($"audio-features/{trackId}"); + + public static Uri AudioFeatures() => EUri($"audio-features"); + + public static Uri Player() => EUri($"me/player"); + + public static Uri PlayerQueue() => EUri($"me/player/queue"); + + public static Uri PlayerDevices() => EUri($"me/player/devices"); + + public static Uri PlayerCurrentlyPlaying() => EUri($"me/player/currently-playing"); + + public static Uri PlayerRecentlyPlayed() => EUri($"me/player/recently-played"); + + public static Uri PlayerPause() => EUri($"me/player/pause"); + + public static Uri PlayerResume() => EUri($"me/player/play"); + + public static Uri PlayerSeek() => EUri($"me/player/seek"); + + public static Uri PlayerRepeat() => EUri($"me/player/repeat"); + + public static Uri PlayerShuffle() => EUri($"me/player/shuffle"); + + public static Uri PlayerVolume() => EUri($"me/player/volume"); + + public static Uri PlayerNext() => EUri($"me/player/next"); + + public static Uri PlayerPrevious() => EUri($"me/player/previous"); + + public static Uri Albums() => EUri($"albums"); + + public static Uri Album(string albumId) => EUri($"albums/{albumId}"); + + public static Uri AlbumTracks(string albumId) => EUri($"albums/{albumId}/tracks"); + + public static Uri Artists() => EUri($"artists"); + + public static Uri Artist(string artistId) => EUri($"artists/{artistId}"); + + public static Uri ArtistAlbums(string artistId) => EUri($"artists/{artistId}/albums"); + + public static Uri ArtistTopTracks(string artistId) => EUri($"artists/{artistId}/top-tracks"); + + public static Uri ArtistRelatedArtists(string artistId) => EUri($"artists/{artistId}/related-artists"); + + public static Uri PersonalizationTop(string type) => EUri($"me/top/{type}"); + + public static Uri Episode(string episodeId) => EUri($"episodes/{episodeId}"); + + public static Uri Episodes() => EUri($"episodes"); + + public static Uri LibraryAlbumsContains() => EUri($"me/albums/contains"); + + public static Uri LibraryAlbums() => EUri($"me/albums"); + + public static Uri LibraryTracksContains() => EUri($"me/tracks/contains"); + + public static Uri LibraryTracks() => EUri($"me/tracks"); + + public static Uri LibraryShowsContains() => EUri($"me/shows/contains"); + + public static Uri LibraryShows() => EUri($"me/shows"); + + private static Uri EUri(FormattableString path) => new(path.ToString(_provider), UriKind.Relative); + } +} diff --git a/Source Files/SpotifyAPI.Web/SpotifyWebAPI.cs b/Source Files/SpotifyAPI.Web/SpotifyWebAPI.cs deleted file mode 100644 index 1efe238..0000000 --- a/Source Files/SpotifyAPI.Web/SpotifyWebAPI.cs +++ /dev/null @@ -1,2958 +0,0 @@ -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Net; -using System.Threading; -using System.Threading.Tasks; - -namespace SpotifyAPI.Web -{ - // ReSharper disable once InconsistentNaming - public sealed class SpotifyWebAPI : IDisposable - { - private readonly SpotifyWebBuilder _builder; - - public SpotifyWebAPI() : this(null) - { - } - - public SpotifyWebAPI(ProxyConfig proxyConfig) - { - _builder = new SpotifyWebBuilder(); - UseAuth = true; - WebClient = new SpotifyWebClient(proxyConfig) - { - JsonSettings = - new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore, - TypeNameHandling = TypeNameHandling.All - } - }; - } - - public void Dispose() - { - WebClient.Dispose(); - GC.SuppressFinalize(this); - } - - #region Configuration - - /// - /// The type of the - /// - public string TokenType { get; set; } - - /// - /// A valid token issued by spotify. Used only when is true - /// - public string AccessToken { get; set; } - - /// - /// If true, an authorization header based on and will be used - /// - public bool UseAuth { get; set; } - - /// - /// A custom WebClient, used for Unit-Testing - /// - public IClient WebClient { get; set; } - - - /// - /// Specifies after how many miliseconds should a failed request be retried. - /// - public int RetryAfter { get; set; } = 50; - - /// - /// Should a failed request (specified by be automatically retried or not. - /// - public bool UseAutoRetry { get; set; } = false; - - /// - /// Maximum number of tries for one failed request. - /// - public int RetryTimes { get; set; } = 10; - - /// - /// Whether a failure of type "Too Many Requests" should use up one of the allocated retry attempts. - /// - public bool TooManyRequestsConsumesARetry { get; set; } = false; - - /// - /// Error codes that will trigger auto-retry if is enabled. - /// - public IEnumerable RetryErrorCodes { get; set; } = new[] { 500, 502, 503 }; - - #endregion Configuration - - #region Search - - /// - /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. - /// - /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. - /// A list of item types to search across. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first result to return. Default: 0 - /// An ISO 3166-1 alpha-2 country code or the string from_token. - /// - public SearchItem SearchItems(string q, SearchType type, int limit = 20, int offset = 0, string market = "") - { - return DownloadData(_builder.SearchItems(q, type, limit, offset, market)); - } - - /// - /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string asynchronously. - /// - /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. - /// A list of item types to search across. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first result to return. Default: 0 - /// An ISO 3166-1 alpha-2 country code or the string from_token. - /// - public Task SearchItemsAsync(string q, SearchType type, int limit = 20, int offset = 0, string market = "") - { - return DownloadDataAsync(_builder.SearchItems(q, type, limit, offset, market)); - } - - /// - /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. - /// - /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. (properly escaped) - /// A list of item types to search across. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first result to return. Default: 0 - /// An ISO 3166-1 alpha-2 country code or the string from_token. - /// - public SearchItem SearchItemsEscaped(string q, SearchType type, int limit = 20, int offset = 0, string market = "") - { - string escapedQuery = WebUtility.UrlEncode(q); - return DownloadData(_builder.SearchItems(escapedQuery, type, limit, offset, market)); - } - - /// - /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string asynchronously. - /// - /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. (properly escaped) - /// A list of item types to search across. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first result to return. Default: 0 - /// An ISO 3166-1 alpha-2 country code or the string from_token. - /// - public Task SearchItemsEscapedAsync(string q, SearchType type, int limit = 20, int offset = 0, string market = "") - { - string escapedQuery = WebUtility.UrlEncode(q); - return DownloadDataAsync(_builder.SearchItems(escapedQuery, type, limit, offset, market)); - } - - #endregion Search - - #region Albums - - /// - /// Get Spotify catalog information about an album’s tracks. Optional parameters can be used to limit the number of - /// tracks returned. - /// - /// The Spotify ID for the album. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first track to return. Default: 0 (the first object). - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Paging GetAlbumTracks(string id, int limit = 20, int offset = 0, string market = "") - { - return DownloadData>(_builder.GetAlbumTracks(id, limit, offset, market)); - } - - /// - /// Get Spotify catalog information about an album’s tracks asynchronously. Optional parameters can be used to limit the number of - /// tracks returned. - /// - /// The Spotify ID for the album. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first track to return. Default: 0 (the first object). - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task> GetAlbumTracksAsync(string id, int limit = 20, int offset = 0, string market = "") - { - return DownloadDataAsync>(_builder.GetAlbumTracks(id, limit, offset, market)); - } - - /// - /// Get Spotify catalog information for a single album. - /// - /// The Spotify ID for the album. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public FullAlbum GetAlbum(string id, string market = "") - { - return DownloadData(_builder.GetAlbum(id, market)); - } - - /// - /// Get Spotify catalog information for a single album asynchronously. - /// - /// The Spotify ID for the album. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetAlbumAsync(string id, string market = "") - { - return DownloadDataAsync(_builder.GetAlbum(id, market)); - } - - /// - /// Get Spotify catalog information for multiple albums identified by their Spotify IDs. - /// - /// A list of the Spotify IDs for the albums. Maximum: 20 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public SeveralAlbums GetSeveralAlbums(List ids, string market = "") - { - return DownloadData(_builder.GetSeveralAlbums(ids, market)); - } - - /// - /// Get Spotify catalog information for multiple albums identified by their Spotify IDs asynchrously. - /// - /// A list of the Spotify IDs for the albums. Maximum: 20 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetSeveralAlbumsAsync(List ids, string market = "") - { - return DownloadDataAsync(_builder.GetSeveralAlbums(ids, market)); - } - - #endregion Albums - - #region Artists - - /// - /// Get Spotify catalog information for a single artist identified by their unique Spotify ID. - /// - /// The Spotify ID for the artist. - /// - public FullArtist GetArtist(string id) - { - return DownloadData(_builder.GetArtist(id)); - } - - /// - /// Get Spotify catalog information for a single artist identified by their unique Spotify ID asynchronously. - /// - /// The Spotify ID for the artist. - /// - public Task GetArtistAsync(string id) - { - return DownloadDataAsync(_builder.GetArtist(id)); - } - - /// - /// Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the - /// Spotify community’s listening history. - /// - /// The Spotify ID for the artist. - /// - public SeveralArtists GetRelatedArtists(string id) - { - return DownloadData(_builder.GetRelatedArtists(id)); - } - - /// - /// Get Spotify catalog information about artists similar to a given artist asynchronously. Similarity is based on analysis of the - /// Spotify community’s listening history. - /// - /// The Spotify ID for the artist. - /// - public Task GetRelatedArtistsAsync(string id) - { - return DownloadDataAsync(_builder.GetRelatedArtists(id)); - } - - /// - /// Get Spotify catalog information about an artist’s top tracks by country. - /// - /// The Spotify ID for the artist. - /// The country: an ISO 3166-1 alpha-2 country code. - /// - public SeveralTracks GetArtistsTopTracks(string id, string country) - { - return DownloadData(_builder.GetArtistsTopTracks(id, country)); - } - - /// - /// Get Spotify catalog information about an artist’s top tracks by country asynchronously. - /// - /// The Spotify ID for the artist. - /// The country: an ISO 3166-1 alpha-2 country code. - /// - public Task GetArtistsTopTracksAsync(string id, string country) - { - return DownloadDataAsync(_builder.GetArtistsTopTracks(id, country)); - } - - /// - /// Get Spotify catalog information about an artist’s albums. Optional parameters can be specified in the query string - /// to filter and sort the response. - /// - /// The Spotify ID for the artist. - /// - /// A list of keywords that will be used to filter the response. If not supplied, all album types will - /// be returned - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first album to return. Default: 0 - /// - /// An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular - /// geographical market - /// - /// - public Paging GetArtistsAlbums(string id, AlbumType type = AlbumType.All, int limit = 20, int offset = 0, string market = "") - { - return DownloadData>(_builder.GetArtistsAlbums(id, type, limit, offset, market)); - } - - /// - /// Get Spotify catalog information about an artist’s albums asynchronously. Optional parameters can be specified in the query string - /// to filter and sort the response. - /// - /// The Spotify ID for the artist. - /// - /// A list of keywords that will be used to filter the response. If not supplied, all album types will - /// be returned - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first album to return. Default: 0 - /// - /// An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular - /// geographical market - /// - /// - public Task> GetArtistsAlbumsAsync(string id, AlbumType type = AlbumType.All, int limit = 20, int offset = 0, string market = "") - { - return DownloadDataAsync>(_builder.GetArtistsAlbums(id, type, limit, offset, market)); - } - - /// - /// Get Spotify catalog information for several artists based on their Spotify IDs. - /// - /// A list of the Spotify IDs for the artists. Maximum: 50 IDs. - /// - public SeveralArtists GetSeveralArtists(List ids) - { - return DownloadData(_builder.GetSeveralArtists(ids)); - } - - /// - /// Get Spotify catalog information for several artists based on their Spotify IDs asynchronously. - /// - /// A list of the Spotify IDs for the artists. Maximum: 50 IDs. - /// - public Task GetSeveralArtistsAsync(List ids) - { - return DownloadDataAsync(_builder.GetSeveralArtists(ids)); - } - - #endregion Artists - - #region Browse - - /// - /// Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// - /// The desired language, consisting of a lowercase ISO 639 language code and an uppercase ISO 3166-1 - /// alpha-2 country code, joined by an underscore. - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// A timestamp in ISO 8601 format - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// AUTH NEEDED - public FeaturedPlaylists GetFeaturedPlaylists(string locale = "", string country = "", DateTime timestamp = default(DateTime), int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetFeaturedPlaylists"); - return DownloadData(_builder.GetFeaturedPlaylists(locale, country, timestamp, limit, offset)); - } - - /// - /// Get a list of Spotify featured playlists asynchronously (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// - /// The desired language, consisting of a lowercase ISO 639 language code and an uppercase ISO 3166-1 - /// alpha-2 country code, joined by an underscore. - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// A timestamp in ISO 8601 format - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// AUTH NEEDED - public Task GetFeaturedPlaylistsAsync(string locale = "", string country = "", DateTime timestamp = default(DateTime), int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetFeaturedPlaylists"); - return DownloadDataAsync(_builder.GetFeaturedPlaylists(locale, country, timestamp, limit, offset)); - } - - /// - /// Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public NewAlbumReleases GetNewAlbumReleases(string country = "", int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetNewAlbumReleases"); - return DownloadData(_builder.GetNewAlbumReleases(country, limit, offset)); - } - - /// - /// Get a list of new album releases featured in Spotify asynchronously (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public Task GetNewAlbumReleasesAsync(string country = "", int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetNewAlbumReleases"); - return DownloadDataAsync(_builder.GetNewAlbumReleases(country, limit, offset)); - } - - /// - /// Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). - /// - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter if you want to narrow the - /// list of returned categories to those relevant to a particular country - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 (the first object). - /// - /// AUTH NEEDED - public CategoryList GetCategories(string country = "", string locale = "", int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetCategories"); - return DownloadData(_builder.GetCategories(country, locale, limit, offset)); - } - - /// - /// Get a list of categories used to tag items in Spotify asynchronously (on, for example, the Spotify player’s “Browse” tab). - /// - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter if you want to narrow the - /// list of returned categories to those relevant to a particular country - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 (the first object). - /// - /// AUTH NEEDED - public Task GetCategoriesAsync(string country = "", string locale = "", int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetCategories"); - return DownloadDataAsync(_builder.GetCategories(country, locale, limit, offset)); - } - - /// - /// Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). - /// - /// The Spotify category ID for the category. - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category - /// exists for a particular country. - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// - /// AUTH NEEDED - public Category GetCategory(string categoryId, string country = "", string locale = "") - { - return DownloadData(_builder.GetCategory(categoryId, country, locale)); - } - - /// - /// Get a single category used to tag items in Spotify asynchronously (on, for example, the Spotify player’s “Browse” tab). - /// - /// The Spotify category ID for the category. - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category - /// exists for a particular country. - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// - /// AUTH NEEDED - public Task GetCategoryAsync(string categoryId, string country = "", string locale = "") - { - return DownloadDataAsync(_builder.GetCategory(categoryId, country, locale)); - } - - /// - /// Get a list of Spotify playlists tagged with a particular category. - /// - /// The Spotify category ID for the category. - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public CategoryPlaylist GetCategoryPlaylists(string categoryId, string country = "", int limit = 20, int offset = 0) - { - return DownloadData(_builder.GetCategoryPlaylists(categoryId, country, limit, offset)); - } - - /// - /// Get a list of Spotify playlists tagged with a particular category asynchronously. - /// - /// The Spotify category ID for the category. - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public Task GetCategoryPlaylistsAsync(string categoryId, string country = "", int limit = 20, int offset = 0) - { - return DownloadDataAsync(_builder.GetCategoryPlaylists(categoryId, country, limit, offset)); - } - - /// - /// Create a playlist-style listening experience based on seed artists, tracks and genres. - /// - /// A comma separated list of Spotify IDs for seed artists. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of any genres in the set of available genre seeds. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of Spotify IDs for a seed track. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// Tracks with the attribute values nearest to the target values will be preferred. - /// For each tunable track attribute, a hard floor on the selected track attribute’s value can be provided - /// For each tunable track attribute, a hard ceiling on the selected track attribute’s value can be provided - /// The target size of the list of recommended tracks. Default: 20. Minimum: 1. Maximum: 100. - /// For seeds with unusually small pools or when highly restrictive filtering is applied, it may be impossible to generate the requested number of recommended tracks. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// Because min_*, max_* and target_* are applied to pools before relinking, the generated results may not precisely match the filters applied. - /// - /// AUTH NEEDED - public Recommendations GetRecommendations(List artistSeed = null, List genreSeed = null, List trackSeed = null, - TuneableTrack target = null, TuneableTrack min = null, TuneableTrack max = null, int limit = 20, string market = "") - { - return DownloadData(_builder.GetRecommendations(artistSeed, genreSeed, trackSeed, target, min, max, limit, market)); - } - - /// - /// Create a playlist-style listening experience based on seed artists, tracks and genres asynchronously. - /// - /// A comma separated list of Spotify IDs for seed artists. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of any genres in the set of available genre seeds. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of Spotify IDs for a seed track. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// Tracks with the attribute values nearest to the target values will be preferred. - /// For each tunable track attribute, a hard floor on the selected track attribute’s value can be provided - /// For each tunable track attribute, a hard ceiling on the selected track attribute’s value can be provided - /// The target size of the list of recommended tracks. Default: 20. Minimum: 1. Maximum: 100. - /// For seeds with unusually small pools or when highly restrictive filtering is applied, it may be impossible to generate the requested number of recommended tracks. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// Because min_*, max_* and target_* are applied to pools before relinking, the generated results may not precisely match the filters applied. - /// - /// AUTH NEEDED - public Task GetRecommendationsAsync(List artistSeed = null, List genreSeed = null, List trackSeed = null, - TuneableTrack target = null, TuneableTrack min = null, TuneableTrack max = null, int limit = 20, string market = "") - { - return DownloadDataAsync(_builder.GetRecommendations(artistSeed, genreSeed, trackSeed, target, min, max, limit, market)); - } - - /// - /// Retrieve a list of available genres seed parameter values for recommendations. - /// - /// - /// AUTH NEEDED - public RecommendationSeedGenres GetRecommendationSeedsGenres() - { - return DownloadData(_builder.GetRecommendationSeedsGenres()); - } - - /// - /// Retrieve a list of available genres seed parameter values for recommendations asynchronously. - /// - /// - /// AUTH NEEDED - public Task GetRecommendationSeedsGenresAsync() - { - return DownloadDataAsync(_builder.GetRecommendationSeedsGenres()); - } - - #endregion Browse - - #region Follow - - /// - /// Get the current user’s followed artists. - /// - /// The ID type: currently only artist is supported. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The last artist ID retrieved from the previous request. - /// - /// AUTH NEEDED - public FollowedArtists GetFollowedArtists(FollowType followType, int limit = 20, string after = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetFollowedArtists"); - return DownloadData(_builder.GetFollowedArtists(limit, after)); - } - - /// - /// Get the current user’s followed artists asynchronously. - /// - /// The ID type: currently only artist is supported. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The last artist ID retrieved from the previous request. - /// - /// AUTH NEEDED - public Task GetFollowedArtistsAsync(FollowType followType, int limit = 20, string after = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetFollowedArtists"); - return DownloadDataAsync(_builder.GetFollowedArtists(limit, after)); - } - - /// - /// Add the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs - /// - /// AUTH NEEDED - public ErrorResponse Follow(FollowType followType, List ids) - { - JObject ob = new JObject - { - {"ids", new JArray(ids)} - }; - return UploadData(_builder.Follow(followType), ob.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Add the current user as a follower of one or more artists or other Spotify users asynchronously. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs - /// - /// AUTH NEEDED - public async Task FollowAsync(FollowType followType, List ids) - { - JObject ob = new JObject - { - {"ids", new JArray(ids)} - }; - return await UploadDataAsync(_builder.Follow(followType), - ob.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Add the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public ErrorResponse Follow(FollowType followType, string id) - { - return Follow(followType, new List { id }); - } - - /// - /// Add the current user as a follower of one or more artists or other Spotify users asynchronously. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public Task FollowAsync(FollowType followType, string id) - { - return FollowAsync(followType, new List { id }); - } - - /// - /// Remove the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs - /// - /// AUTH NEEDED - public ErrorResponse Unfollow(FollowType followType, List ids) - { - JObject ob = new JObject - { - {"ids", new JArray(ids)} - }; - return UploadData(_builder.Unfollow(followType), ob.ToString(Formatting.None), "DELETE") ?? new ErrorResponse(); - } - - /// - /// Remove the current user as a follower of one or more artists or other Spotify users asynchronously. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs - /// - /// AUTH NEEDED - public async Task UnfollowAsync(FollowType followType, List ids) - { - JObject ob = new JObject - { - {"ids", new JArray(ids)} - }; - return await UploadDataAsync(_builder.Unfollow(followType), ob.ToString(Formatting.None), "DELETE").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Remove the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public ErrorResponse Unfollow(FollowType followType, string id) - { - return Unfollow(followType, new List { id }); - } - - /// - /// Remove the current user as a follower of one or more artists or other Spotify users asynchronously. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public Task UnfollowAsync(FollowType followType, string id) - { - return UnfollowAsync(followType, new List { id }); - } - - /// - /// Check to see if the current user is following one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs to check - /// - /// AUTH NEEDED - public ListResponse IsFollowing(FollowType followType, List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for IsFollowing"); - - string url = _builder.IsFollowing(followType, ids); - return DownloadList(url); - } - - - - /// - /// Check to see if the current user is following one or more artists or other Spotify users asynchronously. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs to check - /// - /// AUTH NEEDED - public Task> IsFollowingAsync(FollowType followType, List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for IsFollowing"); - - string url = _builder.IsFollowing(followType, ids); - return DownloadListAsync(url); - } - - /// - /// Check to see if the current user is following one artist or another Spotify user. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public ListResponse IsFollowing(FollowType followType, string id) - { - return IsFollowing(followType, new List { id }); - } - - /// - /// Check to see if the current user is following one artist or another Spotify user asynchronously. - /// - /// The ID type: either artist or user. - /// Artists or the Users Spotify ID - /// - /// AUTH NEEDED - public Task> IsFollowingAsync(FollowType followType, string id) - { - return IsFollowingAsync(followType, new List { id }); - } - - /// - /// Add the current user as a follower of a playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// - /// The Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private - /// status, as long as you know its playlist ID. - /// - /// - /// If true the playlist will be included in user's public playlists, if false it will remain - /// private. - /// - /// - /// AUTH NEEDED - public ErrorResponse FollowPlaylist(string ownerId, string playlistId, bool showPublic = true) - { - JObject body = new JObject - { - {"public", showPublic} - }; - return UploadData(_builder.FollowPlaylist(ownerId, playlistId, showPublic), body.ToString(Formatting.None), "PUT"); - } - - /// - /// Add the current user as a follower of a playlist asynchronously. - /// - /// The Spotify user ID of the person who owns the playlist. - /// - /// The Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private - /// status, as long as you know its playlist ID. - /// - /// - /// If true the playlist will be included in user's public playlists, if false it will remain - /// private. - /// - /// - /// AUTH NEEDED - public Task FollowPlaylistAsync(string ownerId, string playlistId, bool showPublic = true) - { - JObject body = new JObject - { - {"public", showPublic} - }; - return UploadDataAsync(_builder.FollowPlaylist(ownerId, playlistId, showPublic), body.ToString(Formatting.None), "PUT"); - } - - /// - /// Remove the current user as a follower of a playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist that is to be no longer followed. - /// - /// AUTH NEEDED - public ErrorResponse UnfollowPlaylist(string ownerId, string playlistId) - { - return UploadData(_builder.UnfollowPlaylist(ownerId, playlistId), "", "DELETE"); - } - - /// - /// Remove the current user as a follower of a playlist asynchronously. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist that is to be no longer followed. - /// - /// AUTH NEEDED - public Task UnfollowPlaylistAsync(string ownerId, string playlistId) - { - return UploadDataAsync(_builder.UnfollowPlaylist(ownerId, playlistId), "", "DELETE"); - } - - /// - /// Check to see if one or more Spotify users are following a specified playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist. - /// A list of Spotify User IDs - /// - /// AUTH NEEDED - public ListResponse IsFollowingPlaylist(string ownerId, string playlistId, List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for IsFollowingPlaylist"); - - string url = _builder.IsFollowingPlaylist(ownerId, playlistId, ids); - return DownloadList(url); - } - - /// - /// Check to see if one or more Spotify users are following a specified playlist asynchronously. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist. - /// A list of Spotify User IDs - /// - /// AUTH NEEDED - public Task> IsFollowingPlaylistAsync(string ownerId, string playlistId, List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for IsFollowingPlaylist"); - - string url = _builder.IsFollowingPlaylist(ownerId, playlistId, ids); - return DownloadListAsync(url); - } - - /// - /// Check to see if one or more Spotify users are following a specified playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist. - /// A Spotify User ID - /// - /// AUTH NEEDED - public ListResponse IsFollowingPlaylist(string ownerId, string playlistId, string id) - { - return IsFollowingPlaylist(ownerId, playlistId, new List { id }); - } - - /// - /// Check to see if one or more Spotify users are following a specified playlist asynchronously. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist. - /// A Spotify User ID - /// - /// AUTH NEEDED - public Task> IsFollowingPlaylistAsync(string ownerId, string playlistId, string id) - { - return IsFollowingPlaylistAsync(ownerId, playlistId, new List { id }); - } - - #endregion Follow - - #region Library - - /// - /// Save one or more tracks to the current user’s “Your Music” library. - /// - /// A list of the Spotify IDs - /// - /// AUTH NEEDED - public ErrorResponse SaveTracks(List ids) - { - JArray array = new JArray(ids); - return UploadData(_builder.SaveTracks(), array.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Save one or more tracks to the current user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs - /// - /// AUTH NEEDED - public async Task SaveTracksAsync(List ids) - { - JArray array = new JArray(ids); - return await UploadDataAsync(_builder.SaveTracks(), array.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Save one track to the current user’s “Your Music” library. - /// - /// A Spotify ID - /// - /// AUTH NEEDED - public ErrorResponse SaveTrack(string id) - { - return SaveTracks(new List { id }); - } - - /// - /// Save one track to the current user’s “Your Music” library asynchronously. - /// - /// A Spotify ID - /// - /// AUTH NEEDED - public Task SaveTrackAsync(string id) - { - return SaveTracksAsync(new List { id }); - } - - /// - /// Get a list of the songs saved in the current Spotify user’s “Your Music” library. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Paging GetSavedTracks(int limit = 20, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetSavedTracks"); - return DownloadData>(_builder.GetSavedTracks(limit, offset, market)); - } - - /// - /// Get a list of the songs saved in the current Spotify user’s “Your Music” library asynchronously. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Task> GetSavedTracksAsync(int limit = 20, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetSavedTracks"); - return DownloadDataAsync>(_builder.GetSavedTracks(limit, offset, market)); - } - - /// - /// Remove one or more tracks from the current user’s “Your Music” library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public ErrorResponse RemoveSavedTracks(List ids) - { - JArray array = new JArray(ids); - return UploadData(_builder.RemoveSavedTracks(), array.ToString(Formatting.None), "DELETE") ?? new ErrorResponse(); - } - - /// - /// Remove one or more tracks from the current user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public async Task RemoveSavedTracksAsync(List ids) - { - JArray array = new JArray(ids); - return await UploadDataAsync(_builder.RemoveSavedTracks(), array.ToString(Formatting.None), "DELETE").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public ListResponse CheckSavedTracks(List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for CheckSavedTracks"); - - string url = _builder.CheckSavedTracks(ids); - return DownloadList(url); - } - - /// - /// Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public Task> CheckSavedTracksAsync(List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for CheckSavedTracks"); - string url = _builder.CheckSavedTracks(ids); - return DownloadListAsync(url); - } - - /// - /// Save one or more albums to the current user’s “Your Music” library. - /// - /// A list of the Spotify IDs - /// - /// AUTH NEEDED - public ErrorResponse SaveAlbums(List ids) - { - JArray array = new JArray(ids); - return UploadData(_builder.SaveAlbums(), array.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Save one or more albums to the current user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs - /// - /// AUTH NEEDED - public async Task SaveAlbumsAsync(List ids) - { - JArray array = new JArray(ids); - return await UploadDataAsync(_builder.SaveAlbums(), array.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Save one album to the current user’s “Your Music” library. - /// - /// A Spotify ID - /// - /// AUTH NEEDED - public ErrorResponse SaveAlbum(string id) - { - return SaveAlbums(new List { id }); - } - - /// - /// Save one album to the current user’s “Your Music” library asynchronously. - /// - /// A Spotify ID - /// - /// AUTH NEEDED - public Task SaveAlbumAsync(string id) - { - return SaveAlbumsAsync(new List { id }); - } - - /// - /// Get a list of the albums saved in the current Spotify user’s “Your Music” library. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Paging GetSavedAlbums(int limit = 20, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetSavedAlbums"); - return DownloadData>(_builder.GetSavedAlbums(limit, offset, market)); - } - - /// - /// Get a list of the albums saved in the current Spotify user’s “Your Music” library asynchronously. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Task> GetSavedAlbumsAsync(int limit = 20, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetSavedAlbumsAsync"); - return DownloadDataAsync>(_builder.GetSavedAlbums(limit, offset, market)); - } - - /// - /// Remove one or more albums from the current user’s “Your Music” library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public ErrorResponse RemoveSavedAlbums(List ids) - { - JArray array = new JArray(ids); - return UploadData(_builder.RemoveSavedAlbums(), array.ToString(Formatting.None), "DELETE") ?? new ErrorResponse(); - } - - /// - /// Remove one or more albums from the current user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public async Task RemoveSavedAlbumsAsync(List ids) - { - JArray array = new JArray(ids); - return await UploadDataAsync(_builder.RemoveSavedAlbums(), array.ToString(Formatting.None), "DELETE").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Check if one or more albums is already saved in the current Spotify user’s “Your Music” library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public ListResponse CheckSavedAlbums(List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for CheckSavedTracks"); - - string url = _builder.CheckSavedAlbums(ids); - return DownloadList(url); - } - - /// - /// Check if one or more albums is already saved in the current Spotify user’s “Your Music” library asynchronously. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public Task> CheckSavedAlbumsAsync(List ids) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for CheckSavedAlbumsAsync"); - string url = _builder.CheckSavedAlbums(ids); - return DownloadListAsync(url); - } - - #endregion Library - - #region Personalization - - /// - /// Get the current user’s top tracks based on calculated affinity. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public Paging GetUsersTopTracks(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - return DownloadData>(_builder.GetUsersTopTracks(timeRange, limit, offest)); - } - - /// - /// Get the current user’s top tracks based on calculated affinity asynchronously. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public Task> GetUsersTopTracksAsync(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - return DownloadDataAsync>(_builder.GetUsersTopTracks(timeRange, limit, offest)); - } - - /// - /// Get the current user’s top artists based on calculated affinity. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public Paging GetUsersTopArtists(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - return DownloadData>(_builder.GetUsersTopArtists(timeRange, limit, offest)); - } - - /// - /// Get the current user’s top artists based on calculated affinity asynchronously. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public Task> GetUsersTopArtistsAsync(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - return DownloadDataAsync>(_builder.GetUsersTopArtists(timeRange, limit, offest)); - } - - /// - /// Get tracks from the current user’s recent play history. - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// A Unix timestamp in milliseconds. Returns all items after (but not including) this cursor position. If after is specified, before must not be specified. - /// A Unix timestamp in milliseconds. Returns all items before (but not including) this cursor position. If before is specified, after must not be specified. - /// - /// AUTH NEEDED - public CursorPaging GetUsersRecentlyPlayedTracks(int limit = 20, DateTime? after = null, - DateTime? before = null) - { - return DownloadData>(_builder.GetUsersRecentlyPlayedTracks(limit, after, before)); - } - - /// - /// Get tracks from the current user’s recent play history asynchronously - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// A Unix timestamp in milliseconds. Returns all items after (but not including) this cursor position. If after is specified, before must not be specified. - /// A Unix timestamp in milliseconds. Returns all items before (but not including) this cursor position. If before is specified, after must not be specified. - /// - /// AUTH NEEDED - public Task> GetUsersRecentlyPlayedTracksAsync(int limit = 20, DateTime? after = null, - DateTime? before = null) - { - return DownloadDataAsync>(_builder.GetUsersRecentlyPlayedTracks(limit, after, before)); - } - - #endregion - - #region Playlists - - /// - /// Get a list of the playlists owned or followed by a Spotify user. - /// - /// The user's Spotify user ID. - /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first playlist to return. Default: 0 (the first object) - /// - /// AUTH NEEDED - public Paging GetUserPlaylists(string userId, int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetUserPlaylists"); - return DownloadData>(_builder.GetUserPlaylists(userId, limit, offset)); - } - - /// - /// Get a list of the playlists owned or followed by a Spotify user asynchronously. - /// - /// The user's Spotify user ID. - /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first playlist to return. Default: 0 (the first object) - /// - /// AUTH NEEDED - public Task> GetUserPlaylistsAsync(string userId, int limit = 20, int offset = 0) - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetUserPlaylists"); - return DownloadDataAsync>(_builder.GetUserPlaylists(userId, limit, offset)); - } - - /// - /// Get a playlist owned by a Spotify user. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - [Obsolete("Calling GetPlaylist with a userId is deprecated, remove the parameter")] - public FullPlaylist GetPlaylist(string userId, string playlistId, string fields = "", string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylist"); - return DownloadData(_builder.GetPlaylist(userId, playlistId, fields, market)); - } - - /// - /// Get a playlist owned by a Spotify user. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public FullPlaylist GetPlaylist(string playlistId, string fields = "", string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylist"); - return DownloadData(_builder.GetPlaylist(playlistId, fields, market)); - } - - /// - /// Get a playlist owned by a Spotify user asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - [Obsolete("Calling GetPlaylist with a userId is deprecated, remove the parameter")] - public Task GetPlaylistAsync(string userId, string playlistId, string fields = "", string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylist"); - return DownloadDataAsync(_builder.GetPlaylist(userId, playlistId, fields, market)); - } - - /// - /// Get a playlist owned by a Spotify user asynchronously. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Task GetPlaylistAsync(string playlistId, string fields = "", string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylist"); - return DownloadDataAsync(_builder.GetPlaylist(playlistId, fields, market)); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - [Obsolete("Calling GetPlaylistTracks with a userId is deprecated, remove the parameter")] - public Paging GetPlaylistTracks(string userId, string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylistTracks"); - return DownloadData>(_builder.GetPlaylistTracks(userId, playlistId, fields, limit, offset, market)); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public Paging GetPlaylistTracks(string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylistTracks"); - return DownloadData>(_builder.GetPlaylistTracks(playlistId, fields, limit, offset, market)); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user asyncronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - [Obsolete("Calling GetPlaylistTracks with a userId is deprecated, remove the parameter")] - public Task> GetPlaylistTracksAsync(string userId, string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylistTracks"); - return DownloadDataAsync>(_builder.GetPlaylistTracks(userId, playlistId, fields, limit, offset, market)); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user asyncronously. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - [Obsolete("Calling GetPlaylistTracks with a userId is deprecated, remove the parameter")] - public Task> GetPlaylistTracksAsync(string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPlaylistTracks"); - return DownloadDataAsync>(_builder.GetPlaylistTracks(playlistId, fields, limit, offset, market)); - } - - /// - /// Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) - /// - /// The user's Spotify user ID. - /// - /// The name for the new playlist, for example "Your Coolest Playlist". This name does not need - /// to be unique. - /// - /// - /// default true. If true the playlist will be public, if false it will be private. To be able to - /// create private playlists, the user must have granted the playlist-modify-private scope. - /// - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. - /// Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - public FullPlaylist CreatePlaylist(string userId, string playlistName, bool isPublic = true, bool isCollaborative = false, string playlistDescription = "") - { - JObject body = new JObject - { - {"name", playlistName}, - {"public", isPublic}, - {"collaborative", isCollaborative}, - {"description", playlistDescription} - }; - return UploadData(_builder.CreatePlaylist(userId, playlistName, isPublic), body.ToString(Formatting.None)); - } - - /// - /// Create a playlist for a Spotify user asynchronously. (The playlist will be empty until you add tracks.) - /// - /// The user's Spotify user ID. - /// - /// The name for the new playlist, for example "Your Coolest Playlist". This name does not need - /// to be unique. - /// - /// - /// default true. If true the playlist will be public, if false it will be private. To be able to - /// create private playlists, the user must have granted the playlist-modify-private scope. - /// - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. - /// Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - public Task CreatePlaylistAsync(string userId, string playlistName, bool isPublic = true, bool isCollaborative = false, string playlistDescription = "") - { - JObject body = new JObject - { - {"name", playlistName}, - {"public", isPublic}, - {"collaborative", isCollaborative}, - {"description", playlistDescription} - }; - return UploadDataAsync(_builder.CreatePlaylist(userId, playlistName, isPublic), body.ToString(Formatting.None)); - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The new name for the playlist, for example "My New Playlist Title". - /// If true the playlist will be public, if false it will be private. - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. - /// Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - [Obsolete("Calling UpdatePlaylist with a userId is deprecated, remove the parameter")] - public ErrorResponse UpdatePlaylist(string userId, string playlistId, string newName = null, bool? newPublic = null, bool? newCollaborative = null, string newDescription = null) - { - JObject body = new JObject(); - if (newName != null) - body.Add("name", newName); - if (newPublic != null) - body.Add("public", newPublic); - if (newCollaborative != null) - body.Add("collaborative", newCollaborative); - if (newDescription != null) - body.Add("description", newDescription); - return UploadData(_builder.UpdatePlaylist(userId, playlistId), body.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The Spotify ID for the playlist. - /// The new name for the playlist, for example "My New Playlist Title". - /// If true the playlist will be public, if false it will be private. - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. - /// Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - public ErrorResponse UpdatePlaylist(string playlistId, string newName = null, bool? newPublic = null, bool? newCollaborative = null, string newDescription = null) - { - JObject body = new JObject(); - if (newName != null) - body.Add("name", newName); - if (newPublic != null) - body.Add("public", newPublic); - if (newCollaborative != null) - body.Add("collaborative", newCollaborative); - if (newDescription != null) - body.Add("description", newDescription); - return UploadData(_builder.UpdatePlaylist(playlistId), body.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state asynchronously. (The user must, of course, own the playlist.) - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The new name for the playlist, for example "My New Playlist Title". - /// If true the playlist will be public, if false it will be private. - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - [Obsolete("Calling UpdatePlaylist with a userId is deprecated, remove the parameter")] - public async Task UpdatePlaylistAsync(string userId, string playlistId, string newName = null, bool? newPublic = null, bool? newCollaborative = null, string newDescription = null) - { - JObject body = new JObject(); - if (newName != null) - body.Add("name", newName); - if (newPublic != null) - body.Add("public", newPublic); - if (newCollaborative != null) - body.Add("collaborative", newCollaborative); - if (newDescription != null) - body.Add("description", newDescription); - return await UploadDataAsync(_builder.UpdatePlaylist(userId, playlistId), body.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state asynchronously. (The user must, of course, own the playlist.) - /// - /// The Spotify ID for the playlist. - /// The new name for the playlist, for example "My New Playlist Title". - /// If true the playlist will be public, if false it will be private. - /// If true the playlist will become collaborative and other users will be able to modify the playlist in their Spotify client. Note: You can only set collaborative to true on non-public playlists. - /// Value for playlist description as displayed in Spotify Clients and in the Web API. - /// - /// AUTH NEEDED - public async Task UpdatePlaylistAsync(string playlistId, string newName = null, bool? newPublic = null, bool? newCollaborative = null, string newDescription = null) - { - JObject body = new JObject(); - if (newName != null) - body.Add("name", newName); - if (newPublic != null) - body.Add("public", newPublic); - if (newCollaborative != null) - body.Add("collaborative", newCollaborative); - if (newDescription != null) - body.Add("description", newDescription); - return await UploadDataAsync(_builder.UpdatePlaylist(playlistId), body.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The image as a base64 encoded string - /// - /// AUTH NEEDED - public ErrorResponse UploadPlaylistImage(string userId, string playlistId, string base64EncodedJpgImage) - { - return UploadData(_builder.UploadPlaylistImage(userId, playlistId), base64EncodedJpgImage, "PUT") ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state asynchronously. (The user must, of course, own the playlist.) - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The image as a base64 encoded string - /// - /// AUTH NEEDED - public async Task UploadPlaylistImageAsync(string userId, string playlistId, string base64EncodedJpgImage) - { - return await UploadDataAsync(_builder.UploadPlaylistImage(userId, playlistId), base64EncodedJpgImage, "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The Spotify ID for the playlist. - /// The image as a base64 encoded string - /// - /// AUTH NEEDED - public ErrorResponse UploadPlaylistImage(string playlistId, string base64EncodedJpgImage) - { - return UploadData(_builder.UploadPlaylistImage(playlistId), base64EncodedJpgImage, "PUT") ?? new ErrorResponse(); - } - - /// - /// Change a playlist’s name and public/private state asynchronously. (The user must, of course, own the playlist.) - /// - /// The Spotify ID for the playlist. - /// The image as a base64 encoded string - /// - /// AUTH NEEDED - public async Task UploadPlaylistImageAsync(string playlistId, string base64EncodedJpgImage) - { - return await UploadDataAsync(_builder.UploadPlaylistImage(playlistId), - base64EncodedJpgImage, "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request. - /// - /// AUTH NEEDED - [Obsolete("Calling ReplacePlaylistTracks with a userId is deprecated, remove the parameter")] - public ErrorResponse ReplacePlaylistTracks(string userId, string playlistId, List uris) - { - JObject body = new JObject - { - {"uris", new JArray(uris.Take(100))} - }; - return UploadData(_builder.ReplacePlaylistTracks(userId, playlistId), body.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request. - /// - /// AUTH NEEDED - public ErrorResponse ReplacePlaylistTracks(string playlistId, List uris) - { - JObject body = new JObject - { - {"uris", new JArray(uris.Take(100))} - }; - return UploadData(_builder.ReplacePlaylistTracks(playlistId), body.ToString(Formatting.None), "PUT") ?? new ErrorResponse(); - } - - /// - /// Replace all the tracks in a playlist asynchronously, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request. - /// - /// AUTH NEEDED - [Obsolete("Calling ReplacePlaylistTracks with a userId is deprecated, remove the parameter")] - public async Task ReplacePlaylistTracksAsync(string userId, string playlistId, List uris) - { - JObject body = new JObject - { - {"uris", new JArray(uris.Take(100))} - }; - return await UploadDataAsync(_builder.ReplacePlaylistTracks(userId, playlistId), body.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Replace all the tracks in a playlist asynchronously, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request. - /// - /// AUTH NEEDED - public async Task ReplacePlaylistTracksAsync(string playlistId, List uris) - { - JObject body = new JObject - { - {"uris", new JArray(uris.Take(100))} - }; - return await UploadDataAsync(_builder.ReplacePlaylistTracks(playlistId), body.ToString(Formatting.None), "PUT").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Remove one or more tracks from a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - [Obsolete("Calling RemovePlaylistTracks with a userId is deprecated, remove the parameter")] - public ErrorResponse RemovePlaylistTracks(string userId, string playlistId, List uris) - { - JObject body = new JObject - { - {"tracks", JArray.FromObject(uris.Take(100))} - }; - return UploadData(_builder.RemovePlaylistTracks(userId, playlistId, uris), body.ToString(Formatting.None), "DELETE") ?? new ErrorResponse(); - } - - /// - /// Remove one or more tracks from a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - public ErrorResponse RemovePlaylistTracks(string playlistId, List uris) - { - JObject body = new JObject - { - {"tracks", JArray.FromObject(uris.Take(100))} - }; - return UploadData(_builder.RemovePlaylistTracks(playlistId, uris), body.ToString(Formatting.None), "DELETE") ?? new ErrorResponse(); - } - - /// - /// Remove one or more tracks from a user’s playlist asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - [Obsolete("Calling RemovePlaylistTracks with a userId is deprecated, remove the parameter")] - public async Task RemovePlaylistTracksAsync(string userId, string playlistId, List uris) - { - JObject body = new JObject - { - {"tracks", JArray.FromObject(uris.Take(100))} - }; - return await UploadDataAsync(_builder.RemovePlaylistTracks(userId, playlistId, uris), body.ToString(Formatting.None), "DELETE").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Remove one or more tracks from a user’s playlist asynchronously. - /// - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - public async Task RemovePlaylistTracksAsync(string playlistId, List uris) - { - JObject body = new JObject - { - {"tracks", JArray.FromObject(uris.Take(100))} - }; - return await UploadDataAsync(_builder.RemovePlaylistTracks(playlistId, uris), body.ToString(Formatting.None), "DELETE").ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Remove a track from a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// Spotify URI - /// - /// AUTH NEEDED - [Obsolete("Calling RemovePlaylistTrack with a userId is deprecated, remove the parameter")] - public ErrorResponse RemovePlaylistTrack(string userId, string playlistId, DeleteTrackUri uri) - { - return RemovePlaylistTracks(playlistId, new List { uri }); - } - - /// - /// Remove a track from a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// Spotify URI - /// - /// AUTH NEEDED - public ErrorResponse RemovePlaylistTrack(string playlistId, DeleteTrackUri uri) - { - return RemovePlaylistTracks(playlistId, new List { uri }); - } - - /// - /// Remove a track from a user’s playlist asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// Spotify URI - /// - /// AUTH NEEDED - [Obsolete("Calling RemovePlaylistTrack with a userId is deprecated, remove the parameter")] - public Task RemovePlaylistTrackAsync(string userId, string playlistId, DeleteTrackUri uri) - { - return RemovePlaylistTracksAsync(playlistId, new List { uri }); - } - - /// - /// Remove a track from a user’s playlist asynchronously. - /// - /// The Spotify ID for the playlist. - /// Spotify URI - /// - /// AUTH NEEDED - public Task RemovePlaylistTrackAsync(string playlistId, DeleteTrackUri uri) - { - return RemovePlaylistTracksAsync(playlistId, new List { uri }); - } - - /// - /// Add one or more tracks to a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - [Obsolete("Calling AddPlaylistTracks with a userId is deprecated, remove the parameter")] - public ErrorResponse AddPlaylistTracks(string userId, string playlistId, List uris, int? position = null) - { - JObject body = new JObject - { - {"uris", JArray.FromObject(uris.Take(100))} - }; - return UploadData(_builder.AddPlaylistTracks(userId, playlistId, uris, position), body.ToString(Formatting.None)) ?? new ErrorResponse(); - } - - /// - /// Add one or more tracks to a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public ErrorResponse AddPlaylistTracks(string playlistId, List uris, int? position = null) - { - JObject body = new JObject - { - {"uris", JArray.FromObject(uris.Take(100))} - }; - return UploadData(_builder.AddPlaylistTracks(playlistId, uris, position), body.ToString(Formatting.None)) ?? new ErrorResponse(); - } - - /// - /// Add one or more tracks to a user’s playlist asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - [Obsolete("Calling AddPlaylistTracks with a userId is deprecated, remove the parameter")] - public async Task AddPlaylistTracksAsync(string userId, string playlistId, List uris, int? position = null) - { - JObject body = new JObject - { - {"uris", JArray.FromObject(uris.Take(100))} - }; - return await UploadDataAsync(_builder.AddPlaylistTracks(userId, playlistId, uris, position), body.ToString(Formatting.None)).ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Add one or more tracks to a user’s playlist asynchronously. - /// - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public async Task AddPlaylistTracksAsync(string playlistId, List uris, int? position = null) - { - JObject body = new JObject - { - {"uris", JArray.FromObject(uris.Take(100))} - }; - return await UploadDataAsync(_builder.AddPlaylistTracks(playlistId, uris, position), body.ToString(Formatting.None)).ConfigureAwait(false) ?? new ErrorResponse(); - } - - /// - /// Add a track to a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A Spotify Track URI - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - [Obsolete("Calling AddPlaylistTrack with a userId is deprecated, remove the parameter")] - public ErrorResponse AddPlaylistTrack(string userId, string playlistId, string uri, int? position = null) - { - return AddPlaylistTracks(playlistId, new List { uri }, position); - } - - - /// - /// Add a track to a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// A Spotify Track URI - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public ErrorResponse AddPlaylistTrack(string playlistId, string uri, int? position = null) - { - return AddPlaylistTracks(playlistId, new List { uri }, position); - } - - /// - /// Add a track to a user’s playlist asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A Spotify Track URI - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - [Obsolete("Calling AddPlaylistTrack with a userId is deprecated, remove the parameter")] - public Task AddPlaylistTrackAsync(string userId, string playlistId, string uri, int? position = null) - { - return AddPlaylistTracksAsync(userId, playlistId, new List { uri }, position); - } - - /// - /// Add a track to a user’s playlist asynchronously. - /// - /// The Spotify ID for the playlist. - /// A Spotify Track URI - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public Task AddPlaylistTrackAsync(string playlistId, string uri, int? position = null) - { - return AddPlaylistTracksAsync(playlistId, new List { uri }, position); - } - - /// - /// Reorder a track or a group of tracks in a playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The position of the first track to be reordered. - /// The position where the tracks should be inserted. - /// The amount of tracks to be reordered. Defaults to 1 if not set. - /// The playlist's snapshot ID against which you want to make the changes. - /// - /// AUTH NEEDED - [Obsolete("Calling ReorderPlaylist with a userId is deprecated, remove the parameter")] - public Snapshot ReorderPlaylist(string userId, string playlistId, int rangeStart, int insertBefore, int rangeLength = 1, string snapshotId = "") - { - JObject body = new JObject - { - {"range_start", rangeStart}, - {"range_length", rangeLength}, - {"insert_before", insertBefore} - }; - if (!string.IsNullOrEmpty(snapshotId)) - body.Add("snapshot_id", snapshotId); - return UploadData(_builder.ReorderPlaylist(userId, playlistId), body.ToString(Formatting.None), "PUT"); - } - - /// - /// Reorder a track or a group of tracks in a playlist. - /// - /// The Spotify ID for the playlist. - /// The position of the first track to be reordered. - /// The position where the tracks should be inserted. - /// The amount of tracks to be reordered. Defaults to 1 if not set. - /// The playlist's snapshot ID against which you want to make the changes. - /// - /// AUTH NEEDED - public Snapshot ReorderPlaylist(string playlistId, int rangeStart, int insertBefore, int rangeLength = 1, string snapshotId = "") - { - JObject body = new JObject - { - {"range_start", rangeStart}, - {"range_length", rangeLength}, - {"insert_before", insertBefore} - }; - if (!string.IsNullOrEmpty(snapshotId)) - body.Add("snapshot_id", snapshotId); - return UploadData(_builder.ReorderPlaylist(playlistId), body.ToString(Formatting.None), "PUT"); - } - - /// - /// Reorder a track or a group of tracks in a playlist asynchronously. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// The position of the first track to be reordered. - /// The position where the tracks should be inserted. - /// The amount of tracks to be reordered. Defaults to 1 if not set. - /// The playlist's snapshot ID against which you want to make the changes. - /// - /// AUTH NEEDED - [Obsolete("Calling ReorderPlaylist with a userId is deprecated, remove the parameter")] - public Task ReorderPlaylistAsync(string userId, string playlistId, int rangeStart, int insertBefore, int rangeLength = 1, string snapshotId = "") - { - JObject body = new JObject - { - {"range_start", rangeStart}, - {"range_length", rangeLength}, - {"insert_before", insertBefore}, - {"snapshot_id", snapshotId} - }; - if (!string.IsNullOrEmpty(snapshotId)) - body.Add("snapshot_id", snapshotId); - return UploadDataAsync(_builder.ReorderPlaylist(userId, playlistId), body.ToString(Formatting.None), "PUT"); - } - - /// - /// Reorder a track or a group of tracks in a playlist asynchronously. - /// - /// The Spotify ID for the playlist. - /// The position of the first track to be reordered. - /// The position where the tracks should be inserted. - /// The amount of tracks to be reordered. Defaults to 1 if not set. - /// The playlist's snapshot ID against which you want to make the changes. - /// - /// AUTH NEEDED - public Task ReorderPlaylistAsync(string playlistId, int rangeStart, int insertBefore, int rangeLength = 1, string snapshotId = "") - { - JObject body = new JObject - { - {"range_start", rangeStart}, - {"range_length", rangeLength}, - {"insert_before", insertBefore}, - {"snapshot_id", snapshotId} - }; - if (!string.IsNullOrEmpty(snapshotId)) - body.Add("snapshot_id", snapshotId); - return UploadDataAsync(_builder.ReorderPlaylist(playlistId), body.ToString(Formatting.None), "PUT"); - } - - #endregion Playlists - - #region Profiles - - /// - /// Get detailed profile information about the current user (including the current user’s username). - /// - /// - /// AUTH NEEDED - public PrivateProfile GetPrivateProfile() - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPrivateProfile"); - return DownloadData(_builder.GetPrivateProfile()); - } - - /// - /// Get detailed profile information about the current user asynchronously (including the current user’s username). - /// - /// - /// AUTH NEEDED - public Task GetPrivateProfileAsync() - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for GetPrivateProfile"); - return DownloadDataAsync(_builder.GetPrivateProfile()); - } - - /// - /// Get public profile information about a Spotify user. - /// - /// The user's Spotify user ID. - /// - public PublicProfile GetPublicProfile(string userId) - { - return DownloadData(_builder.GetPublicProfile(userId)); - } - - /// - /// Get public profile information about a Spotify user asynchronously. - /// - /// The user's Spotify user ID. - /// - public Task GetPublicProfileAsync(string userId) - { - return DownloadDataAsync(_builder.GetPublicProfile(userId)); - } - - #endregion Profiles - - #region Tracks - - /// - /// Get Spotify catalog information for multiple tracks based on their Spotify IDs. - /// - /// A list of the Spotify IDs for the tracks. Maximum: 50 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public SeveralTracks GetSeveralTracks(List ids, string market = "") - { - return DownloadData(_builder.GetSeveralTracks(ids, market)); - } - - /// - /// Get Spotify catalog information for multiple tracks based on their Spotify IDs asynchronously. - /// - /// A list of the Spotify IDs for the tracks. Maximum: 50 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetSeveralTracksAsync(List ids, string market = "") - { - return DownloadDataAsync(_builder.GetSeveralTracks(ids, market)); - } - - /// - /// Get Spotify catalog information for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public FullTrack GetTrack(string id, string market = "") - { - return DownloadData(_builder.GetTrack(id, market)); - } - - /// - /// Get Spotify catalog information for a single track identified by its unique Spotify ID asynchronously. - /// - /// The Spotify ID for the track. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetTrackAsync(string id, string market = "") - { - return DownloadDataAsync(_builder.GetTrack(id, market)); - } - - /// - /// Get a detailed audio analysis for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public AudioAnalysis GetAudioAnalysis(string id) - { - return DownloadData(_builder.GetAudioAnalysis(id)); - } - - /// - /// Get a detailed audio analysis for a single track identified by its unique Spotify ID asynchronously. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public Task GetAudioAnalysisAsync(string id) - { - return DownloadDataAsync(_builder.GetAudioAnalysis(id)); - } - - /// - /// Get audio feature information for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public AudioFeatures GetAudioFeatures(string id) - { - return DownloadData(_builder.GetAudioFeatures(id)); - } - - /// - /// Get audio feature information for a single track identified by its unique Spotify ID asynchronously. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public Task GetAudioFeaturesAsync(string id) - { - return DownloadDataAsync(_builder.GetAudioFeatures(id)); - } - - /// - /// Get audio features for multiple tracks based on their Spotify IDs. - /// - /// A list of Spotify Track-IDs. Maximum: 100 IDs. - /// - /// AUTH NEEDED - public SeveralAudioFeatures GetSeveralAudioFeatures(List ids) - { - return DownloadData(_builder.GetSeveralAudioFeatures(ids)); - } - - /// - /// Get audio features for multiple tracks based on their Spotify IDs asynchronously. - /// - /// A list of Spotify Track-IDs. Maximum: 100 IDs. - /// - /// AUTH NEEDED - public Task GetSeveralAudioFeaturesAsync(List ids) - { - return DownloadDataAsync(_builder.GetSeveralAudioFeatures(ids)); - } - - #endregion Tracks - - #region Player - - /// - /// Get information about a user’s available devices. - /// - /// - public AvailabeDevices GetDevices() - { - return DownloadData(_builder.GetDevices()); - } - - /// - /// Get information about a user’s available devices. - /// - /// - public Task GetDevicesAsync() - { - return DownloadDataAsync(_builder.GetDevices()); - } - - /// - /// Get information about the user’s current playback state, including track, track progress, and active device. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public PlaybackContext GetPlayback(string market = "") - { - return DownloadData(_builder.GetPlayback(market)); - } - - /// - /// Get information about the user’s current playback state, including track, track progress, and active device. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetPlaybackAsync(string market = "") - { - return DownloadDataAsync(_builder.GetPlayback(market)); - } - - /// - /// Get the object currently being played on the user’s Spotify account. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public PlaybackContext GetPlayingTrack(string market = "") - { - return DownloadData(_builder.GetPlayingTrack(market)); - } - - /// - /// Get the object currently being played on the user’s Spotify account. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public Task GetPlayingTrackAsync(string market = "") - { - return DownloadDataAsync(_builder.GetPlayingTrack(market)); - } - - /// - /// Transfer playback to a new device and determine if it should start playing. - /// - /// ID of the device on which playback should be started/transferred to - /// - /// true: ensure playback happens on new device. - /// false or not provided: keep the current playback state. - /// - /// - public ErrorResponse TransferPlayback(string deviceId, bool play = false) => TransferPlayback( - new List { deviceId }, play); - - /// - /// Transfer playback to a new device and determine if it should start playing. - /// - /// ID of the device on which playback should be started/transferred to - /// - /// true: ensure playback happens on new device. - /// false or not provided: keep the current playback state. - /// - /// - public Task TransferPlaybackAsync(string deviceId, bool play = false) => TransferPlaybackAsync( - new List { deviceId }, play); - - /// - /// Transfer playback to a new device and determine if it should start playing. - /// NOTE: Although an array is accepted, only a single device_id is currently supported. Supplying more than one will return 400 Bad Request - /// - /// A array containing the ID of the device on which playback should be started/transferred. - /// - /// true: ensure playback happens on new device. - /// false or not provided: keep the current playback state. - /// - /// - public ErrorResponse TransferPlayback(List deviceIds, bool play = false) - { - JObject ob = new JObject - { - { "play", play }, - { "device_ids", new JArray(deviceIds) } - }; - return UploadData(_builder.TransferPlayback(), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Transfer playback to a new device and determine if it should start playing. - /// NOTE: Although an array is accepted, only a single device_id is currently supported. Supplying more than one will return 400 Bad Request - /// - /// A array containing the ID of the device on which playback should be started/transferred. - /// - /// true: ensure playback happens on new device. - /// false or not provided: keep the current playback state. - /// - /// - public Task TransferPlaybackAsync(List deviceIds, bool play = false) - { - JObject ob = new JObject - { - { "play", play }, - { "device_ids", new JArray(deviceIds) } - }; - return UploadDataAsync(_builder.TransferPlayback(), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Start a new context or resume current playback on the user’s active device. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// Spotify URI of the context to play. - /// A JSON array of the Spotify track URIs to play. - /// Indicates from where in the context playback should start. - /// Only available when context_uri corresponds to an album or playlist object, or when the uris parameter is used. - /// The starting time to seek the track to - /// - public ErrorResponse ResumePlayback(string deviceId = "", string contextUri = "", List uris = null, - int? offset = null, int positionMs = 0) - { - JObject ob = new JObject(); - if(!string.IsNullOrEmpty(contextUri)) - ob.Add("context_uri", contextUri); - if(uris != null) - ob.Add("uris", new JArray(uris)); - if(offset != null) - ob.Add("offset", new JObject { { "position", offset } }); - if (positionMs > 0) - ob.Add("position_ms", positionMs); - return UploadData(_builder.ResumePlayback(deviceId), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Start a new context or resume current playback on the user’s active device. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// Spotify URI of the context to play. - /// A JSON array of the Spotify track URIs to play. - /// Indicates from where in the context playback should start. - /// Only available when context_uri corresponds to an album or playlist object, or when the uris parameter is used. - /// The starting time to seek the track to - /// - public Task ResumePlaybackAsync(string deviceId = "", string contextUri = "", List uris = null, - int? offset = null, int positionMs = 0) - { - JObject ob = new JObject(); - if (!string.IsNullOrEmpty(contextUri)) - ob.Add("context_uri", contextUri); - if (uris != null) - ob.Add("uris", new JArray(uris)); - if (offset != null) - ob.Add("offset", new JObject { { "position", offset } }); - if (positionMs > 0) - ob.Add("position_ms", positionMs); - return UploadDataAsync(_builder.ResumePlayback(deviceId), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Start a new context or resume current playback on the user’s active device. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// Spotify URI of the context to play. - /// A JSON array of the Spotify track URIs to play. - /// Indicates from where in the context playback should start. - /// Only available when context_uri corresponds to an album or playlist object, or when the uris parameter is used. - /// The starting time to seek the track to - /// - public ErrorResponse ResumePlayback(string deviceId = "", string contextUri = "", List uris = null, - string offset = "", int positionMs = 0) - { - JObject ob = new JObject(); - if (!string.IsNullOrEmpty(contextUri)) - ob.Add("context_uri", contextUri); - if (uris != null) - ob.Add("uris", new JArray(uris)); - if (!string.IsNullOrEmpty(offset)) - ob.Add("offset", new JObject {{"uri", offset}}); - if (positionMs > 0) - ob.Add("position_ms", positionMs); - return UploadData(_builder.ResumePlayback(deviceId), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Start a new context or resume current playback on the user’s active device. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// Spotify URI of the context to play. - /// A JSON array of the Spotify track URIs to play. - /// Indicates from where in the context playback should start. - /// Only available when context_uri corresponds to an album or playlist object, or when the uris parameter is used. - /// The starting time to seek the track to - /// - public Task ResumePlaybackAsync(string deviceId = "", string contextUri = "", List uris = null, - string offset = "", int positionMs = 0) - { - JObject ob = new JObject(); - if (!string.IsNullOrEmpty(contextUri)) - ob.Add("context_uri", contextUri); - if (uris != null) - ob.Add("uris", new JArray(uris)); - if (!string.IsNullOrEmpty(offset)) - ob.Add("offset", new JObject { { "uri", offset } }); - if (positionMs > 0) - ob.Add("position_ms", positionMs); - return UploadDataAsync(_builder.ResumePlayback(deviceId), ob.ToString(Formatting.None), "PUT"); - } - - /// - /// Pause playback on the user’s account. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse PausePlayback(string deviceId = "") - { - return UploadData(_builder.PausePlayback(deviceId), string.Empty, "PUT"); - } - - /// - /// Pause playback on the user’s account. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task PausePlaybackAsync(string deviceId = "") - { - return UploadDataAsync(_builder.PausePlayback(deviceId), string.Empty, "PUT"); - } - - /// - /// Skips to next track in the user’s queue. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SkipPlaybackToNext(string deviceId = "") - { - return UploadData(_builder.SkipPlaybackToNext(deviceId), string.Empty); - } - - /// - /// Skips to next track in the user’s queue. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SkipPlaybackToNextAsync(string deviceId = "") - { - return UploadDataAsync(_builder.SkipPlaybackToNext(deviceId), string.Empty); - } - - /// - /// Skips to previous track in the user’s queue. - /// Note that this will ALWAYS skip to the previous track, regardless of the current track’s progress. - /// Returning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SkipPlaybackToPrevious(string deviceId = "") - { - return UploadData(_builder.SkipPlaybackToPrevious(deviceId), string.Empty); - } - - /// - /// Skips to previous track in the user’s queue. - /// Note that this will ALWAYS skip to the previous track, regardless of the current track’s progress. - /// Returning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SkipPlaybackToPreviousAsync(string deviceId = "") - { - return UploadDataAsync(_builder.SkipPlaybackToPrevious(deviceId), string.Empty); - } - - /// - /// Seeks to the given position in the user’s currently playing track. - /// - /// The position in milliseconds to seek to. Must be a positive number. - /// Passing in a position that is greater than the length of the track will cause the player to start playing the next song. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SeekPlayback(int positionMs, string deviceId = "") - { - return UploadData(_builder.SeekPlayback(positionMs, deviceId), string.Empty, "PUT"); - } - - /// - /// Seeks to the given position in the user’s currently playing track. - /// - /// The position in milliseconds to seek to. Must be a positive number. - /// Passing in a position that is greater than the length of the track will cause the player to start playing the next song. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SeekPlaybackAsync(int positionMs, string deviceId = "") - { - return UploadDataAsync(_builder.SeekPlayback(positionMs, deviceId), string.Empty, "PUT"); - } - - /// - /// Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. - /// - /// track, context or off. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SetRepeatMode(RepeatState state, string deviceId = "") - { - return UploadData(_builder.SetRepeatMode(state, deviceId), string.Empty, "PUT"); - } - - /// - /// Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. - /// - /// track, context or off. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SetRepeatModeAsync(RepeatState state, string deviceId = "") - { - return UploadDataAsync(_builder.SetRepeatMode(state, deviceId), string.Empty, "PUT"); - } - - /// - /// Set the volume for the user’s current playback device. - /// - /// Integer. The volume to set. Must be a value from 0 to 100 inclusive. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SetVolume(int volumePercent, string deviceId = "") - { - return UploadData(_builder.SetVolume(volumePercent, deviceId), string.Empty, "PUT"); - } - - /// - /// Set the volume for the user’s current playback device. - /// - /// Integer. The volume to set. Must be a value from 0 to 100 inclusive. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SetVolumeAsync(int volumePercent, string deviceId = "") - { - return UploadDataAsync(_builder.SetVolume(volumePercent, deviceId), string.Empty, "PUT"); - } - - /// - /// Toggle shuffle on or off for user’s playback. - /// - /// True or False - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public ErrorResponse SetShuffle(bool shuffle, string deviceId = "") - { - return UploadData(_builder.SetShuffle(shuffle, deviceId), string.Empty, "PUT"); - } - - /// - /// Toggle shuffle on or off for user’s playback. - /// - /// True or False - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public Task SetShuffleAsync(bool shuffle, string deviceId = "") - { - return UploadDataAsync(_builder.SetShuffle(shuffle, deviceId), string.Empty, "PUT"); - } - - #endregion - - #region Util - - public TOut GetNextPage(Paging paging) where TOut : BasicModel - { - if (!paging.HasNextPage()) - throw new InvalidOperationException("This Paging-Object has no Next-Page"); - return DownloadData(paging.Next); - } - - public Paging GetNextPage(Paging paging) - { - return GetNextPage, T>(paging); - } - - public Task GetNextPageAsync(Paging paging) where TOut : BasicModel - { - if (!paging.HasNextPage()) - throw new InvalidOperationException("This Paging-Object has no Next-Page"); - return DownloadDataAsync(paging.Next); - } - - public Task> GetNextPageAsync(Paging paging) - { - return GetNextPageAsync, T>(paging); - } - - public TOut GetPreviousPage(Paging paging) where TOut : BasicModel - { - if (!paging.HasPreviousPage()) - throw new InvalidOperationException("This Paging-Object has no Previous-Page"); - return DownloadData(paging.Previous); - } - - public Paging GetPreviousPage(Paging paging) - { - return GetPreviousPage, T>(paging); - } - - public Task GetPreviousPageAsync(Paging paging) where TOut : BasicModel - { - if (!paging.HasPreviousPage()) - throw new InvalidOperationException("This Paging-Object has no Previous-Page"); - return DownloadDataAsync(paging.Previous); - } - - public Task> GetPreviousPageAsync(Paging paging) - { - return GetPreviousPageAsync, T>(paging); - } - - private ListResponse DownloadList(string url) - { - int triesLeft = RetryTimes + 1; - Error lastError; - - ListResponse data = null; - do - { - if (data != null) { Thread.Sleep(RetryAfter); } - Tuple res = DownloadDataAlt(url); - data = ExtractDataToListResponse(res); - - lastError = data.Error; - - triesLeft -= 1; - - } while (UseAutoRetry && triesLeft > 0 && lastError != null && RetryErrorCodes.Contains(lastError.Status)); - - return data; - } - - private async Task> DownloadListAsync(string url) - { - int triesLeft = RetryTimes + 1; - Error lastError; - - ListResponse data = null; - do - { - if (data != null) { await Task.Delay(RetryAfter).ConfigureAwait(false); } - Tuple res = await DownloadDataAltAsync(url).ConfigureAwait(false); - data = ExtractDataToListResponse(res); - - lastError = data.Error; - - triesLeft -= 1; - - } while (UseAutoRetry && triesLeft > 0 && lastError != null && RetryErrorCodes.Contains(lastError.Status)); - - return data; - } - - private static ListResponse ExtractDataToListResponse(Tuple res) - { - ListResponse ret; - if (res.Item2 is JArray) - { - ret = new ListResponse - { - List = res.Item2.ToObject>(), - Error = null - }; - } - else - { - ret = new ListResponse - { - List = null, - Error = res.Item2["error"].ToObject() - }; - } - ret.AddResponseInfo(res.Item1); - return ret; - } - - public T UploadData(string url, string uploadData, string method = "POST") where T : BasicModel - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for all Upload-Actions"); - int triesLeft = RetryTimes + 1; - Error lastError; - - Tuple response = null; - do - { - Dictionary headers = new Dictionary - { - { "Authorization", TokenType + " " + AccessToken}, - { "Content-Type", "application/json" } - }; - - if (response != null) { Thread.Sleep(RetryAfter); } - response = WebClient.UploadJson(url, uploadData, method, headers); - - response.Item2.AddResponseInfo(response.Item1); - lastError = response.Item2.Error; - triesLeft -= 1; - - } while (UseAutoRetry && triesLeft > 0 && lastError != null && RetryErrorCodes.Contains(lastError.Status)); - - return response.Item2; - } - - public async Task UploadDataAsync(string url, string uploadData, string method = "POST") where T : BasicModel - { - if (!UseAuth) - throw new InvalidOperationException("Auth is required for all Upload-Actions"); - - int triesLeft = RetryTimes + 1; - Error lastError; - - Tuple response = null; - do - { - Dictionary headers = new Dictionary - { - { "Authorization", TokenType + " " + AccessToken}, - { "Content-Type", "application/json" } - }; - - if (response != null) { await Task.Delay(RetryAfter).ConfigureAwait(false); } - response = await WebClient.UploadJsonAsync(url, uploadData, method, headers).ConfigureAwait(false); - - response.Item2.AddResponseInfo(response.Item1); - lastError = response.Item2.Error; - - triesLeft -= 1; - - } while (UseAutoRetry && triesLeft > 0 && lastError != null && RetryErrorCodes.Contains(lastError.Status)); - - return response.Item2; - } - - public T DownloadData(string url) where T : BasicModel - { - int triesLeft = RetryTimes + 1; - Error lastError; - - Tuple response = null; - do - { - if(response != null) { Thread.Sleep(RetryAfter); } - response = DownloadDataAlt(url); - - response.Item2.AddResponseInfo(response.Item1); - lastError = response.Item2.Error; - - triesLeft -= 1; - - } while (UseAutoRetry && triesLeft > 0 && lastError != null && RetryErrorCodes.Contains(lastError.Status)); - - - return response.Item2; - } - - /// - /// Retrieves whether request had a "TooManyRequests" error, and get the amount Spotify recommends waiting before another request. - /// - /// Info object to analyze. - /// Seconds to wait before making another request. -1 if no error. - /// AUTH NEEDED - private int GetTooManyRequests(ResponseInfo info) - { - // 429 is "TooManyRequests" value specified in Spotify API - if (429 != (int)info.StatusCode) - { - return -1; - } - if (!int.TryParse(info.Headers.Get("Retry-After"), out int secondsToWait)) - { - return -1; - } - return secondsToWait; - } - - public async Task DownloadDataAsync(string url) where T : BasicModel - { - int triesLeft = RetryTimes + 1; - Error lastError; - - Tuple response = null; - do - { - if (response != null) - { - int msToWait = RetryAfter; - int secondsToWait = GetTooManyRequests(response.Item1); - if (secondsToWait > 0) - { - msToWait = secondsToWait * 1000; - } - await Task.Delay(msToWait).ConfigureAwait(false); - } - response = await DownloadDataAltAsync(url).ConfigureAwait(false); - - response.Item2.AddResponseInfo(response.Item1); - lastError = response.Item2.Error; - - if (TooManyRequestsConsumesARetry || GetTooManyRequests(response.Item1) == -1) - { - triesLeft -= 1; - } - - } while (UseAutoRetry - && triesLeft > 0 - && (GetTooManyRequests(response.Item1) != -1 - || lastError != null && RetryErrorCodes.Contains(lastError.Status))); - - - return response.Item2; - } - - private Tuple DownloadDataAlt(string url) - { - Dictionary headers = new Dictionary(); - if (UseAuth) - headers.Add("Authorization", TokenType + " " + AccessToken); - return WebClient.DownloadJson(url, headers); - } - - private Task> DownloadDataAltAsync(string url) - { - Dictionary headers = new Dictionary(); - if (UseAuth) - headers.Add("Authorization", TokenType + " " + AccessToken); - return WebClient.DownloadJsonAsync(url, headers); - } - - #endregion Util - } -} diff --git a/Source Files/SpotifyAPI.Web/SpotifyWebBuilder.cs b/Source Files/SpotifyAPI.Web/SpotifyWebBuilder.cs deleted file mode 100644 index 47e913a..0000000 --- a/Source Files/SpotifyAPI.Web/SpotifyWebBuilder.cs +++ /dev/null @@ -1,1129 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; - -namespace SpotifyAPI.Web -{ - /// - /// SpotifyAPI URL-Generator - /// - public class SpotifyWebBuilder - { - public const string APIBase = "https://api.spotify.com/v1"; - - #region Search - - /// - /// Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. - /// - /// The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. - /// A list of item types to search across. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first result to return. Default: 0 - /// An ISO 3166-1 alpha-2 country code or the string from_token. - /// - public string SearchItems(string q, SearchType type, int limit = 20, int offset = 0, string market = "") - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder(APIBase + "/search"); - builder.Append("?q=" + q); - builder.Append("&type=" + type.GetStringAttribute(",")); - builder.Append("&limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - #endregion Search - - #region Albums - - /// - /// Get Spotify catalog information about an album’s tracks. Optional parameters can be used to limit the number of - /// tracks returned. - /// - /// The Spotify ID for the album. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first track to return. Default: 0 (the first object). - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetAlbumTracks(string id, int limit = 20, int offset = 0, string market = "") - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/albums/" + id + "/tracks"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Get Spotify catalog information for a single album. - /// - /// The Spotify ID for the album. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetAlbum(string id, string market = "") - { - return string.IsNullOrEmpty(market) ? $"{APIBase}/albums/{id}" : $"{APIBase}/albums/{id}?market={market}"; - } - - /// - /// Get Spotify catalog information for multiple albums identified by their Spotify IDs. - /// - /// A list of the Spotify IDs for the albums. Maximum: 20 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetSeveralAlbums(List ids, string market = "") - { - return string.IsNullOrEmpty(market) - ? $"{APIBase}/albums?ids={string.Join(",", ids.Take(20))}" - : $"{APIBase}/albums?market={market}&ids={string.Join(",", ids.Take(20))}"; - } - - #endregion Albums - - #region Artists - - /// - /// Get Spotify catalog information for a single artist identified by their unique Spotify ID. - /// - /// The Spotify ID for the artist. - /// - public string GetArtist(string id) - { - return $"{APIBase}/artists/{id}"; - } - - /// - /// Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the - /// Spotify community’s listening history. - /// - /// The Spotify ID for the artist. - /// - public string GetRelatedArtists(string id) - { - return $"{APIBase}/artists/{id}/related-artists"; - } - - /// - /// Get Spotify catalog information about an artist’s top tracks by country. - /// - /// The Spotify ID for the artist. - /// The country: an ISO 3166-1 alpha-2 country code. - /// - public string GetArtistsTopTracks(string id, string country) - { - return $"{APIBase}/artists/{id}/top-tracks?country={country}"; - } - - /// - /// Get Spotify catalog information about an artist’s albums. Optional parameters can be specified in the query string - /// to filter and sort the response. - /// - /// The Spotify ID for the artist. - /// - /// A list of keywords that will be used to filter the response. If not supplied, all album types will - /// be returned - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first album to return. Default: 0 - /// - /// An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular - /// geographical market - /// - /// - public string GetArtistsAlbums(string id, AlbumType type = AlbumType.All, int limit = 20, int offset = 0, string market = "") - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/artists/" + id + "/albums"); - builder.Append("?album_type=" + type.GetStringAttribute(",")); - builder.Append("&limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Get Spotify catalog information for several artists based on their Spotify IDs. - /// - /// A list of the Spotify IDs for the artists. Maximum: 50 IDs. - /// - public string GetSeveralArtists(List ids) - { - return $"{APIBase}/artists?ids={string.Join(",", ids.Take(50))}"; - } - - #endregion Artists - - #region Browse - - /// - /// Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// - /// The desired language, consisting of a lowercase ISO 639 language code and an uppercase ISO 3166-1 - /// alpha-2 country code, joined by an underscore. - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// A timestamp in ISO 8601 format - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// AUTH NEEDED - public string GetFeaturedPlaylists(string locale = "", string country = "", DateTime timestamp = default(DateTime), int limit = 20, int offset = 0) - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/browse/featured-playlists"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(locale)) - builder.Append("&locale=" + locale); - if (!string.IsNullOrEmpty(country)) - builder.Append("&country=" + country); - if (timestamp != default(DateTime)) - builder.Append("×tamp=" + timestamp.ToString("yyyy-MM-ddTHH:mm:ss")); - return builder.ToString(); - } - - /// - /// Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab). - /// - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public string GetNewAlbumReleases(string country = "", int limit = 20, int offset = 0) - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/browse/new-releases"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(country)) - builder.Append("&country=" + country); - return builder.ToString(); - } - - /// - /// Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). - /// - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter if you want to narrow the - /// list of returned categories to those relevant to a particular country - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 (the first object). - /// - /// AUTH NEEDED - public string GetCategories(string country = "", string locale = "", int limit = 20, int offset = 0) - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder(APIBase + "/browse/categories"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(country)) - builder.Append("&country=" + country); - if (!string.IsNullOrEmpty(locale)) - builder.Append("&locale=" + locale); - return builder.ToString(); - } - - /// - /// Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab). - /// - /// The Spotify category ID for the category. - /// - /// A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category - /// exists for a particular country. - /// - /// - /// The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country - /// code, joined by an underscore - /// - /// - /// AUTH NEEDED - public string GetCategory(string categoryId, string country = "", string locale = "") - { - StringBuilder builder = new StringBuilder(APIBase + "/browse/categories/" + categoryId); - if (!string.IsNullOrEmpty(country)) - builder.Append("?country=" + country); - if (!string.IsNullOrEmpty(locale)) - builder.Append((country == "" ? "?locale=" : "&locale=") + locale); - return builder.ToString(); - } - - /// - /// Get a list of Spotify playlists tagged with a particular category. - /// - /// The Spotify category ID for the category. - /// A country: an ISO 3166-1 alpha-2 country code. - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first item to return. Default: 0 - /// - /// AUTH NEEDED - public string GetCategoryPlaylists(string categoryId, string country = "", int limit = 20, int offset = 0) - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder(APIBase + "/browse/categories/" + categoryId + "/playlists"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(country)) - builder.Append("&country=" + country); - return builder.ToString(); - } - - /// - /// Create a playlist-style listening experience based on seed artists, tracks and genres. - /// - /// A comma separated list of Spotify IDs for seed artists. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of any genres in the set of available genre seeds. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// A comma separated list of Spotify IDs for a seed track. - /// Up to 5 seed values may be provided in any combination of seed_artists, seed_tracks and seed_genres. - /// - /// Tracks with the attribute values nearest to the target values will be preferred. - /// For each tunable track attribute, a hard floor on the selected track attribute’s value can be provided - /// For each tunable track attribute, a hard ceiling on the selected track attribute’s value can be provided - /// The target size of the list of recommended tracks. Default: 20. Minimum: 1. Maximum: 100. - /// For seeds with unusually small pools or when highly restrictive filtering is applied, it may be impossible to generate the requested number of recommended tracks. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// Because min_*, max_* and target_* are applied to pools before relinking, the generated results may not precisely match the filters applied. - /// - /// AUTH NEEDED - public string GetRecommendations(List artistSeed = null, List genreSeed = null, List trackSeed = null, - TuneableTrack target = null, TuneableTrack min = null, TuneableTrack max = null, int limit = 20, string market = "") - { - limit = Math.Min(100, limit); - StringBuilder builder = new StringBuilder($"{APIBase}/recommendations"); - builder.Append("?limit=" + limit); - if (artistSeed?.Count > 0) - builder.Append("&seed_artists=" + string.Join(",", artistSeed)); - if (genreSeed?.Count > 0) - builder.Append("&seed_genres=" + string.Join(",", genreSeed)); - if (trackSeed?.Count > 0) - builder.Append("&seed_tracks=" + string.Join(",", trackSeed)); - if (target != null) - builder.Append(target.BuildUrlParams("target")); - if (min != null) - builder.Append(min.BuildUrlParams("min")); - if (max != null) - builder.Append(max.BuildUrlParams("max")); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Retrieve a list of available genres seed parameter values for recommendations. - /// - /// - /// AUTH NEEDED - public string GetRecommendationSeedsGenres() - { - return $"{APIBase}/recommendations/available-genre-seeds"; - } - - #endregion Browse - - #region Follow - - /// - /// Get the current user’s followed artists. - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// The last artist ID retrieved from the previous request. - /// - /// AUTH NEEDED - public string GetFollowedArtists(int limit = 20, string after = "") - { - limit = Math.Min(limit, 50); - const FollowType followType = FollowType.Artist; //currently only artist is supported. - StringBuilder builder = new StringBuilder(APIBase + "/me/following?type=" + followType.GetStringAttribute()); - builder.Append("&limit=" + limit); - if (!string.IsNullOrEmpty(after)) - builder.Append("&after=" + after); - return builder.ToString(); - } - - /// - /// Add the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// - /// AUTH NEEDED - public string Follow(FollowType followType) - { - return $"{APIBase}/me/following?type={followType.GetStringAttribute()}"; - } - - /// - /// Remove the current user as a follower of one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// - /// AUTH NEEDED - public string Unfollow(FollowType followType) - { - return $"{APIBase}/me/following?type={followType.GetStringAttribute()}"; - } - - /// - /// Check to see if the current user is following one or more artists or other Spotify users. - /// - /// The ID type: either artist or user. - /// A list of the artist or the user Spotify IDs to check - /// - /// AUTH NEEDED - public string IsFollowing(FollowType followType, List ids) - { - return $"{APIBase}/me/following/contains?type={followType.GetStringAttribute()}&ids={string.Join(",", ids)}"; - } - - /// - /// Add the current user as a follower of a playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// - /// The Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private - /// status, as long as you know its playlist ID. - /// - /// - /// If true the playlist will be included in user's public playlists, if false it will remain - /// private. - /// - /// - /// AUTH NEEDED - public string FollowPlaylist(string ownerId, string playlistId, bool showPublic = true) - { - return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers"; - } - - /// - /// Remove the current user as a follower of a playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist that is to be no longer followed. - /// - /// AUTH NEEDED - public string UnfollowPlaylist(string ownerId, string playlistId) - { - return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers"; - } - - /// - /// Check to see if one or more Spotify users are following a specified playlist. - /// - /// The Spotify user ID of the person who owns the playlist. - /// The Spotify ID of the playlist. - /// A list of Spotify User IDs - /// - /// AUTH NEEDED - public string IsFollowingPlaylist(string ownerId, string playlistId, List ids) - { - return $"{APIBase}/users/{ownerId}/playlists/{playlistId}/followers/contains?ids={string.Join(",", ids)}"; - } - - #endregion Follow - - #region Library - - /// - /// Save one or more tracks to the current user’s “Your Music” library. - /// - /// - /// AUTH NEEDED - public string SaveTracks() - { - return APIBase + "/me/tracks/"; - } - - /// - /// Get a list of the songs saved in the current Spotify user’s “Your Music” library. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetSavedTracks(int limit = 20, int offset = 0, string market = "") - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/me/tracks"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Remove one or more tracks from the current user’s “Your Music” library. - /// - /// - /// AUTH NEEDED - public string RemoveSavedTracks() - { - return APIBase + "/me/tracks/"; - } - - /// - /// Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public string CheckSavedTracks(List ids) - { - return APIBase + "/me/tracks/contains?ids=" + string.Join(",", ids); - } - - /// - /// Save one or more albums to the current user’s "Your Music" library. - /// - /// - /// AUTH NEEDED - public string SaveAlbums() - { - return $"{APIBase}/me/albums"; - } - - /// - /// Get a list of the albums saved in the current Spotify user’s "Your Music" library. - /// - /// The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetSavedAlbums(int limit = 20, int offset = 0, string market = "") - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/me/albums"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Remove one or more albums from the current user’s "Your Music" library. - /// - /// - /// AUTH NEEDED - public string RemoveSavedAlbums() - { - return APIBase + "/me/albums/"; - } - - /// - /// Check if one or more albums is already saved in the current Spotify user’s "Your Music" library. - /// - /// A list of the Spotify IDs. - /// - /// AUTH NEEDED - public string CheckSavedAlbums(List ids) - { - return APIBase + "/me/albums/contains?ids=" + string.Join(",", ids); - } - - #endregion Library - - #region Personalization - - /// - /// Get the current user’s top tracks based on calculated affinity. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public string GetUsersTopTracks(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder($"{APIBase}/me/top/tracks"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offest); - builder.Append("&time_range=" + timeRange.GetStringAttribute()); - return builder.ToString(); - } - - /// - /// Get the current user’s top artists based on calculated affinity. - /// - /// Over what time frame the affinities are computed. - /// Valid values: long_term (calculated from several years of data and including all new data as it becomes available), - /// medium_term (approximately last 6 months), short_term (approximately last 4 weeks). - /// The number of entities to return. Default: 20. Minimum: 1. Maximum: 50 - /// The index of the first entity to return. Default: 0 (i.e., the first track). Use with limit to get the next set of entities. - /// - /// AUTH NEEDED - public string GetUsersTopArtists(TimeRangeType timeRange = TimeRangeType.MediumTerm, int limit = 20, int offest = 0) - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder($"{APIBase}/me/top/artists"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offest); - builder.Append("&time_range=" + timeRange.GetStringAttribute()); - return builder.ToString(); - } - - /// - /// Get tracks from the current user’s recent play history. - /// - /// The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. - /// A Unix timestamp in milliseconds. Returns all items after (but not including) this cursor position. If after is specified, before must not be specified. - /// A Unix timestamp in milliseconds. Returns all items before (but not including) this cursor position. If before is specified, after must not be specified. - /// - /// AUTH NEEDED - public string GetUsersRecentlyPlayedTracks(int limit = 20, DateTime? after = null, DateTime? before = null) - { - limit = Math.Min(50, limit); - StringBuilder builder = new StringBuilder($"{APIBase}/me/player/recently-played"); - builder.Append("?limit=" + limit); - if (after.HasValue) - builder.Append("&after=" + after.Value.ToUnixTimeMillisecondsPoly()); - if (before.HasValue) - builder.Append("&before=" + before.Value.ToUnixTimeMillisecondsPoly()); - return builder.ToString(); - } - - #endregion - - #region Playlists - - /// - /// Get a list of the playlists owned or followed by a Spotify user. - /// - /// The user's Spotify user ID. - /// The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. - /// The index of the first playlist to return. Default: 0 (the first object) - /// - /// AUTH NEEDED - public string GetUserPlaylists(string userId, int limit = 20, int offset = 0) - { - limit = Math.Min(limit, 50); - StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists"); - builder.Append("?limit=" + limit); - builder.Append("&offset=" + offset); - return builder.ToString(); - } - - /// - /// Get a playlist owned by a Spotify user. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetPlaylist(string userId, string playlistId, string fields = "", string market = "") - { - StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists/" + playlistId); - builder.Append("?fields=" + fields); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Get a playlist owned by a Spotify user. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetPlaylist(string playlistId, string fields = "", string market = "") - { - StringBuilder builder = new StringBuilder(APIBase + "/playlists/" + playlistId); - builder.Append("?fields=" + fields); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetPlaylistTracks(string userId, string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - limit = Math.Min(limit, 100); - StringBuilder builder = new StringBuilder(APIBase + "/users/" + userId + "/playlists/" + playlistId + "/tracks"); - builder.Append("?fields=" + fields); - builder.Append("&limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Get full details of the tracks of a playlist owned by a Spotify user. - /// - /// The Spotify ID for the playlist. - /// - /// Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are - /// returned. - /// - /// The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. - /// The index of the first object to return. Default: 0 (i.e., the first object) - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - /// AUTH NEEDED - public string GetPlaylistTracks(string playlistId, string fields = "", int limit = 100, int offset = 0, string market = "") - { - limit = Math.Min(limit, 100); - StringBuilder builder = new StringBuilder(APIBase + "/playlists/" + playlistId + "/tracks"); - builder.Append("?fields=" + fields); - builder.Append("&limit=" + limit); - builder.Append("&offset=" + offset); - if (!string.IsNullOrEmpty(market)) - builder.Append("&market=" + market); - return builder.ToString(); - } - - /// - /// Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) - /// - /// The user's Spotify user ID. - /// - /// The name for the new playlist, for example "Your Coolest Playlist". This name does not need - /// to be unique. - /// - /// - /// default true. If true the playlist will be public, if false it will be private. To be able to - /// create private playlists, the user must have granted the playlist-modify-private scope. - /// - /// - /// AUTH NEEDED - public string CreatePlaylist(string userId, string playlistName, bool isPublic = true) - { - return $"{APIBase}/users/{userId}/playlists"; - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string UpdatePlaylist(string userId, string playlistId) - { - return $"{APIBase}/users/{userId}/playlists/{playlistId}"; - } - - /// - /// Change a playlist’s name and public/private state. (The user must, of course, own the playlist.) - /// - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string UpdatePlaylist(string playlistId) - { - return $"{APIBase}/playlists/{playlistId}"; - } - - /// - /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string ReplacePlaylistTracks(string userId, string playlistId) - { - return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; - } - - /// - /// Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for - /// replacing tracks, re-ordering existing tracks, or clearing the playlist. - /// - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string ReplacePlaylistTracks(string playlistId) - { - return $"{APIBase}/playlists/{playlistId}/tracks"; - } - - /// - /// Remove one or more tracks from a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - public string RemovePlaylistTracks(string userId, string playlistId, List uris) - { - return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; - } - - /// - /// Remove one or more tracks from a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// - /// array of objects containing Spotify URI strings (and their position in the playlist). A maximum of - /// 100 objects can be sent at once. - /// - /// - /// AUTH NEEDED - public string RemovePlaylistTracks(string playlistId, List uris) - { - return $"{APIBase}/playlists/{playlistId}/tracks"; - } - - /// - /// Add one or more tracks to a user’s playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public string AddPlaylistTracks(string userId, string playlistId, List uris, int? position = null) - { - return position == null - ? $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks" - : $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks?position={position}"; - } - - /// - /// Add one or more tracks to a user’s playlist. - /// - /// The Spotify ID for the playlist. - /// A list of Spotify track URIs to add - /// The position to insert the tracks, a zero-based index - /// - /// AUTH NEEDED - public string AddPlaylistTracks(string playlistId, List uris, int? position = null) - { - return position == null - ? $"{APIBase}/playlists/{playlistId}/tracks" - : $"{APIBase}/playlists/{playlistId}/tracks?position={position}"; - } - - /// - /// Reorder a track or a group of tracks in a playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string ReorderPlaylist(string userId, string playlistId) - { - return $"{APIBase}/users/{userId}/playlists/{playlistId}/tracks"; - } - - /// - /// Reorder a track or a group of tracks in a playlist. - /// - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string ReorderPlaylist(string playlistId) - { - return $"{APIBase}/playlists/{playlistId}/tracks"; - } - - /// - /// Upload an image for a playlist. - /// - /// The user's Spotify user ID. - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string UploadPlaylistImage(string userId, string playlistId) - { - return $"{APIBase}/users/{userId}/playlists/{playlistId}/images"; - } - - /// - /// Upload an image for a playlist. - /// - /// The Spotify ID for the playlist. - /// - /// AUTH NEEDED - public string UploadPlaylistImage(string playlistId) - { - return $"{APIBase}/playlists/{playlistId}/images"; - } - - #endregion Playlists - - #region Profiles - - /// - /// Get detailed profile information about the current user (including the current user’s username). - /// - /// - /// AUTH NEEDED - public string GetPrivateProfile() - { - return $"{APIBase}/me"; - } - - /// - /// Get public profile information about a Spotify user. - /// - /// The user's Spotify user ID. - /// - public string GetPublicProfile(string userId) - { - return $"{APIBase}/users/{userId}"; - } - - #endregion Profiles - - #region Tracks - - /// - /// Get Spotify catalog information for multiple tracks based on their Spotify IDs. - /// - /// A list of the Spotify IDs for the tracks. Maximum: 50 IDs. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetSeveralTracks(List ids, string market = "") - { - return string.IsNullOrEmpty(market) - ? $"{APIBase}/tracks?ids={string.Join(",", ids.Take(50))}" - : $"{APIBase}/tracks?market={market}&ids={string.Join(",", ids.Take(50))}"; - } - - /// - /// Get Spotify catalog information for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetTrack(string id, string market = "") - { - return string.IsNullOrEmpty(market) ? $"{APIBase}/tracks/{id}" : $"{APIBase}/tracks/{id}?market={market}"; - } - - /// - /// Get a detailed audio analysis for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public string GetAudioAnalysis(string id) - { - return $"{APIBase}/audio-analysis/{id}"; - } - - /// - /// Get audio feature information for a single track identified by its unique Spotify ID. - /// - /// The Spotify ID for the track. - /// - /// AUTH NEEDED - public string GetAudioFeatures(string id) - { - return $"{APIBase}/audio-features/{id}"; - } - - /// - /// Get audio features for multiple tracks based on their Spotify IDs. - /// - /// A list of Spotify Track-IDs. Maximum: 100 IDs. - /// - /// AUTH NEEDED - public string GetSeveralAudioFeatures(List ids) - { - return $"{APIBase}/audio-features?ids={string.Join(",", ids.Take(100))}"; - } - - #endregion Tracks - - #region Player - - /// - /// Get information about a user’s available devices. - /// - /// - public string GetDevices() - { - return $"{APIBase}/me/player/devices"; - } - - /// - /// Get information about the user’s current playback state, including track, track progress, and active device. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetPlayback(string market = "") - { - return string.IsNullOrEmpty(market) ? $"{APIBase}/me/player" : $"{APIBase}/me/player?market={market}"; - } - - /// - /// Get the object currently being played on the user’s Spotify account. - /// - /// An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. - /// - public string GetPlayingTrack(string market = "") - { - return string.IsNullOrEmpty(market) - ? $"{APIBase}/me/player/currently-playing" - : $"{APIBase}/me/player/currently-playing?market={market}"; - } - - /// - /// Transfer playback to a new device and determine if it should start playing. - /// - /// - public string TransferPlayback() - { - return $"{APIBase}/me/player"; - } - - /// - /// Start a new context or resume current playback on the user’s active device. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string ResumePlayback(string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/play" - : $"{APIBase}/me/player/play?device_id={deviceId}"; - } - - /// - /// Pause playback on the user’s account. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string PausePlayback(string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/pause" - : $"{APIBase}/me/player/pause?device_id={deviceId}"; - } - - /// - /// Skips to next track in the user’s queue. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SkipPlaybackToNext(string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/next" - : $"{APIBase}/me/player/next?device_id={deviceId}"; - } - - /// - /// Skips to previous track in the user’s queue. - /// Note that this will ALWAYS skip to the previous track, regardless of the current track’s progress. - /// Returning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. - /// - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SkipPlaybackToPrevious(string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/previous" - : $"{APIBase}/me/player/previous?device_id={deviceId}"; - } - - /// - /// Seeks to the given position in the user’s currently playing track. - /// - /// The position in milliseconds to seek to. Must be a positive number. - /// Passing in a position that is greater than the length of the track will cause the player to start playing the next song. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SeekPlayback(int positionMs, string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/seek?position_ms={positionMs}" - : $"{APIBase}/me/player/seek?position_ms={positionMs}&device_id={deviceId}"; - } - - /// - /// Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off. - /// - /// track, context or off. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SetRepeatMode(RepeatState repeatState, string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/repeat?state={repeatState.GetStringAttribute()}" - : $"{APIBase}/me/player/repeat?state={repeatState.GetStringAttribute()}&device_id={deviceId}"; - } - - /// - /// Set the volume for the user’s current playback device. - /// - /// Integer. The volume to set. Must be a value from 0 to 100 inclusive. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SetVolume(int volumePercent, string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/volume?volume_percent={volumePercent}" - : $"{APIBase}/me/player/volume?volume_percent={volumePercent}&device_id={deviceId}"; - } - - /// - /// Toggle shuffle on or off for user’s playback. - /// - /// True of False. - /// The id of the device this command is targeting. If not supplied, the user's currently active device is the target. - /// - public string SetShuffle(bool shuffle, string deviceId = "") - { - return string.IsNullOrEmpty(deviceId) - ? $"{APIBase}/me/player/shuffle?state={shuffle}" - : $"{APIBase}/me/player/shuffle?state={shuffle}&device_id={deviceId}"; - } - #endregion - } -} diff --git a/Source Files/SpotifyAPI.Web/SpotifyWebClient.cs b/Source Files/SpotifyAPI.Web/SpotifyWebClient.cs deleted file mode 100644 index 54b2ff4..0000000 --- a/Source Files/SpotifyAPI.Web/SpotifyWebClient.cs +++ /dev/null @@ -1,223 +0,0 @@ -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Net; -using System.Net.Http; -using System.Net.Http.Headers; -using System.Text; -using System.Threading.Tasks; -using SpotifyAPI.Web.Models; - -namespace SpotifyAPI.Web -{ - internal class SpotifyWebClient : IClient - { - public JsonSerializerSettings JsonSettings { get; set; } - private readonly Encoding _encoding = Encoding.UTF8; - private readonly HttpClient _client; - - private const string UnknownErrorJson = "{\"error\": { \"status\": 0, \"message\": \"SpotifyAPI.Web - Unkown Spotify Error\" }}"; - - public SpotifyWebClient(ProxyConfig proxyConfig = null) - { - HttpClientHandler clientHandler = CreateClientHandler(proxyConfig); - _client = new HttpClient(clientHandler); - } - - public Tuple Download(string url, Dictionary headers = null) - { - Tuple raw = DownloadRaw(url, headers); - return new Tuple(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}"); - } - - public async Task> DownloadAsync(string url, Dictionary headers = null) - { - Tuple raw = await DownloadRawAsync(url, headers).ConfigureAwait(false); - return new Tuple(raw.Item1, raw.Item2.Length > 0 ? _encoding.GetString(raw.Item2) : "{}"); - } - - public Tuple DownloadRaw(string url, Dictionary headers = null) - { - if (headers != null) - { - AddHeaders(headers); - } - using (HttpResponseMessage response = Task.Run(() => _client.GetAsync(url)).Result) - { - return new Tuple(new ResponseInfo - { - StatusCode = response.StatusCode, - Headers = ConvertHeaders(response.Headers) - }, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result); - } - } - - public async Task> DownloadRawAsync(string url, Dictionary headers = null) - { - if (headers != null) - { - AddHeaders(headers); - } - using (HttpResponseMessage response = await _client.GetAsync(url).ConfigureAwait(false)) - { - return new Tuple(new ResponseInfo - { - StatusCode = response.StatusCode, - Headers = ConvertHeaders(response.Headers) - }, await response.Content.ReadAsByteArrayAsync()); - } - } - - public Tuple DownloadJson(string url, Dictionary headers = null) - { - Tuple response = Download(url, headers); - try - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); - } - catch (JsonException) - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(UnknownErrorJson, JsonSettings)); - } - } - - public async Task> DownloadJsonAsync(string url, Dictionary headers = null) - { - Tuple response = await DownloadAsync(url, headers).ConfigureAwait(false);try - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); - } - catch (JsonException) - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(UnknownErrorJson, JsonSettings)); - } - } - - public Tuple Upload(string url, string body, string method, Dictionary headers = null) - { - Tuple data = UploadRaw(url, body, method, headers); - return new Tuple(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}"); - } - - public async Task> UploadAsync(string url, string body, string method, Dictionary headers = null) - { - Tuple data = await UploadRawAsync(url, body, method, headers).ConfigureAwait(false); - return new Tuple(data.Item1, data.Item2.Length > 0 ? _encoding.GetString(data.Item2) : "{}"); - } - - public Tuple UploadRaw(string url, string body, string method, Dictionary headers = null) - { - if (headers != null) - { - AddHeaders(headers); - } - - HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url) - { - Content = new StringContent(body, _encoding) - }; - using (HttpResponseMessage response = Task.Run(() => _client.SendAsync(message)).Result) - { - return new Tuple(new ResponseInfo - { - StatusCode = response.StatusCode, - Headers = ConvertHeaders(response.Headers) - }, Task.Run(() => response.Content.ReadAsByteArrayAsync()).Result); - } - } - - public async Task> UploadRawAsync(string url, string body, string method, Dictionary headers = null) - { - if (headers != null) - { - AddHeaders(headers); - } - - HttpRequestMessage message = new HttpRequestMessage(new HttpMethod(method), url) - { - Content = new StringContent(body, _encoding) - }; - using (HttpResponseMessage response = await _client.SendAsync(message)) - { - return new Tuple(new ResponseInfo - { - StatusCode = response.StatusCode, - Headers = ConvertHeaders(response.Headers) - }, await response.Content.ReadAsByteArrayAsync()); - } - } - - public Tuple UploadJson(string url, string body, string method, Dictionary headers = null) - { - Tuple response = Upload(url, body, method, headers); - try - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); - } - catch (JsonException) - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(UnknownErrorJson, JsonSettings)); - } - } - - public async Task> UploadJsonAsync(string url, string body, string method, Dictionary headers = null) - { - Tuple response = await UploadAsync(url, body, method, headers).ConfigureAwait(false); - try - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(response.Item2, JsonSettings)); - } - catch (JsonException) - { - return new Tuple(response.Item1, JsonConvert.DeserializeObject(UnknownErrorJson, JsonSettings)); - } - } - - public void Dispose() - { - _client.Dispose(); - GC.SuppressFinalize(this); - } - - private static WebHeaderCollection ConvertHeaders(HttpResponseHeaders headers) - { - WebHeaderCollection newHeaders = new WebHeaderCollection(); - foreach (KeyValuePair> headerPair in headers) - { - foreach (string headerValue in headerPair.Value) - { - newHeaders.Add(headerPair.Key, headerValue); - } - } - return newHeaders; - } - - private void AddHeaders(Dictionary headers) - { - _client.DefaultRequestHeaders.Clear(); - foreach (KeyValuePair headerPair in headers) - { - _client.DefaultRequestHeaders.TryAddWithoutValidation(headerPair.Key, headerPair.Value); - } - } - - private static HttpClientHandler CreateClientHandler(ProxyConfig proxyConfig = null) - { - HttpClientHandler clientHandler = new HttpClientHandler - { - PreAuthenticate = false, - UseDefaultCredentials = true, - UseProxy = false - }; - - if (string.IsNullOrWhiteSpace(proxyConfig?.Host)) return clientHandler; - WebProxy proxy = proxyConfig.CreateWebProxy(); - clientHandler.UseProxy = true; - clientHandler.Proxy = proxy; - clientHandler.UseDefaultCredentials = proxy.UseDefaultCredentials; - clientHandler.PreAuthenticate = proxy.UseDefaultCredentials; - - return clientHandler; - } - } -} \ No newline at end of file diff --git a/Source Files/SpotifyAPI.Web/Util.cs b/Source Files/SpotifyAPI.Web/Util.cs deleted file mode 100644 index 5d6df3c..0000000 --- a/Source Files/SpotifyAPI.Web/Util.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; - -namespace SpotifyAPI.Web -{ - public static class Util - { - public static string GetStringAttribute(this T en, string separator = "") where T : struct, IConvertible - { - Enum e = (Enum)(object)en; - IEnumerable attributes = - Enum.GetValues(typeof(T)) - .Cast() - .Where(v => e.HasFlag((Enum)(object)v)) - .Select(v => typeof(T).GetField(v.ToString(CultureInfo.InvariantCulture))) - .Select(f => f.GetCustomAttributes(typeof(StringAttribute), false)[0]) - .Cast(); - - List list = new List(); - attributes.ToList().ForEach(element => list.Add(element.Text)); - return string.Join(separator, list); - } - - public static long ToUnixTimeMillisecondsPoly(this DateTime time) - { - return (long)time.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds; - } - } - - public sealed class StringAttribute : Attribute - { - public string Text { get; set; } - - public StringAttribute(string text) - { - Text = text; - } - } -} diff --git a/Source Files/SpotifyAPI.Web/Util/Base64Util.cs b/Source Files/SpotifyAPI.Web/Util/Base64Util.cs new file mode 100644 index 0000000..e1e91e1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/Base64Util.cs @@ -0,0 +1,132 @@ + +using System; +using System.Globalization; + +namespace SpotifyAPI.Web +{ + internal class Base64Util + { + internal const string WebEncoders_InvalidCountOffsetOrLength = "Invalid {0}, {1} or {2} length."; + internal const string WebEncoders_MalformedInput = "Malformed input: {0} is an invalid input length."; + + public static string UrlEncode(byte[] input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + // Special-case empty input + if (input.Length == 0) + { + return string.Empty; + } + + var buffer = new char[GetArraySizeRequiredToEncode(input.Length)]; + var numBase64Chars = Convert.ToBase64CharArray(input, 0, input.Length, buffer, 0); + + // Fix up '+' -> '-' and '/' -> '_'. Drop padding characters. + for (var i = 0; i < numBase64Chars; i++) + { + var ch = buffer[i]; + if (ch == '+') + { + buffer[i] = '-'; + } + else if (ch == '/') + { + buffer[i] = '_'; + } + else if (ch == '=') + { + return new string(buffer, startIndex: 0, length: i); + } + } + + return new string(buffer, startIndex: 0, length: numBase64Chars); + } + + public static byte[] UrlDecode(string input) + { + var buffer = new char[GetArraySizeRequiredToDecode(input.Length)]; + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + // Assumption: input is base64url encoded without padding and contains no whitespace. + + var paddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(input.Length); + var arraySizeRequired = checked(input.Length + paddingCharsToAdd); + + // Copy input into buffer, fixing up '-' -> '+' and '_' -> '/'. + var i = 0; + for (var j = 0; i < input.Length; i++, j++) + { + var ch = input[j]; + if (ch == '-') + { + buffer[i] = '+'; + } + else if (ch == '_') + { + buffer[i] = '/'; + } + else + { + buffer[i] = ch; + } + } + + // Add the padding characters back. + for (; paddingCharsToAdd > 0; i++, paddingCharsToAdd--) + { + buffer[i] = '='; + } + + // Decode. + // If the caller provided invalid base64 chars, they'll be caught here. + return Convert.FromBase64CharArray(buffer, 0, arraySizeRequired); + } + + private static int GetArraySizeRequiredToEncode(int count) + { + var numWholeOrPartialInputBlocks = checked(count + 2) / 3; + return checked(numWholeOrPartialInputBlocks * 4); + } + + private static int GetArraySizeRequiredToDecode(int count) + { + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (count == 0) + { + return 0; + } + + var numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + + return checked(count + numPaddingCharsToAdd); + } + + private static int GetNumBase64PaddingCharsToAddForDecode(int inputLength) + { + return (inputLength % 4) switch + { + 0 => 0, + 2 => 2, + 3 => 1, + _ => throw new FormatException( + string.Format( + CultureInfo.CurrentCulture, + WebEncoders_MalformedInput, + inputLength)), + }; + } + } + + +} diff --git a/Source Files/SpotifyAPI.Web/Util/Ensure.cs b/Source Files/SpotifyAPI.Web/Util/Ensure.cs new file mode 100644 index 0000000..5b8e46b --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/Ensure.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace SpotifyAPI.Web +{ + /// + /// Ensure input parameters + /// + internal static class Ensure + { + /// + /// Checks an argument to ensure it isn't null. + /// + /// The argument value to check + /// The name of the argument + public static void ArgumentNotNull(object value, string name) + { + if (value != null) + { + return; + } + + throw new ArgumentNullException(name); + } + + /// + /// Checks an argument to ensure it isn't null or an empty string + /// + /// The argument value to check + /// The name of the argument + public static void ArgumentNotNullOrEmptyString(string value, string name) + { + if (!string.IsNullOrEmpty(value)) + { + return; + } + + throw new ArgumentException("String is empty or null", name); + } + + public static void ArgumentNotNullOrEmptyList(IEnumerable value, string name) + { + if (value != null && value.Any()) + { + return; + } + + throw new ArgumentException("List is empty or null", name); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Util/PKCEUtil.cs b/Source Files/SpotifyAPI.Web/Util/PKCEUtil.cs new file mode 100644 index 0000000..55157a8 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/PKCEUtil.cs @@ -0,0 +1,69 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace SpotifyAPI.Web +{ + public static class PKCEUtil + { + private const int VERIFY_MIN_LENGTH = 43; + private const int VERIFY_MAX_LENGTH = 128; + private const int VERIFY_DEFAULT_LENGTH = 100; + + /// + /// Generate a verifier and challenge pair using RNGCryptoServiceProvider + /// + /// The length of the generated verifier + /// + public static (string verifier, string challenge) GenerateCodes(int length = VERIFY_DEFAULT_LENGTH) + { + if (length < VERIFY_MIN_LENGTH || length > VERIFY_MAX_LENGTH) + { + throw new ArgumentException( + $"length must be between {VERIFY_MIN_LENGTH} and {VERIFY_MAX_LENGTH}", + nameof(length) + ); + } + + var verifier = GenerateRandomURLSafeString(length); + return GenerateCodes(verifier); + } + + /// + /// Return the paseed verifier and its challenge + /// + /// A secure random generated verifier + /// + public static (string verifier, string challenge) GenerateCodes(string verifier) + { + Ensure.ArgumentNotNull(verifier, nameof(verifier)); + + if (verifier.Length < VERIFY_MIN_LENGTH || verifier.Length > VERIFY_MAX_LENGTH) + { + throw new ArgumentException( + $"length must be between {VERIFY_MIN_LENGTH} and {VERIFY_MAX_LENGTH}", + nameof(verifier) + ); + } + + var challenge = Base64Util.UrlEncode(ComputeSHA256(verifier)); + return (verifier, challenge); + } + + private static string GenerateRandomURLSafeString(int length) + { + using var rng = new RNGCryptoServiceProvider(); + var bit_count = length * 6; + var byte_count = (bit_count + 7) / 8; // rounded up + var bytes = new byte[byte_count]; + rng.GetBytes(bytes); + return Base64Util.UrlEncode(bytes); + } + + private static byte[] ComputeSHA256(string value) + { + using var hash = SHA256.Create(); + return hash.ComputeHash(Encoding.UTF8.GetBytes(value)); + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Util/StringAttribute.cs b/Source Files/SpotifyAPI.Web/Util/StringAttribute.cs new file mode 100644 index 0000000..bc13301 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/StringAttribute.cs @@ -0,0 +1,39 @@ +using System; +using System.Reflection; +using System.Linq; +using System.Diagnostics.CodeAnalysis; + +namespace SpotifyAPI.Web +{ + [AttributeUsage(AttributeTargets.Field)] + public sealed class StringAttribute : Attribute + { + public StringAttribute(string value) + { + Value = value; + } + + public string Value { get; } + +#if NETSTANDARD2_0 + public static bool GetValue(Type enumType, Enum enumValue, out string? result) +#else + public static bool GetValue(Type enumType, Enum enumValue, [NotNullWhen(true)] out string? result) +#endif + { + Ensure.ArgumentNotNull(enumType, nameof(enumType)); + Ensure.ArgumentNotNull(enumValue, nameof(enumValue)); + + if (enumType + .GetMember(enumValue.ToString())[0] + .GetCustomAttributes(typeof(StringAttribute)) + .FirstOrDefault() is StringAttribute stringAttr) + { + result = stringAttr.Value; + return true; + } + result = null; + return false; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Util/URIExtension.cs b/Source Files/SpotifyAPI.Web/Util/URIExtension.cs new file mode 100644 index 0000000..eae2e87 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/URIExtension.cs @@ -0,0 +1,42 @@ +using System.Web; +using System.Linq; +using System; +using System.Collections.Generic; +using System.Collections.Specialized; + +namespace SpotifyAPI.Web +{ + public static class URIExtensions + { + public static Uri ApplyParameters(this Uri uri, IDictionary parameters) + { + Ensure.ArgumentNotNull(uri, nameof(uri)); + + if (parameters == null || !parameters.Any()) + { + return uri; + } + + var newParameters = new Dictionary(); + NameValueCollection existingParameters = HttpUtility.ParseQueryString(uri.Query); + foreach (string key in existingParameters) + { + newParameters.Add(key, existingParameters[key]!); + } + foreach (KeyValuePair parameter in parameters) + { + newParameters.Add(parameter.Key, HttpUtility.UrlEncode(parameter.Value)); + } + + var queryString = string.Join("&", newParameters.Select((parameter) => $"{parameter.Key}={parameter.Value}")); + var query = string.IsNullOrEmpty(queryString) ? null : queryString; + + var uriBuilder = new UriBuilder(uri) + { + Query = query + }; + + return uriBuilder.Uri; + } + } +} diff --git a/Source Files/SpotifyAPI.Web/Util/URIParameterFormatProvider.cs b/Source Files/SpotifyAPI.Web/Util/URIParameterFormatProvider.cs new file mode 100644 index 0000000..3fb91a1 --- /dev/null +++ b/Source Files/SpotifyAPI.Web/Util/URIParameterFormatProvider.cs @@ -0,0 +1,27 @@ +using System.Web; +using System; +namespace SpotifyAPI.Web +{ + public class URIParameterFormatProvider : IFormatProvider + { + private readonly URIParameterFormatter _formatter; + + public URIParameterFormatProvider() + { + _formatter = new URIParameterFormatter(); + } + + public object? GetFormat(Type? formatType) + { + return formatType == typeof(ICustomFormatter) ? _formatter : null; + } + + private class URIParameterFormatter : ICustomFormatter + { + public string Format(string? format, object? arg, IFormatProvider? formatProvider) + { + return HttpUtility.UrlEncode(arg?.ToString()) ?? string.Empty; + } + } + } +} diff --git a/Source Files/SpotifyIntegration.cs b/Source Files/SpotifyIntegration.cs index 0430fe5..ef7bc62 100644 --- a/Source Files/SpotifyIntegration.cs +++ b/Source Files/SpotifyIntegration.cs @@ -1,12 +1,9 @@ using SpotifyAPI.Web; using SpotifyAPI.Web.Auth; -using SpotifyAPI.Web.Enums; -using SpotifyAPI.Web.Models; using System; using System.Collections.Generic; -using System.IO; using System.Linq; -using System.Windows.Forms; +using System.Threading.Tasks; namespace MusicBeePlugin { @@ -14,51 +11,66 @@ namespace MusicBeePlugin public partial class Plugin { - private static SpotifyWebAPI _spotify; + private static SpotifyClient _spotify; private static int _auth, _num, _trackMissing = 0; private static bool _trackLIB, _albumLIB, _artistLIB, _runOnce = false; private static string _title, _album, _artist, _trackID, _albumID, _artistID, _imageURL; - static async void SpotifyWebAuth(bool autoRefresh) { - ImplicitGrantAuth auth = - new ImplicitGrantAuth("777824a07eeb4312972ff5fcec54c565", "http://localhost:4002", "http://localhost:4002", Scope.UserLibraryModify | Scope.UserFollowModify | Scope.UserFollowRead | Scope.UserLibraryRead); - auth.AuthReceived += async (sender, payload) => + var (verifier, challenge) = PKCEUtil.GenerateCodes(120); + + var loginRequest = new LoginRequest( + new Uri("http://localhost:5000/callback"), "9076681768d94feda885a7b5eced926d", LoginRequest.ResponseType.Code) + { + CodeChallengeMethod = "S256", + CodeChallenge = challenge, + Scope = new[] { Scopes.UserLibraryModify, Scopes.UserFollowModify, Scopes.UserFollowRead, Scopes.UserLibraryRead } + }; + var uri = loginRequest.ToUri(); + + var server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000); + + server.PkceReceived += async (sender, response) => { + await server.Stop(); + + var initialResponse = await new OAuthClient().RequestToken( + new PKCETokenRequest("9076681768d94feda885a7b5eced926d", response.Code, server.BaseUri, verifier) + ); + + _spotify = new SpotifyClient(initialResponse.AccessToken); - auth.Stop(); // `sender` is also the auth instance - _spotify = new SpotifyWebAPI() { TokenType = payload.TokenType, AccessToken = payload.AccessToken }; - + //var tokenResponse = await new OAuthClient(config).RequestToken(new AuthorizationCodeTokenRequest( + // _clientId, _secretId, response.Code, server.BaseUri + //)); + + //var spotify = new SpotifyClient(config.WithToken(tokenResponse.AccessToken)); }; - auth.Start(); // Starts an internal HTTP Server + await server.Start(); - auth.OpenBrowser(autoRefresh); + try + { + BrowserUtil.Open(uri); + } + catch (Exception) + { + Console.WriteLine("Unable to open URL, manually open: {0}", uri); + } _auth = 1; _runOnce = true; } - - public FullTrack TrackSearch() + public async Task TrackSearch() { - - - SearchItem track = _spotify.SearchItems(_searchTerm, SearchType.Track, 10); - if (track.HasError()) - { - - _trackMissing = 1; - Console.WriteLine("Error Status: " + track.Error.Status); - Console.WriteLine("Error Msg: " + track.Error.Message); - - } - else if (track.Tracks.Total >= 1) + try { + var track = await _spotify.Search.Item(new SearchRequest(SearchRequest.Types.Track, _searchTerm)); _title = Truncate(track.Tracks.Items[_num].Name, largeBold); _artist = Truncate(string.Join(", ", from item in track.Tracks.Items[_num].Artists select item.Name), smallRegular); _album = Truncate(track.Tracks.Items[_num].Album.Name, smallRegular); @@ -66,91 +78,230 @@ public FullTrack TrackSearch() _albumID = track.Tracks.Items[_num].Album.Id; _artistID = track.Tracks.Items[_num].Artists[0].Id; _imageURL = track.Tracks.Items[_num].Album.Images[0].Url; - + return null; } - else + catch (APIUnauthorizedException e) { - - _trackMissing = 1; - + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + return null; + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + return null; + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + return null; } - - return null; - } - + } public void SaveTrack() { - - ErrorResponse response = _spotify.SaveTrack(_trackID); - if (!response.HasError()) - MessageBox.Show("Track Saved."); - else - MessageBox.Show(response.Error.Message); + try + { + var track = new LibrarySaveTracksRequest(new List { _trackID }); + _spotify.Library.SaveTracks(track); + Console.WriteLine("Track Saved."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } } public void SaveAlbum() { - - ErrorResponse response = _spotify.SaveAlbum(_albumID); - if (!response.HasError()) - MessageBox.Show("Album Saved."); - else - MessageBox.Show(response.Error.Message); - + try + { + var album = new LibrarySaveAlbumsRequest(new List { _albumID }); + _spotify.Library.SaveAlbums(album); + Console.WriteLine("Album Saved."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } + } public void FollowArtist() { - ErrorResponse response = _spotify.Follow(FollowType.Artist, _artistID); - if (!response.HasError()) - MessageBox.Show("Artist Followed."); - else - MessageBox.Show(response.Error.Message); - + try + { + var artist = new FollowRequest(FollowRequest.Type.Artist, new List { _artistID }); + _spotify.Follow.Follow(artist); + Console.WriteLine("Artist Followed."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } + } public void RemoveTrack() { - - ErrorResponse response = _spotify.RemoveSavedTracks(new List { _trackID }); - if (!response.HasError()) - MessageBox.Show("Track Unsaved."); - else - MessageBox.Show(response.Error.Message); - + try + { + var track = new LibraryRemoveTracksRequest(new List { _trackID }); + _spotify.Library.RemoveTracks(track); + Console.WriteLine("Track Unsaved."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } + } public void RemoveAlbum() { - ErrorResponse response = _spotify.RemoveSavedAlbums(new List { _albumID}); - if (!response.HasError()) - MessageBox.Show("Album Unsaved."); - else - MessageBox.Show(response.Error.Message); - + try + { + var album = new LibraryRemoveAlbumsRequest(new List { _albumID }); + _spotify.Library.RemoveAlbums(album); + Console.WriteLine("Album Unsaved."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } + } public void UnfollowArtist() { - ErrorResponse response = _spotify.Unfollow(FollowType.Artist, _artistID); - if (!response.HasError()) - MessageBox.Show("Artist Unfollowed."); - else - MessageBox.Show(response.Error.Message); - + try + { + var artist = new UnfollowRequest(UnfollowRequest.Type.Artist, new List { _artistID }); + _spotify.Follow.Unfollow(artist); + Console.WriteLine("Artist Unfollowed."); + } + catch (APIUnauthorizedException e) + { + // handle unauthorized error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (APIException e) + { + // handle common error + // e.Response contains HTTP response + // e.Message contains Spotify error message + Console.WriteLine("Error Status: " + e.Response); + Console.WriteLine("Error Msg: " + e.Message); + } + catch (System.ArgumentOutOfRangeException e) + { + Console.WriteLine("Song not found!"); + } + } public Boolean CheckTrack(string id) { - ListResponse tracksSaved = _spotify.CheckSavedTracks(new List { id }); - if (tracksSaved.List[0]) + var tracks = new LibraryCheckTracksRequest(new List { id }); + + List tracksSaved = _spotify.Library.CheckTracks(tracks).Result; + if (tracksSaved.ElementAt(0)) { _trackLIB = true; return true; @@ -168,34 +319,53 @@ public Boolean CheckAlbum(string id) //ListResponse albumsSaved = _spotify.CheckSavedAlbums(new List { id }); //if (albumsSaved.List[0]) - - foreach (string line in File.ReadLines(_savedAlbumsPath)) - { - if (line.Contains(_albumID)) - { - _albumLIB = true; - return true; - } - else - { - _albumLIB = false; - } - } - - if (_albumLIB) - { return true; } + var albums = new LibraryCheckAlbumsRequest(new List { id }); + + List albumsSaved = _spotify.Library.CheckAlbums(albums).Result; + if (albumsSaved.ElementAt(0)) + { + _albumLIB = true; + return true; + } else - { return false; } - + { + _albumLIB = false; + return false; + } - } + + //foreach (string line in File.ReadLines(_savedAlbumsPath)) + //{ + // if (line.Contains(_albumID)) + // { + // _albumLIB = true; + // return true; + // } + // else + // { + // _albumLIB = false; + // } + //} + + + //if (_albumLIB) + //{ return true; } + //else + //{ return false; } + + + + } public Boolean CheckArtist(string id) { - ListResponse response = _spotify.IsFollowing(FollowType.Artist, id); - if (response.List[0] == true) + + var artist = new FollowCheckCurrentUserRequest(FollowCheckCurrentUserRequest.Type.Artist, new List { id }); + + List artistFollowed = _spotify.Follow.CheckCurrentUser(artist).Result; + if (artistFollowed.ElementAt(0)) { _artistLIB = true; return true; @@ -208,36 +378,36 @@ public Boolean CheckArtist(string id) } // Workaround for Spotify API "Check-Users-Saved-Albums" Endpoint bug. - public void GenerateAlbumList() - { + //public void GenerateAlbumList() + //{ - int offset = 0; + // int offset = 0; - using (System.IO.StreamWriter file = new System.IO.StreamWriter(_savedAlbumsPath)) - { - + // using (System.IO.StreamWriter file = new System.IO.StreamWriter(_savedAlbumsPath)) + // { - while (offset != -1) - { - - Paging savedAlbums = _spotify.GetSavedAlbums(50, offset); - savedAlbums.Items.ForEach(album => file.WriteLine(album.Album.Id)); - if (savedAlbums.Next == null) - { - offset += -1; - break; - } - else - { - offset += 50; - } + // while (offset != -1) + // { - } - file.Close(); - } + // Paging savedAlbums = _spotify.Library GetSavedAlbums(50, offset); + // savedAlbums.Items.ForEach(album => file.WriteLine(album.Album.Id)); - } + // if (savedAlbums.Next == null) + // { + // offset += -1; + // break; + // } + // else + // { + // offset += 50; + // } + + // } + // file.Close(); + // } + + //} } diff --git a/Source Files/mb_Spotify-Plugin.csproj b/Source Files/mb_Spotify-Plugin.csproj index a53f1c6..a3e9563 100644 --- a/Source Files/mb_Spotify-Plugin.csproj +++ b/Source Files/mb_Spotify-Plugin.csproj @@ -32,13 +32,11 @@ 4 - - False - SpotifyAPI.Web\bin\Debug\net46\SpotifyAPI.Web.dll + + SpotifyAPI.Web.Auth\bin\Debug\netstandard2.0\SpotifyAPI.Web.dll - - False - SpotifyAPI.Web.Auth\bin\Debug\net46\SpotifyAPI.Web.Auth.dll + + SpotifyAPI.Web.Auth\bin\Debug\netstandard2.0\SpotifyAPI.Web.Auth.dll @@ -59,6 +57,6 @@ - copy /Y "C:\Users\Zachary\Desktop\Core File\Other\Installers and Important Stuff\MusicBee Plugin Development\DEVELOPMENT\mb_Spotify-Plugin\Source Files\bin\Debug\mb_Spotify-Plugin.dll" "C:\Program Files (x86)\MusicBee\Plugins\mb_Spotify-Plugin.dll" + copy /Y "C:\Users\zacha\Desktop\Local Files\MusicBee Plugin Development\DEVELOPMENT\mb_Spotify-Plugin\Source Files\bin\Debug\mb_Spotify-Plugin.dll" "C:\Users\zacha\Desktop\Local Files\MusicBee\Plugins\mb_Spotify-Plugin.dll" \ No newline at end of file diff --git a/Source Files/mb_Spotify-Plugin.sln b/Source Files/mb_Spotify-Plugin.sln index e35b199..f7055dc 100644 --- a/Source Files/mb_Spotify-Plugin.sln +++ b/Source Files/mb_Spotify-Plugin.sln @@ -1,15 +1,19 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.28307.421 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.31112.23 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mb_Spotify-Plugin", "mb_Spotify-Plugin.csproj", "{EA4E342C-C766-4C68-A28B-7ADBE7C3667D}" + ProjectSection(ProjectDependencies) = postProject + {1C70690B-F28B-415D-BFF2-FCDD34CAD1F0} = {1C70690B-F28B-415D-BFF2-FCDD34CAD1F0} + {C222F9E6-9053-49E1-A1A0-F5A409159847} = {C222F9E6-9053-49E1-A1A0-F5A409159847} + EndProjectSection EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{86A2B1EE-465E-449F-ADD3-F8FD52FE7F11}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SpotifyAPI.Web", "..\Source Files\SpotifyAPI.Web\SpotifyAPI.Web.csproj", "{C222F9E6-9053-49E1-A1A0-F5A409159847}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SpotifyAPI.Web", "SpotifyAPI.Web\SpotifyAPI.Web.csproj", "{C222F9E6-9053-49E1-A1A0-F5A409159847}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SpotifyAPI.Web.Auth", "..\Source Files\SpotifyAPI.Web.Auth\SpotifyAPI.Web.Auth.csproj", "{1C70690B-F28B-415D-BFF2-FCDD34CAD1F0}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SpotifyAPI.Web.Auth", "SpotifyAPI.Web.Auth\SpotifyAPI.Web.Auth.csproj", "{1C70690B-F28B-415D-BFF2-FCDD34CAD1F0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From 5b4ed46af0d036ee2ec74b1644d5958c27f49ad3 Mon Sep 17 00:00:00 2001 From: zkhcohen Date: Mon, 29 Mar 2021 14:53:17 -0700 Subject: [PATCH 2/5] Renewal of tokens appears to be working. No persistence between sessions. --- Source Files/PanelInterface.cs | 72 ++++------------- Source Files/SpotifyIntegration.cs | 124 +++-------------------------- 2 files changed, 26 insertions(+), 170 deletions(-) diff --git a/Source Files/PanelInterface.cs b/Source Files/PanelInterface.cs index 1e5b33b..a09fddf 100644 --- a/Source Files/PanelInterface.cs +++ b/Source Files/PanelInterface.cs @@ -16,16 +16,10 @@ public partial class Plugin private PluginInfo about = new PluginInfo(); private Control panel; public int panelHeight; - private static string _searchTerm, _savedAlbumsPath; + private static string _searchTerm; Font largeBold, smallRegular, smallBold; - static System.Threading.Timer authTimer; - static void TickTimer(object state) - { - _auth = 0; - } - - public PluginInfo Initialise(IntPtr apiInterfacePtr) + public PluginInfo Initialise(IntPtr apiInterfacePtr) { mbApiInterface = new MusicBeeApiInterface(); mbApiInterface.Initialise(apiInterfacePtr); @@ -43,14 +37,11 @@ public PluginInfo Initialise(IntPtr apiInterfacePtr) about.ReceiveNotifications = (ReceiveNotificationFlags.PlayerEvents | ReceiveNotificationFlags.TagEvents); about.ConfigurationPanelHeight = 0; - _savedAlbumsPath = mbApiInterface.Setting_GetPersistentStoragePath() + @"spotify.txt"; - - SystemEvents.PowerModeChanged += OnPowerChange; + //SystemEvents.PowerModeChanged += OnPowerChange; return about; } - public int OnDockablePanelCreated(Control panel) { @@ -163,7 +154,6 @@ private void DrawPanel(object sender, PaintEventArgs e) } - } public List GetMenuItems() @@ -178,23 +168,21 @@ public List GetMenuItems() return list; } - + //private void OnPowerChange(object s, PowerModeChangedEventArgs e) + //{ + // switch (e.Mode) + // { + // case PowerModes.Resume: - private void OnPowerChange(object s, PowerModeChangedEventArgs e) - { - switch (e.Mode) - { - case PowerModes.Resume: + // _auth = 0; - _auth = 0; - - break; - } - } + // break; + // } + //} public void reAuthSpotify(object sender, EventArgs e) { - SpotifyWebAuth(false); + SpotifyWebAuth(); _trackMissing = 1; panel.Invalidate(); } @@ -207,7 +195,7 @@ private void PanelClick(object sender, EventArgs e) if (_auth == 0 && me.Button == System.Windows.Forms.MouseButtons.Left) { - SpotifyWebAuth(false); + SpotifyWebAuth(); _trackMissing = 1; panel.Invalidate(); @@ -280,63 +268,33 @@ private void PanelClick(object sender, EventArgs e) } - public async void ReceiveNotification(string sourceFileUrl, NotificationType type) { switch (type) { - //case NotificationType.PluginStartup: - - // panel.Invalidate(); - // //panel.Paint += DrawPanel; - - - // break; - case NotificationType.TrackChanged: - - //if(_runOnce == true) - //{ - // authTimer = new System.Threading.Timer( - // new TimerCallback(TickTimer), - // null, - // 3600000, - // 3600000); - - // GenerateAlbumList(); - // _runOnce = false; - //} - - _trackMissing = 0; _num = 0; _searchTerm = mbApiInterface.NowPlaying_GetFileTag(MetaDataType.TrackTitle) + " + " + mbApiInterface.NowPlaying_GetFileTag(MetaDataType.Artist); - if (_auth == 1) { mbApiInterface.MB_RefreshPanels(); await TrackSearch(); } - panel.Invalidate(); - //panel.Paint += DrawPanel; break; } } - - public bool Configure(IntPtr panelHandle) { - - return true; } @@ -347,7 +305,7 @@ public void SaveSettings() public void Close(PluginCloseReason reason) { - SystemEvents.PowerModeChanged -= OnPowerChange; + //SystemEvents.PowerModeChanged -= OnPowerChange; } public void Uninstall() diff --git a/Source Files/SpotifyIntegration.cs b/Source Files/SpotifyIntegration.cs index ef7bc62..55bf476 100644 --- a/Source Files/SpotifyIntegration.cs +++ b/Source Files/SpotifyIntegration.cs @@ -13,16 +13,17 @@ public partial class Plugin private static SpotifyClient _spotify; private static int _auth, _num, _trackMissing = 0; - private static bool _trackLIB, _albumLIB, _artistLIB, _runOnce = false; + private static bool _trackLIB, _albumLIB, _artistLIB = false; private static string _title, _album, _artist, _trackID, _albumID, _artistID, _imageURL; + private static string _clientID = "9076681768d94feda885a7b5eced926d"; - static async void SpotifyWebAuth(bool autoRefresh) + static async void SpotifyWebAuth() { var (verifier, challenge) = PKCEUtil.GenerateCodes(120); var loginRequest = new LoginRequest( - new Uri("http://localhost:5000/callback"), "9076681768d94feda885a7b5eced926d", LoginRequest.ResponseType.Code) + new Uri("http://localhost:5000/callback"), _clientID, LoginRequest.ResponseType.Code) { CodeChallengeMethod = "S256", CodeChallenge = challenge, @@ -37,17 +38,14 @@ static async void SpotifyWebAuth(bool autoRefresh) await server.Stop(); var initialResponse = await new OAuthClient().RequestToken( - new PKCETokenRequest("9076681768d94feda885a7b5eced926d", response.Code, server.BaseUri, verifier) + new PKCETokenRequest(_clientID, response.Code, server.BaseUri, verifier) ); - _spotify = new SpotifyClient(initialResponse.AccessToken); + var authenticator = new PKCEAuthenticator(_clientID, initialResponse); - - //var tokenResponse = await new OAuthClient(config).RequestToken(new AuthorizationCodeTokenRequest( - // _clientId, _secretId, response.Code, server.BaseUri - //)); - - //var spotify = new SpotifyClient(config.WithToken(tokenResponse.AccessToken)); + var config = SpotifyClientConfig.CreateDefault() + .WithAuthenticator(authenticator); + _spotify = new SpotifyClient(config); }; await server.Start(); @@ -61,10 +59,8 @@ static async void SpotifyWebAuth(bool autoRefresh) } _auth = 1; - _runOnce = true; } - public async Task TrackSearch() { @@ -78,22 +74,17 @@ public async Task TrackSearch() _albumID = track.Tracks.Items[_num].Album.Id; _artistID = track.Tracks.Items[_num].Artists[0].Id; _imageURL = track.Tracks.Items[_num].Album.Images[0].Url; + _trackMissing = 0; return null; } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); return null; } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); return null; @@ -101,6 +92,7 @@ public async Task TrackSearch() catch (System.ArgumentOutOfRangeException e) { Console.WriteLine("Song not found!"); + _trackMissing = 1; return null; } @@ -116,17 +108,11 @@ public void SaveTrack() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -147,17 +133,11 @@ public void SaveAlbum() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -178,17 +158,11 @@ public void FollowArtist() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -211,17 +185,11 @@ public void RemoveTrack() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -242,17 +210,11 @@ public void RemoveAlbum() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -273,17 +235,11 @@ public void UnfollowArtist() } catch (APIUnauthorizedException e) { - // handle unauthorized error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } catch (APIException e) { - // handle common error - // e.Response contains HTTP response - // e.Message contains Spotify error message Console.WriteLine("Error Status: " + e.Response); Console.WriteLine("Error Msg: " + e.Message); } @@ -315,10 +271,6 @@ public Boolean CheckTrack(string id) public Boolean CheckAlbum(string id) { - //API Code which doesn't currently work correctly. - //ListResponse albumsSaved = _spotify.CheckSavedAlbums(new List { id }); - //if (albumsSaved.List[0]) - var albums = new LibraryCheckAlbumsRequest(new List { id }); @@ -335,28 +287,6 @@ public Boolean CheckAlbum(string id) } - - //foreach (string line in File.ReadLines(_savedAlbumsPath)) - //{ - // if (line.Contains(_albumID)) - // { - // _albumLIB = true; - // return true; - // } - // else - // { - // _albumLIB = false; - // } - //} - - - //if (_albumLIB) - //{ return true; } - //else - //{ return false; } - - - } public Boolean CheckArtist(string id) @@ -377,38 +307,6 @@ public Boolean CheckArtist(string id) } } - // Workaround for Spotify API "Check-Users-Saved-Albums" Endpoint bug. - //public void GenerateAlbumList() - //{ - - // int offset = 0; - - // using (System.IO.StreamWriter file = new System.IO.StreamWriter(_savedAlbumsPath)) - // { - - - // while (offset != -1) - // { - - // Paging savedAlbums = _spotify.Library GetSavedAlbums(50, offset); - // savedAlbums.Items.ForEach(album => file.WriteLine(album.Album.Id)); - - // if (savedAlbums.Next == null) - // { - // offset += -1; - // break; - // } - // else - // { - // offset += 50; - // } - - // } - // file.Close(); - // } - - //} - } } From 51d7e36a8bbe415850f278339efe18a07c39ce94 Mon Sep 17 00:00:00 2001 From: zkhcohen Date: Mon, 29 Mar 2021 21:22:55 -0700 Subject: [PATCH 3/5] Persistence and automatic renewal / error-handling working. --- README.txt | 8 +- Source Files/PanelInterface.cs | 2 + .../Authenticators/PKCEAuthenticator.cs | 15 ++ Source Files/SpotifyIntegration.cs | 142 ++++++++++++++---- 4 files changed, 133 insertions(+), 34 deletions(-) diff --git a/README.txt b/README.txt index f57a434..fde4148 100644 --- a/README.txt +++ b/README.txt @@ -7,10 +7,4 @@ INSTALLATION: Just extract the contents of the "plugins" folder to your MusicBee Plugins directory. -Let me know if you encounter any bugs - "ZKHCOHEN" on the MusicBee Forums. - - -KNOWN ISSUES: - -Performance issues due to a workaround I implemented because of a bug in the Spotify API. Adding/removing albums is slow. The first track you play after enabling the add-in is slow to load. -You have to re-authenticate hourly due to a limitation with the Spotify API. I plan to do this silently in the future. \ No newline at end of file +Let me know if you encounter any bugs - "ZKHCOHEN" on the MusicBee Forums. \ No newline at end of file diff --git a/Source Files/PanelInterface.cs b/Source Files/PanelInterface.cs index a09fddf..9dbd271 100644 --- a/Source Files/PanelInterface.cs +++ b/Source Files/PanelInterface.cs @@ -37,6 +37,8 @@ public PluginInfo Initialise(IntPtr apiInterfacePtr) about.ReceiveNotifications = (ReceiveNotificationFlags.PlayerEvents | ReceiveNotificationFlags.TagEvents); about.ConfigurationPanelHeight = 0; + _path = mbApiInterface.Setting_GetPersistentStoragePath() + @"token.txt"; + //SystemEvents.PowerModeChanged += OnPowerChange; return about; diff --git a/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs index 4cfb99d..74a33c3 100644 --- a/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs +++ b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs @@ -1,5 +1,7 @@ using System; +using System.IO; using System.Threading.Tasks; +using System.Xml.Serialization; using SpotifyAPI.Web.Http; namespace SpotifyAPI.Web @@ -40,6 +42,17 @@ public PKCEAuthenticator(string clientId, PKCETokenResponse initialToken) /// public PKCETokenResponse InitialToken { get; } + public static void SerializeConfig(PKCETokenResponse data) + { + + using (StreamWriter file = new StreamWriter("C:\\Users\\zacha\\Desktop\\Local Files\\MusicBee\\AppData\\token.txt", false)) + { + XmlSerializer controlsDefaultsSerializer = new XmlSerializer(typeof(PKCETokenResponse)); + controlsDefaultsSerializer.Serialize(file, data); + file.Close(); + } + } + public async Task Apply(IRequest request, IAPIConnector apiConnector) { Ensure.ArgumentNotNull(request, nameof(request)); @@ -56,6 +69,8 @@ public async Task Apply(IRequest request, IAPIConnector apiConnector) InitialToken.TokenType = refreshedToken.TokenType; InitialToken.RefreshToken = refreshedToken.RefreshToken; + SerializeConfig(InitialToken); + TokenRefreshed?.Invoke(this, InitialToken); } diff --git a/Source Files/SpotifyIntegration.cs b/Source Files/SpotifyIntegration.cs index 55bf476..05bbf5a 100644 --- a/Source Files/SpotifyIntegration.cs +++ b/Source Files/SpotifyIntegration.cs @@ -2,8 +2,11 @@ using SpotifyAPI.Web.Auth; using System; using System.Collections.Generic; +using System.IO; using System.Linq; using System.Threading.Tasks; +using System.Windows.Forms; +using System.Xml.Serialization; namespace MusicBeePlugin { @@ -14,51 +17,136 @@ public partial class Plugin private static SpotifyClient _spotify; private static int _auth, _num, _trackMissing = 0; private static bool _trackLIB, _albumLIB, _artistLIB = false; - private static string _title, _album, _artist, _trackID, _albumID, _artistID, _imageURL; + private static string _title, _album, _artist, _trackID, _albumID, _artistID, _imageURL, _path; private static string _clientID = "9076681768d94feda885a7b5eced926d"; - - static async void SpotifyWebAuth() + public static void SerializeConfig(PKCETokenResponse data, string path) { - var (verifier, challenge) = PKCEUtil.GenerateCodes(120); - var loginRequest = new LoginRequest( - new Uri("http://localhost:5000/callback"), _clientID, LoginRequest.ResponseType.Code) + using (StreamWriter file = new StreamWriter(path, false)) { - CodeChallengeMethod = "S256", - CodeChallenge = challenge, - Scope = new[] { Scopes.UserLibraryModify, Scopes.UserFollowModify, Scopes.UserFollowRead, Scopes.UserLibraryRead } - }; - var uri = loginRequest.ToUri(); + XmlSerializer controlsDefaultsSerializer = new XmlSerializer(typeof(PKCETokenResponse)); + controlsDefaultsSerializer.Serialize(file, data); + file.Close(); + } + } - var server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000); + public static PKCETokenResponse DeserializeConfig(string path) + { - server.PkceReceived += async (sender, response) => + try + { + StreamReader file = new StreamReader(path); + XmlSerializer xSerial = new XmlSerializer(typeof(PKCETokenResponse)); + object oData = xSerial.Deserialize(file); + var thisConfig = (PKCETokenResponse)oData; + file.Close(); + return thisConfig; + } + catch (Exception e) { - await server.Stop(); - var initialResponse = await new OAuthClient().RequestToken( - new PKCETokenRequest(_clientID, response.Code, server.BaseUri, verifier) - ); + Console.Write(e.Message); + return null; + } + } - var authenticator = new PKCEAuthenticator(_clientID, initialResponse); + //static void WriteOutput(PKCETokenResponse InitialToken) + //{ + // MessageBox.Show( + // InitialToken.AccessToken + '\n' + + // InitialToken.CreatedAt.ToString() + '\n' + + // InitialToken.ExpiresIn + '\n' + + // InitialToken.Scope + '\n' + + // InitialToken.TokenType + '\n' + + // InitialToken.RefreshToken + '\n' + // ); + //} - var config = SpotifyClientConfig.CreateDefault() - .WithAuthenticator(authenticator); - _spotify = new SpotifyClient(config); - }; - await server.Start(); + static async void SpotifyWebAuth() + { try { - BrowserUtil.Open(uri); + if(File.Exists(_path)) + { + var token_response = DeserializeConfig(_path); + + //WriteOutput(token_response); + + var authenticator = new PKCEAuthenticator(_clientID, token_response); + + var config = SpotifyClientConfig.CreateDefault() + .WithAuthenticator(authenticator); + _spotify = new SpotifyClient(config); + + SerializeConfig(token_response, _path); + + //WriteOutput(token_response); + + + try + { + await _spotify.Search.Item(new SearchRequest(SearchRequest.Types.Track, "1ghvzmzpx2nnrbx7wtpMgo?si=cC3VIBCfRPauNBHFes6nsg")); + _auth = 1; + } + catch(APIException) + { + Console.WriteLine("Spotify agent dead."); + throw new System.NullReferenceException(); + } + + } + else { throw new System.NullReferenceException(); } } - catch (Exception) + catch (System.NullReferenceException) { - Console.WriteLine("Unable to open URL, manually open: {0}", uri); + var (verifier, challenge) = PKCEUtil.GenerateCodes(120); + + var loginRequest = new LoginRequest( + new Uri("http://localhost:5000/callback"), _clientID, LoginRequest.ResponseType.Code) + { + CodeChallengeMethod = "S256", + CodeChallenge = challenge, + Scope = new[] { Scopes.UserLibraryModify, Scopes.UserFollowModify, Scopes.UserFollowRead, Scopes.UserLibraryRead } + }; + var uri = loginRequest.ToUri(); + + var server = new EmbedIOAuthServer(new Uri("http://localhost:5000/callback"), 5000); + + server.PkceReceived += async (sender, response) => + { + await server.Stop(); + + var initialResponse = await new OAuthClient().RequestToken( + new PKCETokenRequest(_clientID, response.Code, server.BaseUri, verifier) + ); + + //WriteOutput(initialResponse); + + var authenticator = new PKCEAuthenticator(_clientID, initialResponse); + + var config = SpotifyClientConfig.CreateDefault() + .WithAuthenticator(authenticator); + _spotify = new SpotifyClient(config); + + //WriteOutput(initialResponse); + SerializeConfig(initialResponse, _path); + }; + await server.Start(); + + try + { + BrowserUtil.Open(uri); + } + catch (Exception) + { + Console.WriteLine("Unable to open URL, manually open: {0}", uri); + } + + _auth = 1; } - _auth = 1; } public async Task TrackSearch() From bca2f60e8ac7404eb98aab513527e5ec93e3b56b Mon Sep 17 00:00:00 2001 From: zkhcohen Date: Mon, 29 Mar 2021 22:16:04 -0700 Subject: [PATCH 4/5] Automatic renewal / persistence across sessions. Artifacting issues pending a fix. --- Plugins/SpotifyAPI.Web.Auth.dll | Bin 73728 -> 73728 bytes Plugins/SpotifyAPI.Web.dll | Bin 197632 -> 198144 bytes Plugins/Unosquare.Labs.EmbedIO.dll | Bin 252416 -> 0 bytes Plugins/Unosquare.Swan.Lite.dll | Bin 164864 -> 0 bytes Plugins/mb_Spotify-Plugin.dll | Bin 55808 -> 61440 bytes README.txt | 10 +++++++++- Source Files/PanelInterface.cs | 11 ++++++++++- .../Authenticators/PKCEAuthenticator.cs | 9 ++++++--- Source Files/SpotifyIntegration.cs | 8 ++++---- 9 files changed, 29 insertions(+), 9 deletions(-) delete mode 100644 Plugins/Unosquare.Labs.EmbedIO.dll delete mode 100644 Plugins/Unosquare.Swan.Lite.dll diff --git a/Plugins/SpotifyAPI.Web.Auth.dll b/Plugins/SpotifyAPI.Web.Auth.dll index 37224dd1dc6d378d5dee4e49b576bc16e114cdf1..2db0f80619b81a7d4df19c80f8c1b1dc8c95549d 100644 GIT binary patch delta 242 zcmZoTz|wGlWkLtb%jY%S8+(?h3uLDIhW~Qrb)J4du4Hwn>A%em8XBw`riLlzsm5lB z7D-8|CWfXKrUq$7<`%}rmZ@o}h8Bqi=E=sE$*Gnmn3zK+`dSRk&DgWl);c8 zg~6O5mBE<7j3JT1f*}bAQyENv;-)~JDT4t+8iNr~g#}QBF@q&gE)9qcf&4_EoH;`> SSTq?ZX31c({kIGwD>DFuMoRhs delta 242 zcmZoTz|wGlWkLtb1?R9(8Jwuc+K!A61 z(w(Rm#~l{T5B$K%@$bm=6QYc}6riFB2~bg>`kLj(+>8BPFB|eiCns%RB*w_a=5Nkm z&S1b`%3#D`!H@`KrvkAFgE5da1+r7YGG;)TWT2QSgC&C*P+bZ`8W0-;)tLar%z$hY Ppned~c>8Y|MpkA3#=uRr diff --git a/Plugins/SpotifyAPI.Web.dll b/Plugins/SpotifyAPI.Web.dll index 79ec22eadeafc8e51c80e23d1ef01b2d1550ccab..5fc83b55911198acd21dde1d29714b5cbb76d604 100644 GIT binary patch literal 198144 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%0DRDbv$U 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 DO@>Q1 literal 197632 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%0Avq2D%_lMNCA6CIXZ5sgN{U3 z19}Z5sw;;#aP?<5^6#%o_mnl2MzT7ZlU?zsBs;cHt!m6c!0sJ@Ikx-J{!rDYVm2x- z`W|n4MkvnGx#E2lz@uXh933n!G~SpWihFb@nghUW2Vf2Wa~*&=0Ely=VGaPwg8|H; z@$(au$4%;YCe`ow(K?cK+t(`KL&QXMK9y3P=UqukH~YA3@?4el^%&9N;0(KWhSI&L z(!v4-=$d;C$6~lbE%^dy%x+Ui{A8R3#)3)*9$zR(d=X}2pF(`G`7SZ@DP~@Z*<2a6 zMcy$t%D7@a<8VUz*E!w$@@VN}Xy6NTE-T5)U~%DmjR;#H5n zUh86$6do?etnj7U7@MYk1y-X}ti(^p!FyJt+xc!>g8RYV{h_s9{amjgxzZl`{@AZq z|F>frW$tq*4fHOm(YS?s`^a2nczY>yB&#*{4BZ=O%e~1xy}TygzPH?4*>LnVH~$Ir z-=O+hrTXet&7HlfG4gbe)x)~Al_hy4Nm`Yn6p0Qc^I$!-hn18Mr%sn+^x-FS_^nsV zD%u|3N*M@ps>7WI>u>;K^=!4OgF%0TSPQ*BLr*GDw7uVMZ#kBJ`q9{_xZ_a(G$t1+ z#OEl3+sOD#{~;baJ=c%y=NuQM4ww@s~xtrADXUbWPpXIEr&T7l5 z#Mj75J`NfyyTizmjorB@1s*TRxE4cGN4hVqLibX`r2(6*zIP{5eWS_Q->u z>*xs(U9Sv2ho^2-tZU%9lh>4;X_l_hxmgzFRaS)~du?W~ldUns94lKlKyd4RezN2U zO;gWPZ1wpU!n1zaH)afba<&fH?r1*a4UWz)4xulQa92%s#b) zXbuoh%K{$X2`~o%r*{D60B}YJU=A9~)l?tr8FFcdo)+Ydf2P^XySRb&BD|buNU^R$ z7d({BXx(+B=P59{4pV)CaI8=0D8(cb$084mT^c*H2K9G{#b2XGVypL5tjd}tjFqUJ zcv293+q_=H<&BM(NsghXb|$*|Wm2Uw&c4;B()H~sQmW$1J}RaX%)a2KLd@h+#pa~Y z(G7GC)qdGJ<4nWdKr6C!2ID&ukKHvcxOIj?(z6VSQNJH)j~~5-+ z=tcmD#1jCicT#$BXF5Fqv^d^ZL_f>Bb`MdnqD^!^0kTE~{vsUA_J5yo1>YqSp z{Xy%@yiivrd(*kNasNPS_brmg=q&`H&sBUf`ATRlABtav)mT~p@M>J{M0~C?vc0rD zKZnKn*i92I4U%v*AQurzR>NB{S)c<@z1rA(<_VFG5q1=D0OuRaCvL@ zINMD2F;2d$kUWpzRWSw2`y73^$;*M;=hXEjhS!pkHJRD$dH-S5n(+lh8euVL@BWV# zORd*|X5ZM6E>b_1+z-J}bSt@UE(>g@edb0MHMUvL$Ce)jV(aTy#E6F}Ps5xqWH0Zy z0DH47xdZ0h(F3PV)SO1YnHg{VCG;CAlNBU$J7v<^i?*R}1|F?S&!xx6%BRO-xteU% zKo~BB=?Q=eZJBN1QXcoJ><&`dWpG6XzI{iyr~&^?58g+}*4p-VgFBtMa1z+o!cWAp z7|yHl-cKsC+Z1B^YU%N~3Kt@{o27IIIX`e=K|M&p(A?i1nb+kW36==z00;~Z$_JGpk(v(z9a-fq*nH*8^t^n_Zy_RGT8$pO&*kR z?KKN$64gY5*(7CpfY5KEZO(2}Nb6=bQ?SnyHum|lHB~T&&ak~3{_cXmyuCKfx099+ zE$1y>wc>H9)wtJ+dr5w?JIPWE*X*C0d2^>-^QL;d1QE*F%c;rXFc)5jh-IHbtP)f~ zHTOEr0gB=LA-S1*Nzdw%7yUNzhJ1hYvx#1?=tVO#Qntttsa(DQF{afF0xH|{p`~A7 zugdz-yW!NF$pVxjg6k$ofxQ@-h3kNnEf@O3_2g<6F6R#6oiUuJF0Gi?xU`QKcDws#r@QAi=(;I7{ao}W@ij` zU%=NlKr`_Xt=3zhAn_Lw6Mu665GezgV`cJIN?EcM*xM3sryd*y4!Xtv1Q9!vZ~f@w zohb0~lu}qYtJ4mjVD0cAwZq$qFuP455#wi_`NJ2*-W`CWCj-!Bxw=2QSoo~KsISZM zTQQWr?=cj)`K`Md@e6gv_exfNic4&`@z&lK=>^zVH>JD(1SH|pw>L0so*W-UyXj#% z5`(b8*c*JL_EXS_#9yZkh%c2(whJBo2C7bWIJlys2x5Waw~-Tj+O7wq4DSM}c}&jE z_`Cx;cC9g*q=UHbX!RRRxOK8TdOMgS^hEE#?gHP5$8|67!ey6B?OrJwvX6>Ul$ku> zXqjaFAW-YwAl4b)DY~$A5$(ru8HTN2i_P~CY;s5+=)F_<>fJ=K7oKf$MMfSIZXdaK zBfT{97o(YX7hI zQgO+@K*st1hhz@1Wa{ViaoMA0#JH|*#mN=$yD4T9p7>!hmi(Cn#&Z7y@gt4+!26GT zke}zMd>hk7iG#R7{5z;c?}NA>eOPk$eo0Zq6JG(nNSKA)4-?Xyr7){l2dYX`W|=cvr~W8b=PG9q8w`J_=g;G?n0t_lv+w zFO##?WOPYmIbFp>9|NsfN&ZEZkbD8tl*U<21kuL{UXp9AQM9KjniWU%Ez(ANVf9pv zzK1W@n1beGR#3k2to*_S!L7c;d^GU-|$ijt# z!AJCh6%t)4Sy&9W!^~p|2W9Y>!tu)ixQ0iSl#PbwVDMDN<8?Z*!FHNF921hS6SVI@ z(0=_v`^y8(%R4m9(TTWLp(~SLNy0!H*4-2b9MQ&R@F>L?^jkLkW|a~qF_s_;GyLFU=VsZ2kEJKCZO zxoEJ&AE(gIT7@VidMY?BzEcfEpCfGH;=xEqc1X@{Q-~vc$so>AJ;Dkx!qL;j!BYki zkM1EVB)SZo=yD-mI*53T5Z&H_LTqn=kNc7F{l2Vkdh4F{R9Im7f7py+fO2xjBrCAq*pmS9Wif=SwGOL9jyPD~!A*s}e73Hn4* zI+j|P#h5|I=I-dY;;@f9xMg;hNc>gOh_6;NDMHmW;@`?w6FpOKN%&^T%R8`vCC=e+&syTF+tSv%DEkB~XrL1dFdWrgToD4*&A zIof@Inx*3B)KBXR+su{K?JmhvHeUm`v2OStad~vvsT=-A_)o?9JO* zsxx@{f2^GecvRK-|8MRjGs%Q4gd{AoDa%L_5D{fj6alRwAR+<^0&WPXqcecwWDr-} zP+J#V>aKOGwc4t+R$FSVTivVH*2H})F17Bh#{cL0o;!1IMy39q=btBY&iS78J@0wX zxo1BW=|%{S8K>R!LOp9U!LZDYq`Hyc*Z|floMhT3sXp}@;e)S}8Ce=9+sv)H`L6eH z4j7&Kz?t8p*~w?%1orP^PJN^(Xy%SCw1sBC;+TSk8L&_&`OFp^%n&S$^z&0J$Hn!K z<@4~Nys5lg+e+Spsm0G0R~qY@@0x+WQq$TxMaU(SA=?P5C=f20?5smW39N$q3|9DaO+Oz@4tx zjYU4h`u9k`gykC6D%?kUC5HC+OvToU!{D`YNgYjFk!}Mg$2^X#$I~xku1-9~Vwk)4 zs3H9dHmPIqw^EjaJB_^#kCo{!$Wv$TS{Ot9@_5knQm#$PiCIjzyh@Pf?gf~A4XAya z$?`;&DiF^?S-h5Rd*J;IoGR0w5n=jGj7?j7hYKf#-@>i2_jkL!jT`sI&aLH1u&Q&G z?!26fAKW3haVfh4B0LFS;MqF_Q9I$*lBaqv4|8`xX#c{?*#AalvY(ZSpUN8YM*i(+I(LC8AKH?aO#c(5)0mS9o}EKbu0+eTJXBuAcyAL<`8*&|m6KN09-phy zc#6is4!4W;CT_n?zlTo_O84zvkzy#vLFtO_aScb4Xdj}fm!8Ctu79#wZ@5>q*Pp_s z2X|81#a^3e>qnyh#>=>4#DOl|SssM2z*mo9HNhSSpHtDpe&%(7X3yv4%8UNu%xeD_ zH+pJ68F&=)xaL@hw|<`!seP0Q_g$8YeV5l9*U`@``Ej$ua&f0F<{|~OhKe}uM8-Db zI4qfnIdNbutK3fg2b@lr=calWG@%{7MX!lr>_E}}k8#Da$(CXL6A@=(mNkb7#zcOa8U4ei8(#UvZ-8uKTdo z%ysz_(BnBF*L}#i?t?5`_u(|x+6EhmJGQp@<0w6~>!#oDyT`mfCSUp0xJ0L>wanDD zwBhVDm4>rJTd9+-^n+tIcg;dt4I|Cb#7FZs9M5hgBbM3&t5g#csB2?H8VMCkv7p&__6*e&^RId^4te>V zXeoSgER-#(xU^#BgDr^G<^NqIGZKqr((UuUPcmr)ray-snl$>AUtrSY5Z@VkWid5{ zJs=*J|6tSH>KvhWHKjsctek9ydbUAB@L}OcO=qZ=FKs6k(QmRW3=1yulKzPx@Y!SKr_5 zCqkf4z^@G%&47hSFbgxNf9TfKHwJt-*Ye6+u%`1Etm$qo_#89W<=3Ofb3%>}s~jI> z;nso?-8H1+UJsRt{g_*kw_rb}(%gys{V_=MVv9GHztr^d{3WKR%E)4VgPH5{7oo>< zLN3i?NfTBX{fg^>Ag-&-e=L86>E(IWjqnk2Crwhefh zL-5rja~f*q7bpYf)9;ZK3@u8rMe{SU&%im&pdHz<@U46XS%ys#j z(BnBFSJub7`Y4MI=Z`f{$i#rPcfYoP>q49%?`jwSv_g7|-DVI7_Knz=6jTl9EN$i>s*;*mv>PThsX<|gk^;)&Tx zduI1(EURc~jgKccuOFSQhP~|D(;!oq0~J@-cDg)icOX@>`}%51g9-j2ZozF0>n*Og zcRz-9#2P7ey*;^vJ3Kqt1bL-x@{IRPHs&mHPOwOuUTw?%X;*$9gI{Kv9`Nf{4 z1{MREwhpaqJ4UT~@I6Ox7O=94N*glIfQ|Tp|>2-mYkM5wzDP zfZ5*o)qeS8!Hq4q&U+0H)Z$pf;RiD`$_r+BuC(T9-1atPsBGd?fhyTc^pp#2)C%wE zDTQ%Dg*OpFIhQe}^WTO89_Da~C-ojw+`4z18EgkzF0{|9*|=)iMg_5)3y}_OHHcqDa50jgUEagubC*&Ohvf3 zG_zrty9j$`Jsr1H4c_T*m3w=V(qrUh4HJ;%KGP%JacLfv`J71BoFco-e=*wSRGH4x zgK6akyV@Y>0>#s{gc-s@OAp2B=3vx!`gXiqxw-sI4H4N&Z?=vg-yKgTTaVjX(Us|g z|H6F=B5K$#f?Z9gibA)+=`2~Mok!}c0$o* zjpch+YeUuq;9zdzuy_*Xdl&aX#ccghh3@*A%{^n0iQej%+vL}O#PIseNLUfe%r2Bf za2_C*>PZ&a%k7+x?C4B$0b5udSdTpmMy0M=9MA=6~clBHQ043XN+_qU5Lf5Zg4bKGR7sRCK=H7xFe z3N#L;ds-4@H*U2E?PfNzwWH^-qt-l3iMPkss5tvVXSN^8+S^spdawC|(>6+LFO)$4 zrpwpfk4=%Imtf5oA|sR1%sc-l2Yk}Cvb={e{;<$=4~AvkP!b~l)} z_D|TT{WE{b*f9RL>{_NXX-P9|DZ}^K7s4GFOMk|!nV)-{*vx3twzhw8Pd+%zsnJ$E zfg_E5uXw}w(R`qN`#9yF#+EmQo<*bCsAoGrGeMlm(Jb6nB%c4Pb2(_t#gZ<+ML0D` zF3(}&p$JnIC^d>e_36R5X=lL@bovRYq3F#!`}Kp9d6D2J@_a$d{gx+DyVK)3fy&hS zGf|Y2L$%)`t-X%e%KW+@6!C0LJUoM;u$HKOHhDG32ykQ#!^^n2`fPG$XGD!7w!NM; z<6tNm*wo3Ut){bIm48O@HCX=j%$fM0{$#^0ntX#BN-xTYhT*dsS46nr_?4nt|NU8S z*lgBsQ9?f;>ya$B{J<>o@(1Lv+)jNd9VHVwUgz18I=`tGp=8t6i%HY|?XGmJSZXR# z&A9U>YX|Gpa4eD3i8Musl{bN(=CJ<7j~+_#ZxANg^`KB|(D{|gKiw^RBNrxj@Snh~ z9uIx_F);H)@AghWVyO`>O^wC=iyPx`WcdZiMwTV6FJg>{>)(M0vK5ldCaTWY<_k&k zsc4bUe@JWj8>-}Ut>lv_OA1L2$fvZ3d@58yK3gnJlf!5s$+n{$nvIjg2CflocWGOq zRT1VJMP?f?U+2MmZ=iS9&kHO}c#k~gH3U2p(Gi}N!%5G3(s=d~PRaP#pC~6>KM%@M zNb&qDnEag7^cUdfZnhsZ^C|6lmJb~d9XQ8NFbBp@&G>Q{@MA1ekU$-voUHnfL|66S z7QJ~#tNx+@_P#2ur4?1|JrVY{E#j7WFuax4UblhzX?0&gh-4IzxU{*R9;@_Lq}Apa zXR%szQO1R~j&T~>vvbCK;<+NPL_xr-LQ8s>pL-2kKli%a{M;L8*}kMjd%eHfYj%f) z?RD?$cF^U{8h#0%pE5qbjTdAy?`P)_BF}0S@j3Nf%z2l9vtUbid0vV5xlO3y7G9q8 zurR6NB;K4@Gn#~WIc9sbyl5NKiS%3`=dne$I#ik*_mOfMZ#u@$j*<5dEqbRak@Q$> zkpS7`KQKpGr^aDjpB|4|Tfwycjxy*?oSiTs_|s&n2P%4i_E+CMZqw8;nGdyHSCof98p zsUNvWv}RC_yQ{Mw;gpOI@#15dI#jj&7z&x@ud|dY`=H%*NGKGrGF^N$C5B z)m5cTUHwd2%fC@oS7`+s+m7&avZby{i_}#GDb`g-o{~-TIne8Vva$DVgL-QzSk%#a z8`=i-miCUmllSOfz1SGzW5Rpp#bO;6WgXhPr}52?Z^Y*~Az@U^a(3zMoyhe^LYj`| zGx#5@>bu9?%bS$y5zH2)_kjN<_DEyj={C}mle1Y1X&0?pB3u!+mTfUqv z(%b8X>5$+$85W=l+mbxw_WswmjUxgjl#h|8l1ZQSf zGg7BR%fVfH6k*(H3L6IH-u^hAQ#C z)tcRCk;*}>ne_I$s|y9JaKyAPG3h27P*r|QYkg#{Zrfjr%9a=LvpJC&2T*kdmbN1>qpV0GJ9GCZz}fv&x>=UeeHv14Q$Zf%#!{H#jR#l)-M~;&2VOuhvgJX?)b_9l)ATU-m4pcTkO zYY*MGWIFtx%`Z}R;zlgB(7amNF>mDk)yl3HPPB)8(5mAN+xJZ5sNdzy-4X-50o=dH z*P|>i8|veUu6$oXOQe3JvL02P7;y18&&zLvk3?>WsWJ!Bn@H`6Hy35SMVMY>oLr1* z74IMnn*BH!Js1v(B8FgFNNeeh+MVMaeCQfmUm#^JJi)57-y*HO?z%$tQz+s&gm^k7 zDs_ceF!HL6vok@XPOI@Y>~sZY>ClWbz9=L_GtO7KvF#XcQNdQtxb#S`-jb=XQDx|&EGpxmZtP2+7|p$sh<%Lio`j-Nv7;`oWiTYruGYAK%y{OGP?h1Wvme$L9aA5N6*05raJTTnN@CTvHd8Rc(@J3YgNiQLv!fGTc3CtGeV zF;(Vy>6@88b_02pm{_U-ePkf7^!&>FR?=Gfqju-4@fj*Px{{Qf96I?e(jqKXDB{sT z-cewC$p(09)fjO6QTN-$TQ4Gpw(disJZ?S7Vik$a@HS+AtC}v(_9;6lrm5p&&xLo1 z9Gopr9}h;n9asU-tQImFI@Ts~LyZw;H9-E0WT29wYkdTA__B#|<9@+B2#aW)abB$AIODu%{Yi9Bq*Q-Q!mR>1 z!M0+kiRT9sTTl*6c%3Q1W+Wq9K1D6kBlX8hA#U{tvF9EcoNFrP=0)R}wy(eWrnXZ3 z5{ui)wx%*7&7rlE=0cyBaf;48s;%LMl8&-G5jmZ~FCxp5nTRaMtY`PU$?_1KkmVE_ zvOF!38xL2x=>nWS6ec*qv^GVODG7~8rb5%E43pL}6jg1?S(41Fp^Ez^u%bTuNlFfe)=KQ_HXo-bXp#8}UcaMy#IK#rxAU#r~dh6iY3a&*9k> zROYpf*c3Z)%oLJK&6WHOomP~7a5Em@=Lj_Td1N9-=c=5gxc&5zj**Mw6N&6u+EXb9 z=bXL}yn+t1pJuOmp?%fYvjfZBuwDtkau&B?IUAge=lMC=!f$C2ek(|k-%3{9 zVVi`q$Sf8np^hx_DYULk9c6qn?sV~fdUKICN;;NGJKp5Qn~~TQdBZHJ`ohII-SKW| zaoD4=`b%RR%NyP=7MvH#Tmx&?EXK3V;HQozN(SG@pk*_Po^EwE&{s%jPt=|G*3-Kh zzimm=0srCs4iEtE$D+ae=?T?MhVu=bTImaW{s7%Sl^=&|Lj9LG{gGb2Gjja}*30x@ zdUC0Gp{mNteW+RPR!crJkvfNP+>rrhE1En+8xECNhYznSF_A@y?I^88o46O?gA7wh^tG;2M(Xk)KWZVbMJ6!?2?V@ME@;E@yMS1^HP`#IA(*q`Z5|9}|qC?gzpXqcOqDN5ST-H@#yZhAp1(hvN0 zQaw8+rFG<-Xc*Qz%bum=@daoyG6@d+y;xrT+j+@3rxLZY9mPYfuB?)ciTdn1s+R8M z+7F+>rp3l$`rHKWP2yj&#{x`krN*R&v(GnKsBeBYx#?!_&Sa_5cfujVyu zUry(}FRzJy#a&Ph!~M1zuZ{P&FNN}#{M04Vf^SZL&mZXS74yAXuP)`xiuVcP{YNog z)*$yG`c8=^mMDiGSD$SCCGM2B5mlL51leg?=XidWsI1TLE3N<6&OK+AEwXdl;er74 zcawQG8{zXS^VvAWZxK%Ijf+-l_LgIVxiuu)b}sk}e9gpH^W!dK&Z@m`qJ|8XN2Z^Y zZhf+iCDskfv?{XZQ_7+J!3SMlk1Av$C-R!er~;|?kQ}zGm;u+qRwdZcflaLm|PUo6E22YMel8lBq8?v<$)8PprjV_+Ib!*Q2RB0ryS zK{^yNdk>Jyc2#wmP5 z^#pU3d{?St5MMKg7;TPO<mD<{(SE*)J<`vw z@K)g7W-__}CuDRX8hxX&iT2u@gsoxtP`h$2v+GRG$hF9-y`J%%yHLzF5(Mw3QmGFj zFl9BCkHaF2T)=^v$o-r^OryY>EDK_B^M)7sPP1Of$~J|RKiCDH*_h!#vz)fXR#OV6 z;AQip4AD-LbcnQ;15q`~U>38n)xN$tInala7Lja)3VOXkioHm&`NTGEk{F@m{kW^u zF=ALyO}<1H1%l;l%YfT7-wQ$BERzQk}(mjNyZ~dJ+-$#i-4F7~oqN^Ac7^KJs`u4Ry0~6{3Z?io>O~9EPg7 zil3;gXd`GIhI z5*rzoeupv&tvimVYoJY&2lQFKRnN-cv!*8^WubgU%A(wRi*T=4SuDkgvRIBrJv%h4 zXNmewt?-p{xr-9vKp;LCLr6PkX=D!Q+e2+PicrKDq!TFun`b&n2Cbc(j3HPu5#RJpKUR9n z(Wv^SU!cl#73}9M6IS}BOK-2E9d_SZg(Id@h-pY7#cWXXR*GN_%> z6S;d(UF|HdZ!BxbE0FW-B3M|gvPP28(xJ+R*2OAYT+e*-<6@mv9!kded-}N(Ewz(S zQ>&02y1Ufpa%%%$GhUyJ6TChR4PNs-KNVB@2K-LhC@t3+u#x zeXYn>5gd_IuI)fhUpL;JjuX5)6Aj)S&-6N^HIMUiXJL~ToeUNx;GLE8qE%oNhqDZE z;`uuyCJiYDByd+C@KNM>dJNtI%j@ygu*;L;oAaDMo3!Z2%>#=``SoDurvaF_<>Av9%wG`#CwlU}=%YMxlbnW{d_6LE@6D+KQTr z2Bs)_*HrX#cUk-kDp&H;EfHhp;v1PW>Q---It>HApE?bieh76#Bk3_h-3&K+ZZ^Gc zKQO(!$z&qcLP}$3j*3}5ZnH`E+HBI2pdXOc#+@_6X6agYlY{$6(2c8lWaeV+dN}V> zrYSl%$wcNPEC>862F{AMPHlae?hV=`W4lQMZBjVX8(Ig=ePP{N-%$qQ9-XtOJWHH9 z^wr*miAVwRd;w0#^F?U1Px~=l0f%55qez+>bzRd8Iw&ohCD7!6%@Sx@BA6x6)=tIZ zvsAW0dJFsZ%e%8wc8R2yVLeQfgI3F=M`j5Wj+it{(77u84hgYzaz6}lOD9$7x3OwY zRCQ_{L^M@y%HX3df=w#5<(YQ;GHBR--{7bU-N+p=J0{b$^6XuhMD8{+V(~Cr#8G!! zP-xmRb2NTC1mRQS%7r9p#pJb;QmL&-q!4sgBP;U1Au2stzKGHbUxiNXE9dCUO;z_Q zw_dKP6>mK35hJns{m!{Al*urh9RdqWbK+gy8ntFsAf*_>L#ce_Q8H z13riMm06}g;>QP@*e)S)zvWWY=q9$%w%E>>S^g$_LzjD<-JD6n%N}3c$EFy9_Pj6y z?B);o?s4MST_Jw? zxvS8E@58~QL2dH(g6F^Gm&h^Oi!k=+)H;A*4))}J2iIGwNJTcusG5D(<|?J4O*+>~ zZ@Cgxn{?=vHnzS(5`In&+N2{rvPnnb_`bW%RaL3S;C22Q?D!B!OZ^3l;4>wu)pDdw z2%7l12|<^1B7YtJgQS@dyj)2iYDvpM6N1ts5^PB)+{9y$8om9^rKaz|W>Whcp8B~T zp4tP!jho+WePQf}eVyG?;p<5=SpSxNX4-_pTZfftVG{a~FSa~w}_!GGA zR`x>c%GCMT4vV(;O$gDrj_th!B9^*9KGm0xd7UU3>L2oXJx<8yjcAO`Pg1V@+zp}( z*^K9J!sO?qHrF}(H8-eY(}9k+YBcA>)p?2Z@FOx?*bt~5zU>Ee^BGE*{>{zOT7HJA z{>>F?^;Y^h+0wa@7Lis3AreWeuAp>@4)2utg<5U5)6dapoyvIOqiHEw5*<47p|xu^ z3jO$}UoQ6JMOLKW7xTIo`F0CV@a-39@J(}k@a|4on}Y4CmJi$qOZU`OUaVx zz`fAA(C8NU_rjY+{)w;%|F~lZ{{7SB?slBu->=c&--Gavu7;+DVB@c_Oy3I)`8zTB zIjPNkoc)0J`6~3tcEL4$yVyvNj%qJ2Yt|!~+t&>E2p^eWS+1B@*NF;?@D9xVPuTI4 zh|nt3(*IjaE4tOv-X*=|4pgrQW$ro2riGxCAV{1%OGX#ytF%-Q^U58~I} zOMUG2$MRqNY)gPen#j@Cu{WnnY>p)w2Qk+zr-tq^_qDBx>`qs4XzcM6n~ zYCGsURW^_I8xlF>xO@$r1>6*EA_tM>*{fh#{x=HIkXPciHZKF@RIZ^Pd{C#o{ z(1NA;`vr5dY+i!+3%Y$Lzc&Y$zRXNn$uUhI8a~K4YP$j{e$M&+PFi|?ixwj#nu?Nd zST<_Di??}Smtz-ez4^9e&GZ9P?e(oxjf>wM=WyKw&XkPUy4k$+?ig#pFijV@EX-@H za>ky^=H>rDu2>Y`h}O7xb6Il9!{E(uu}?|LIYrC-E92_9mV|FM%lw>@-S)hIm7RTK zniX?n&HuH4M{w26W~thuBUQFBLjo9CAvdVKJ3CNc-YeE6w?3}Q7Osz5g|YSV2bm($ z`nalFUW%=cKZb2_P5jSplNYbd`nf+U8rBb!O}%27L@nbl1D#@-oeChb83Q_0x0j;p zkHfkIkJa;tD>1l(Su)K_AB1Y>qnmdvdNTLkcArG(-ZUU^k42n=H$LnkNmA!kGuQuV zqMdl(`0yvv<%|Wpmi~;%UGvsX9i~5C-TH}0i@JQH+Win78JKF1jEqrt8l-sk&(zNR z!_L!geom(Jg)}7f>5EX+4ced{4C`GNqX!e7qJwp_N2Ikph^lq7tMyqq+4v&|*3G1~ z*ZsOMpQcd6b1Csux9#E9HI<%fgQZ&!`(ASPqE+_N-J}|yDf*a}vL(sj_A+8}eaz50 zk@_jN!?btI_ZE8TC)|{o&kb2Wf2%Nkmhe7rFMjt$e=K#mLPf_{<=#;8;`YouDk>OW z(2hNZkz3xWLo&tFk7JvrcTQ(j_b-HD{_;b@49~tm>8yPmzs1Cp^_;@V9J3$u1V4iz zn*ooyTgK8?Kzq|x0k{&-Tecay_bghS#WPNQYUr z^bDm%q)0)CL{ikLvZ=B%buHexq?#cpi!*&{DvHPREOLvL&fpFBcd`;%CsH?JYj+*d z#qmx)vnUfHC6>BLuC5MJ65fZF#}_34@uo=}`Nb5;kx>Z*f^9NdGOx9EH}2)XyEwu78{GjybNFC#B7$u!TI8 zd#BNhV^)=MRVz;HQ$*NpLRgc+*U;$9r(;q@hvox*9InMvaDPnj7T4?8__Q!7Dc9~9Wv_J~b(2)HFH00mFOvAL0p7g^6aq)Ak7V81(Uvk_Q zWBNAyZhr1r#3Ms*N^5CDl?*Wl#8EAyKn{qJw8)5Fp%5ebYgB4w%_W__eY5FlHu?M0 z8}mcc6Cc)4Wy;xdwZAnhvI&@5SXU4y)C5W|t}6(PxfJ%oO)HS>9U(J&4xi?{J5K+P zyl95v`}1;y(#ZW!-u-W4-&fJ+oEZE<1zi+_Uy1U!$dDKBCCXhX$l`xcuGx<7r(E6l z{{!VpPi(ey?F+>6jlh^uPG}vQe;pFrTg1x84`Org%@XT|VLzD7-%spmkvb${+AIrq z^!sd%sy0?h|0hX}4VjgEqg?$z`!IOkBU`~iKSr=hUu~A{+P8wTddYg%op8~$!l89S zuL7u@o!CMoWFyC~9^U_$Ur)^Xll{ZsRp=7{QTvm?vj3vQegxG~_B7^2|3F%L&zngL z!>R7*I8RMSEOob|MQg~*N$(?TAK%7_Hh(c~RXLV^?p-YGJdvOKC&r%a7vF>)T`Sgz zY#ov5vk+M;R#dcB?@McW2UV>VUzf(#Zy?Lh$${2NT4b$Qp@`=U;$v5IUTJdb9W~S3 zn+1c zS$%A^pF?`2VKq|S9?gd08AglAVqhp9E(L|wY=|<(7slc$qwQh!PW&Qs{bE>TEvUj{ z1nd3V%IHI!IDfjHfD}_t71Nr99C&ua#!qqe>zCy}lb-v?)PJMeb!cOlpn>(yRzB-3 zBuDDy<2MjipVnbT73D$b>J8gbD|dB`Ql?Nom)62y-oEfRsz_b!mIEJoX^~SC3Pn7J z5MOm->@_NUPS0bRST;8x^Ak|I#){RbVxrq9I@Kt$qSJh(O>|4#BI`6p6Ei>5i2_l~ zSKOqc%lbLlYT8G7r09&K^5C23IAtVshJ>A8V&TT|D9wU#vM}Rj30bZ?%(#WtZjvQh zu1COaRtux$Dz0^yd%FjIkPLm3FLB}%{a-ZJ_+}(>bXm$dD*hD~Tj7hp3A?1uQ#bq` z_>%rDiVEsp^x$$4MM0hWT3XA0P*vw{7BA?6$(9Nyt-X$}tlONSAVl&zBFXN-Ww)B- zwl0{(Ws%SYI}&HtoQ2lGAtcBu%rWNAD)zyYcyJC${mQtfHj058`E19De0o~0i8l<< z#SRz4BxHFm?ONt!+S)|!Q}S-ZKKEv8O}dPt3Epo_-A}P}@X~3Bri%6@rK-k$f!C;A zGW7?7WLZy5o-JRg?J#vpq?Tc8J@#8^&uyRAePp!K7J}3FV^oWgIUkDj*i|zB8C3O8 z7N57kp64wRIa%vvi~G!?SEb&wc-GA9AyQ6K`$N5!Xd=%7r~g2V*9_hwv!s)v=^M#V z`fJVbjfBQ)2KNhM>R%Q05Fo4S>+^T>5jIul^y20GG^b&kz`wtlkRoVUgRiqEn%D}nD~5)5tFQ3v|ZU2 zg^gU}c86W+p><)-b}xwMk0GCTHud95emW<;9n}t_+24ZUetx@x3x8cO(5CTbYKQhm z#T#jV;@&;@p(Lo6F^ZRZS%IeW5`CDFwIZ^z7(o`(f20)h3EUaZ>_B~ehjJT3=GCCf zI{kn=RANH>q@^w)Sm&y-pGuDE^GORjR>SDR8!^sbdLaI&N|^^>A~mT>&%q_rBdL{z zH=94S+R)3c*rR?0KFro$jS2Yuh)T}t!M?`tpw@69hUlZIFVqIj-=9PxrMo-D1?}#v zmflj1s@_)$T)@?4EQVQnzC4GM>zLB2bWV?i*ybu(9=GOIi-dZj1EDx70G8 zv~MXpV&*fZuq^a2ISAx}j!kmh3mmI1jG`nh8jG0J)Z?mM{sOk`xsxWqj2E4PZJ>BDi=pwqcw1E=s~z4zi@>P^c&mb#UrC>_=qQ7W)xOyLi?+#%+~rdty`M6&e4S zP78;Tvkbh$DeyD7;{$)?XJ4fn_!x=m**8wU?oN}E+7SglRw=qIqR|a^4}?CB*J2Xz zQe{6D9p>2{l&1(&*n{$7MzmaLYs#>FAS?8+lEBA zRRJpv3Z%E!Z7c||!V%MR#DsJ!wbb*Nn<`r0BF9yU^arF}l|4Vq!37wHv@NO)cow+~ zz9zoXFZ0TpyJMJv2sT$?=uF~GJt9#z`|Z73&mi)e__w$W``m$=Hn#bxbej4GCG#<4 zGi$FHlhKF7>iu4rT7xRbqRTSaA-@fb)smx&+SM?m@yu9&TfwRu*^jl4^;bg-H?WU$*CYg2Bjl0ya@vocs#g;*?a69b-fjFFoxNH562-^lb3XAW|^6ZE^>vg#eAfkAtVw3p*c ztNX)=fx3^K>i+CRrVH=3`?--|>$&#KE<)V2QIVSVB57C!`#T1GB>sUOd?XYRABkE-%-+?%4^r-raMc>rSNsWg#q}Xj#n9Ns4 z(S(f$-fkC^t$LZ#Bb_Y;A{qpc+$jC@Iw)#7$7;W` z5i_lNTLKm_)%)clGehgj)GOH1X(-zQhI-4r)o*yQ8lZYcul=jYSJ4*JbBX$BZYiN3 zi%n7JRTuw%f2(5NG^qHmmEDdcMs6pdQFi+>?sx`j$1q{3?czIQtu@WUS3ynqvyduT zwU2_Ex>6*_>Mqh+c0!e`{z~73w~2>q5U@gArA0mo3Pn8nBrvaKN$Hc&9INCw$Ylhq z3_b^P(*5&LVV&&nDs&A}jSLEXBK`w9DD+>e&=2Ao3T##A(j$d#R0M?{5;680wfaF> zTfCO94o!JzU1-X^!u*ulTJ4(~z%SC)iZzk(Va(26er4sbD^8TdWHid*;4vqu0JLZx z?;cCP23wl61N;(f`yayP8hA@FuT!W7-!*@yJ?V;7U+dkZw@gCS*ZNLz*(E?rCNXp7B1WG5j=h7W7m`j{Czi(q3cv)PNW9I z{-%);THL##^g+Id4o5_g#_(*j8i{E{Rcs{asMBoPtwA02!u9ZeZl>~9o_?K@a?uqS zKAjxXQu7ongSB`^xBYONg`1z_Yf_Gvb$Fqf8Y2p3V^ySJ*EP4RNBRcQyQe3HXUEIa zoTw+=JO3s=wBBFk4WYBrZn8fQPZaQcG-N-)V09rzW-d9CL+fz>z@9SIP$S;iS!5df z1tr3Sz)T9X%1sREee52Yl`7#gQ2Os`y%J_y4uif#ZV9T*a#Y!4(doA!$5P{(0Fr6e ziDm7sbd#5AXx_$$O;q+6LxQ_NR%$90kCwy;vpFgkI9w^A=@ic+hXN6n1>ji-9@sx7@ML%?}@B37)iQENtmc{ zuO-OJo=srt*Xr9lknHyCj3FHs-)dsncd=vN$3M}yKxx~|b`*JP6DW~-4>g{C-_#FK zQy-#a|AnF}zbrEKy?;Vnd;x0uR~4qicO(wx@M7tY@T=+Yz0E=sAc}@XE_>*CKeO%A ze?WhxHRNKO%jPxA&HmfMZDB+DB#*IYOrG~3oXInD?zbnomKecT+=~u?$WYWIK3Un#EY#6==!$w_T&GiyP~{ z?I)J~6yj3is67MZc&WQ;G?x^g9J^ z7HVoie}=R8q@2r1;R+GTI*-v_nAL;FR2Fk@!7_CZrKjqyIj#e#Q%t>3r%u2LZzrK~ zmf<1z$IyW}9Hi_-h0>Z_XM1andriZaX`5;iOr6UI>z-xQ!N$%7i5UK{EM;jb9`cg464sM31Treh{hDMR zD`a#nYImmMe=8Z))V80KgQnu8N7f(|j+jnSl%(FNbr*amjD6Joc=}5mnmX0QtGK%J zKT57=W)ZD1-~Y1@Ct6z-b)(*zAaipo)YO+<>YU&&^t#3i@(ZN>oBSR5@qI5 z{PxIv$V6f04UGNASnsCb`2~5Nj0l;q)mBFM&h^T)4dpeJdIUROAOOg=B>D;P&aGW^ zWSBd2@%;>IW5@je=9b0`RxvFi<9LUP8Cn-BW^^32B{D||N9&mit@!PpuZl#egca#K zD+Ybea=TNJ&IsYfc5*ZCxU#J-z_Sf;R-^;$Bxit)rg<<%c16a`0NYgs&@iZtR1YD1}rP>Okj4 zE)Os?2iiJU+3DTpE-v+|^j8u%bzUz~-7%7?(qCig0&yz>5v6+)(PqZb>J*AEnm9RI zddumknmD=Y?mdAluziX$T#pkOJQt1cdP|&>{*xxC!0f%v4DYxf?FI$zdCl9v_Pl2Q zL*1YtcOD@J=!R5PF*wt%YM`<2HyAX>K`)`OSzU=S$8o;2mUB=w$MHM08oQ`b%*lZ{ z4r%Rmj~1rn6pDCg>1@Z^%-n$|Gc){PnG z>KevG%-EfUkC!q}k_nf;gnNHB38`)&M%ylemqf#?W-O~nk|Omj$4D}?k&!)rWrTOo!tt|(^3k{udK^mi@2YICYfHkrRL zOqTYZRglKk(=1szsJ)jS5o$};Exoq&AJVo(DQgFuN$A4fg&GQ~Q$U(M2&;7fYxFF6 z%PoywGlk{eyb7%glShShfJcZ{Q-*Ky>&CC}HxJ3~!S6`KtuWs&w}SoA*ehINJS6+k z{LaCi&PVZ2;~|DI-qrjf^-LlinVX8+`&#Tgqn=%a6ZPz3G`nl9>4-$C9>)8*ORyT; z93SHP@lPS4v{IL1X|Ls0HYDtc-}G4I=lgbFyY1~tg4%VNv=(N)taklgtqwPR$(E`m zEmA%TLe<(@EG-nyTij;oUeIMvL9uXxEu@x)MNVxhSM{>j$3p8=1(w6yd~J<)!S&u2 z;-%(m?|h&*cO~LtsknT)_DJ<4ZhZPFPVng}G{+|%Yq$bn%%g1OioCf7CwOx`8f`UWuIn%{&&%Qk?Bn@M zvoKBtjA2hfAT-}%jGJ{z%Kgn%3gnOb-*tl^M<<$)v=3r?;}OtDFXrT3f**#tKECv z3FNE0=jWdj@f=P2tLg4N?`O?imwyI5o)dCwzrcn=-KO4xn!h1p@pD<+ShUE=%?in`Zg;`joqKOOE!AFMri9==RzMP0Y%hxuQR^}%t0STR7cv*a_=_U z)=Fy=eu)zl{u+(*yK1+O=T}AeFU2G4eYm~Fcj1MtUeb6LdjD)C{LJ4C8lxVtpSwfu z=A1o=K0YVBu}D{m>q!(_v9HDu40DvQI&!~}-f}ytI&xIE#?~GdpB&VeliptUmqL$4 z;poeCBBty#zVF;gvo~7LT{OSrsIc2pt;r9FI0brw_FcE*sE}uTj0_D;B*JSB26)=&6xn7@xGr_3xG1?T3vS4_henEpTV zt6s-u@_V5r^h5I7Hm@o@gUmK<6=W;O!E2CGmF{26Uz!mDv`IqJYblGK;~!@`nCCLX-+xJ_XAmMjtwC{(w z^{d<(INQtyjvW>w#Vo!1tj#YEd3_Qyi&LVv8V2EO6?VjHdWgL*zZo1xKLdp|bC z37igdqq#rGNiT1kfh)W>7A(wAXygkz7vVpIhhW;-o!R^@yW!cq5`H+EFyD!CuR36` z+hx@a#tzP0tq(DUU*%I zFB85##4iZH8sg52zzrxte2u~p|D%N`h3>0`*M<0Y;opb&qZ0RTggY-T#=kqpX!zN} z2Z!#r2;URp&xOklDu$nmF*7g3%Y`HKtQ0;sbl+Iw{+RG{q5Ie79`d8=VB915uNCft z67Xja;aMR*Qh0TU&n>~1311(&_dNtW6eWmnn(&ekUoCt~h&Kv97UE4M`12ARI~4yB z`a26ZpakiS7LLR>vBdvW;n|`8!f;R|XixQ;&xbSl!eqZ?W5H}nK z9*9!lk8p&ZIl_mA?(2mk`Q0FVb?APla3uV_CH@~2elqm`w(!Rx9=QZO9wngXSm8)~ zCzRlI!V!5mU-)vAApAz*$3k3oI5=zhKMZ6SV9IFi5Dg(KlNmEf<16U&O}HDZkV zA1^#5be|)?v({^g;L@vj%YBy@jV_=OOE zEF6jdYvIJIV*Fzfc$V-1q5t*58$x`$aD<;5g`W)FKNs%0x|rS! zjG1{MK0`Pnf0qkK@_&Qy?V~12}k^2FMM0*|H%^k58*dM_b-KGxng<^7&8MyJX(0?5YG`_9OBi&Cx`fY;Rru& z6TT;Oe^>bH5RYu>=zqL$g#S~8Bjcml!V6IX{;V%?-yj^}_tnBTh5la^Wez$ zcW4P7Exa>Iklw5kyihoj-csR6{*MvPp#5&qs@g6|bx7|Qd5!V&p-QaDoIUKD;EC7`FzTJT_$08bU372>>b zWPG?zI3h1U7LL$&nPHS5z6XV$4Dlx6hEYzb}^ zemis@dJ1?XN)X>t;cSSn6}~;ht-^1I_-o-v`6N#5h--xVpak)cFL9qzf@cUv@;6WT zV3Z*Ig~E~auPnj02uI5Q-V*$z@QWxxd|gii_d*HqNa67zUQ&XODZ#lCd};|kSNIZ? zApTp0?+)?X!jbmQ1h;N$kybwPm{A`F9o!-&^GT~JyLHIV|cS79r zjE?@d6dsNe_`gE<<`9oPv!nk>!ZT0;{|^d39pb~z0w0Z1h)*~oKR1@(JA@r3ze;bAC2dw(G%>{O>3{86}|Ss1kf!iT{&?&kp_HA^f`#za<>04r#Sy z3vY=M(6_hn{vpl?N78E%J|%R&UpVr;e^~gL(7pG$;2|hM{L_W!hWI?;OGA8@@E=0_ zits-}96t{n$xlz=2z~v8w?_%mTP3_U#CHh)F2sKqej~(R3CDk23_k>8v^=*Fo*TN~ zEd1LLvyuGhOgEGu{YAnNdRGXa6uRFmd{>Ac6@Dhfp9p*B7vmd(F*^R+PIyA-zDzih zUP}o+UHF2~|5w757Zl?^7h~p<5I-gy;qP<8n?m=#7lMbP1o_=rI3oXhl(^3-!3%_+ zJG2;niExDe)xweZP8N>Pv%Umx5RQC5uNJ-qC7`cW`0Wt)xu|1&gM}mg&Dp{WQG)On z3SSxGSA{o)c;E)`D3rkeLg93XFA!IOj|=}!}m zq&LSfNVM9Jo+l|PACQXg%1w#iNa@v_)g*9hxjAm|Ax5l)!?mBg7^*) zUJ~L9g|7|qtHPT?Ty+h&79|KjQh0ob=LsJi;`PECLj0h)hx~j}_{Gq@;#zQIe!pu8 z?j;=Qk8EY`2NmfVAv_i(pl^=wf)Jl79Ety2;mbnz2Zf&uarJfJ29zMaNy5`Ye57!s zJ{>E3V(5Nr3BFf2(qDK``03F9i0eDLvk$I=|4AiyS_z(0f)|(I<-*6J1o?Sg_`?uS z`x$s1O5olm9HI9e;ZH*Mxi^3hK?(eSC>-(srEsMEh}{T|)Ss@xk@Dyz9O36+;Snf7 z{4>mdh&LDx%l`)9Nc^{#xZhiXA1uL7mf(K~N4|e=3P9>A2y{gmt561mG!(+}HufEqT@ z*m;2N7_>o&9lM2Xi;9dL%YTt(k74ON0Oz0@Tea!h&&h#J%hKBGo-FLHQz+u;K|H*v zQPHXmvM$NW6x-0)@Ooll^V~@?=wLr5Y_zFQTj(uOHuXIorpl(ihm|UurAbu|+SDgK zvW4D~b+6-cn98ykygl4&R4<3^IaWJR7f*4#HaVniLEtgI0>a!4L|21igAsmwq_NH0X z7H5aOX`yv-Z<;pxvyJ%t>%7;PtVV3 zD{&g`#`}%RCBmJuiJW%*x-IJC{?|@yMG8yE6fCj*$gqSnFpaHeL#CgT16+|7;fg{P zc4F`A(sKj^M14c;j2QL!Rgu{2U!mA`Ko)psG+5#t_GE|F#XZ^G#JeuuL(diYC6bH# z)_0w?=dPS*mnW|izg61}-)8uzZAOh8E1L@M2-LandLGmG-k;E4T8(+u3bqj}$;!u7 z2bXzY-GtrjS>8{%^H#}iwfpQnCZqox{K|gdU5`i~B+vY@#jvEJj(gAVB6ZG0sb5Vvdr_^oZn0bsHv9EEKR-F{O_=z>K5=j8 zE>gRic{ek^v9oN-%>0?Djb`)61jY8#!n)D7`D)Z<= zZd|(18?i|F%kTNr^qkjyU(efMHgT_07lj=}*tj>bOXV?fuVt)kcD1}GrdA&s_uklF z)NV}5+@)IPGseiz6FbO!*QlDsk9ogYAf6n(pX@J8)+~O(Y?9tit3|`4{ccQ=zV#th`)ceh!~6*Q2^L931x!*|Fi^r1$2uGgimF zKQ2&;H;VGW^Vjs3c`jUvd)H1qV`|)6l9bI+M@l`7{KmcKc9J@6s?;54OKq8R z*FH(_%WcHfC5Omnf#o-oR6N5bJ~h3IxBt>zX2iWM7mC|G_7>&e>?`%5UF3ggwbbV< zt=p2~+t}?y+qh#y`SwRCzdKktj$2fD926Rd-%BR;N_vZDi6^zIt|R8$&Wh)X{eM)S z^j_IbHj9We>Fqf3fSGY`r{g3)`^-_gCry)|KTJDdX43n@)K6C^o}E_SOIbfWU*=u1 zQqLN%eC;?#VcW=ickfp-&pwP(68lKK0(0Ekgll*21I$V9QT6QVLzCWl zqs8;)eWdQQ^z21R@3FBmd$XkOd5CQK&zHLN2&F!Gg4ENGyq8>WWiqfsH|1+ymjp4_ znv88&Dw{VZNL>zxJ?UMWl-4NyK>ZBbK!>B z%(ArJH+eYJ%&(gIoaJTeJcT{-AeHseCWo_*Q@yAfEA{#@Qg_@->J6i%{*=0dJS>u2 zecDIm_{D)YF74tiJWP_X#S+E#>)9%W7pAFvFW6Ils^`f3hSAf8{B-x$ChwY?^oEa+ z|GVHr(tBjKV*Zci?g;Zaba%O)cYxHJ;6~E>@wmqR|MlPEx|*DKI%?e89zJyOj+v^| zU)e`KYqk?@^`_ow9L{BA?^jC3UYIWR7L%o)&%KV4y?Bl<(;N+l9`8-lAju6JL#nt zNpc1sCP`aj^0xOP(X&Op;y-+cU1soAnXY(xA0o-=G)6W0vT=_?Roz^*c!yC^q&r6P z^W-wAdmztoZ(q1n9cwy7-=*Ehh|d1oE0sPbOM_RdM)ci7>T6ajudq5YYNTw&FO_=Q zSgD;4v08Ab)RiVzL${Ot>2v;t^kxoKzJ7m{Xs#j`-MxQUO=-6}lG#Vx9tb5#uiZ*; z$lM>PBj$ZlC)K`*Y>Gdc!-P|c=rgW-nZj4GN_TB|?{4$d^4YwM&=vP?)cmJNuMVUO zkTL7ZrUT*6Hw9WLVmVfP?=k>&2H}CdoLKk|24Lw61KJqTp z8wTK~$0(M|y@}@br#Xt{dXQ3IdW6so-fo8WSSj>?cb1`D_7h(o^e(YjUYem;{;Yli z@qE0e&?5m_N4VMEU#t(|dB5CVu{>$0o3|dyrg(q%9urJBDkcNaFtL!g&V+i-d3_J^tpGLg{xjI z^riPRM1+@-NA6QU8+4<^vJLs0;(ZmMQ$LJ%Z{IX@C}@h;rR*(3x0=tIviB|ZM-SMiesoz~*{A-A(7A$gpr)36 zX>rawXrKDwUhlF>E>7s?&4+_iygp@JW2%kSON0iL4Kuf;@Ne6LXyy0at4ZXQSXq&RRhMKZM+m$Uev}(N2o@J{H%{@?Pzp`@; zE#7YUL4(Q;D7(T?_t8T0%dR(cnz=0~yD_F5oit8v2bTT9-0m^AgUWtms2#MZ?69&& z483RQ@UkZ@+~oPg51Qf~UG`6NyJ(l;2Tk->lzn382#aM^*?)`^x0>5=WfkS(QeUHG zby=cZsULTsVmZF7Te(_>?1C%CPN5APMu)tc_x!e3jNKO0Xl`$V5l+7}fCC-iBOJ%bS(fuXdYh`mHalTnL&)i-ypKq7VH#D1?ywUrp z>_9_%^3B=keO|UG67H+AgUsz{qto-382YjK^!=rV^p@L3ui9U3C<|9Na-jW45S_aT zdZw&QO4^LNrL#z_CT zh|iI_{T=QuGoL&7CmUh{1HSC!pK53rUC$}JPqZ!)ZmNH-xebT%Dc&^yCx#q9r~4Ne z+63qM#`zaT!tLi@Wp2GJM|1sa4SmEx){Wi*|9V5eV~D!ZJJi3y&^)7TsehB9?W{D@ z{w;=@Etcc_TMa#AQgEVwo1ue@FDLuA8=7w6PWOLh2%<^hT>nl(zc#lE{JRY`ncF4) zJ%)5s^%U=?{=F`oQFeuYpP}O|-1YwN4b3xJZt*u7y35e*{sV^Yg_bGa-Ts4ywqW#( zT>Fn3deG1V{*#8jw%q>7f7;NIminXqvk?wH?musCKcZANde8YU8~WIC`=bA2-@^5XeNj%+?%iWj*E9AXLq88tdn8=Xm|r0otTCzU6N^`bHGGR$WyGyttlE&{ z*??H*h|htsuIBcor9LQDYv?c3F}?w@x`@wVu?BPF78%@{V|@%gZ6!85*4NNvlY&vP z{*iEFV*}0Y*G&6u^mdF5HuRjOw`**uAzmjX&fQ~M8(P6#E_^Lw!y>Uvi#3^>cr(SD z85?P6vB~Z}u~CM;GBhhTIudSnY=;P%6B}nfAG30w7uzY~wm7!4xpCZ?6qd#IFtoS% zTppWh$ko&pv1yTTD`PXv&DH5#Y(GQ&ED!nE977NHR^CsD&5MLPC3b+h-ED5`VhatO zZ2VjwTWsh}tKk>L4mR{iwPN{c>`+7R83(V4EivS%z9F{M&=Dq)H^r748f>-Wm$4%a zU1;h3HkOXia)0cYiVD7CBbZv6;{74EqM`ymzp+eh>mOsQE!L+3+n%hU__Dt;LihI3ysuiHZEXUn9{H$Tss{p5XQ(>_V+MSDwq z$3ks6Zo3f!ySGHEd4IIiJXeD-b1p{_}-9WiU|PbSUoI?y|6{;Ak} zyw{n;=~5YW=sB1-9B?e^nw96H-n_#G)F-B0hWg>OD^aJ7*u<3g$Q84@mU$EA?uyMP z^B15VIN@5|Lts2eBVi~7o8 z523~mc^d!K&|l_#)+n`hi1KpZpyzOXYAfaCh?RfG{7&=BsMij91NFgS?-HtK;|HkX zNtyS?mV^C)-h{0`#R-hHV^I%e)b!2*==UnYYc59O^woWpm>& z#V`v0+w>+7a7(|46JIF>~#|CW}Isy36mM_GrMTqhZBZg>{s;bk|N7=PO5w=hL&})Gwj$=-W z26}^s%l?^W@oF0W2YMrsoHB3U2F3p`_<&??nMHoKJan)x$sf4Qerq2&CX4jmvqI{I zB-^cTu z#s2NJ_IUQ$d!2L7-FL*8KxkvHR@N?9lgDeP7a#PoLVezvjPlzEl)IXsbd4iP@m(NZ zjU`{^>u2o}$o7rEvLXXwAU-^*DadzXdxEV0L_f&CB6R@Bu~C^IpM|l<*;{E?lfm7y zA!hO@?3t%Bav*%$e>})g=wZ$ZNsIO8Eau6{5MPpnBVlMrv>RtX`WHfYM=Q)nT@mNn zV&BHXx#R2*owfUIaU7n8tH777=~M#s!O`N&Hgzb6aIY3Yoo)SpAZ#|Yab&OA)DL(@ zuEfs=Su16}L(D>oSqSZ|g!Xc_t2N3VZD&I%P20=|IkOYS;Q57c^Q928qO~tbx8@5$ zwjdb_(wEikg|))g1+u<_mUl@leytg{dUz`wGuvtW9B6?yA%2h7w#|^i-B&{$K1@Mb zo5FuIUak8-kZp#u?@PVy%ie;y3&!V@n8W1Ubx>kn|0)<2ugBt*%L}ThH{J*N&+`EG zRdj96p7Fu@e3rQ#EOGX*jgu_z-B5=Ixw|2L6LWyq4D>oZj*#$h(EVffOydzb|tdY6kgp2OLEU+qwFu7dPsO*WIjG z>>s?QI6K(f!=JN+_VvIrseU7nH=ARgZ~2Y~?RT9}rgvxyHjL)9-Y_0G8`%a&j$hl3 z5MSLg08(WS4}tIvUn|JEEl`eXpA2$ur&N$*Bj1KTTuC#Pido!ZcNflHhq5?3NAvJQ zl9yYigZ+xO8Ib2E9fpA%JY^(EHPY_4#h!VPGZt*r9D4?4o`384)Z)i_V_WQN4V*_9 z=e8ckS<#nfNZY(Lqm475v!G_+7wCGy znHI`zkF!0N&h`9;HZX&cy}2#UIqF=i`BT+R&7%Ej{HwWiBISua4C_Air@fzj*`f{; zAiivDk$-COxz1R(Wzeobb_&LDAe%sIYjB6>{W-hV?kAVj;{ILH=A%(BK+LYTcpgX4 z?AoeuA>`93ua!tIz7969ErJ!9HumV!O+zRK$u$I_M&04+#F*x%1 zKdgXibnS%m4*tXNjgUj?z#Smfd_HvG$57`Ys-a&Vj?x=BUx2nQ#BkQEJB~Cp#_%ks z7Q1)BTHS><`m<{R7ySL%%_(^Gy_{VHsa^odSq7XP&NAC#8=s?gecApe7u)RgXUG7! z)~-aNd~G1gW-vph7pIOvd3+d3e~Rf!F`J;Q^y038D3`-3nO^)1$?;H=^y16OC}()1 zyfGZ*4{(jA7k}9u4MY)gi=`{+&1EBwHGec>i z2VAqIQ7Dg%L-~Ra%AnCGf9Q_VGaqG3kil%h@Sptq7jJ~z`WIJ{TupM=IE=}Lb=;Qo zxz4GOs%}9l*kc{~7xw{e|Ke_B`8l*Yki`yq&^eIJ9sK}ixr6QQLT?wh|HD6!H}e(& zX4WORl?Z0<)pH8)W^YS3kWHOY2D#M-=~25K$S4D2A}BtU;yXe-e8y1lUS~5ah=SRe zIcG#bj09hZvv=KM0$>fQh2BDx2abVq&mIu-PF*~wu`VfK`Dm(nu4wb9b_4XYE$620 z??L{tE@`?fGkY=TR3rGLA^ay7Y{d|$Co>Os$Uncv5^dn~n0&0m5Af48X7+j>)@`2a z^Hf`uu`V+l(qfBp3jVotTm4@Gn>*P#u(Rh&w5G?pyb^#lc^zs}Al?MI+p-blE!Q1j znUarnSO#mHy$23Lyo!kc?-xEr8;7&;56&l`J{j)Qp}l)*e@1mX3zoKWzlAVM!n&!n zDpjlt+T4i$DZn;DwuP()e`&;+)wHssKl5kEI*8dj5arSMb$>g9cd~z>9=-)7-f;i> znL@3ZT_w+Iv^(}5o-aJt7{1|t%b|w%A$%u$2-w@|mO?#a1bVYl?i^@ui#LStWaE7S z=7zo39Blketw6r%+!^Fdw-}Hawflj*AU8UcGMv(m4dm>K8`j~++URe@x?oMLflop_ z_84csPsH;c?}OpRaoBH_AYontj~za*0?C;dwdl9n7;o`>8DdV=!MSTuU6fvGh=5^M6;d>qFxUTe1e7ehY(G{UKWdY{%cvG?9t zioy7N@E$ok=7u%FEAF52vDM);*r;)(u1(wZ>)77^xs4yS7fZB_YOI58yy1A*?uPxm zsW#pt)b&I!xH{xf{O^GKglmeYJ3|n^6blK$8gaX6HyQVIs(0N;2f2 zN{MyBoNayL4mST3-w5ItXW*RqN#_ADx;FazLCo|NoF{L);j@Lawc7=$(ZyL4&rS|y z;dm$;h~rk}fTP#Uu0>peRIx65pmmRq0cCk|O8uIVtn4G)u@9fGjeUqS%-_?hc`Oi0 zpG}@mtV^gvP1H3W2QmM41>MQEYhg8n7OkzF3Np$A=a6zwJdd$18*1vT&K;)0bCC|c z{jHG!a-#DnikSpqX1obw-qyovPA;IndYWvegUv~Hwu?7&vb+FwJDB=1#V>>SvwRiA z+{u1d*BRag3Ef26t)N|Qvid_>XDjrlEq~R{=kWLI zzYMdGEiI0{JK0}=eL8si*wXV5wrMXzc+=#cL81-Z(YyUhtx)U5eX1?iXNcv|`aFbG zwm$y|QvLOet3GkG!5L!?K8s-Ez?N_cufWHVFn>ZT%&bF@AB3lXSBCcO!2T=IiPBmj9A(6U*49QGt2q9#jcE`+B*Q-6 z_Mz($=TFRM5TyOq7z%Qt^LUVx+)(~*nFi9+Z7#^`wJ`jJ2g(g_J;JZ7Ct`gbElb6# zvhHLrhjLY4*-L~sTJ(8e4Y^Hb>p*%5yvAoys|zT+8^T!gjgUiieGeEFi{Sng`)bR- zv~eT6B#Yx2TeK7M971!*m#&T@*0E3a*3|8v)~th|RlTR`U*>*{@;?dkhC5z0T|6Au zf-k}TPBx}`7rcF()s_9tn)wHIBGMdU@Dcrt={K5IcBY9%0 z^K*wmAEJ#dpXVS?&f3r{R8jjUn15njzNgkX)<<1~wt8aU-hjS6$u@$$8$As$wTHIo zr&}*KyWKUtI3)#Tn;?{}if%*Azl70(Y41VUvHo|m|D@VVc&P(>_3v7Dh<~(y)LMTh z+t$*)&EW$RR&MFqH5NX)9jNJUa)lRX!!&gc8Q{m+7)>tmnLra2H5fcB0cbJN0oGw; zf-^kD_hs;RfUWJ4!_BN%)7*rPKrgjGUAg7w+*o*5YpJFj?+P#QTNFW_NrstiAyRo- z*h5X2r!xy`sY<{+o!KFx%g#y7g5mw4qnhgHbq6}FX+xiJwIH1zrn}5P@|jf2h2?5$ zG~gn4WtLW`gD;N8)d_ZIJvH^VHVCfGGKeZz`?v&ePnNIAscEy|I&7b&Kl9oId$BXE zF_#Kh6*h->G_G0D-!GY`tO$C!a3=U$}Ak3wby#l&mR;H2vE>%;*g7lEb*&t1R1sOouirD9QS*CPWrKw||tdMl(5kV!ecY2Qw8Nh}S zm9lo$3Ne7?T2WWRn!|_Z1KA!;ZSv2Hf$W5)sl9ST2C*jaSu|Qckp|D{S&XLP`IAEi zvut?(0(FZ*riNrNBU(`~c#BW4wwj*JMam_@J}V1(f_+GI+1WZemoKfb99cr!hXm)aXNWF4@5);nGL}u(bTj;Ipt+jH4tc?2EL*6_ zI&>rGUe%N|bSuysM5Pw%{pwmPrB!L#^SL>m-*3#pMfrcs1(|FG2}`1I8nJ} zBdi@0*^nCDk&uZjSLxVCJ|1imd%s4P5}e1r)agDP9^^8aeMeMc`DFN&kjd;C(Pih6 z-Fm_1bM+Fabm!R~LttyVCPXEc6&`N`wbr^$VIBDt7OLs%tm`3D*bq&%o(g7DSdJ!~ zQKqm-nr3&#bVWoZmZhCNz_Lv1qWUCw7Os4Lb~D;Vh|O)Ij3T&A+6L?xE$tScc?*&3qD&NC+m!@J@JOs{yYd=TOR zl-pC$(SGo`0=tx?XviQBAZxOs0r~eso?&G~CG5v65B3a8>w~%y_I-i}ye(`=K`Li` zBW37w%wJPzqV%*oHQ@kAB09zD-0|3VvxaO|c8KhNs+#XQwGD`h@J<(8su zV?0ZlpVr~1D`Oor;ixNPGd1C;o6hEIiVE|9cZv6F!ZBFRKGuYzuAF_Q2}ejd`%2TM zxC&9uyi!$NGGNrrVBIv~c$vYHiOOlb%wUge;*EpZOg2Q5XX6Sn6Q0hhT#mxkIEyXQ zbPj%^SfuWVG(*Q*g z31OiNSQe3*p%=k-ZBSPNKM&E7zswpBRCIZCOz6vOK2asxklr2WOC`IK*DLfD<~9VWl)W3# zFLW7;A*x^>k9;EZRkl*oq{*W~m$R6mWC?Y7GIRwSL{tJaC3Gd5K~zpPTf-J=V%A`` zhE-`g1UvEbdWVLxa(6@e7}1eRBB`2@zx8rDM-j;uATuOe#S8n%H* zweNK{Y8a-gWZNT3LSJVKH1)QY1KlRV{`6pPuq5g{ah0=)Wqoiv3Ph z!fL?_lU1y9HrAz*rNq4fxY8ypbTczXDqY{C&qCj4rcsJErg)n^U>!8w$vPjpg-z5{knnxzHnz`3BmWb+gPBKT zI_#Hrt{<{`HFPI*H%m}tx#k@cx|j9S)TZYjK*Kb>(1nNXWji!g!uvXVncEo5Q;mte ztT9m~YtY#QmIH}O;d>43T=%g>n%06pzn?89QnUAd_Kwm)&D_HFvoDDbSYGrAW=Gi9 znocGmUDQ++g>*?%o1R0Qjrs}RquOvL zsX^Fr)?d?GJ>PaZ0pG<_x{XmWE+<(wQ3)H9k?eY!O&g0k?9b+5U$7-as@CV&GEG?P zb8Lksto1qenkKCEIR^WV!`}f5*7_XVpb2Yzj%`r{9w%pCvNhw#lG^YkTc-(Y_9d&x zRXS|Z*KDySY|%xwLKC*=JGPFflr4vJm)Orl6|7`L`>-plF*t!ZW17Zv2))Xt5vg>4|y$s6wD zt~0+0Xj#Ed4TuZ-56dJv0Dk0teuKS1RKhw(RfwAmcF%@CoKfJtF7|^;M{EBr_}&)k z@H`}j-C|D=m0QxlN4X8}!cjWQN|@_zvm#A+Z*iNIXp*7+VYk^FMUaaJSOyi?@=OW) zl^r93mDxW%>^EjSrSkj^=nf0hG$}PJ>@Mr3sU&qY&@xS5XFVBqk5y?h!TfTMZPMfg z_dxg9PEF5&k9nUR(zGzGLfmJ~3srdwMt0=CGk;AVgLm;ei_(Pml)tm?L?xD5;T7U{ zmZEikrgY>F*g#FreLdjYEJhLLdD;0!WMSAJtQJwZ1-;5YSbI&~LY@U(kfzj-GN8po zrIz{qg5g^*D~U=htNT@mKiPV%oA6{Xd&ppGU-&Dv^lpl@RnzFE72+Y=s|o!O#*b)P zJrZu~`KOw;jI0ohf2nE8Q?tW3hdqF?*1UOx3ZUDXes1u2V}l!0QCH4>Zt!ZDi5F_x z-0<_p7QS0k-G=u=ocY}vS|8@j$2_glHE*yn%!TjPgr0{xPo9Q4<+0S_^NC8?j}5a- zwfGrLbsO#utHnD$gO(NSY}4am9z2bxg#FOqbeJdKrzx_*w_)DA{j+FU!rtlio_iyn zTtm0Q8uMaJUE%3wQ+`_0&iePln)1ZwRJui3_rjX-Ynnbx;jB4NELOVQ;D=$&`7}*k zfqeNfO&&rtZg?3~#DdPsX-O;m0{FTFkg zNE6=UwdbE{!h5{-{E8;L&uP!^X~OHMJ+D`;^2|$$hFsbZm0QZ6LS4KjnTqs;wrrW( zG`u|@O;l>Z=S1y!5s{iP+w<8<2V)oBNaf2FK^xw4Z_nSZA;0hrd`k^=4DZBG5tUnB z=n@j{&(9N8vVZ_9(AXJRPt{8Sd>Rq!n^X7H8e0hoEOc+bZE(0G%q14 zw`BDk=oHOoDV^o%p6y(t`Ab@NB4uQF3}32sXHv!it=77Fa6cW(-_f)NW`UA9bc*9ww65n(;w23GdDy)4KOuR{#ZR z-GW+6!h3M5*1cM51yF+4_4HU0p2&M^T|bW%KRsdA_EF;92$LAE|V#!>~8P zd-4;SX2ShLPk!kIY6C-msV9fsP2o?Cm!7;KQ6p+R6P2>IaK&ZtZA5C6XYd0`2f6$bp21ndy2sbJe?SpsHhHy7c4MS1qMTDi_4?s7=IJZe5^s^P8oFP2_$H6}>yC z+L*)(7a>)!I)lAUd3>g(2%yP)siql&yiNHW?O;r}VB z8(itpgU`C`grz@Qqr+!icEV>?&(-L#?RLVxwi7<}2Yj8W}O&md@m#+C8G&fqF;GsG+{8X%RDR z}ZF8#cQ}cdJ*K0}V}@BUz3qgv_Yz)3vm(ykdn1#^KQ-{4HX>pj*S^Z0Vv7N4&w4HO=%n9I=k4Yq~z_aKxK@n5N6!4@Xq-u|yTD zH0ZO4clb=L>zjHhqMEPLj(UvrcV;Rty{Ur zVpY!xJ(^gz@hnYe$kV=G;+TMzP`n&L;MSP$`IH8jwAgu5?Q=`u$?VLiruYbe)x zoOh|ABI^m>WtpQ$|Emd>Yw8T+wv8!R5#{!m>tL zo^Eh2@-Z<+Q*Ix(sLld*8HGRPtp$opL^v}vjtUh1ucJ3*U$$|}xlO6y^biWIqPRXVTCgs3R7Ta&ZVCn{Qau0tJ`_jpu{c#KGW;vOsD zK{)(fc1AxdR&>{depZ~ArV0J5I5A5Tu6S{xLJ@tc9w(M-LO&}`yrl{KtT?e-6Z%>4 z!n7XCQ%^^_iTXr~*qq4BsBWTp4ULRS5W|SndFUZtAiC^~zGT?9gq~cYxUUI4xkTagrs^~FW)g*$ zCiLVIg|8;`{U$t8+JP3XxbipMpfFO?{UYeKIpQB2T;o?IgQ#=0sU zJ-I|NOA~r>iDD6v>a#?#TkEjTdWw%Vp_kWFoYRC}UQh9ZCM+*W{Hh7Pyd)vtQsrUI zdI=9r=;ieiO*NsHmn z2P0PieWi3zdR5c_@r$;c60jp`ka(bo#g5$zH1QqEg_Q>$kIE4HG_@SlJz|Kstq5{C zA2n3Oy{pO#9^aikA(Axt4)`wW3DHjxyalzY&J$vaB1i}C8H#7LC4N3OOib6*wFm5m zCFW_Wtba8sODxi~to{w46`C$&{1!D_tkrZo;{nhHMO4BFv89G!&l^!^gR199pN>3R zG}1J=$rzC>T4;K;2&uiMcZ!OD0yWL^meC_cjHV5JR@E6PhHBc{$31$K!2Bi6b;W#) zrUSe@ux|9&8p;i95uIB@!vh1NCyMcu3%+s2*(B28T{6yflf(kjU3NzAev(+GEG@-j zqM|2>*R>9P{XFruCiM05#QU1i*PkqQX+mFrvN)&-ef@m#i6->*^TioW=<81r7l_I% z6H@Ylt|=Wy&%Z!etFgWKZc~0lktiWLz|r%cDoTlPlq1biWWoD@sbT?9nPqKILiAMe zs?ss^;GY&dG#v{{j(%GBy@w@~GxXq}5yeC$V3{8Mtf*2tD&aZtK@B|-{hT;kL!+Zh z#I+il5M3(%sG-8>>7v#~DgkmSi=HW(*HC5j9FbTF|!IQe4!8eO4*{qY3Yw zD#dR^WtKxvZH%rI4~cLc+ZMe*ST<8VIris5QBM=z5iJycny^0?i6BjQNA$8N(G&-> z)M7E8XdjQWR*1#oXQC2TE;(Bw#QU~B^8oUyp(`Ov1$@{Gf8~}dBZ6FB5iy#u)~|>} zO<3z!M5-oV|2@&m#2`)W{SN{S*OYJV8}h1Hs;SJnr0%O?wWbm9j>K~DmZrk`9&EYT zq-lXQn5_^yG*v+xR*3zY_JMAt_*l~g(5)1oYkIcp@#t0JYfW>yo(8(2seZpNqhAv@ zG_~t@5$G;a3EKqqTrKu}fNd{fbt8X>UM&*0DEbWE6IdhGX?g&quMvy4D&0bOPhgFJ zkG&~fgB~}c*N7!Vc;(!QenYHNWJ$?&@>(l45UJ0=)`~Mk%9~j$epEX8q-m`%Z^t|@ zbG(OrQ#2*QJpYV-OAJyvXS}1W5?Pw?j<%Dp63A&JVpS)STuL=F+&0?1(^piJ>1Ddcdo5gWWSeMP> z3q|B7zc0Qf!alnZ^?|rnL!mKSMCMNFUGfLFiEK^iGi(#Nn$Wx0Ch|3*SF%k^(}e!u zHc_St{lRTwjwbX6w}}Os&>!3;mT5wNaGO}83H`xsqDm8bI@`o1P3RA96FW4aKe$co z(}e!uHgQZ7`h(lVX-()4ZWHG=aLELZ5G^7^4Z#-!3tcsN8Y@KE>E23W?zT&w_TYyF`h$L=W&oF-sGA zfFFvNh)OL#HV$UH#ZsN_4y?Dk#cE|q-r*kco+k7TKN7n&p?A1XT+@WJ@IJvlRAYWo zLQKp)F;EeVNY3_)4K=hedcWwhTlF=r76(M6CY*N(~J? zLKCiI2gNu|xQ-nZ`9$TGU1NL191_!%j#imNVwNUcWe$nOnsAjlEY@klRpyBJm8hJR zKiMzls9<{-{FN}gJ3A_R6X6xNpC1!LY6x~J5;KVoz&BPp^5bH@(y<}U2F4s0KWK8x z+s{7{cZn*Pcl{?~PKud(RSEq?-RMt++eb)P!n}H?h5tSzmFE{Cl&FH;8I>FJg?K=O zmQ!QSiJ<+qbaP|Qi{u&#jrm%vtD%=;E{OX?D$nl(KS1d$wc&dIPB?2SAO2d*ccQZ< zk1^FiA)0ar2D9%(w5Gy=72-RQNL0pB8*GcYB#eWYXBpc&`e@8mk+12O(VxcrD9#X7 zu#|u=W3G!8hsct~%T4hfk$TQ>Qye0~_HlMov^$KJm!0v6^-U4137=Ts6j7S+iS6;IrQn1Bq1Ie-Xp9ZbP5%V}23EO2^PUye%#eUFP`Q`!;R%k82e^ z+x}IIIzn~f_!Rs%QCLI0BkqXZL?x_c>b01=qVG|(EMcC3-6QS_%P~cGrtgU{A1g|5 zz8UkoSWJYiy&LmDgdRtos^>!yO$47_^_(sqid>=+wtJj8mdV4KFi$B@YkJR87q)D> zK!kaE$2v*l6U-B-d8|cx)KKeK7y0-J(piGzb9gN|L{p!56RRahX*vpXa&0+T(>G6g zu-dXjQ*Pgm+(XXOR040qc*td%<|TIIo^rjWYWQ}dr>xerC!j)j%565v4vnoN4-%=i z*OAAGN-S#v;z0MgvSeY2`*|Jty{6uY9?VPrqUj{O=TT3>*V*8&f;B5jjIAfLXiR%KT2t@Z zb)z4Xd7AEf)Q#>apCQ7#rS1`(k6`iT*73Y))i-82?>)=D;?wlyS&NwiPRYjmpgU3JK%$b z%Oi@|j!{u`=e$tUn;^YpqpGsgzfWS-Q@?0EO`IkLw;DJgB_^k4I)+R9`ZM(V-tt2kL@8X z=P}Q6pcY`6T|+lw6Xk*$`ZczvJWq6hW{qCb`jx87mBc?{d&xDLzU6hJljS`k91})d z9~tyDTB`f$zA}cW+;TF1#8i0a{W+{Msd9M#{TH zCG0hrcSlLDi%=X~ss6bEaie6uriD#78!fHhDxGU?-?-6ofu^e5%(xtRThlV0Wy+P- z@6fW6?Js;XE>~7vLMnxKAdBLjly2WEn%S&0ZjzixgyV&?d|60T$*w*1e%*X|Lep}f z0_lAj)2Y>|PzDlVy5_Nk@(D$jHvL0mr^?ZqaK@Y}CuqVMbE+)Vgfr&TvRD(&m`}@D znsCOPCMz^OKLkFXmdl7rS+m4BanmGhHx7TLG!H&2=WD`wuvqTU^mO9FxDvVH2dXtY z-Q#IlDlJ!$O4tU-WxD*DNVRB&yiZhVnK&O<(RogpnmHp@gJ)n_wg zU!qd>wRu_G44LgJgN_mS&mA63NCn{y$E=S`QNUxvK zQuW|M*_=pOE|hJF;Jb6?lW_}W7a~=&MKbr6y@W+_nkFp$Wx4JbyY6MVMHA{4%XPQy zy2bK+B31elxtB0nfz7jg3RZ| zGU@iKDi2G4RX+I5Uiz!j?T%fyTyD8**DaTaG-0|Ga>0GOZiQT<33V&wus`g&m2#pc z)UA?>|Fr8?$v22pYhRP^5vkU`Cbtolvbp?n+-q{TPKUXymYW{hb6HJumhDOD8cq15 zv~S28HIy4DL+vy?&^>gW+)KHr($~x5M5^@l@^hk67Gb&(w_g57(4X(|1 zC5JsT)Y@-i8>A1BdNxxnn`@d6-^{3%xN|(@={#>@M_w&=E8-u)_fxCoL9IJ6u{+QS ztvmcg#m#I$8VI2Yjh^INp2!iE!r&IaHC%67i`gHd6%e!ZFl8BUS`ylus3QUbtby# zd}qS7n9VXo5w&)+jM6%6?Pi&%b)BB*62Do_)`YFyEGvmrYd6akM5?u$B)Z;AYotk-IgaZmZnqZr5#< zr!}E&n{4Z0*KL!bnozf07JAxs+hsYCYQqjWkEoOlaDqKV2}Byb?oVO$P1cK zw^Oe4vg>xr4VqB5OHQnB*X@$Uno#$loZrx{`%tdbgu2~wVk5h5w|tgJ)pL)WNmRGsHB;78c{bB~;;33Yqr;-+@pUb#*a>OPWZn%Q+9$saVKZlCVpoP-mxAP9j#+qu}T^kYlv2;E5Qp zd`lCKx&v|}k!t$^xt*w#akz30$m5j?~+OiL9R&Z2~(i8>j%27F4 z)A3r>#xYr}siID`@v)q%X}IYeKQ4D`x&-uz{6*7hc8;Hr9_{RHI4Lh_!t3ayyzQX- zRBmZ+Z{Mf#kS1*VDR~CIgKrxXr{oWsP1*_nAx!wCg^T*_u%IxwHn^ zb)U;*O{n`qo({3=zL1wRq3(>l8*bN~k>&^_)t_gj2T>_|!@W<`SviVG_53-R=U{nG zPSut_!P^bz!&b{KlluI1aotLjWq&qL))|Tyz$IR#D79zFEd?m|Z1lxM)tG}#` zU)QXL<$?X;FVs+O;L!MQYY0C@y!@ARS88OU7EQv{qEfce zcq9J49I0tPuQndY$qtr($Z1-)+3Ah=KjbkYRhNfyL!7-X59Mx6IChy~>1Nk4!<$Ie zg&Qr1R9(2yfv6OICuM0oH_|kXvMh}k#xx>To-}SJ*z=Tz(OnUiXBZDO;q`79Eqxf!z^bZ*892VE^=t%I(Xv6D#E%)>bBVCi9;)Rvb;Xsn0v z?O!ba^B2qCv}L04PP~V~dfNNU(Z;_m`9|_t79xBQaw?}c#Wu()iUjjuVZZ1 zw9NTXd|hLgrm1d+;=PQ6noQ28;_DeFH2Jt)i1#+UlCiu}cBj^<`1(d;O&2{*#Wygv zY1#&}enVqFkt)5BaYE}>I9-TuWDM(VZ-b9<8or%nn~8jkZ;4d8#>S6Cr7XbddOUo6 ztuI=t_BAowiIim%qaINy?3HjkzKM~bsVV%rOH-qtrb;;P&5XgCib2=h7_I3D=zNU{ zL@Lh~##4Wx=d|S}b1-XRY$8(Qx`kowZ*M~jBZ)}Wv!#(vr1ETO3?(XMqhQ@^X^hi! z$@MX_pOH_b@@!?aecYaBDb36jj?5rUDw7qqzQFxjnjke zy0*q8O{i;Ucx2jj?Tn^Gs@Cm|wnX5AIsG2r-pJLKn686yY=}Kw2jjdZ)O9pA4YTVy z8v8V%u9LAT%dYEW>?Klt*4a2tq)P8>d`?u#eqhx`XXB#MSx)(k5nYU{nlAYi0o~Hn zBV(YGzj0qvzYN$y-H^kvJe6mF;rbV8t|o+no$>I^l(TQ zWc1aRKlAFCAY;sQ)go+PkdZvY-o79sQxodC8ksZgx~@j9Ce#HRb7t9f_#3)#PJ{7R zcawYLn?8XdFg3Hq@fg224(07!)QJB@a(e-4f0}~fTd^J<@Bvtq%~HUw zn6@zN6iSv~6xm~58EOx!+~g35aR)ps%nK}ZRh!;O>3&*%3P|h2R za#4+;DDsTj0pNm!OW2EMZaF@jY#LYre0#yU$@0JXB6S=FNbJv}@)`<2er zK&sDG=tIsXj3i6yH;j>NdkXx5g(X zot-^hu;x(#XsP0B)9gE4A^D6O(bDcHGm zJUcjY3_Wsi*ACm5QTD2yDtsF12D@ZX+5kE`s1>ktHO4=UW`GWr{r_;pQvZAavzBcR**VVf?5NoW zW7O5Hu1%b^1dJm4T%^YKYa=i|1#(m87oJOb<5_Oj87-H`;e2?aDV|4_o3dXH{U9M8 z&$6u)Of{9p29_xFHKOKlCDlm&H|f~J%BJ@qd%r~mVE$fu>^X+9EY!*xEv8b}3${fv z?_L;lKSlKb)*O4oV7*~(H2s4XQ~g!zShxS%@CV*luBwBQ>RhO>nlZ4pw)Mh`YU>!U zv}#s-wD(%ke5h)LSBI_VZD$O%1yNzg_2|F%@RqJv6J_H^UX2Pn zu41+OVN3t5KFXu0hA|*nXeL^!G3;1wCnyDG$WZ%rq-LQH^lEO8pWGiURqGu6E7j6j z&|?C2ghreHzhMcxE@LT<{eWS??7gARAgA*v{=srJd0&s_pk{cLn`0Qyg(^`nd)ToK zg1y}XZN5yzny9eK=K)>ID*RU)9DCpYOIy%);_R0KTe-Hf7H8nN{e)(%jWEj@us=N7 zNb({aS3Px>)wwv3h-LlqB-$?>g7zx@Qnre>#b7+|ufwg~p$ZB(5*K#xiAnK2(+#r|3! zJg2zE*-KYB|M&QlQ&euYRw$2%!=C*17&aC6C^54Uc&TKsfU_K}XThS0}s62{$Fb)N~1?wz4k0vj!?^s)j zg4x6H+kce9zm+@L2U97nx~@^$X4lnl&w|&KJ!jQp>fB*iviIP6G#FaKCq51<(Z7}W z-{)TJdBH}}bulg!^HlQnJnY+tP&dx{!YH+c?~K6kd5XV7o(zU1{6Yj;{yhf#Z8|#> zNB>>xcxE51xjNU6t_U6I9zkibEL%@Ln!`WE;K-R79Q5)6Dh_j8L*~Ye3s@fKTpQ-MH;C=_Z>%Y!LYGzh5Pa@nsNj8-3R#d7{@%UWg z&xCJ5`G&3TWyQ^ zd-x`;tz&ourM*aNH->Fxb%wBQOxjAvdOFre*ggdrE z&G~rt;RzD;i3;N^^jCYFQ91n1g-r^kVw64RFIfmZW3k8BW_ZV1shqv&zE6eKjEA1{ zKiSVBf4dE>O^!8p%oFDX0lz?jIXH$@j6L3Vj&KZ1JsYch9*uc<655OgX{*&B@|4sJ zgHq_3N9BO!+RpngGy{*OyE8RYsWXmejnml_a0ctSW|&bR|0W-$FQ<|G)BcgDjoahQLU|!Bb_@xil6YP7j6L8eyy&?bJ@V^h_p91-(Lb`rn z-w*8igMEMcUk`pk;{+ST4#9DZWr9r>q?yF_vphH^!%+aoQ*ac*@iZLM;3$Tp1diw7 zD1&1L9J5#*IC9{q1xG#D^lu2C3%}Vi7vko!MsU;v9)i1zv-xmT!0{3s@UAudTF8Fb zmuEkF8IHwpEP-Pw9LwN%6^`X_tbk)BYYj&Z94+9e$5%prt0DdkIM%|k4vzJ3ya~r! za8$wZHXPM(Y=dJL93R552adgP9EIaJ9H-#;435v?_yUeIaGZtXOE}KM@f94G;P@Vn z%Wya|eCyj2q=_}8F#HDbFc&yy`0ar(lCdOvl1wEzh-4PY9Fmhr!mk5BsuGa!4P=n@ z*eVKFQ~V%4cvuTIi{3Y$MeiB66ZkIv5`ppSLBe}`0^ba4%x+AKh48nz7;^*O0P};r z3{&9?Ex3!)NwN$g8!N?kqi`~X!z9+B$QV5A6_(F7HroyITC;s1_cl8O@~dXY;H+X< z(^&BMD2bi*{zOHYSV<=R4Sa zC~*f{3ndJ-v_c7!YlL2`7sKgG}6W|g_w_gwt(E)XBR&U zsrK`;?5m_4eo=?p^i*LFs6P)o%2RnWk`Dtn>Vh%xXNZv838um3?Bnw-?;H0(~Bm7tQ#^0;(r=m1mP9Ko)ZmCBmAdB%trX; zz#cXt=>-UX*SP}ZZ(%5N3sGKz9aP=ehCV9=_AuPfgM3#w^OV951cy<#6XcDwBOv`c ze+Ke!iivqbJdAw)ddhim8tjX?CqLZeM{%BVxI~iEcSTZ7XNNo{FR_PX1LQS`AI~o_ zKX^wV)#N`u0b)7~OOm%~1m0%!?y!+w^t60Hd7d=h95-8@G>%MuTN+g2Ak)ZzBl0}U zdFlel4Sg=d`^*!@U6*d4E#_V%Pa0ba>lx=^BqV{9@J87slAipP-0=qIw;JXfp8WRE zc_3fNT>$dsl863x?!Li?}jp0yd zgL{oLF<+iu#7({&cgy$XxJ$k-|A1bC|wb5mq2gnbLyiMn+PdY$}txQ2wVi1*e zo<@5PpA*^J1i$N&*B|8Fq%6}tHX&!4$;!vaRYDkZ?gl^1S!wDEYKEn z4%$vmoKK$=2{H}jVaR!)(>;!Ry5FPGI0sTqby~pR91p(=$2|wkc3Q=^_;=*@IPSxa zSDcAmgq`xYKscbMiTOjGCbo>~yoO{IwWx|(R7EXX!*~1q>a>Jv>o2Z`!+r;JE|x)` zBpJ(e_~F==mQB>&O>h>vT9$FV3a-()zD8Hy8jdzQpp;_1kH+CK8Wn5kj31-1v4($K z6wJcJie@>M(^QkwRFl(GlU0xwzR3u!fM0}V1tTv=FPat4Q=XSdUL$$Z$S*i;xlQ3} zqgfYk(@l=Q+jWo6OKuNa^WyK_Jpk<%{(ujI?~^~^anNH|VQlwtzRDY>^l`?qkp*Fz zm-xz|u;(B206b|jJ|B-Ge^%sVXJ3A?5W~aail{ceq#1R>xaS~kmvQCJ4Nc==cJk$4 zfXzkzVBCJb73RzZkP7oO1de1w;7B$Ej%1t_;T>!i)fH#6A7VY=-F!M0B2p8$(?WV9xzLnh~)5Jov*S=m_M(=y7Rm9R@2-B>2j5C>V@q(0@96U zBsW+$W0@PRr#K$!yP$01vWI;g+Y#pZ(mbd$)d%P24lWnDWn7TUO@2HO#~bece~;s@ z1?*uv;Jfk{8Ld8GIRf$t88^CQN$fq;>mVqyS8NMloGvRF)FGyR=Pa4CL_ZugT zf{{+H)kft|)W-C!=h_&wTR6@J?I4V2HpldQL1)*)rY?0OAO^l23FXdBh;zm3bUa+4 z-2=wM)q(XnN$2+-$6qrzYr2qz2?GQFsqTNa;I&O3G~l*d7L{lfxq*MU1&PmNw{TzcgK_XJ zV{_+$UER3ET?^WoQDP~n?)Uib4FPj3UUj#M;el_t<2Cr6`(e{Yk6rG` z0{t$3Gye9Br`$fGoogD6>NFbFX*8S?~+J*AeXoD-Q2 zZ?_kWtTx(7Tx;4%+%L18M8Bw=#QibbN$lHp5UGCRPG>i_nctXQx=XsSS!oCq0h&)a?Cik@wz@;E1TMt4gD6&av=;) zg(${f;{1HlcsFmZIalB+oJ;3!l6h@>{n}*$e;suWl~pF3Gm;?&f7x>ml{<&ZT|n9e z6tjS0mQlNnO5*+-@clAq%PNUGq^y#-Gs-H7JEE+T zxD(1Mi94XIlDPB9Dv3LLtdh9X$tsCEoUD?#v&kxnJDRMLxRc2$iMxhC4zRDtDv3Lm ztdh7>$tsCEl+2Ph!!teCQytbr9fm^~cPCjdaaWS{lxn@iT}akbKIQ@y<$Dy9UNqD5u=&uKmpso?{9*adkb|DrD2!g;MNg1<<~oPv(|HX+W+%4-S?nEF z=eF<s*!D39IU)sTC8>T`_MAa(A7^5@$j`i6h((O1TUYSMxMlPw{#`TPG7z znc!X-y+Kd&o%F75ndE17pnQTzRvYgYw5VGRs(y7ofFO&zQ%?=vmqYOMML8wpCxsj#kNTuA%_dy--ohrtol1C zITBV?f2ZYBDuln&n?q4f$tM|G0sifTal7jJI|YvQfI2u0JWw~xxDj~@B;J8qp`{lf z+`PdRkUuxLUpLjMCG6#t>Xg{Oqi3oU?z7a>!20wwa3`gnM#E5duWm5EoiTNT>!?3S zT;B&#O{xtU-&Q0;o-p4!wF~X#l}6!A+5D+k_~to!znO4$Dj**Ht}wGp!g8-nut_qq zK^F5|kh|+to8!j+=#@+7F`v$3KAp#{u)><^<Z#c zX93A&B-h9z-KT&S#{+zO8a(Z*EV6SB=df0Gp9DYDX?0>nuT-M_g$-@Cb;%hQ7P5tBi%o&hd%J<^-dZ-`E$*iAfB@l zrw_(@n`SvpNSrQqkmWv-*>opW;^aL%!TT7+oF-Y~)N1&2?~_JS-xoo48TX<$uKt@q zb{Y4f_Yx<(9+xazDNrvo7#rcKlX=Vh5|ESqJXR>!G+j_HFb9`(=5 z=W11Wod?S#V-xj!35}mi5CeWJ$TO~&^wo!F;gUrEGnIcdtats}pe^PPV6{qxZ(5*d zRbfsaQB?mL^`{%}Fsey1}?jGA@C33%@4uF4D`uJEq2zPcF>x z-`4ko@Ne}y7&t;Y7&tb9D3zZ<&qGLBp_DVOdz{{gPHteOoN)%ofH3CJjdDn)wB58l zmX$_jWl~w06rTCo#X$xVz+gd~YaMmd++}h}@Q}q;h>zW6qCp608 zn?MUsS>U@NRfg;M=NfG?jt_aM(GCN1*kRy3S2yw`oq1{DsYcGch-8xWOrxz7zm@Y~ z@amnWHoVwqALVe2ayU&nBvTzuQ$Aby#mPQCTlvY!Eq%^Y>#Y0(p9r5z6z)dhWU5s% z)M^V)rdnNt+@?C+rrgpfx7(Ck8d;{1Wg1yNpwbN!*5A#9_0K1JHxu1CilG7D_;7mu zmQQK(DQ!Nb%`w3@Pa97odki;+F!s+hvYAFU_qbDo-i^IX*h`J66hA7(kMj2y7hor; zD$1b)_|K^<$b?r-73EV!`BYIpr^)6t#h<45(-c2R^tRS(GD+lzG;U%AzdgyYn((*C zttR|^azo(RGz8Yl5ZFJ4z_WJMsjW|PlUe41k?BpkQQeZMZfR7vG^(2$!#jd@=7}M7 zo6do8@?4`#vdJc!Y_dTQxp&iR)Q7pG%~yR$+G&(?8O6_`_&F5MVI+4KT*^M(n!%ku zJhMupdZtl5)2NkN-yP7R zsZRT-Mf<2Nc$W&lf&kA;)r#{NJR#W+ciBPY=NzLEa+*fSO{cH{ZCZGmBf4~TTOu1Y z8s6eO_0lEkrE8SuHOlj_yfS`Ki^KB5lvi8$L9NcXp5=9hUTBf2p2$&dw@o;IKA;>7 zGhGX2ycXQdcom%G{!QV2#K2!|gx|9Zsqf-trtwUceq`xKmdO(Ds=7(+&u$Xi-c4eE zc9Ynj$rA6;I+)7?ueDqNb5Se{f;*84uPiyTcLTqxtQo9RR`BX$Sq{__p5HpdJP0U%xCGyQxm zn9mZYzJ1}z53B-n{M-zBK1pkz8_l=4R(|SdrIpAE^Y&%gjarvXtxKcUrBUm$VXfK1 zml!ld8rZre2F`>_3~XHon8Sh2#u_YMpYLKd>`5X{z?g^)clg%FaEkU)SW?l24kOan7G zGbEs~PK??`t@|2niLowK>sD)9Yb8y6?4oV0b*;9f>7J+6u8&rI`h9=i=iECNhWPY( z{`kFKzvOk_^Esch+_Qep=X}mNmjvIqpW*j2e3mLuKb@TgyZ)=dx#|tz>FO=uV$}~^ zs!jk`s^84Uxp#H*oGi6g{T`fB^`Ai4`+=L)Uw~EW@4y=M?(7k;-@iXQ8+$Nn4o)&4 zRyO{^*xL*9)jaDiaL%)Co|CUG20cREXk`L_Wt|BeYe(l~s;TzPzykYL;A!^lz`6Dv zz|-x|0~g!9NUhtx3%K9D7nrmk1YTx83jDPFRp3?jQ^0HOKIGQ&otT}kGJSU;?o=OB z_T4&Xn40DL+d`yF>M};_Fo6yAt#W%!JP(?p3}KbFVAr&&^lGq?cw)16={yhTeKBa2s()hSbJR z#_AwGM0|pH6gWctIAbQ>`y#{tn)r9b!l@6^6`409OlRigxg+pZhcyU!Tc)IcCvb%7 z&D;*oVT8$6cV`AA|D^BBYy;2yV=S=@|z;pe-0slPm8~s@y%U1!? z&Hj&lY=mm_R{-1nwZKk)0GROa2X^~!0q*zr0+aryfS39I1NdqGao|<{KLD@w=gmj| z@vj8l>JI_$@ZUTiWkmYf>OQ~pjR*bGHy-gn1O8Y1(nG%H{|@MH`o9P4^ZyXBzUzMp z_`HAa>8NM_y}+OPS1lN!Ui0r2=zOE+rkm*Km8rRcl?h4|K^wWt;~|% z)sb~O(!U_6{ek+X`NifnsPwyFXrTh(Ms4eS61Cvxd~Ci&-* z-D+CVeqrn8F`Za6L}rz1H(tkdq<6woR1wT`I$KKnfZmdOZ?QXh1ik5cg{jJM$Ox} zP)$)wfJJHtaK1VlSfcg=*QoCU%hl_^t?Dw#D)s^5MCVd2Z-QU^ON6t}l`bjHG!ZZ?-#9m?_@q{gT4)`Sf1H>b~ z_d)lOK1%E-1~M3icrcUi$`npNQTY$4r#6)W-`Ug%oVz&*JZEz+@cPY1{Sxvx(aI9q zmnA6_WF1o9+gwOaQI_PSjC48aBC>R~aDPOFT?GO6(^d zC!WZbH>w;-$08OG3yGz~GGc&ufY?hsOzb1}6VLY!W*iSr8JOSTVcd6mb8?k^`NGv6m5mnwH^^?jYc@pv%v7dN?s75da zqK{ZWEF=~YONnK~a$+MfKnxNO5DyX$6OR!4h)0RXi2cOl#1lj{l6fHdhy}zVVi~cV z*hmZzgTy590P!HPcjO_Jv*j@9BgCV`e&TVWHA>#-BNh?MiH*b{F-bf?JV@*#9wYV> zPY`{hCAA`AIkAx#BqoUmiM_-l#AC!0L|;BrAeIw@#3b<`v6py+*hf4@>?fWesxd4V zv4B`aEGGtuN#X(GL1HiQ2=N&41kpE^xgwSl%ZZJ|An_paF!2cSDDfEa1W}DUq^h>~ z#xXTwIWb5)NIXKkd)zVUrKC>~ed8ro0kMc!N<2tBLOe!1LG(@FTZm=Ea$}F0P!I4F!2bnk9dsO zPdq_XllT^50kMc!N-QTf5`)Af@gVUC@fh(0(VEQEh=s%=Vi~cV7$63T2Z#rWhlxjs zM~TOX$B8G1))b~sEF=~YONr&gMq-e7ka&c6lz5DIoM=sz)C!43#ByTkG~qWA3#Ky+ zv6NUwY$OJVN#X%wFR_nk&5*cpP;!)ypqBWagh-Jh8@i4KEc$C;r zJWjOcFcz_l7$6=X9wr_o9w%CJ8J<{13=osV1H@k9Vd7EZaiW?haV=s2v5;6s3=os^ zo>EV5IY7FXc$nBnJW4!Hv_8h15X*>-!~ii#JU~25JWjOcGZwLo*howgdx?jMeZ+pE zI-NNu77z=GrNlanfX zLh&sC{rjzjq|1l_;sN4eqP2)27adZCRi(gPRlUG#s*aOyEf(M2#n8>F`hnToj+0{* z3%`(9N-QJxE)jmRM6huwX<{$2k65~lzQiQ4m)J+_C#vNVrhr&VY$PU$y~I9ZKT)k< zc%rpZ=t81ebx57DEeX7ETQBgrZGFI;?P@i{6MKn$#D2|R^OUOEUQj8cyOh{SOcHyE zeZ+pE+QN{;Mq-lKOY9@|6V+A;SwJi$HWHJ>USc1y-(Zn-$#zwBNF4?;F0qu@NK6uY ziG2noRzG6(10|N)#<;{%gA%53+aWchx{;hD==SO)={{mVQEg{jVkxnam?ZWR`-uHS zRn73kQeq=9N$e%|8Du_5s~YCBMmPneONosJg`XtdOY9@|6S3fvTHSF--B(>ex)k&u zs!K`t?vS?bBlZ(jEnA;hT6;*HUXuiN*7O1&t0}D$UsW%dtUsjQu1W3`y8lda&KB$? z_7VGu>Kx%05KD=@nm$+fjl@1;KT(~>@WfJLBe9RzPgLhK46(66=p?b1*hlOqsz!z+ zmJ%C@NzD(4Zz-|ANoW;hcw#BBk(eZ^X8IEQnh&W(I|@R=NfLXBeZ+pEY7yT?Vv^WP z>?8IQRV&jZmJ%C@NsVpdTN-9M#L`cYCMJo!#J*1)QlTCFz%TA7*uz-FMq-lKODt%o zFR_uBB=!>fi2X#>At4KhrNl;JlGsb^BlZ(jgyD&$#71J0*h}mq_7hc<;fbZhMq-lK zOY9@|6ICa}6HAGW#3Zqo*hlOqstXuCCfGB=!=mZs8Xa`-!SYILV$v>T|Wdr2B}a7cvE6!9_xs5_^e_ z`wyvCYSqQUFCaD&lf+(PAF-dPKFN^8K4L#nT|z!FnZztvmrM$$kJx_zEA+bl1Hx&% zR4_^GBlZ*3!9(hvx>Dd@>KcJ1^?krZeg9>L)K}}(<%iU;odv-2fK2BKrbFx{_7VGu z>QmyYJ}p>4EdA`2@?K&evG+>h^b-rN61wzih9UM5)#u13_7juWG8R!?M_*ziF-hzt z_G!GH;fakm2%RMM68nh#nt!AC_7T-hOqrM@_G!+|Oo7-(RJSlBF?q`&^_87{q}8qD z6O+VVVjof6CcXv4Qeq=9sX4ccueyUN5R=3{qPmlOVv^WLEck-(lZOu}wJUj-(0xY) z)!n3t>WifB6-?eQSo(mVdXO|RN$ex4hsb~EkgDF5B;7|;UlxAy%hJBR#6Ds_Q9Z&~ z#3a#Dex=k2+<=*2ZL`j_g4S28-&uZphP~9j*}lil_T~G|^_`ay&bTP!_KdG)yq@v% zj5V1XGFvmhnE92=W0`-+%<-S*@AcpB|Bn9`et*`=tn#edtUy*v*7aG3vmVR(N!Dvw zA7RoOFgPRm)8vnA)uoN&(7Ik)9JmeZH>9EfXyJ^_%!yXy-r(sibH|Orj?aEE&emeK|+}_+T=Dv{o&)m7g7Ysjhc=zy64ZnK$ z9mBso{ORF88vdu@Ie8QF=H#u)+mzRo*Ohm1-c@Hp8jW{~u=OadsoISE>k9lFtn6b0Q){YH~ zy?E@+WA7gO(Acky{nps;jQ!Qv1>=(AZW{Obac_?M)3}x6pB?}F_@9se+xSHjmQA>B zLjJ`06E{u_Ol+BW&BVthK0on~6F-gGwJb3-=CB@xoUFL znSZq3A%-Q$=qS z{i|rnX@S#PPP^%}H%@!^v`@^seAd0Qo|(0B_HDBtn>|Cx_woKvJRUdc@U;(>iT_#X zF~fkvaR(?5)F_p!Ccrfnt~t2lH5a#n*2BJBi*wjJ)i`yY8n2qvB-Mr+Q0;1px&R^f z;#Sl?-2J);yLnfsLfm?qgf$>Qd`Gb%k}l`n1)cK5I3qE3JUK$_lA#t#)-2cC2r~ zU9a14KkE?we8`=s#yQLF4GLct%mS9I7!JI(d^GTH?ZWREFZ}H@#sjCsCIg?|J{|bp zxu*fgt``2uG4p`q_ALMg+lqm&*Q@}ZdBz#QQNeQHjoUW?KXbu0;S=*2w`p%JIA^y? zI^W+Qc>Wo?fpeBiYX1zL2YetN0{(K%9$@6W3xMaIzYka%zZiJsnoEH?KeLudtnZ#L z=_Kku1-yL9Rlp|~OCDZox*mA(hFgF~M%@W)TP5K$n+^l>_em_B|IaTH{(9y)I8FF7 zwhC6&3w~|Ape~Cp>3bDY>dI{rOP8){+r6OAKTq)Vi0~gjM{;sWSm=C~?umfp=c>4* zcB)+I{OC8vnIHYeaZ@GMhb-6QyCls(-9x~a>mCD+j)?CwTco|#Fl1(v`08@)-6G*N zCu6OIe4b&R*dug=ZT;#Rp-?x*@S}Y@*Zl}#&SV|l z%{=R#vwxNFFW>P~U}n=Bz=_P&ZEV4|7Rl|4Y)9P>i))0_x$aj$-F7=y`~md6wUVDW z>vPX^p>;ifGbHrY``#f(`j2iYZ$Hs3t5e>)MS8+#IYzQ}$h*Sr{{ZT7F}3&u(3ez7 zUAMMnBu@yTy|8hLz&0$Fk139tFC0oodACajHk99<92zb^p};UylXd({xShk)=nI z?&o@p=(^IQL)VoaQ+ibD5voU@9!Giv>E7razj|Eglyy$@h&b3X74^_sEA6QBd0E?B za4x0vxR|y2kFDYxuU-iLx0WsiKEH1@@Z6?SVCIaiz{ny&-8Xcr1?r^5b(^Nws^+B2 z%>Qkz>UPmBqRXY*=>MB~)^9&mZR?zP>s;qk*ZkVu=c2~;mo!NoQgS}t)&cstWzr9K zmFxq(spMi{&ys_{b2>y)EjsfvptU@CaKbg9-#zChV0ene+BfYG=*M~lt0(jVpWgl@ z;J@Fp-qw8Y+=mhOB}2mO}!DOYtb)tooy%%FKX*X{0j%0S(y3lM5UM z?HAty#D9q~8aNs{unj$T9B>9SWE=YIBxuo#fcS1PG+`TO)20E>fWM88xfB97<1~ha zuNV}8-U6-I#`%jmz$!HlxJ}ImZijYk;fn?fK%a;7EOkE6Rt?aSE!7CLRREf@4ZV9A zFbFLfUx>kZID7{SZ?>U>p8<@ik0X2>Xybl+8L$gyK5S^`72xj!+W6+dCeS@Ve18=A zvZ1qY1@1>)@QoehY6?i?qbbv26j^!;FCg!>>cw~Kak2(^x7A(h0Kyyr+UjnU z1K+qp2`u#((8kK+Q=q>BwAB-GcV2xJXk#^UCGcy=yRE*CT;neT0d4gZa&6-d{|(?g z4YcvKg_}S>1GH5i@+)^ZZvp*n|e4!k9(kULwwk9^tc1LVk7A0jWd`fua{ z--lB#0G0J4;7IF5;3(@Q;Arb*V7~P#aFX>paI*C?;1ugE;8d)HY&Fd~j`vOn;+x;r z3E&*-*TA{fZ-Mi0qr_GpvrZz+e4wqCTYm(-0%&7>_BOEG`ZI8Y^;ckp^>^SF>%S0Y zD-a{adJnkGdLNwaKzx7K`Ve#t(8lTKe*tSPT$xsNme0apbOhqWnUx887tmI_tt{Y~ zRu1qiD;NB;f%xi@l?VD;Vfo5c77Eck{T5MQpfJ`Va}psgOU%0NE~wAEu) zIq1iMw)%=y0s0A`t-fk)0{tWqz1^w={dJ(NzF}VU6WJAuEpb_0KFodx`zbq?_N)_K4`SPj6FxP^)@!@=fct3O&Hr1K}Bt=_R(LH`+u zuP|C+;9sphz`t1?!1t^u@SoNN!1t{<@B^z0_@T8A_}^9!@L$$NKxJPHwCqcOwtWET zvkw9@?8||f_NRb;`!m2S`$}N8eKj!0z6LnVz7Cjc-+-J92jV=VeG}*rK=gV07SN-B z==1h%z#8fSk2^mrgffqfV_#XbVgRG_U2?Jojn+V=vB?EAq#4QQ)b z_5+}212Hb_hd|E-VqDk{0~gqj0vFnk0~gs(02kX&B1|z5-vqUBi$s+GZMD*V3b@98 z8o1Ve26%>j6u8bl2K>1FEU?sm4!GX_9a;1@M0RIPgpM3E%_vuYnKRzXd*I{~q{d`y}vT z`;Wj!?6-lB+J6Q5cz0iU*WfX~>uz&<xDppCy&J`MDbfVTQ6Y^3P(b|LT;y9oHIJq!4nJqP%@JrDSXJsK ze;oK%y9}Ja0WlWra^U-R1vno7F&6Aip#K|)v0zt%R=!HmmTxO)8;G&s+XgxVh(7PD z20aXDs|mgxpeF($!+mw2Cj-%YeLF!<1ww}Vb_1vT&H~QxodYcJod@4Spsh~#H2@d* z0^lqJqObabpceyeRqP9aUIMgLiLVv(QXo#V`of@>18ud!w+Hk}AWrf7IzX=mqCfkh zpw|M?SA7=%D|~U_7GD=|t8X8$%GU$j?z;$B?YkIQpOtBbwC?;DG!3)3510A zT@F0k_bK2xzRv*9^<4?y^MH`&zN>*vzH5L%-*v!d-wnW!?1nY?+`HT zyA${c-xq*;e20PUz9Ya6-xq-q-@U-7?|xvX?*ZTizK4J@-^0MT?@?gF_c*Z2_XKdS z?@8c3ANsrM2HL8}_Y~+0fzZT!PlMhMwAIDFXMmsd9R*(EI|fYpo`vrLApVMi?>XQ> z-}k_|3y$^id_aQiM z0HG22{snx~XZbMtd_LewU#3s)YG#7|qc02epMV%&z8v5?zFctr420(6%LDyiKwG`* z8wvV7AjX$(H1Gr87@$96956d$0x&;g5^zk$6oecLgyhed1{|L;1Dpv!Nal<}U`a+1 zI7@-(?HRK`F9)KxXUqYv%$Nr(&6p1?%UA&XY{nwsRT;&=Lm4H&J2RF6znifF`2CDk zz(nR6q|*gNZ^=9Z^giHdb-T3ytBTj`1<>@jWG;ZVewBX#bmY6T=K=4|o)7K+9?&s$ zALzLH66m;k5cFR4HPCz2H$d-G-vqr+eG7EA>I2=az76^!^%Kw+sh@)0uU-MYU%du8 zsonscRBwVlpneYefa(W*srn`8OVzJHU#9*O^kwQ#pg*PjIrD(oIrE`ekIGp9%+DzS zj?GyH9G|lSI5B4xaB|KX;MANmpm#4s$g9<2guGfU&nW}0M98bvYJ|L6t<5P1u0zOc z)JCL#joOU#uT@(>U#qG>U#GT%zE0JEzFyUWzFyUXzCrB*eSI%?bP@e|ftFA)nde!Gpx?Xi{P6hCKl&)9Zh|=|{n{ze+Z$;^j zsJjsBh`JlG?ora(&=09MKtH731pTOb2lS)rFQC7nW)GVOoI7kjRyeCce@m?e z{ft@%`WaOU`l#9h`lzY`{cW`!^tV+F=pU#HLH|JQ2mM2JGw2_xTS3319s~W7`U>cm z)we*utolH|qP`9K74;p^ud4q5{i^yd=-1TuLBFP+2mQMGA?VlDk3s)Ty#o4Y>NU`B zsy9Htson(rmijs9w^TpqU#b5F{VSz%=VQHO=gtFWfc}m0gZ_=m20aD4POGs34`2m) z0alNfV$F90){75fHT4Vip0cny_!xBYrO>-KSl!lj)^YnE_P^|PzIxvQ-!b1`@hA80 z&-iA>l+5DHOEd4t{Bh=Zf2Dtyf4~2${ulkf@yD|+%lcNK~@ z$Qwo;8~L9jM~#{^>L;UqH|mnnw~c;r^iN0c$ZyQ=%C;##MALM_KKW5D9V@k%Z zAKNwdGh@F$_SLZ;jvYR3{J4^F_2Zhyb&Pv*oIQTj`03-fj&B?PukjNm%$TryLhFRi z30F+$oABas z`Hsndn*8o$d&Qv*}mrv7f~pQjd1`@*z)r#(EaWcupq zmrlQO`cu=7P5;64MFqrw7)c3-MfpXFr~c@q7}tp-b>2@f^T&DeOfD@mz*I)5~Emx&qIq@O&B;qtC!j z^jSPt;<*a@q*p_Re-6(zc&^2B9iHp)+<@msJU8LF8P6?vZpCvOp4;)@>>MP{Y)G2f zkTA0$S!P3Kd<<5E`RK!|Av0FP-mw}sgw>E4t05~^Lq@EIY*-DMuo|*p4SM=ojQzFh z%Xl8f^9W{=NAWzS)?*B;hh1bnYzpgP6WIi-LM7}WTVPk%3c0WqHiatKL8@R?sDf;$ zflR1@{i7c8pdNAnUlLKfVE5Ps>%uPBJa)srup9P{-LNp630ucmkPm0W&T$T`4Cg>T zoTGjO3)heFyol!~cwWNuQ&_rQ#`6ls=&N{M!}B_xH}L!n&zpGO!t-<0gb^E5{je(? z$MZ{!=o7Fa{R*}8YvlYlh#~**mw5QM{W6sQEUX>j{`r|c{=SRv{9;!}jloyTqXW*zFF3{eDkbVeao!X8S|{#j5@fn51rX#eHqWwnO9oB#P9o=w^-BtMb-}g{Z==A zukb%)-R^(F`j-DG>veyRRh89a9m<*oKg)hQtH`R%o@Lc$FS4)5F0y*@d^NkwejC5T za~?vN9{a(ZI_qKUCHwVZFXK6G`*Kg%-TpfGy$$yXxGz`V&7EgWAKqgHhL`vf_&tE< z=HWf|efWJ6zu&`eeqN7NnAc;M0edJTVGe;ivT{7}H-yI|GxBfBmW&0l^+cG}DGjr5Gv!;*iu{%cf zSo=pUvOkaCheq|-&y2cUy*cWB>&;O`)?Y?h_W037))z<5vc5dJE91k_`!dGl&$7nk zU!1WO&)NBxEB~1BexzfSj=8}%W9+2NwPR7QV=X&6_BhJAB6A1ov0~i)*7@UR;fcfD zWB+d4zRY*Qdw1M2>-6zO);Z(L?C$YbXWj?8d;B$-Qg^S7zuyW>c*weRLXW*-;_owe zPW)r0d#ry<%=G6@%JfghQ#z@~YMRtzC-8f4QXSH~T)jJPhreX<4*ywr?w)+H zfB2Lg{`x7m_^+9Aum2}gp7f8Iy2BsEa}l1q@H{Z}1^+LmzV07B?WDhS+7AECc%Gbg zKiY1G{}s@G27lP}9saWEC;eyR_eMM~f&R<%d;JA7?)5L2(PP!kD9XA7&s8&a_#eab z44#uSO0qT-Y|Ba(JnFl)U}x5s3j$fcE;#9*S$NXFxNwI*h$mY3y8mJP9v9xslm4|c zU+{l=W{>sQ%pLx`qLQo~MNemS7oi+@9xHmm|6dVhL%~pZZ>V`= zEYJ~J*WA!hym+zNoJe%mB?5`AxVYBVg%aiM;ZP(|mxzS|9Sl`Wex$i9-V+Jxcxr8J zs3W>JR1*uegu4xIS11+_M^=Ly|G=tnG@RW+EYGd3PWYY-^6Tro350jJGM2sEfDPL}Lloj?OAlCE?bCaXHnZ zLk+6KRMaI>-tEy?N1#1?VQ6=_y*U_&HP-|ZZSsy{dZ(3#T=#`ThhaTR=1PRBjBg7i z+M>LTyiB-gX+40X z?a3KjAkCC&TP_jGnw!n=lExrwaE#@eizq8eaRih{qkF=-3N%+b5xr5_n*)(%jKPhu zXa{?+)7bQvD%7vk(cRRGSC|rbd#GW0<$z?AK?i5l2^(nM911i;PONKfXsEcLE6^U_ z9Zt0EH?fe>62=#KP#%gU!Y$z-YFQdUdkjw4a1oL529|Jek7f|J>kgSw%|vp=E2YR% zBOPkdo|{b%s+iPIo{z)Cy8&pu4?5b0rmeSH|n3dvs@`+s&v>W>D|c zOv%A2$>=F^KtFi{3DizSXO)QKh!(@zdr-<`)}oo*j3RxR7uc_)Dd64~ZSHDkyTGx& z3!-B~s6Etb+DalM0x<|lnQ_e62Ght+w2N2Jzymp>EY*?+3|A@*=%w($sHp1<1;c@M zlM`v8%0#HcIFXX>VwI7WsNp$-wJsENCz*|b9HCI-vR+xN>Nb~wE8Spm1Bg^1#5H(CVZJkgF?E6Z zsQJzWWH>if9e+@#auda@f>>_z4j!V~+f9psCF7VF5bcyR3H+pU51dI%?jXlO4N=S5 zgQ+iU??{> zUF%k&p0p?!Bs;-HUOXdAGX@F+@aj6-!)Ewk%yelb5nZH<33GPY5|5gBOgdXhW3k%U z6$#>JdslmVps76sva%x5)e(w0uId;heyDi>6J=`&w|0SDABgWM+ZPBYOmO%FyJ9g& z+#Ow^E=f*8;HRRyGln6DAqz(t6()ICxhR#6OT<=nq`hYVvpm|-8Hk0Eafv8OtfZ)Q z5{j-+Op@P=SDNOMbU8bP6G%#8Gl-j2x|~vC&`P?oSfHma)Y^emB)W)M{8j}n?7@#T zrwA$3@wyca4f|q&&SF(wciLKMv-W5Z^Pmn?8{b>3;s{M*?YfSJhK=D!puN3En#URA zOH^efQL;pj>EZ?uZcm`gj2Q6I?1M&yiG|J&YUoj6fFwr< zF4Maa;MBbvo`L3OXo$(mViqx) z71t{o?Lc5BTBji(e`R^JzN@7Lv!gf809KRNKLLf)35#BWe6H_FU`jBt(H9K4&sp4X zPk9M7!dm6c;xx(PMRqs_*K= zKwaXDq9tl;sD}f-CJ>H+Uzu7%!Ic`31K5?$U>m?abJ^lm9_h2h?fQ}>)AcnIJ$#AN z)x|T_)un)rwoEAlU(5lRk4iqO==7F==-UW5bl-*t`{8m4GPrL$o-6c=JS$wS*}~s# z1%@$Q8vIjtX?Vsla5n@J0cmPDO;2k!8ie6?Xq8F_Np)6)Z^I(PjVkK1aX6y`YhWF# z$?1H2XD9n1NNFf8`dy^}OkF*Cv2VJQ=nwD_abKdlinvUpm9QnzXeCagl_+S1+ICPL zZ4Q+zUV3V^M^awO6gU7Pi7JlPgZwKC21A_*H~%Z)Wm+24 z&@BxQPh-I)BUdU4O$bCpE5nBs?b8kzAwv6mpUHZLGqad-z&$w$0K{7gyedayd^Ku+Q`#jr=f zw>lzub{d1_lsM4r-At_nV`DpX)5=I^S3-h-Ba>%WBD8G-Jf*!bgh8FMinX_CSOgrp zVc`*q2LqjYQh+N4?H}z53Ip0*-yjFzn0Kv*pmno~4^y)ZDk2F?@PoZ{=aVo)RQ(dL zb*?ssvHrn3O29FdCqvvduB}?G8X9DDgoD%#DkI^9h~YYzTFyWmbisr!0US=(1c~`h zOll|(9LNC^jLVzg)~^OvyIY|s?2LyhJNGW~6jetG8*dBj37Ix@BNZ=RDeEn*8o1mgU`mBJ_7BvUuy)77iBNsCx+{U6XcPkJ z8cc$gH#db9!V~+P`)1c`#o%I_LhQ-9M6mJ_;Nelx_psBFli3P7h$Uy^KTCaE& z8UV&ojx19`_9yVy;gQ5mokN@Os?UfZoLjzRcj;7{-s*w&8ptqEV zgr|J$zg~Bz?k^0xGZOFW?1b$z#Ay`TFA@(MI$qrg17gTcw5$`W7+8&@obn>nmR{V` zg(=J7qEVt<5$%+YQybVvuZEaIpuUWN&>rp3<~7wUDR;z!(O7%9iDmI9J@su}9Zh;- zOD)|sGeIwT8`kbR3<=W#NbjXj6S_fAndv6z)P8DV6JNMV%sAno3Pyrb*|bN>VoVLy zb;x9|Aypr(Fa~{0;$CWC*H=Rf2gMO3;xCmPrGR#d#{iL{Fz7Hs2J$v1I@$+vWMNs+ zEweltF5PP&X9&q9OCqWYDUqdf>g1Bzy>_@07wh8G5=sqR@+xOS#k|(pQyXgq;QDJE-}xRaBBUL|N}*sur4Gts$aQ@~9}6NAKvX70w?SyN68 z=wO<6N)IO{!kEBec66EL?V&&f9VF0UBG+l_1YBrqu~UF*i0N7dSsf8Eq-8~bQeVmD zg4C#zg@~4S%E&!wp6VF*3YI|mfeaM8XG=Jw(~v5Kl-CTg7z|*rE5NX@$Ap${P~O%R z5w`^Px~2SRykLkU#~Ui0+YmH~u+ri(`h~f6i3r`_jraJg~bJ3o)9dB^LFD1%B+soXvSV5DV=?1 z%)zTg3=5TU52pbvsyJR|&^1V?u1J@psZ;Xg$nY>vgv!x>FlV9Z^*YORcyNpy$KGa8 zk91F{0Zhm}h|i#;5@>FQaw8MDxM(v&rwFu!ki5%I6-);UaB0Ce(vGFIBiVEbN9s7E zniAAGGpuo!2O_}`OnO=zQ#2qIoqWo8ZiEJWq*qnOhw_npSHxn`m`t5|O90`8tCg|= z?COY_^4x&c5za2I+gUxM`{T#}hntDi3kC!YbJWkknJ+AULu}LL795E}d+tbjnJ`fbO)x1tjF+*}o z(z%>7QtS8h0A>-A?%~ny(me;OPw62TNSZ(!Du|Xk zL-`Dl6X^jwLL=RC$kCM^EWN7_6$YE}8=?IUQG2qbt;bM$JhAhnb2+$&_DY$D(xahQ z50RK2)9In1uU5A>)|a#%%q*PJR~M%|5NsRbg|&f>Q~01KpW0Kz0LC!3Y}4~fUFlSw zb2W-AA>9+BDLVM5Kw8B}prN)>(*l|~I<;g=f1z~eAqwW0&(kAp4TU<( z+Oe&W?zJt@?es2LGf|MI<*A}0oT!e-dL=ypcVj0lmT8?+2dIo|d&`jNV&5&+qZe)I zFXe%eAzmnFPKNel;b>MI+TTnI+Ax&A{R5vNIM=_tVS&coo#)bWc%X)44c| zaSA?C!P$ef8gP_fD&AO)r-zWKIW1aks2QqjQ1)hr@C@u5l8?5Lvw3NW(eipK&jALo zw5VQfPai``3xa*f^jAWG4|KIBT(vJf1Qhl}G#G8i^etSKXmsIpn?7+7J((&IZ4TI@q| zh%+rA*MOVm<78Zm6j`bSu%Diu0{VJw2z#$XdqT$_A_~6X#qooKGwY#N4;e@w@JWv> z`z<{ClkSCTj8z39tz9q!#M8YU6LVTowdF--#UWzVhPq%FNKXyrc2C`dXw~^x#;tIL8l88Ac41=`nS`Oy`S{FrB+O z5U+6Uh3Vd@t&(&Ie|J%-Fe5~9f55~;#&B7IP8u>(POiE=-cq$5X9Ke6#FU&=bcbO8H>t{6l+{Q= zR8|t+CX^78q%+Ym0Qv*ikl-88KNz5+oocr(q+ZPGj=^0jZD%y>l!eh@M0KDJNlNl) z)?lR3h1~_Pww^hrGKCFrY@s%|wlf7|wG-79{tkm>mnwA_QjOmAvzVS8zlILexr7FHY1AEEBldZXaULgmPI+s=PZWk zfHZd9l0UCo4DT`5cY9Q)$eyjqAk*aDjh?A7-~+KB`j)IxFwVPob{ZRzVHtzH8`>Op zRzV#@N|RdeGlQNbzCz3BrM%*XuAv!e&{|)Ww}paxDqG6-V*gdFQwp1~eGngm{?gpf)ht&wHc>3bF zPXzXvSlqa!uF*O4%@b&`ZW1zL=#ct!9S!>&wi%5|ys9H1Eej}Du?EDkB!{IJ;x13C zA@puA2cPMv3*q_%w_WIjfQ3SWf>Q8EKM!q#m=hL44sgpn=X!3BB7~Glgn*LMnWE;< z!IEn6PPddxBoHp!RYhBIGNskb0`vvT>vUVm%hZF%O?-VI&g)owKes=+Qf^F`?KqVk zX=QN7O5nz=4PlWRp_4LG>+W>RBc#d9=>CTMIZ*KZ;#6yz_V5xF)>LbJ#M-C zg*#Zr=Ae_p;hR`E5J@=9@<68;B#fRYjjqr;w1A~c%IirO3RXx zf?ygQ@E*P7EtllQ8@CGNV7!N0iyKIeuVb!YJ-Cj6TW>C#nu6=v2K!1FTXkJ9vAE13 zPp2s1xwTPcpqkUV?U#{nLdq6_mdyG-ydtsB7|YA&DE<6YF5xHxTKDC*r5 z!>lZ5TIim}j-}ZgRqjBEW9v)vonu}pU1XsqLvj*_hA`fc8iJ|4 z1H2kXv7~Oe>nj8@qZ?Fh3I?6)a;l-#;}9j&^`WG9T>~!JDR$BzCNx>{R9F`CFkz0?6@V$oDXyGycP7%qB|rra*5oyO2CNn@qKbCsl_m^NeQ zKm8xxu=9fylxtEI8d$Tb!JAzX?RNV`qeCWO2|!|H>Kzk|f4+ zZ+J&@Spr8Rny|W6F11q@E3V5FTuMBc=c$a8m!k{ShZEiyX;W@01}^o$CSj_{OvowU zY8<1MlBYQJyq7}F28;APDG%vTUGYS;BgJxBZF3kmVj?NNYxPU9oQ#X4HHP+dPq7%| zuD3SLoiY^U1Q#9*m!62n*q!op4xYt#h2vpVHjc)*O=C3DZBQ~{U~}2%QCKPHrN=h#GD< zq6uFA(~BCdUukw_-0K>AN02$d{G!7mhv>bjbsImhGGE$lUwI6Bu2y1J!BMe)d00%&jTEvf=XkFeB< zt`E1e=&8MAmcrwd!eRvlW!%v@^(jYTh@Z2OtmBzmwxX%H9umqZz%GxIzE+Z5o}(DM z483FGIzvw4I!o>@HQ(&nwRZApM&Uvu&LqRw%8W!4IQj&;lB^0U6-z%d5v z3w07s9r_ic)zDmLQ(e#F3OZ^9*1Rg-)wE4Mm7*$JU~JbU4oQ%O`3)W-l_6inz^Kfk znsiKy4AN+U?fBSCo8qk{g=E^;*+rhPen|{@Q(d~gnV_V}9ZNeS7^wuF^Nj<@IBkQX zzqF)oV)sQJXA`<7`4FKz(C@}66I}vjA_IdJbzR*;M`v449H-B*+h$5Y;|5)lT*_ri zFD9oHldUOdBTNGAF6C&>yTY*qzSO}4Qx-QbcdsV|szzSG(4b{=Q}Weiex>+a3%e&m zXmr%84u;ejBB^ijl8i;8l=NPykBYs(nE{mBP{?+un{n`ZPb;PPFaXovOvuio@LMZ-m}*jv0c%AJ-M^SDjC2SGhs^maK`^OEj~9!IIqQoqChCIY>JrH) z!wnNP1W_=I&n21OrplVI4KHra)ac2WuT_00)w z=0tG9Vi=LD1;X_hrK_;$Z%5s5BeAT#-AooCA*Jb5gFtGH=e--Yuo+%B1cZu1r$-{% zOtEzFQn8$Q+{*^IWp*aR?QM>o5PFc_GsDCo)<5JR*cNge4ag*$9nwd^rk(1|n(aAt z1sUR=z(VWtG?UnFB&Jj@E`X=22nZWjhMS+1!-LPHkcDYGz@0x>@c=Jo!lA9eZO%- z;<$Q-DTf)kCIE+sUg9$;XT48{cxrRDlYIJROVxmtj(hbIM#2u9)iJ?gAkc|AE1bGe zhaRrDgv>g}`np5GPS7EDWw6r5P}Ch+$sAtR-io95iM9@fh=ER=!w=Q9hdZG110ck( zztl>lLuP3#nYxfnM6HivQ67j48e|9$g9O(75R|ZPQbb`pJmTrmVzm$@q=^f1W;E^G z9CMw{4SH@<@O+)_o>2L#F0Ab=BTb%yCHy5W8;YclZb* zXA&J_H)N~0w6)6Y@!=RnqKz|z!`OuF78BC3l~%(>@1FHw1$o_)SFanBc`C4TxI)YX z&S??3b_j_8(~^e=!x7II;fjqL4)QLJa~C*%>9TP9MC#Oa<7CS~M%?6`bs}4lQaG^* zvCg@V;Bwj>ubL>X)b{KOb3fSa1Gtx!iivkR&b02YHAxd#UOe#NCf_`WWvX^ld$dWG z!1_Jt?qT`B059S>O#LY!72r33oOuif3C&l52HU2Wq&6MA9}hCE=1h*_C5Ht(fhFH* zOx?DFLZX2Oab(MbMiEbXn_vRM2{`wSlD<}UJWNSHjfsAo#)EAICVn?D?@mJvzbN4G zL|Bh2n2M!~=j=4PrxYA0d?oZ=ct^!#?H(VjSS(%Z7Q?>;faD} zr+cH`n-uu&J-XBj%FNKkR9W4^V>9V~q8FvOn1iZY^dy;Ly7JB$hAA)EE5mxx%#ogp z)B{c|rNW2N#t<&%wzbS@SU0EKsKb=Qm6|D*Q=k;bWB_(JPt1_}0%=9r7wE!`Pxr92 z5jcanoAh?}z@U(b@sMn{u^ZO%P&HIHIa`edjaXDf!s@SlsZR)3j6P=72|*eWBZE)N^!&Cz`j`@F@iJ2q_NB(yvhQ#o}y9(|(=@))P!NQyp3LX3V+P}waeZOS_MtTw)1 zW~y7dlUOO-w6v_F)66WSwaJ{Mj43_j=|mNITv)kq9C*&#G8C#q&mwe*B%y_dF7zci zVVGjL$EfKYmhzt+iba+FI$1@h(i^zj0-d-;i|riw)FT~GS}=_Y8R}#WLXDBdDO=Z} zyA01W4Kj?j{*lDY)2S#EWm)gYacogtfazIoM}DHAp&s49T#j^I$k%|g8mVw%a!t9Q z#itz3#YiU=9w}399n^)S?l3t@I58%51hj2joEX5((T?r-#6u`1B2u@6Xh_bX0mDHW zvSu_c$DlKW9-@_%j|k`LNVq^HwQYhrjp)&AK04$_yuuMKdNuG70gdi7Alyf0WI#x0 z?Ph&pUZI5?1~kq(VddP7@9FH~=AY~-NtZq))VAdb}S#K_wVyYn_rX6O=IVj8eavc~k zF0BnMu2awBt`nI|eb+|uc!lfN&<2US1{jQg18c=;k)9++*A?EL>doKw9tmwNjm|G zv`{I$`419SKA_Ay2nwknE_kOL>*av6<0B?S6Ub>iW=u;Imc@{A*wc`b^OQ?^Rmvq+ zl9X$o8^=jq{AfNhLQ5eCY6E#dU02~V;4v6p!@7311wIj#F)6*anHPGTCg1@&W^{94 zZ%DfwS*2Z0JL)W_!t0l7x0@Fuh4C`ke-sNlNY9r%op~pvAG_b#S?C1A2KQRCJb@7g zOFvQe*Wq(K*bc)IjT6Ven@-AHCP}&3q;=^3n54;??z{g+8lGYeDuZ{XGlwovTfAq% zdgJHy)WV>Arv>@}mSy;r{^%%qaK;lcjyg;mO>w7IHiQGXzl2SsV4QYW-mQppe-6_l z?peh32aU9lkEb*-1oz&Ipt-^cq!l#x9nQ|6t9D8M2t(;{GT{UeodkMZ%=I_t$k4Ai zIm99Cc(6?L0G{_6$kzQXJv0vvrP%s32NYGYtj3kuYmPg@A$8qMir^1ky86U=a$MG)q%fsUv$N2ttci8~0ed2H0=4_NQ~}(CDoW z+0emb({Uxcqhj2zOY}%;lB~!x6A>QLJrGRWh}`e>>w7h+Q=E*cgGvFlnyB3(B)o3% zr|kjBil0L}VnM%J-@P*u26ET!1+F!|Jl4~hh_>R(ylp)T2Ytmr!2yoV<}bWr(fj_9NOJglnd=uGs;cDr`c{#zE;4z2KL8rA2Cph+n&q!{+S z*md;c-Z(Hhxo#M!UAm!@CIEzzi%xhi57W@Js3|Qh*i*#B3WAcmOtdX31z7R1aR;gj z3R_F49tx4DA!ue-4BN=XzE*HW zxduX^@y$XlFuBX+u+ayxJ!Zl%e~tqY^n7g=pOit4r3^rfxw5pGYPhbDAuJj!0!JP16GL@0da`%Q;;~XKK%op{IGYnE zAREH^#tOsEV^_@syiQjtjpyVZ}rHx+Zit?xOPH+=W5%vQrd+9R)kM z$a736iSMOlK_F{MhZiv6+>?a*NT}PjMGrK3v!kgDP!07P+>sc^(HigHPJ-<6_{o8A z9B22|(ST_kibY&D5OkvE^YyyP92=ieD^gB~cfAoIcV$I+;(oE7=2EW88eX;SlxxqZ z{eb?~W?bnmf`&YGretA(wv$svI$tt`sRH4uxGaKo_3*elmI*K_D$i_SINPxeN-t>- zF^=noX>TX37oKGaP9+i$m&T%E7XS-y!iI>s9;`c)GAlOGYzzlwHq(W$YEah(4 z=QNW3fT$;`4r&;287urionbhJq=8?db_(f{`tD*3V;D0A62d-nON;zUgB$xE_C|x4 z)}k$FXxz$@rq!1!xr9~}!#IHsANjZ=!=U-l^K>dkN{SXsjjKB5a5jcxVkvT*@=9a^ zBhB2;GLC@gPmYIMJ;vH%_+m0LB;I2vw40$~I$2|#aPP!8OXw8C8OpH0#Bhg4)-w@Z z3?rTCmKyiEMJJULq$a2ct1|frf~pU8YQr7Ub4eMQ9E@DsD7pBFu;$CBCb-mv^T7m2 zUGwP#sY4SWs3S`_tPOan&vbd$DY=x@mSm(N0_83mAuVxCojadg;6yx_*Q{qtH;h>l zd;1UP$8gZwkA_;*m+KFL4%GvPN@2j*Ok2+XFB2QIkpGC-&Jtb*!$$-gD#zv}GR0`! zWZgok<^N?WA6@SMLxO|K{y(JPEx$MD+I34BoJ*BMHKB-l)4*-18+?u_U-~z`9EQ%w zwGHNY$Ii(9Dq=GAX%B2#3~*{8Iv@g15x5-LTgO#GZT!Vi+DJ3!O2sck^Qo0y+j;>98fO^e?fP>0Qf4C#dt)U^$c=Y?B#6G9WTvek38IP0}sW z((7(_0*Ttm&{&Yx;XAQ(OsXGEFtml&epQ!BDt2v>gjQXF$rL4@KjTt|OA+IDf=ofo_zLKs)(O7RSX6 z0mtDqoa6R3n!|Gp(~diJmf7K?R3(SwO~>u=j%P~E@p9tSwOmfnWFFsGWm{~I?&B}M zf-NMcI&5SoLffOeQC6^cOBFT3{fNz>ZiU+*xUPnEw#?MsO8$hV$H~RF_Cb93)9eH# zGob&(qju{Rt=S^x8kf1yCL%p9X(JL5VVGKk83)erx|A_2nFDE|nDOY;3E(WB;wIYq z9yv-C=uyyxnMst%wH8qA(pO&`Kj&AJH%$lRk7~)6j(eC{xiG=3lE5I518-tQ6TTTc zq+@zul9n!2;eM5f>0lFb5C@9_BS0YUc@I}O5_KCaM0kZbrKvnlJvoIG5u@T|*V&%j4$j5DLp-ekOvIVx-N+00acu2ZB)l*)>*?3>o2BZidBR%MZ9&45$} zTQ?LQ@P#DQo*W*n5M!aCDPW=_Q9S>*-s_Ndx} zw}h0+m2_h8LjiNc$W=4A-Ac`zI|{t-};s~F-gRH|s3>OxtiEK)Y94IF6% zB_#{M2Vs&wsz+3*CL9eykS0biK#&&jLI@Nx5ix^-Bd^!5!yN}ulF@dC3c8ghp~SBh z842M<36o|jlS0Wm18OgxFyaUBW_ecuVs^q6B&~DdgqC8*`4-8((?pVrQ$13kXPpB5 zUo$W5AHn}9UQxgbkzxk;YI#`~_)%1f&Vu+z1@s`S@O9-#K@#BM2oR|MLor65hN_X4 zblOYhp2mui%1|RuLyPJ>NP}pl_z5@i1v{( zs?lwT2{jri;n+BGuY4cFGheB4-9sdl(^aL#rM;zF#=vc7%F=NohJ&l5^f7g|poVV| zdC`sV(g$>BZ)QE|VbX=%g=CcZ7AZBUoH@~HCQuvo2r2!;itGHyTjhPN%!ku!Bu4?1 zPUlN%PFmT?_y0V^blne38#&6#Q^Syo^5G$!gPtQi)!^i2;G2gU6;6o@AS^`YbRb1t zhXu&7v~d6&?D4QoWJu%9Y)ctm(pJtOR=GixKFa!16V|iD1+38v5LXX-wP+_>DXxSk z^&suH8TDANYCu&DYBRM=!lwj_9-R`a)eR|aEqzORnT!zhwP|JGNM1YPTA&8Xacfd4 zw8U9}$F$-&-M)j$HEs`5lC-4vORth~X+gd_rA5CTr~65aVPu3z%2rMr>jOE;+N3H_ zMm2IL(vcR|{Xvb{hp_mINeCCjTp{y}T2qPGB2?vF%_yCeH&utaXGrAQO}RjyOh=*u4;9PXpuGEfrnO+|y_J7tw=NYC49nlpY^t3~*)$K7iD z%8aR|3{FAIgw-gQ%BfM+kUOZctQtrl{N`0q`sp60CKW>)Sd7|s+A@r{N-wkAo>x1d z*3=A{kWzg@rYjkz(hDik^1S|Pnv$pvVO)VQ`rN?oi7fCGR3jI7+j}K{aHA!?N zQ7W97ejWA2#Y*8Xwu$^o&|h*XGPnRWG%&mEnUkvcufTINV$X%$BkOrK{&W=V^Sa)x(|4x;=rrnT0224u?`zH1OSuMWA5 z84W{CkoQVCWIm0e2P{EasDYdfEI(>#n$t>7kM{OStEe7nNqOU@UoU{Xl0KkyYUzI# zW^~+m23O>i$h@ui)pD_nvWjwXmdppbH;a~a25NH|^b$RXo#E&!<0SW5HmB;w8a=Sj zqU^pkc<`II2J?gNy>N|QGob%E{<;TCEND-e=ZX$BCDm)S^bw6o>+33$l4i71FHY}O zbLz}Ulk)1ZSAe(6>?re()CsOmqWqdCGDY+!9a4=fM@UCyMlFr@&PA-ZHQSMbXjWyY zO&O1pZyDKAK0Uh>P>O4PMQYBOW36!#H#OpPTdFB~r0P|QQy$|tL+VXNb{N01Y8vFv z(W6%w3m|b* z#z?D6I@R!%Q4ZNTNlGMR*SmgWJ&oCkT9wecp1U!o)U0}NWQ0kbNx4L$mC{SUmwFd{ zL`~9KgSU2NO@$m3N^SHY1)W13SLRk7TklCA`$E)Bg(8M%14y_E@@NC#Kf!3MexqtjNCt%-S-x zMXQsR5=pP-4U8eH3+embu<}kwn+4K_GW&Fz)|S~pYFg@D@+5kxqkpT94@_5wtVI|} zOZt%04t3y34n@vM8hXj9W_h)X)OZ_I-g%OzPUKjmfFAWu3Iofo@~RldNXjB_trb9a ziPV&K*8M9eJ$rs7++r`y^HnFrJ^hR19 zAldYsp+~S-QsiBO7w~Gvz<5&61Nzpo&B&>&%L)c*8Qyvx+;VE3lu%l@f9n$9Q` zxuZukd&xLG@_91YZ&1unuo z34UHRY8792z=P3VB()U8yLaQa39XRQ%@;tQ38A&D;*Sa=eMwqUN~EFL8H?hyFMm=du&K#tnd#UJZjxLwt#$o4>)Mb{}<41BQ zl1k)7y5xc0Zt~X2(zG#@jN?IhOIz1CHWB1|m7^1i6p=NAwmqaYQY{qr7;)=1SeO%|*1Orv(IE29o zF5?%$5C|}9wjr0M5G`kk{KmZTDoYGnb0@%B$^v3bkG0yeS4j~&tq2=uk>itew?%R+UxPH z@4deD?R}7Lc<-EPHE`)R-Xja_vVxBC{kmK6;42tB8-slMZV^9?-C~BfE(hOu8A1D^ zFGhqN*9ylI?LwQVmzdpS`ra*A2)G%6=ZW(HPEC9%3*pEFlBt^b!sx&qgHJ7=o}H$eh@w^fN00lMujK^Oc_=mZs<7d~yC_>IynH>w`KXD#e|-R{`_gZeS;_vW`#l zc2PoBeeTZ(NS1P~J6D0SI_v#MS7op8rNO`RT64^5pO66x13yJqXM1+on>9te@VC$f zA-2)lyY+s2MRxSmYm&}yf_Oxl!$*c=<6gJT(aO~4rG2y4oyr!`(=p>Zy-v`$9jyhM zL|3JEh}Izq;a+@oxQ0QLIMs@ojm`Hv;HG7S*40OCBeb@N1)sy@Fl2YmQQPQv3z=1S z7`?egoJ1YnW0;qJJ1+T*E^nT5MD=@BAGgGyQ;LAaER~ zjWdRRqL%3HsQ*r*mUPmZ{nDxjZH;JxsKhn!v1)4KtGz{f9*0ODHa&vh94U6_J(^pv z|3uf&Ccd0D*fK0cIyO;5`i47A^BQCsj3khyHL=Z%*E^|^kuEH73v}1{44qmvLAW-= zKj44gw?|jNJ1DKT-RxE24iGob9hZE!kl~ukS@8w!wora}@0^ZE9<^KdbC}jU@oM&L zZe_=WVXme%f)271iFDo#`$|#a+O$m?i)d{XXIh1kfC;;of!B77K3_Ukd%IZChya&! zE7Z-LA#6ek07=4xQr*BY8sqrAw1}J44voI<_6*i4HrR z<{gPgZj{TWIU2jJB!-u*lLon*m9$3ow#!31qWVam`=mjRh$Gm>v|B4hQ~JK+R(W!Gyt`H7yPjL4 z*=d4tQm!*M}$poRn zxt1HX_E18;QO)Ux6VcjsVTeix1uvUb6d{VGwMGzcL;+x8TxGjU&!z`c!!Zj%LX=bp z@f=F-U;vYYt>pNb4FK#B+_ZG%sYeUjxqFTK&(T1#h3!XB=o{S!4%=4)Ou&%}H`yE^ z2$aqRq<&-$AK3QzE{s?E7B+jN8)%e5O7ARQgoztRH4d|0uscBS0gXjxZ#!B{50aNP z>nQku9v-@6qxFQ%>!QC52=+4qcq5cRDEFkk^SE?T3`};SOE$y;P6-ud+ zo7ekpPx=y1c(3#BNcs{-TwdRM#lqNRA`K4n&Sm#yRR?8(4lCa1eQ(U|>n9p0QQ{9o z+hHxwK=HnxPWq;v2Qblg>ApAR&g+=RADt6RxOJ^0@ll_5*P?w}=k}Azv1GkBt8cUq zF(xm?)o!O8m1g1a-~$E(n1V9Q9|b0F7G_2WqTD=AT>V=HN_ANlu%-1HAt9n81nWJe zBk03m`NnhK9nyZk!TeWFVqSO7X!-3 z?x6q{*vGFS9%N_me-r$mAYG{s)J!#}%9Jf{q>>oN<~nscvk!TdgMSoA=kIFz6*=R=)n4M(F3T!|COebTOd z9+)ra295gJrABqi`8;X-Hj%5_=5TqV>;2mm{n#aU zbyU0JQI(1G+$?*rQ>C5JO^S|;s&upN?6J}wl}4jG6hGaonq9iOL#?+(@y*vY^zwCD zK{I6#Wbzo?06GPTxldu9Zy;uelk~W0&Y+jvz0-r$YNr>g8NQLnsQR`4uXyWhi}0pg zdjV$RzwcWN87PiyO!j!98r<&jJ3^N<2z)H9l!g1vMFV(TB1p%1$a{xaRAO}mtJKYXR z=U#^mjh*8YsfPj!Aax)$3!!E@@nOu=9N%c0<8!d0GZ}ga++-~gcY>GDetzzl!UuAb zo<^|Hz469Wix6oXZ9jj%_rsapA)kuk2R@wf;4^{_r?qyi0Ne^K6ghW@uRS z?}27B&RH=gsXb`WNsrPtnC!b%#v`OA`T#4*8u0hDl1AQp3RBd7QhS5bk}IB;!k%FP z$n?c+Av;=+QtK|ch`~_1jkrPKsS%6np4YeUQYKX*oZ%iXdf4~8+(+#bb|U^3 zIj1-Y&W?%iw-$7sPL88UR*=j3S=3cNBC^R)tqE#E!Eiu9J4zh>CDmVQWeUkLRXC-+gDY~us0Vl#E{H@3%%|6(4i?+m*>dS^0QENQV zbQd~tM71HG00rZ9_+}oAr!J)8jEJ-onY0JYzm6qKt$pH+c})3v&Bl78we%!i>jtTZ zdCj0>nk$YevE_5oUn;hKgM#~?()Vrpub{`;O$Haj(~(RENZ>px}{!al8*ZKc$~(;qc|c7`wE$=X$%f;f_HwG$E7 zRFpwqdUagj@}!ox+NSRt6P6hf8n6MrFAIUu>~gc&ls+!~nR&aun-3BEKJ}c(z!bNN zbi^*X6KX==!%@%3RtHrOIhYtovYukJH%<64VcUQQbbl~ zUN;;x%?Kf3Jep*K)`ewz9zeY>10t8{YIpg|Slp8*+9FyV_IXh0IOG2vdq9(WJ` zZghg57-$qQBNJaj&=3swr{oFWe5b7w0YN|e8H9U6Vf|t3=6R!yt@yyh@;#%HfS3o%Xgj9ATNMsIuD>G+`W}~`xkII$s=didV-o!Bf@nmo zKdtXwTIW`^+o`*|^#3s#_IRV`J-`HL|KJ<>u@Z2>dc&^rPYEWQOYL)~qU-B|1 z?LY~Fuj3JK zZ{b!N!JE{2J}#w-n&pbu7_iRpaD|(Fx2)im>#Pf*YfFdZPSa{W6M~lDGNguuqYzRZ zn}aL|bsgN2SeWpKua?*MZi61a1&a9Q#e0uxov19fp6|bB7GBMHIf9&xIX@s+MCpEn z-u7w37Koo2xCR7 z)3PMcHoRy9{iLSg1-rf>Z-Qm*BYI2)<(=M-lw{5deFk(*^L-=){Cn)2HA4&bb8+>5 z{HQHt7Wg@dIF@FqMJ6`%HlFVHBNn%V%UhP~Xf4jN3sW?)i)lpz$YP_7K;ogGR7MT8 zp8jReT#98GC9R>4lRG^;!GlBSQ?FmPJlQ0sV`JN4xE67gNOE7I_<=~#13jqSMdYy zefQ{iVT8PWSJdlmBHNp?Q{3NJeK?|uuJ%1%*hkK4yzGuK>e72TE^prHu_9WLlR9d_ zj6GU~ha$`~yy`BkSTD3oXaKHUY?Osv{qmn%5SAuYA_i9lfQb;L*@U*FHO*QlwxbUG zgw_orEX(mV?BtIfE$w)Vp$;BV`=!Q%F_$&kaBy5h05Gc@q7$7$eCd`4rf;1E>v}pl z4oDLq5GMLLQZkD<7jY;5~{fqu-<$!o;d!-mE7+MlrLh)y_tW5(fZ{r+o6hVTkrS#*Uwi{JQT2cLa|>c8mdJu0 zc62bGKiLlX%@48w>A5JY@IQvQMT&y{Q9c;fV zcdtv4v<^>=y7JRKd-H~47)`JYd-9mQ}%OdJMC9D+QpImsXT?AKr_TX&&>4UtQsZ8faM`p~TD!>*Xv z6l=bI4-~XAg6n198GEh?Zk0yvIV(3Lx^9ygbhixn?K;!=jI;}{9JxUZ{IFvA>_~Y; zT90HVk8Gi32~*&lB{}R5eNZ|!>m#S8;JXW^4Z)B1pS}?5QK;rHde{rWahY`}J?(?> zV>?a4DzN3vi3dTDmrbo}TUU_=nKEm*EeLumPT~2Kv(seC09C?mpSeTyB@9ICaL*}{ z+V)OkYo#~sQ!kIXc=&6X{gz0fOA`dm_xdEkOeE9yV)q+Arq4m#sk_PZ4WDsbAoT&; z9`N-SNw6Mb^GG{zBWJX;v{0o5dfdTPdl4h$hM1&@W8jOVN~ZmQEVl>h8Kwi*xkhPAQw?0f-o=z}kV*JE0y`o+LFXnd-D zX9PJ>NO}2}Vduc&QbKihlmG^G?JXD06g?N93E9hmmB@$YFr#yhY$x~ZJ0ww*ox+0dL`=2KGxuquDt7 z(L8(@s80ZNr=Z5AW^7hKzN&}&;v4p9RFnf@7HH>U9eTqFspyDOSMReHxmeJRl!45EDWXF~^z%&%9-1oi{!tiRTJkP?;r2r8rH^awb58qx-`@;n+ZgYu)4 zJ;qwCM+;H)Z$Ik&P1w(*o3DE_E^Xr=b7N-!LBp5~iCnxc@!ZG}@vvTat;J-|WIFea zCWFS=-^ij$p+M!g?pTn#V0xGn3G%mmc(U{n%{!+y?Q4?MG+YeiDJ!wa(edc>s>MMJ zrUo*lI~Cl7;C|tTwgz;OgMC5qj(;5U5bv+V)^!EYCop!G5HSAYt@CP_C)M&z^mF8AXU0!X%_8 zIj$H9n!+Z>?GDj%5vK`($=Si!+cBWRy*)= z8fL0!!Qp@0^lp;&w$b@)IH&zSZ@x=6WUkmy+%B0&3Rcd)I|qL7nOeg#3I(o2;U(wB z2QdRkjXxOdP983-KOD+x4(c9h9z;VXb?w`y0DF4yAyW5m(Lv#M{cld~O6u(HN&JP& z!*S}gSZ{~)5yyV2Pg+R%Ue>8aB*ymEYTGEQwV3=S9NUUG>8rQi zUmxaV{wK_nU|gTg;qZCX)_R>VT!$78wbdnewWihdfRFGMqZ{*}n=~Fsj|1sNE(5wY zJH~Ont8lqvWcvw6xtM968?Re4Wnfp1L*{B$51A|%iY>ylhdDhYlO0Dfqs*wvYPf6p zqn;Q2IArXUd7F+(u37Zi&aG|`^^v?R*8RO3Ze87*4U`tm_veiRmEf&eeLIJFaK=L% zp5;7cRoFlwrtB0;h$q#=k#%5 zjPXbH{Miu&i?ZAsc%H5ElrZCSlR$vHdym5jbdL#AB%k+XL?d~a@eCP8;H}Xl7>FLW zIx|+tGdK+F0!fWv zpUuw9v(P`!oQ5Shp0|#7nwz%9e}-FHitCf|3ChU`+KDD5;eI%4E3z>1))c2B9%!yk6NC4+yM;L?GxN`6Mi8Bo5dwUKTQpj(ZbX)8alJ;d6&mNBlP%2hRwlW` z#%E>G)t%Ot);U%$AS1FLow3S+4R*d+27ESj)p6Y+VMsZulE=YSeq8HRT@QW~Z4#ZHltj0tl`}dmoMM#DfbU$*8KemfIwH8kyHg3lhu*+QS^W5! zyj3-iGb6b=tq}<2qm}84cR(3kgB680_%?fLGmLBY=$gD4d}Xw8c+k@Mc9_-|EMuE= zA|T+CKKyP1GoOObL^DFE?C(VP9gEHVd9`ArcoSimncp*g*e$;9PZ zO8W|__ZDP3JH;(#bXB%3PliD;JX4)IF%BfUQ{Cn&Ue`1eTUtCcO})YtPY zRGr5iqsv1HK1_Gfk*GQ@?U0>)T-4Mkxpo?CWW<+`uKdG~y;3kpn$;F3RXn?r20w zBmPM6S{Or~qunahV`q?WwV8{zrW!xmYH6>&V|h~FtkXhY)=AIwS%WPa1qp&jh+BqN zO%c8)85G;;eMI%@-z_y=c&ye9TzK3J722wz+W`qcI?JH&U`@=6lQsa70`JU0z}8uS z()&RQ;((zFuTNVpQsxnb|Jq1t1>TW@+&gE%IbNCK_wcg`ZrHD#&TlP7t6m)Fan&_(>9W5&y{Tgj*igVQIsPI_3FqK}Yi2 z2lByfJ~BL_VX)yMNX*tL_=N7z1I*Av9MTlGp^w*Ne;+eCX8g-spM;j2q|6FVXpr{t zndYFBb|>kn4o9V|kEjVy6TcRgn!L@VPTHJ=1Zn>~0^r*uLlispJ!ZiCocpg+hd zx?l%Y4hgu=mvF+|&dHRt+KtWlz^0?z(RN6$`@J3-7 zkq~(=S7beH=%7W_cPe%N{Vu^lidgNd;p1H>==PA z+(Q~auX~cv+;P|ob6SrSO^Wlwxo7Ar-ESi%w!CSlJfqP){^o6v3u)EdST+<5uu<~% z*xhuu$%ww=@v)m@Z_V>1bK5FS4rHx(96x`xSqNHfH9fJ_sm`S)wdd^GyiF1*l64Ml zw)*AzMa-GDV_yZ%i6}#1V%f%3x8+$jw?)1`L;9P0hX@>8#T{wcMQx~Xokp*em31bzB1N%JN4GZ*Uh1t`mG!h?r@VlVwA&{F%`RSCyC~l`F1+^lZ zit(oBWY9E>kemise_HNJ`tQ^Vcp^USHK`T2eWxTYZ@cT9&t1t;+g;TeCU&A3+I&2E zd6a=tC;! h>Zwqm8W=*1Z?33s%nk3+kK?C@Dg^D1UJh=-C7) zq}C}YbEC9y54#597mv$&!s-0JjqhYE;$klXk^Vei$*kNO51ZRadPB}Yox7AY$ayx^*X*%r+GV4^Hk(@+pvvY7?b;(F3MTT+n z(2|niO75o`X9le1YVfc#4tyQ-8>6OYUtuLdi`kAN_k_E7%n+OO%p%uiGs466grCoX z6XOGEw?!qRnV+Q>ZPoa!jx!>oUP?8kMI)@;6N&Af)O^w}H|5zh=N5nb)Z^b^-n{_D z(QPb#1$}W&ofIF?ie0Mt>A8^x=EHktR~61K@ZH_FpOOr^)<+^GF`6H~m9EY`*-P#x zEj3O@zn50-@lkR+NXhpPl(fc2@~{+WOhgt6kRunulI=l9cmVC{J3|7Mp1~GYqZQ^# zZ~M+U^pXa;_rrlN_*FhK)X4Xl!VVXI)aA`cyRdMSdOf(=$H?_87rQV|FU%ver7f7 zXsuP!Ua&68(PhFZtGla7OkK4dW z;4qf$Wyj{8M!xj;N?g{xtz*JY{F-tH&~a94)C#(WIXo`RbLFxmxmqW=Z@nK&bS<_g zVEnN}d$Ai*-L|FIOMH>17m^j*$iRq=Yd|X*1IH(g&jp`6I=}Y3a*MiH&&MS{`KQ4_ zpSc}m1Wu>!WXkG0)Jy}nZoK9 zmzw;eBWpY8fv`cM$bl1@&n*SxVua0Ot>vQ0x&PlT1;R&%ro06>vQUSMnQ{-N^Dayt zb4XnPj?7#|&SF^PX4_$<@dk={+ajYLl2YLKVODR4;26Zx5RA8Ru-ND^7IOvFZhW4! zkRxX$egtmuAS+~@5!@sc<03Pche2jEzbn|YsujCjk8%r%p&UTLIA`Ptp+td&q!oAF z*g|Mj-t*nngYvDfWDYrjY$>T({kK!l!JX-H-;_yk>6GWJ8 z+`}}y7hrUq9puZ+qxc7GS1mZ?$Ct!X)jFVx}|e~fn&2!1>;3haJs_gkO}Xm5Wh49slkfZI}SJs zb^HkzxuNRLv!$U)9}CCV*JE3cyOxsw0Q;2Ql>~lqR!^wh5(qF{cn~dri^RIp&AP*5 z_C{{<@_2&H0B;K>q~ea!tT-_52*>aFJoE5$u9J!sInPs)-pFi?Nm^#Z6eN-DS*mr| zpmPi;3MouZh>my4(Z}Uh(!A()BHLr6V}IaBb4iABk3_&MT7`CKlkk?7&{r@H2l#KW zRv{G|-RXJ)9VcFIa%CCU>wP5K{O4kkmaYYTqZwTXC#dvT&TTsewsn9j(4DncQD97hw^Xo~(3gSz~yce!LFrsb4&v|*7L>cMB z59A%EuG(_kCR$sdrTT0h+JX}P=-j3hWEaUZ+Kc8Zh5!%BVMI*pKbPn^MU14g5#^*& z;%uM&aw3vTs+tk?K`|mQFs(zwNk%6XLValA1_;+liq_a;GI4tNeFF72;!kOG;>oFc znt~0iJ+Z$~@*Ob_m78ozx|<6>Z$J%k7H^BY;Bij>VbaB&H_ko~XcS|baqDX{r}c&{ zavu-ty!^19uSqjzF~sb952`|6Zau=#}e zIBLpzC%gJ&`s|0bvfN3TZa07AF^QKJ&HwT?%tlmRT((4O+Qh@Y(RUgWeIiqc%pA+N zzbd`kruuCjWOk`}XoI456EFE%RMm!7z@R9WXx3Zyj%)P$1-Xxf2ZZl5vBA zCnN;*`*?PQhni9O&Wl|6^DW7yq$x7#b#mKmP9(}*I5^SenUZUpB(g5EhavVA+E#JV z6{0o44K0y7HYiU0u(=E;N_^|QYKLQz_nE;fyy_Rc;9R)*2S+1n$w>U@g-5PA&kwMt zBZmC5b2<~0V$fvZ)njGF9LpYQc;@hr(6!$d)f>@DO)y+_M_OT8$c; z!JJQnu>Fp>G1m=m)@Yoq;(AOg;6#}$#ITioLVO^pm&JU-R)`!!aX#TfuXTMwS+*=! z62q+Ne2ypP&Udujjx)A0z>^v6#5~uL^R`;QG)*Y8&Bnb9o4D*f+^r`2ByOS~7F>`S zezBWS*ex!1-BI~2JDc?PtxDQoI7@nfPqwBZ|0v)U3C_nR+?3*mw#X?E zc$}P)aA0-e?ANmxnzIs;I$<{CIM9c(dJng5Q+-Ci%Y5fuO00MC^j%Y!BG8;3GvY7W z+cw<#+A}4&`Y7}bb7HX{*Q$J8%O9~(ObR;A>ODPM)G#EBhi9m>`FQz~;&wOP;*zuO z&tPZ!V^O>wTB3&>hh*)Ak_WlY+X|rYLwcL>LH(vdzQs8&j!1JT;8NZjC2gm(QSNbm zgpPK-XQ8`AGj>9s5%D!Vn&cr!O2VDy(RM6yN(5d)uN^8kjVQf(UXVvuWwSO?e&wFi zkTvD=76P4YR`ba2bu)*wZ!T|zKGVzS4P_yzan>DHmG{<9bSx>fD(+ z_f?NZZ)uVdsNq4+&h4A5i}aJjNbS--M>Evfkz5-wmi8HKnS(*@xEtsoi@!)af69&V z&>i{I_op^#C#hH_UH>Y9!S*`2C*A>j0d`tD>=qO^eSwu;TCbirYYtt!zrXYy%+Dr! zH}X*e9kG1k85{qJMOV*Vp1}}?a{UzS4n8J9BiG?P2OxeH&rmY%TLf?3B7}y3ie94e zqJeEJEYIAaWAGwR%BSSbA-?m+_FjfP0*md(-v@TG z^FqhPk1Ks9@pN@zsU?1pfD-N+0>oKx3LtDj=qDh`S(8`Z1?1Zy<%y*rYiAMEMAn5{ zPHYWS_>tsuOHKGup`sP+fDrc}leb0~Urq{CNs@6ZhaMp8sNQULP+pAJ+Ob9l32!|% zXICR`U*=BPTes%X5jWwvPTrjjF&u8w#s;D7Lz0qUO-hnGTMMy2_t1Fq$#>h71eLWU zgzlyD$nSOSS}Pl*=itFCq;$HhS*~S5-?hdMfIIn}&D=vS`gxo7{uY1uz%TrDOXDw} z^;p}Mh(G`MkN@i}SN~$$9bdforN_SV&flGiy7czU?n)f@_2{E?8O5R%_pi9D{BT?z zTcMhA^=1G1VGor>bt>p~ZDU;Qu0(4YWQgng;$nX#vKwooo=Q}%J>09S$+&!!?~NLc z@B8%K=hxMX6jV{Ys5_dkw%)(1uQOw*eslk2an&HVpvAF88a$on_Xl=Z< zu(qpfg=Sx|HrD@w{&y976RrQVmx9`$BoFux>CeYyg+{#eAu9LsaMYSyskfijG%lYlo$D)|GXVMoP5EqbXid~pC=P?0 zQvJEX(z$Mh!q16KO6R&(l+N`=g+l2ZT|`|zOXpT=s$$U@>_r%`(BHeFsCoOq4>;-T z)l!}-S8D=J%X=31OZ695Rl39>FP7?GD%HO{U>AR1s(-CuL)E{*P!I?Ht3J2Vk#A*H zK3OOqDR1_|rt+r#-mY@>`{m8$BkOy+jS)9l8{H~gR;qq6E^k^9iByAyl`weqOGa=P zkxha>9)j^{2yMN?hGe88Hl99x&hXtMOcaZ-x9EMOeB{c(Lcz)HOwyqGhIqw*wHO?P ze;zh|Ft&gljyMoURt?5o8=}Dt5r6vztYP_x@Fz%x5OHFp8H>fCL7P!9e$7x&KGIsT z`4fX(T|l`Z-jF~P7;uAzHBQ`6SToR-8Kb-z(wGo1wXbw#uez%U62-Jmmuk&9^SN?w zk0@GRUrsS?WPMeix>4-yhCYT$VJAWA5fQZ@wvZe9T1Zi zjn2|7DG5r|FDHxd7Zu9Y7xhmgcl8;HiXv#iDDx$21qE(IJqz}~ArPJo)qN7cwb9_(nDto~ zo8U)Gz>q((%h$u@>#LallEC_2T$b|mZxkLS5uHAlOf6TxqigH^i_rTQE>Z9H*(ksA z-cr^!%2Dh4s})G!AJHCCGLdNWM{!kgxJRGEJ;?2_l!El9h*2zd59lMgC|n`JG&ER~ zBI_EEsqiiuPyAifmsmLEZOyH!KIHNpDJFyOw+`2#1inKC-*4^K@9frakKYn-Ecs!K_wKztoIDBgh4$OjSXUOV@ozI4Rdwmue-)My-%wrO;Oq5U-YN{cvWj)L-e2 z%k>`)^+}(`<)(4&j-y9`*DVhI{&??}mG%^9N{nW)-Wb3BupRg+9rv2vKl- z@f%TOh2KDHmFhpX;kv_c-BQgOuCFK(yn#X+kV=*!7VgVuyPQMHn}!CARZ6wt@>a=) zAYBbmNRODJ`dXu4Aogi>#>>FARf0J*)Z06Z7>b)Wsk2L+MzaBpb?R>jP;BHIY65mJ zA1jT3-mY&zn5KgveppQ(797Kkp^%N*uz@w0fORQ=b;-aQ9O&(a3;6G%E#mZuGlq+6 zY@%UNZ+kK+ z!d{d*S{Zd=VBZ|n2k1OZ6eclw2+7STHONt(MwMyeCZ{ zONkv;H*ByNL$KB>AM5Qa*G2_~jDG2yddq%|$@i*oU4I%Ou8rzSsM0Ghh{AK ztg)AdR8hvayL{F?gD&j*5WFo|#pV(>SzY5#8ac6f0+M8)tKo&6TZX)D8TrkJ*f*P0RA#VLX_b3;7 zTxx6Q5)b^WzQx+5+Ow-K$0V6+-u$&Pk}mwE|Lez=TN|0vp+W-ei~Z3GnSvp)U-t?P z1=s7#OH!A8qN-`J-9d}(Mzc%Uz9W&`pr2}!7KFWT5BG1^3PY#8p>nT@z}*?%zuS5p z2n`NcgF~4Hhd|d+{EI<%j)&GpD+R1{r{qd*FVbm@(hB$7e7D_ef%T zw91u$R((sXsL$aZQ@JxfKf5hA2^US7%&hAbvA$5MzTp2PkI(lManZGNaFomk@a7HL z3*qvDT|N~qpMvccHVQ_xf+?8iioHEpf8nQGf2LSKn~b4T^o2`N{{j+Ls(rOzLRBah zg3I((^TppS*S>~@76#sxCN=^*Z@?E_9m+JwTs{v;Yu`X*7Pe{j^1_I4Zz@-I{bRko z<@yU!#M1PVogs%t1At(5uvEGpC=T@upo?X`i_!q*iO87|!)o6(h;pjGgh2s)8*uUM z5~J{%yBtyp4%k}ljr))sZ=$}X`d6%<&$lvDwl#dkNc2^!hH#-^H^15!v4JZsjP_zH zWJ=aZa4|b-$0xJ$ZMLT-U**+--mYPGg8FZScy)yowl0#bM)hSZ2{-jwyP(MpEvnEz zc<(-LI%kJgRaDD4A+}grI9OV^4{}uB7NBxyBw)oM(GOn=YE<7cntTVE)V^bc`?@X3 z4cOO>alRQC=bOgQrG*Eq`L%|MR}u`kU+{``_*UrfEgSJ4G9&(jl#_f;X?5g0S!Hd# zt+KWrVCt_mYK!cpYU_&{R9~gqE5?*IXljs?ro$+a2x9H4*^tM<10R^{5; z<=UWpD=!$u2FtP)^`Dh%|G^x#+FRw?Z`57a>Mb%1DL_&mk!E{aPQW`?b=XzvuDEqW z9L9ae)w9{n@@bpoEi(h}lr?(wWko(T2j$wE&L6e6WO2ne3#TOvx-qQT=~w@eR-{T5 z?DF++`MM-t;0&5ysPDjwubDScn?WbnaN5?gnT5hG9U^BvAo(J z!$lHOdD-op-8X{&Vo(@Kb*GrsSo25r`MNdvRe<4jmj{8^g}>rnq2$^OmYln2n5a-Z z+-06{?M2OHEcxrelD~$Y_1~83{gSuR!gEID`W372XX~rW^-{UkgDNZ4^{l2>u#(f;J2^YSsWtHk1 zVZQoCX@!Nqk8Lu!>Sg&}!iH6q7QTk?DtMx*(!w{2AO~PzSlu-F`WF)g*RlU%!to~; zj@p4lKh+M1!lnA3fJ*K~^)(Sp>-sjRSqS@=g>L#T1eIojwa|yg6(!~Kc?dyjP4PDZ z5^{bOPmFtIPR*yq(KAt9SXExo20{`=rnn+0cK%VGU$Pds^qmB;DzntdfPXzwPRRkPDlQY^Hh_Huo!J;b=DdWC&mFtJWfKEDRL6 z3X3Ziny$1zYLH9Y@vid1PN#)}0`k|BO`7P_C#Ec&D{7OLUic2KagUqng+i&==+eTE z*LMgQm|9wiCz=dAfd8Jb0nRsj5p}NGdUs{kyGstMwm7x#tk%9=E#4?C{JgaA=75?f z%Y_42wu~(9(z^w*g1mX6!J<_4Wq~ahfsaz{tL54%IACG-<-NLJQ#8Bwrv00TS#`Hx z-j6Cu3%?93@TRlCn+S=_YRwAPu}@A4`i<=e+xIZT7H!=Y_7=5@FJ~t%FWl|kgS?9U zcrr%Dp(2~#FJ&9Dxo+xd!7KHFfpJ^t?E$T?g*x~E=9Fj@ht_MODzn%+OtE0-J)rtz zE4m;}0Cvi?XG}1j>NBUQys+Oa$WuLov7CK54jZC%=09m>wROlf+OJUN6f^P(uH*g{fBc0z9@T6-b*_zULaFB~h?52Cg8 zDRs7R%+%MT;ZkmX@QyAegNk|@9nl&Ot;U&55?;NeU4Gw?3|-RVOkyDx&KT70g}W@y z*bu?HUYNhKw{O^juE9%nuT_UFMA$U;yHfi2*0zbQeYv5mzHD{_W6)h*cn0jDM!O0t zy5vHb)fA12lrfr=*`m}&gB18nxf+jKAh-;ljahEW~yAX@!sooY4Un+i_q>*xB?U6D+i!7>LQRw!sP6|Jl>{XxD*!bknN}#3ERag~i)tZZ& z#!p^k@!o^dn|?c)ho%adO5<9!d(Rf9)mA%=)2^xLENHDq#?!sHfXl-Bi>rEdj8Q2c zm0PTTn(H^BXIWhCyry?0SBHj7KB_-9e3Xe|i2DyY zZ3Ec56FISfH@BV0_AjTDtZrofv31{WItJ- ztFB>qRn=$0@G}a>)3-y%mM-(z{ueetF}f|?@u{_7wffBghsku0N5`sbWx}u`Z|blF zT(ha}vop`{$R?OjTLeaToCPdyZtWG0k!z#_>8AeLeLyUtAv!`x`ampBr`9A2K|Sog zA}(tqxgZidnJV0zEF6K^6vX~Y*;epYsrFI>n;Zd4ib-@2}MwI=|9I+MxQHrq(}Ey!1?uV!g~{O%oveP|R8;KvZ9A03o|l|Miuus&>2c za=C`*tLC)>jG7R}_QF;f7IL65M(seU{x7CPYq!&@wpX7iiW9^1r;po0r1ultr3+}Z zZ44=}7P=FxFLYmqmZ;HF{~C?MZ8AOz?1KpfasO={W|GRHZGd}za;D|%%NW&8$tl#1 ztucmHh*PQKt}xnWxtq!Ei}*zC+j1hcwNgrnHedrQwY_3o5@k4s>f-owEs>M8I>69Y zbO^?)oe@CRw|S~C$1eG7?1+Ykwp#NG?73VGWOiWMW(~KQq?9Wc4p>Y?>rrT1b5=Po ze5J9nFxQbCHpMe8f0!EN5N^1nD1L3HE*e6Vc6O?>w@BIs&bgG5=u&CnXa=04VaB6o zifhkglz+H&Yz@kw_DnjFGsnWCp~bjy|4U)N@lvQiW3E%}8G*dpl)jWi{o2MjYbEBU zLF(5gp`Ys83G3Fc1$JxhuzSyiV1!hNq)aDuaD^1gnNsjUy%Wghug3w?VMX<#p~}C( zpI@i?CzTdIe6ThFZx>U%T`VoUkipvvhLgJT6cRNYX1-`Q7EZO@c&YCn|LWL-SM2=N zbA?}b6@JrI_&>V}|5sPxw_Sy|y9)oYtMJcVh2M1*-svj*r>?^P-BtL1y1G|K15tOR z-;}<8kMba=^q03O@tc+WCMK^S@aK!j$g8OAzo|E?GRdZ-p^{ZSXZOgrDXJ~e z$H*OJAkw~h5$<+nscwz_yG_w2^>fI#Mz=?sqtED9nU6&u*UisG4@b8}pN;-nKXqDB zvRWJ|g+#}>aeq9}P1;^}%twI_uDkpA804d(kGr?)m!5X%w^v5>ZtGE%M^wJq-rGB( zr&w>&6TG9UyIFVkSZR++qtP7#Xs>E^>FN%(-WF+sLad!rROpHdpNhKqrRepfWRpI5 zivZ<;Kz|tKhN%3AUZBB>$+Gm9x2z-85VTy-YC|e_x1Rcoy4UfcjI(HPla~9JHrB%$ z{*zJPCN-w;=}{p)ycl-*Kfk+c`Q7doXer&^L&t;a$YY$mYHluCb+717EGj zgl2h2-^aBue+e*j9f|%zbx%g0TCB-~YJ#*or*B@YDd<3zFar-@_$*qzXSHAvJb&g5ucZ=PTzFTEbw#uY%C)5BnZ4QeL z$n)cx@rYVeo=E0s9s@J!KMdVGPCm1g;b(vHtziUs1^pd)&qR<9f8PG`0xO;g|!chOh$De4|qpBkm zu2|_KTg;2OnPtL_^iWaYvS!UEljdKc&(GAS`UO6o=i>!+7^mrTTzy?vPjU4nKEBMy5Bc~BHw`Zq z_Wc%hKj-63Fycq+OvSO=pz7;C;^XxJRq2>Z`=TKlD~(Bq&wRYC@oHbCR9VdcjdNzI zgd@4YDpeV!wrNdc6!WrKSoOOM!1C)c9}u}dOzR(0y4Ii)mbCk%Gl!rs3sHH4$&Vjt z|0*9BE#RWcC=C&YaW28}i)bA6R3&ME0 z_T7LLWm_B9Cg*^h5Ok>7td7-huh5`6qp+}!&J3vgi6*yQJ?vcjSu#{6aBla%r%*rl zf2xn_FEuq?h`fipN41(H6i&N;Vo9QzHl0bKkie?|)gMErLp1%hnB|bw5D!mo4fi;x zJqD@*%r?BBsJ^B?^;KX;!%HmmuW|1Z_tt|~rXDVWa+T8L(}1WnsWjn=5H@zy=*Ub! z?biP>M%nZ;7b2e@Dmf@$v8VQT?smwU88-ztd$B zDdO^VebgK5q)ePJhw^T?Wg6-CHiSissQYO`08eyLP3=EWeaXbIk^4dYC-kAb5Z(MI zE;om9oRGic#uePSJ=~}ru#%8bJHU;*`Jl8AQ95Lp(4$M#tm0!GlcsSK8hxAkPc(qB zv;nF%mDN-nA;j4UCg}jQKgG?hCcfcjvCw=On5hw22^Es|B-X-6XBg@B1_s|W{ds}P zy?hwQS84c+K6C={AT2}pgm}Lvod4~N;yV|sxK!P6hs6IES zFNOAW^_&JKz2~{2Qj0cg!4Ip$VEKq*4PrkotgP^bmj@~ZCVNp$6mg0Lmj-!NmR9X` z8u+wAN4nO79>wH1tE>#K@@8#gqj-g&DLv{5HPyG2&>@0-N0vtx%EQ2akR7%Gm98Al zyEuul*m0<^^D$Co)KU*ODTJ&v?!LZ3Jzk(RQd{79e@;L)8jSGhjn<*h@~HtT&R9(C zRV6fYjPjPACD6&9Mxa8h$s-2(>?K?(jk-F(X|X%*Rljea{zS=7tyA@<47{6`sRn|#0qGZx@4BlI+{c9_%R6)saoO!6Eaiqcd60eZd zq36`9?-W!33T0`CW~%UH`CcAlT&e%PT8oA(uB<3myZSCfQ7*T#w@bA#vr>5zxk{# z%GIxslT6~Uj;!AHa%m8@Q*MdTR59J8Md?vhuTDaIf=v-RK~yLWuCC}T_to-vL2235 zx5IISTG+KiI%p(48V*D*29^=$gA)i2n^^M3KXA@WgpY}^1E7db@oIMxF$LeLA|>;>c1+QzsC zl2$KjOe66{D64CdBGgA7Vx*^T3<-}m*ig+?ucs$^;R>|{0e#{rF`_B?iNB`j zS)4OzDte$CU(@k`3d+Mna5>1+pxKMpT+wpJQn{3kon#N`6efLEz-MEY0R=^UB%ja6 zd~Gn9J52K0$AbRnY*{CPFUfU5k|O0lf)QmJt_j$&PVy(=3+`o5_^M&!g3_bqiDx<& zm8+h#7LHU>5)3NkH8YhIh6WP|>_Sr)vK2^jLC@qlW$7n%NZl$QMxv#Pa%KpxDXh~| zVwf$Pi&5nCW-EW7101i+j?O_1qc;!uZcEh^N$(enMeVJWf*3;xr zaJ#zGCTj>=DTWLxRfA}y(w~?|D`O-Z=uoXMW}SUif7Gw;LV`F6giv@{W<j?^5f#r8S_blz%O)n2uOMWwDL2k%Ii zNG^4c%4HT~i9$&fN}77LTF8?y4xJRvQ73V^--}lYt*1oF8;Djcy&@G)G7q{wMDAXXTU0fgR1 z{BBhhdvu|vU-Zwpihcf!#)DMLDdqEdRg}jyOpjf@u+m0wSC1ZY)cx+NRO=j(jRnDNQb5@0J=0Pmcwf;iz&_a;3E!yTCe!1xoN((-%)uq4c< zGA&#*xKgdjCHicIC@NKG!@Bxn-sjV0T!6S^!YiRS#yf4KO5s{=z*!}xwGfSW+%2B7&|_0CM}5?OSfzvNehZ;;6?iygose-Y6PJ<>aFBkmfpUb4Ah4IJ%*+jx8F0 z%f6}cL(`|H<`0fdjh&pBy?*!T`1pa-bMq5Z6SKFDKk~?p`YE?K+P*}m`zI!+pP0z@ zyD5r9jFBb!X|hAJ6OWy~z*M`U=+kkuZHX>-P0a6`$<8DyETfx4m`=7$*lPz+{Bd$} zVru@5bB{d+GBnx2iMcsp1^{5NB&F_|CnmaZ2c&49F(5_`N(;b?fJ|U6XJ2pRN+89LNEM{uwg!WEBJkySXvRz!- zJKjHWV&e1@6XT7J+qO#nZ;hjy7bR6=c?lynu(NIJQp-F%F~8@`X{nOK^Rp9UldN(Z zI%jtr-IOz@0q4zKnOH?*&K*&7Adc=@ZfBE)@rm(6V^5x$9veR}F?DkORAVsVZ8VN{ zFL$tmV{?y-ss3Uj)l@=2yZkpW-?o+n49MO9LK>@G1viEWn2-*((M%-8C^!j+%t%+x z%}rG1Pfb+D(7Kh$iTP90<1&%WbZv4YvKk^GYMcIDX7@v5vvU*wYHoU}v7YTa9+gNp z6KSd0@06sMDs)ZjXc{5WO_|P8wYSC5EsHE6n7fWv67X+~qpdmp;dS%OB=6@^KEg0A zGOM}5<`5eSP0QHq4eCp<7C~C){!OL{O|>ita#pZi%IeNI8qHaE3PGm7Biq1v6Z6x0Metp5bVtrK2h9PW+alhcJ~w+};?C1&Cg!{{aEm5I zHA}55W1PeDWAmp^bQpyyhS{NU7D0S~M@t!F~No}$wHRPNT(uNe65601b?|DeH zN8*dh`F&_?{=}*A>65V3j*i^G#;>uM>v!LJ;*m#^t@55TV{>!cwyD?kyLXGcNt@NF(4E|kqSNpGZ~vJK;u25j|D*r0D|+;&WX`642GgRI?mxWu@E=~f z^8fgF|KJ_})BisAPhaSI=V9jCbIY;D`i@Ny&p17OY;N{MTH6%rI5vI!^T(1f#IdP~ z`JFdz&uO`3X8d^cp9NX?v;Ln|u7s=R?*Z;L{%D&syZ6kQgJY+sqRF`v3NlP=89$>p zBio<AiH-HV$FwEK`jaXO!|6$oijsjD?MX|l^|!r~Iy<7YVTU4QCIbIe^`0G{6ZdCzu^~lD#A2R0FWq7YBIm* zao$=yZnNB@>v`Q}EhIWKGY|0B#*!EdZ&_?!Al7(KG9oyAz}n8)BO1^} z!9v|%t3Cm*dsW9<$iweIrS#Y*xcm_xIHZz1SkRon%^X`5IZelFevW|qJQ~FRoAe(# zJs4f3_N|HGDb(#SZ_yju`JJvgjnE9$7U9Hxoj~J)omegT(N9v%!QPDU;m@*=sV)81 zR#%B$R=@T+D}s5eo*CkoV!R~hLJ#%;d-nMlW(v3@#T{C9!u#^p;JEY$EZ{+YO(VsO z{H-RMfP0;j>KA!(mnfKq@-P03xSJG%#GpkkDCG65n&n!s7APJBJm<%R^M9#Lr&@h7lGt97H z8yrM(02>?IVB>6@v(EviGfpx-`y60xobH^%Ifv!_{;GP?u5`XP{Qvurx~iV%si&T* zdaCNFILDuPm*Y8(XaHJ4m}4dLUi zL0E7muZi3(GQj6gRcqCY02tYj(a90GzL#(l=&9-@&yFE9#f8j{NN$-&cPP-Fzfk4M zpJa2Ll=Jwk|Mx#D-TEE~S;D1?bEVVWa01u$8Unk1!$2KpXkX7c5cZ^# z_qHu@oMpM7yiYhOBEumt-*_(oD*#xao_Bc5rj%_*S9i!wVeLN zeM#7#9FF>D3j)Svcs@8$wD}!a>@N0Zmn;R5-L5ZD9g5veURf#L0!LAl|O#lG!xh5WU zopDxE%*4)nZn!^^lmpjWjjhggT^sL)|J;SinJ(jhZzylDKvT6zP@uj zMXtZv)1jT%L4)ZF564?Of=_&;0d8*tkLmz#Zv&6+0Pko6kLds@+l1$_9pGJU;Bg(` z-EH9U9pFpaz-M%TFKq))=m1~V2A+2Z)*_ zz)L#7Lc2UK?Eq1$gz}jk;49md&uRgu8L#}NKJivyA-zOYyBy#2U<=Xw1HRedcGn4N z&lU{>R+Iqm5b#O?=_I1A*bC;wzH?`>@7h)Dg>z!xy|dUa*;Qk~8e? zT=M*!*e~B%?0a?>5Cg7ClPx_G7ai;wIMt=}* z-)K_>Um9(y1aVXpILZ@_gu_uPL>}7Lb?6n$pBr9Hq6{o6!7;Fm$w@WFKjYkt;rO#Ye9A$Q2*C;v-jlXUw zSJk%RzoB3e@wEg-&I+%?31)*=NExojAHpaKQ+!G%yWZH?c^8d8MKV6V3okwIG3=g{ zLjh_q&39pPso=cFM1G+g80XUS&VQ^_a=oIjkufmwUP8Qpcy6V?dR|)~pU@TUkXLZ; z*jn5Yz8%tB?Kw!)A8m2{AUqVnK&G%d%miEfJGO4VeLFQW=myzB_KvOL4G^ZYab39~ zyg3)`37=q#p&IhtAnzCQM6-l>-%v(D0MY6P(nb$GXB7F;Mm~4A1ja&^%E(MDvfq+Qtrff#sqY_$@g)JRhZ5&>YOa-?@o(woC)!>;)hy1A?;O?vad zlbNA1_8gSj)J<<0C$b=hEy!TDue93r3Z_&G1TY<20bk*_y51VMSlStvH3J>mKFnup zhhIRtSZs6Z*6Xd?J1Xvy5+#8+tMK`S)t(>q6$;exxSPJ)3+`SM1Vt*(E#v~|)&%LG zxMfR8R#=)ytG~0P^hU{aQ%7G2b#w{Ih!!`fEVuLwnZv^or6YBgfke44qraiB9IVQ` zq`SStDQ*%i7cC58*ys9PV^al_LA-)s<)<@DE`lINNpg?7CG~l(vjl!-Hs$P(QL1F( zY4DV7cr$Kzgh^9%jrxi(@0OL3iCiUJxE(8FS;;G`&iRE^f#+`yR<(hZzz^2AZpk-9 z{jQfT_*QpIQ?9qw-x|`8B2)IRLkHo|CFd7AZsRYs)y0n2_?vP4#$Sz_YW&@};Vnqf z__OgZY5WN{s4K**1X~rIjutyN3J^X|*?_P5XN*402@QX@&+_+-i}7z<%eT+?mo%7= z!B-*67rhW)0lN75&J=tZDU8nC->wIW$2Pn|f7BnO-Sl0Ly}GRczqW1A#$|Xhao^h$ zmm2M3MquOK{mh=Ybf@w2RWZk_Vl*8(4v(!f<<)oSK^(>_!}s%TzTSzb%9C9|G`Udn zPV9*452Oa8m2Qy9#d?SgkZiew~;mH%Us zpElg*tR?Pn61P*)wL2-NToB)d8J%Femi)n~mYUgctSIUV)QCJN9-mg;o7th|Qdf@8jdfui`s6vuwy` zK#X5aV8$`3;;;UCP@@gzZpfArdv3ima6gm6BR94q%8g#0A&}gGN?sPu&6J3v(i8*&7XSs1KMeXAEd_I_yJ-S z7 zq#C2r>hQxRdD@7&Tcc;k;1*RDj0gt?+h~q`m4kw9G^M_Y{_@`GK`(v?Hsvudek1Nc zW;lG4!Xqhqhd1L3-@@mlQi|GstMT2cEN^UQnO^E`z$>ngn#OO(Yuf6Oq&t$-!F=M- z_u_XzN;9GS)3Z+J2Dm2J__W9Y~j8(RmDvEL;gfD@ufx*k1W^Xs&(07hr{|^bI7$A^e6EL@_s&*4}x^2_Ag2y zJ(HiT{*)|KO+G#@>GHC5?R+hAUi+w%UrA7H??CdtjJ((0Kr7H3Vvr_K@PfKrv;M?b z9)1EIEQ4K#!=&LMHJDH059!gP(u0)irwA?V3m?JRT)b>c;yo*I&#ZkKgwf?m(xc1F zkH05PV=C4@141c?K`vnwY#E=v=M~OnXPL!Eq@%Ca*vLp`{%W6vc*09+H@pIZ_;UjJ zfK>lopcEi!NEc{<$fSzhFwuR!2i9bmvfa%BJhQ=@mFs_nWMWzvt+|=8E#=U6bjwv; z=NiqI>V;Q!gsUED;YPv^JXJl(!i|_6_yWKBOp7qGb|F&Lnnf6a+lc0(UV-1z5m*>2 zul`U2+(D5R?FY5s)|ASNjsKov)nN=Q!v~(mpDKZuK_O55Ek7 z?PnC1ex~|j!0}fEp6WE2vQ_2b*+BYV`zoK15jXNf#<<8P(+sgaz4&Y3a&DCcmxRq3 z9X9(|HerECrX>w9LvD#tS>&0*GBVk<@WE(d)?bq@+61zh&4bxs)h`P+=vG-+Nz!;u zCyk`t%7_b#t#pR4*8EPg;lD}9?z9KH(k`d-sft&WRW}qwi}OK8ggi5xp@4R}>ZdI! zOg{Xsvi6;0Te|cOl9@27G%w zAhEeL`(fxzLb6ES-wt{4zmrl$6A(B47T*8k$lq3E@*;iPl;r83$??%Sa+C*L-&ij3 zci`rhE}O%EDV3j~{_oTIE=k0Xn{+fj9*4|h()r==34ko6e7-H62-oLWb@Ldn+(=M_G2+l}?#{x9=X9KWUkNyUpAU8*~{Jtwe-B z09pD;hw6tNsvWn%z^po38zaBtvKGLNf2eo`)8D3OyW`}e_HLxg1%6`*A_b{NK@N*+ zMchsT9WjEs2vLr|w9^dgiUeq(*V3M#uK0lVZiBEgenj#N6Yo(u{1|_Tp%FEQpfuK- zEv0v~uoKh57#bqIw*_ti-ZvM3wg$DIh%IAwM3fKoP=t&ZQGYuAPbiA}rqkha!ll~J z2;RW-{O7pwFZgJ#ZUVpT4*aS+@ayitZ@L4&RbZtX|4#0D%gFQN|5EV6cJTKELps_h zr1!+6OcMN~s9J$PbqD^ez+*{uRL0$~i7J!}Zu}PzJ9cYTuu&T7x7w*Ltq9!%u^*xr zLFpcU_$0G3?#6#5YI!IL{EYx|PHOs7V6Ndg6X-dN^KSfi;aCm0RcX@lg7_amiv2U` z8E3w%IQ3M#_#9!b{r>&aTV zn@v~h)_!rE&6`_k2M&Y3*1i(?joqCKl4iwJokbv8abyf{CeB{W8bxj}T9J)emB1LI zYfon;m^5n+9aK_XQ8L?VrW{+a!D>HYm)`vcpM4()0L6HEK3Du>vp0NOq!|r;LI_>L?u0$j(^PP*4Yftq7AEc$Qz}6U{ z!3A}FS@Uy4>Yr5;6RwOm_h!t9={9odIFJ+z++v)@6ElC!l~;7(X?q`1+haPGiD!&2!lZ{*`7x6-(qsB%)5G{|r`N%g-p7<4_E;{)2D9n8 z4vZY^%Dmgz+B8k1ve?}bVVc-(@<}P&A}_=i%3<;NA^lLUB4xbli7*e+MF>`F3m(Po{ab6rc*c{vaSRXdd_IYtCy>VE-p&C)-#XeoA zA|-2|z4}p_Y1&@*ohrXk=!!K;EjO*oPEhX>YPmtN=#ZOMxy$|w%zDILDqlMKn^;v! z)^1ipl^fS;m07oA;k3ZYlUW8E$PA{3{9WNHgIbo)#$zyGRmTJX#N!HQDxVJG-SCx; zF>9%=S-A5;R$hYAm2@#piolO|hayUalEIDl5V^HAkkhQKcg4*q(v%|YX(LVG1W6>> zC%cNXkK)i*DxtmphjI2*95xdbXYV<2PCzy+GRiS9O`nyJ2T-|O&^4GFEls;-aiL^- z?Z9;5Y%iE9ZNb!&yD?Ikxsg3z#Ec~0VYTDbUR9~sMLF5}!X%4s4@>6uVE-?vz#ajY9-1dq@#|s3l`NP zg3RuQ!&j(UPj?w`yy3#|aCnn)WJ|})&DWA{!IoL|NQ{h<;})u?;b{?v&m~5o_8j$^ zH}KI)oonRovbl23?q!z9kV^d%b(HLtB=z8XZhS4dZtXvL!9Ihmns{4^o8z)1wE`(F zc3ZOFk;G-=swb|Wgaf;m)t@eB-5}k~=1RAmZ_>y3aRuIPJf##0w=;0}*|pMxI(fDU zH&?f*s~3>>cpswVnrm9npveI0$1G>&;#ES~J)tw?-gg$1CiMZSRJ!q10=u zML9O^)z;wY=O9fqlF8o3n8@;VxSx1EjnAZxlw>n^Y+d~WJ963D)ry>LbG~y1>Cn%T zPNq-@8EGPRH+oCOp45pZ-E4dS5yx_CGFsbbv2tMxG&tpJNzx=2tokPCjOAtK{zsFB z{@n6`&8I1|YhmLy=`yTQNne8L{b{M%IxrK{!sz%|R2YApc;Tz1XkFUMUg{eJ0;hUa z+bk;&*FL+ykc*b%qNw`2Ytvc%+MII7bztzavst)oLdmA$KG_7e-`A>_P%Y{0>f;SE zxX&)Nv(;d#FnpuZdeAj?z0nuX)I`BEnn4~CbHEgQ=?1Utdv~x3ZVdtUf#L(n)sk5k zv#r>Yc{ik^GtAe%n6ydyL7zR(+2Bhmhl7Zrb8S)So9@`Yt5fdSx>b|z*dg*Av1-^I zyFk86wIhdr%NVEIz$Wg#TkM((BcJ(OX7qESP`!zavJO{$u5m}IFEsAb>Yc_Nt-f6D zv(p3|M_^?GOV#RABYLfYpuG4m04V3#=}- zY3utl%ID$2A0dnyRf73!FGdY0!F;Y4qehfqnBfJrBgO3~aZ{U0FkcYnXkm^KMhaMZ zbfM#!jf>fW`qTJWFok_wk2Ms39$b~}GgI(ZXI$R~yq$Ac&8p@6__MBdXA5isYM(r0 z#A5Af8T*SzQaco%8Jk~4(c7`vPqwhVu3clDgN&Aj$04Q`+>XZ$>CvNsnGC@b2tJ-^ zt>aEP3lFwOP-WMWU5C10{Rhp9EbAcQk! z7c^W(Idw5Nr8D;p29=@gjsp76;*JgogZVe7c}#D3HQB zADlESvxS(VX1}VucM$)Xv4(ziGc=V&HdtJfx8aVZD1&gbzNzZ<^cPpOCE;LH%yM<$SiGr2T7 z>EXq2d7SMg%x;KSS=@MzozH3Kb8v-oIO@VaTE;o|QaiUgqWT3`hL;e}?x>K9{gsPL zf#9cB{rH*IkG&$9k?@^7{N_3~e4{fyy$e7XFGHrxLA*#;T@3o^%7$luiRTo7N0 zzZUa}ui_J4txuH?2_Gy*HS6Ed<;Sp3;HJKj&)6_y%fo9F+a$3~zH9aQxKcq`ZIJ3$ zO;^%EcpWZVmQ&45;&(kE{D;VowPV(1eFv2JtNu_$^hsESpVCK6&CZHj!z#)Z!;}o9 zM}TUmsV+>hZP$eIzV=2)9x~gbj4d*=9Tpq1vYiH*%b z{8e?BH-W89^O;s{C72z;+$_v3!l>>N%-4i@t}xFNMm3pW9uwyI!rUs1>NUZ9U6|X1 zd4Vvh1zTw#xQ0VATT@d@TwwtwvbGh{;W>d1~C( z{_st>yU}JXh7rK8yBQNHXU$ow1@HR!%-MWt;Ty|#;40oUr<)9GWODxLg z+XQQ`z+YQ~oYNv}>NB=5UJIbR1-HhE)y|>UwAMgeV;?i5<_%+=d6=8@Vs~~4A}z~= z-;j#FlC!xF=p74I6S6182j%fpV4Uk+=nAMVt+4L~rnFW(}^TCE3 z8~e4;sz0XVb)0c$={jeD`ry&eh~5AjK{{g zhgMKoZelU61>sx3Bn07GMLyV+{>N{_U)c98wypT)Zp#0L-V|JO0+Hin#tq*Nw;naJ zy1B@y9Bg%HeIfh`#lXz*n>hBI*;(Y9el0&&^~1*?8OW3~Zv1^R%c_L38^1$oR4goW zUd5f+&B7lBZt~>D@0=?}VpC0Os%hbKt5?+Ww=w?;d>xD_*PJX$=CKG20_t$!}o$JM?w5J z`3>JkAbdZcAf6!{e?Z|6n(%j9_%0SByJGR7|DJ`_%VHO&(GI7{j@*TV3)o~RO6$xG zeN587m>tnGXaYgWW0xuXFe%zD2YWKT*fl1SF6&UP%d(~?vqh`|ESk>LM#{}Bvwf>Y ztEwN*l!LT2g3uS8A99_;oP{UrIF|f-IGZkN^-n41yTBOL=F4T2t4kWU94~Lp(X>Xu z94%ZxP1%z=W8p_gTFZnMm?vbG63l!vN|{M2=P5!i+5{Y=s2b70-H-KQYca@JyRR~6YTQj!qxv>+`V_Hx^Pw2wPx+9v zW%MHgUi=7@L+R*b?k0U&-i+m4{R?cW%L3=B#hLIkAht_Ss=EO&VgmgvP_t~Zi`3xw zIY=rG%`8})o-I6tPT9>Fd)&Qpe3FvX->_KGrL6|nEsCi8PIB{U=jF}D4qde>Qy#f_ z{D0D29={+kGmsB-D8M#&6W1*NEZuCz4T?_VMyn~c+EI3KwyPa=i)M$Lk(oy7UV|0E7}alZMC-gE+!j)0`I@BDP;#4+jYD$X+QX6!-! zHjz%PK<#Ls`(WlFbNk3z5hUk88XL7ZxR`*hXu7WXnz5>qdg5_P#$B8We?q+s`OV`H zaVRi$$57gYikEGk7PNf`vVHC=cfVQBPWru}Ot!9s>JlZ-ao~J9{0}kBX7hoYPxoL` z3;YGC1wm~O2pStCyXv5f9t0!EX>9WFQA&F{GAET^36p@c;O#S zFfiByyztK^m@&c73;%9{ITKv!g}+g7Y&=wK(@mJQd0jx!U4l0t&!Ljnj_D(=J2n-6 znLHOa+tv2)ezKluUoN28&o5{UicNLqdu>{%QQG_uGz5A3%?2(dzT$s0n@;m z0TWAo%!2AFxM3QktyxeqINw0iCXLdD5!dsLQinf6sM2MG?X8S>2h6)s8%EfF=_1`Q zIwvaOT}2)3je6+VqTaYy3b2dF5YLT0J~uXiUB({ojlH4R8~HNAyNJ7?I4A1LIZ+Ak zD(cGKsE7Klm-HRBpsxhb6}Ja>$4WLD(v$Xxwr9Oxqc*xr|06v#U7U7KuKV!JyOKS+ zzEbr-G-EV5yNjw6?H;F0OSNfCOV_mMWu`?xXinkgMuQ#&5YJQoAMorFzB`9z-CTVf zYbuF7HGe&!dLH=*zmDpfp2psTtDD zt{|J4ZfDm}^w)i~ROtJRw_#2p>e(SXkNo6i?G|mUgl2F~ax4Lyv#otou zosFB?w+YAJ;bYDYokptkC;8fUf#|H# z2W9R1e012y%qO+ido^jW+>x)1Y1}1^!^sF~93dywI8shsu$?3o)J3(kbDK7b#hXl# z{qo2QW)o~av;WvBGnLt;@H$Ss{?qVs8$ZQG=AYqkUF=CLNUEfB zAkhsol(?7N-1#|FMu&cZXEyjH-`cMPn-+$G`n4dx;iE@Llz~<~9j`Qh2SRrf{!7GO z#vkO=6=V=t4zP69i zKfiIR(KvlMP;+3qt=3%)1|gZXS!Ig<4ll|`d$X^G*9q{ljgOl62RLft*bW!Z>~S_O zP!sjcF;5G)5P;d&q?TB&jLg}{Ty#)i&PHCdKgKU-x?-v6khT8mNN&6j#uA zru9=nLE~cl$>pGr^;{0Jee2QAQFq(El^#LDsArH2axapryYR*XK+J?t!g7_UTqRgK z*WJOq%_^}M&XVJBF%nQDlu6oos1FZ+oepVWvU*9oKpI!T!*#ZXx!p zEo#$sD3H6#4F&^>&(i+}`o>k3%SyOZSUC~5XpwbmPe~-^-?;{Tjqf%u(>L5r39hB2 z8?lWmKy@pEjov;=f)j<#=`Ad$9skl20_$nV3pxQzD8-D~B+We-yL=}qt2y-4W;e1k zcJm@Ns#c2K;nljR=Sk+vftyJdQ)A1N$9b+QwwQJ#NzyL1(iU04kQq#)W)s*WNuUs= zV>miPMz3ZZV3js)g3kQ zlZpdR{MqQ56ro)7%;tT0VT%W7_S8_tJwaF6;KINYj{vTvRC!(;;N*&f(Zz0Eg|Aas z+|x`0?bN$XeK0Ureoc&MRg0*tDVAt)FpdT~+Xc3i>0sD+%;_qdh@M+meP;p>;tYxP zCxw=dvxFYHm*^bnPD-ONFtgZCbHcN@> z#A_dRtgF(CYsTGB3gH!#NrK7GgC<3L0Ffh6rb^5h@ES4ZZ>+zie%s+{hA%ad+dF}g z9h*9Vr8{2U35@P|StqcpbKv*EiRC-)>|j>xcu6O)a>q+MfwAn4yShTT9e1}w(`wqK zBf2`Ia5=ft9doUNEYrc!fG0INBLmao5KWr{#2zz1Zu$Ey0*!&N*FFDyZB=5coTjnD zZ=5cN`x|GNp+ms-AlMm%Qw%4!xBI=Iu1J7h*#@~O#+B6?S8`N%*w3eQOt-AzzLIoi zXCwR^PQEuWn;w8c7b|uH2gQ=&(MV{|VK11U2#ech>u{0W3z@%ib9OBWN3`E{xO$~4 zDqTv^%)=~J6pKkEaZ)yp!Ay?r$Fm&D!{pd-;%nB{kYlc8Z>BgVyv7!s*fl&}eUE61k8s@75(&*AW4?el383?kSqux*f~2PJXmKmMb6T z-ueW*cH1d0&t$fn7p!*1OJ(s-d5P$s@lxI*(l}+O^3+v&@iNM1ZU$TVD~xsKff&qs zzj0?})aHZ9^$pe4a(Le08vbtG)NozmhNn5^BSb;bkoJ=ZmK5raJ%D~4ffz$+f%S6+r6M(e8$m&sX%c|594APF5lvwJ%coKA_&;{5FfW2-1^gN4yrh4-b3f|zA zwj5g|oczUO($sbB$Sm_OVHxVauI$Nr2qs%EskCZh|p07p7mmAlyaPu|`yYXuo?;I3o zEz7D7iegT?a~qf=rL-3=7_1&(>vG8^ZASh)#-zQX^tH^V6% zS3r|ZZ%uk+VC|KFcs6FukS-R$Hl6}Y;*9SOdyVlvA}$WBWvRl@jTQ#FDHCpMWv7Yd z*{sviUFOQC%L%buK0Dio_fdp6 zuRPpN+qR6gpF{pOZ0&~#DY@fX$!+|Z#1gngwaIG8eyy>`z8Zc2dUCpd0T;IZX_%|H(g|dMX`1jX+^lPjv)3`ef(x zu6d7UGv!n}09ekg9ZECfHtX>?laZpaDHZ7~9vfZ904)E)sCn9MgxfpDF0U(%ao>gV zb}(XO285f8_EMYF?cPH0=hmM?n=kiq#$`#;xvYbBCgTnp^Wt&0*bqetTHB8eID<=# zneT8$Lx-d}omx8(XIj07=(KLanvMBO?42ekcdXo?TQ+vj^W~a?YtVQ2u4zV%+YA&F zf_F+9Hz|;6Ov~{bH{&Fx4z^misbhjNb=D(yV(J)}OdSLBbqd=&x2NRI5`*zDPm~-6 zU_1aMjR6=B0LetAdhH}-r^iluE`T|sQmec=c9M8dbwt0~;VwRN%FDXy_~jOk}GThv=;QRzM0IoaA8Sf7Pw zHaJ29>%pWlF)d8^bm+p%RWKsHte2Q;RxM&-x`d8pRWiu zyds|(8%+Fp{5k74CmwkWIiITD$slK=*o~J@F=03FVs!z#yk=u2K7_=EQst<6Z*S~Y z>Xy~}QB*cW#BnHPb3@0ACeewzb?I+DDCBwg&pb+(PiKl-_E}^R=HKbLiDr58VdXgWI{FsvUh1v`{t4v%W-Vb1{ttKWM&H$G&uqq($9nDE)e zPue4C=v>%NbT2*(&I8ecO#E~_gKjottv|}xJKaB<8RqC&#`cz-^IxrVcq7i}YMZ8P z$~DPbMzRmor=3H3JDUm9DwMM(4a&|5ZKFG?mCcE1VQgkqHasn9il=v8OfdzeYi07i zzf&_jq}eH9+rQ?VFCfdg$kM!8HCZld&pQ7sh;!{Om%|H1GGmGhB& zrbTU{)Q=))e9f!GVgJI|V28uV91au3kruC`#p@XHQals6eyn&Y=ncom;g65!gMHdj zFK^qUR31+sE~MFr| z+`3|wc~f4lF%P?MY}yN@cAUn*b_^{2SCRMPlgUJGZ9ie2e>jDJt|6U@yY5e0lORZIVN&b=12Pt;2dgO$D;yUV=qN6J@BnE=QkUSH@vL&fZ?En}Cv9nHTbrTcQ!kEq?K1Wp+jiuvrRb7^eO)z7&?5&2R?Ev-dnQ?}t z#GJRZof}(rqLHjAT;oKqwPO{=u02mR98RlcYRysO)y2wdc{lr*KxJ__ZjLNGpejBO zQFO5V1)}%-1zhFVleumv?1EHy8*m**oF+p#w-AI^;VHpWyq6@rc?op5IQ-9OhW&Xo ztd3qPe(d9!aa{vfA-t6|?T%?T-0On#(vIS>R?Z6m%BQdX%e-USdc%nOx6M~myKeI( zt*W`xRLxz)sGU!?C#HpoFTk7QMHY5;?c=A~*(J7D9^}y&iZ3$DO(pyIDQUSnhwogX zGNr4WvhP3ARSpFcgWG6)edW=t*)kc3+;k~Z398wC-Ycjs(YN(@gPknV@%g&{98AAT zzKalLT0*nrTze(p@Wp&e*Y@mRj={z*QZ?=uDbo|?Mpv zc$Fa(Ccc`F^j&uJd+A4>sd_hAi|<0vap#?Yxw)kFgy3+ zLpuH*QSIT)#pVUN1j69Sdm$zc4*<<{5q*~ONFZHAgBiKCDF9XsZwq8~`a z#nrEw*b115N{b-1qIFT^w-B(6mSKZA&tbi#S)J|tlL0Qvr`R7$$DA1nlFJ|6^

r z*AJR?w$20DJI#0XA8_ocRWE)S#b%%S-K%=|09K)LkbtkD1WnJ_qZ?k#(*o@{S9IbS z@Xq73=E`HvUzhgfq;xc!*QojEtby?Wcx?+{JOEzT0vHbfG}cBj9@bRoLU^NXS!tA0 zSVhAKN7Oi?u}zmoT6-fxqevRZFGY`@g&x_LH<}MZ*EQ*CzMgQrjl2)8)#$~+wrdIS z9!K?FGRw`K>r^h9ahh?U`aui59%%d=K6dc!;J@C%>k6G6r(SP5!?z(+?FQmZObes; zlq2(aMHhQ-&?GAM&4+rUzr7P(n2^q8Ui39x(cjn`{T-d?!sub?xzW4U)hLH1GOYiF zhJ0=s%@!VS5BXi!h~`nPD_2(0aZ#7JAITL1@j<_C)5(B=akP=?vE^aYJ@HG^@G~f9+KQoB_a$=d7GKmy7<@hTd!3 zk4v=Ih)U6#uf=E5ejOh33UsdapkUL≥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 a{r7+W#3}IAn6+|jIGJm||NH-r0{;uFX~nz% diff --git a/Plugins/mb_Spotify-Plugin.dll b/Plugins/mb_Spotify-Plugin.dll index b79f436441a764a76972133a88f349ebba15a906..4df799f86e509ba8e1e10c21d68e06e5608465e7 100644 GIT binary patch literal 61440 zcmdqK34B!5-8X*b&XO>h+{sMX1cWGCAR&+i2oRPefJ9j$35#o-BttTiWa7*Oh!C1s zH(aqUk6NuutxM~!ZC#(LRcl+Uw$-Xtsn(_1s@11jms)(kzu!6c+_{qg{$Jn!`+436 zJ->T?>)C#1y=QJ#9lKk&g%BQuuf7uEK0N8)5{3r`{a~9D9x%nd!=66uKG({p4{L0X zB@4O}@wP;yv!Er?)fG<_G)D^(JzWK{u7ag&8VWk&tm6xx_+4uD_w5!=CMEe zhn3oE;_!kT*DN940mUb&V|*?l3J@>AQ;0l{8#3QSP+~%y1U~5W&n-?mgGA|n`>9YO z;op;9msmp)*nO5NBJ9qB@EC@%O=V2D6mfF!0>QJ|B9lFFBqJPXG`^f<<4l zfJn%zUl{H_)V#+)qM=&fv4wd0`=Ev@Czw+tvZhmhFGVgP7!vNp6IRJQg%cs26Lu9& z!qeDJhT>=w|2~i3SL_w;Kv9cu$ESdjTQp9%M-Cfx%;enoRN#58VI%js@;xC>u~9VR z>lrojy&><6`_eKnInNa+64|Iy)TvjzXCMRYQ!*=sNXW|8G{keV0tF|%FkTcw!Jq4i z7vbTH7X!lCDD#Cg5RaEg0!9lDXYeplh{3@pM)l)?df{TuWTBCLBqes5fTPNDcap%U zeJ&KO$TgC(JMT#sGAEPTIUF%#J2mOp3I60PSjZ|YB|C~glKIrGV<(IsfHpRg`H8=`2UCG;;AqM{5EGIqkIhq{I@ z-yibZh9|qy49E6kxPgU~VW*I>6E;1Cr~+SpPAJDV+?Q^+Z$E}_OE>Hk5|!lrs*(Lx zBU1|pLV@B+tIW@{1@?~gzPv>C*Rd0pJ5yfD2B{b1hH{JNSXMq6+R91N%9sg`h8O6Y zZh`j3sEoduoR60CCsrAvJGlVSoGf&Bc&O^|Rn)G&tT={mJh|tbykFnuamoLjWQE{5Is5`f&W zyRaJ1&G{b0YB=Uqv`{8J#tQEGj>QAv*`fL*!tzN^`=tnUsIZ^@J{&Ho9Q(0G^@i~IeTB6sSzp)?9-q-Sf*$U^e0q5LhSOt2Ux*$%NFpo>(Y{4w$3-@1%@Y!% zcrx^h>GJ=v@MDZS0^qLX0+$so48aDhOqwBbfQqrm`${|^iwZE3ME-(3t4Lv3zGv@< ze6I+3XF>Jre1gPQpfCkyM?=szie-+_cEIgOI|t5S>o-_9SfNa`}=CpiSnH zJKjjyO|Ap@>NkvLA;`I?8@L2vZWT+R6RDTy~H61!^hCWgn>ukD9d# ze}Y~36A|^ro4D|w{x>eX)$R+b>~>$!Yq$G?pE%ncUC?fKTCJ#dKglk-^!W%E{Sf#6 zAfHFU?Xsu&d~;^mTe$3V|7Vn4`aEVSlzj-FZ?y|AeLl*CU-#d*@L$*GX`P2zNnmM! zbsi7%ZsqQq>{3g2Zv!FT4v>>IvJe}hqCj?W4z@3-G|#Bqq8u@jqa$;R#4rrEn1`fo zEO|0*pPXrX^L}j8vPRjaXqs)0z>FcV;0RewW@Ws?HZGg1b3evWXv;W7rSX%EBsR6a zK1`+_V-#=1jKVHh5YtZ_$y>FN{Un{h(yqH7yJ?SA)@P9)th{jc;2u+msS!(_!tr=u zEslL_*l-s-g*iuZDsP0aWMgB8WiGKjNK>)T((KXuT&U+D*ef)8Z^N0B@e z4%uhOVtGd96eSgL0uzy2�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 SpotifyAPI.Web.APIException: invalid_grant \ No newline at end of file diff --git a/Source Files/PanelInterface.cs b/Source Files/PanelInterface.cs index 9dbd271..35ddb56 100644 --- a/Source Files/PanelInterface.cs +++ b/Source Files/PanelInterface.cs @@ -17,6 +17,7 @@ public partial class Plugin private Control panel; public int panelHeight; private static string _searchTerm; + private bool _runOnce = true; Font largeBold, smallRegular, smallBold; public PluginInfo Initialise(IntPtr apiInterfacePtr) @@ -26,7 +27,7 @@ public PluginInfo Initialise(IntPtr apiInterfacePtr) about.PluginInfoVersion = PluginInfoVersion; about.Name = "mb_Spotify_Plugin"; about.Description = "This plugin integrates Spotify with MusicBee."; - about.Author = "Zachary Cohen"; + about.Author = "zkhcohen"; about.TargetApplication = "Spotify Plugin"; about.Type = PluginType.PanelView; about.VersionMajor = 2; @@ -96,6 +97,14 @@ private void DrawPanel(object sender, PaintEventArgs e) e.Graphics.Clear(bg); panel.Cursor = Cursors.Hand; + if(_runOnce) + { + SpotifyWebAuth(); + _trackMissing = 1; + panel.Invalidate(); + _runOnce = false; + } + // re-draws when file is found? if (_auth == 1 && _trackMissing != 1) { diff --git a/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs index 74a33c3..a2f562e 100644 --- a/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs +++ b/Source Files/SpotifyAPI.Web/Authenticators/PKCEAuthenticator.cs @@ -16,13 +16,14 @@ public class PKCEAuthenticator : IAuthenticator /// Initiate a new instance. The token will be refreshed once it expires. /// The initialToken will be updated with the new values on refresh! /// - public PKCEAuthenticator(string clientId, PKCETokenResponse initialToken) + public PKCEAuthenticator(string clientId, PKCETokenResponse initialToken, string path) { Ensure.ArgumentNotNull(clientId, nameof(clientId)); Ensure.ArgumentNotNull(initialToken, nameof(initialToken)); InitialToken = initialToken; ClientId = clientId; + Path = path; } ///

@@ -36,16 +37,18 @@ public PKCEAuthenticator(string clientId, PKCETokenResponse initialToken) /// public string ClientId { get; } + public string Path { get; } + /// /// The inital token passed to the authenticator. Fields will be updated on refresh. /// /// public PKCETokenResponse InitialToken { get; } - public static void SerializeConfig(PKCETokenResponse data) + public void SerializeConfig(PKCETokenResponse data) { - using (StreamWriter file = new StreamWriter("C:\\Users\\zacha\\Desktop\\Local Files\\MusicBee\\AppData\\token.txt", false)) + using (StreamWriter file = new StreamWriter(Path, false)) { XmlSerializer controlsDefaultsSerializer = new XmlSerializer(typeof(PKCETokenResponse)); controlsDefaultsSerializer.Serialize(file, data); diff --git a/Source Files/SpotifyIntegration.cs b/Source Files/SpotifyIntegration.cs index 05bbf5a..0b7fbfb 100644 --- a/Source Files/SpotifyIntegration.cs +++ b/Source Files/SpotifyIntegration.cs @@ -74,7 +74,7 @@ static async void SpotifyWebAuth() //WriteOutput(token_response); - var authenticator = new PKCEAuthenticator(_clientID, token_response); + var authenticator = new PKCEAuthenticator(_clientID, token_response, _path); var config = SpotifyClientConfig.CreateDefault() .WithAuthenticator(authenticator); @@ -84,10 +84,10 @@ static async void SpotifyWebAuth() //WriteOutput(token_response); - + // This appears to be the easiest way to check if the Spotify client works, but it's not great: try { - await _spotify.Search.Item(new SearchRequest(SearchRequest.Types.Track, "1ghvzmzpx2nnrbx7wtpMgo?si=cC3VIBCfRPauNBHFes6nsg")); + await _spotify.Search.Item(new SearchRequest(SearchRequest.Types.Track, "fasdofimasdofiasdnfaosnf")); _auth = 1; } catch(APIException) @@ -124,7 +124,7 @@ static async void SpotifyWebAuth() //WriteOutput(initialResponse); - var authenticator = new PKCEAuthenticator(_clientID, initialResponse); + var authenticator = new PKCEAuthenticator(_clientID, initialResponse, _path); var config = SpotifyClientConfig.CreateDefault() .WithAuthenticator(authenticator); From 1460a636c65ff33c5b601d69ce2d32b4a0df094e Mon Sep 17 00:00:00 2001 From: zkhcohen Date: Fri, 9 Apr 2021 19:23:08 -0700 Subject: [PATCH 5/5] PKCE Auth fully working with XML encryption. --- CHANGELOG.txt | 5 +- Plugins/SpotifyAPI.Web.Auth.dll | Bin 73728 -> 73728 bytes Plugins/SpotifyAPI.Web.dll | Bin 198144 -> 198144 bytes Plugins/mb_Spotify-Plugin.dll | Bin 61440 -> 64000 bytes README.txt | 2 +- Source Files/Crypt.cs | 89 ++++++++++++++++++++++++ Source Files/PanelInterface.cs | 20 ++++-- Source Files/Properties/AssemblyInfo.cs | 8 +-- Source Files/SpotifyIntegration.cs | 52 +++++++++++--- Source Files/mb_Spotify-Plugin.csproj | 2 + 10 files changed, 157 insertions(+), 21 deletions(-) create mode 100644 Source Files/Crypt.cs diff --git a/CHANGELOG.txt b/CHANGELOG.txt index df7a88f..5d9fabb 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,4 +1,5 @@ CHANGE LOG: -Beta 2.0: Improved performance. Removed 500 album restriction. Added automatic prompt to re-authenticate if computer resumes from sleep. -Beta 2.0.2: Fixed error log spam. \ No newline at end of file +Release 2.0: Improved performance. Removed 500 album restriction. Added automatic prompt to re-authenticate if computer resumes from sleep. +Release 2.0.2: Fixed error log spam. +Beta 3.1: Upgraded all API methods to 6.x.x spec. Implemented PKCE auth method with token persistence and automatic renewal. General speed improvements. \ No newline at end of file diff --git a/Plugins/SpotifyAPI.Web.Auth.dll b/Plugins/SpotifyAPI.Web.Auth.dll index 2db0f80619b81a7d4df19c80f8c1b1dc8c95549d..63b7470ad11de26fbf676cee693a29947e713de9 100644 GIT binary patch delta 242 zcmZoTz|wGlWkLtbS+^Da8+(?h3rw-QzCLrCgVX8{y=JHK8&ozsXlSr%Bqb*rrI{I| zS|lc$n;4j+CRth}CMKC08k-uKr<$fFTN|0mM+rio=s_!-Zs+ZTy3a)O9Zk^84MYWfus>oJ{3r(0##Z9MN)wn PBx}ZywEedXBP%lienm)z delta 242 zcmZoTz|wGlWkLtb%jY%S8+(?h3uLDIhW~Qrb)J4du4Hwn>A%em8XBw`riLlzsm5lB z7D-8|CWfXKrUq$7<`%}rmZ@o}h8Bqi=E=sE$*Gnmn3zK+`dSRk&DgWl);c8 zg~6O5mBE<7j3JT1f*}bAQyENv;-)~JDT4t+8iNr~g#}QBF@q&gE)9qcf&4_EoH;`> SSTq?ZX31c({kIGwD>DFuMoRhs diff --git a/Plugins/SpotifyAPI.Web.dll b/Plugins/SpotifyAPI.Web.dll index 5fc83b55911198acd21dde1d29714b5cbb76d604..f60cf83e5095ca914ed9ff9b9bd88e3989240567 100644 GIT binary patch delta 250 zcmZqZ;c4jMnb5(qLE+4$#-7$5#;rX}cUB90;4et`mAmLQ*wn~8)igEP(m2&P$y$zaiBpqM3t$@a-i%(=_}PoYj3 diff --git a/Plugins/mb_Spotify-Plugin.dll b/Plugins/mb_Spotify-Plugin.dll index 4df799f86e509ba8e1e10c21d68e06e5608465e7..6d20595c47c8f4c994527c98f5ba35820253d8af 100644 GIT binary patch literal 64000 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 HQ49PV7A~N8 literal 61440 zcmdqK34B!5-8X*b&XO>h+{sMX1cWGCAR&+i2oRPefJ9j$35#o-BttTiWa7*Oh!C1s zH(aqUk6NuutxM~!ZC#(LRcl+Uw$-Xtsn(_1s@11jms)(kzu!6c+_{qg{$Jn!`+436 zJ->T?>)C#1y=QJ#9lKk&g%BQuuf7uEK0N8)5{3r`{a~9D9x%nd!=66uKG({p4{L0X zB@4O}@wP;yv!Er?)fG<_G)D^(JzWK{u7ag&8VWk&tm6xx_+4uD_w5!=CMEe zhn3oE;_!kT*DN940mUb&V|*?l3J@>AQ;0l{8#3QSP+~%y1U~5W&n-?mgGA|n`>9YO z;op;9msmp)*nO5NBJ9qB@EC@%O=V2D6mfF!0>QJ|B9lFFBqJPXG`^f<<4l zfJn%zUl{H_)V#+)qM=&fv4wd0`=Ev@Czw+tvZhmhFGVgP7!vNp6IRJQg%cs26Lu9& z!qeDJhT>=w|2~i3SL_w;Kv9cu$ESdjTQp9%M-Cfx%;enoRN#58VI%js@;xC>u~9VR z>lrojy&><6`_eKnInNa+64|Iy)TvjzXCMRYQ!*=sNXW|8G{keV0tF|%FkTcw!Jq4i z7vbTH7X!lCDD#Cg5RaEg0!9lDXYeplh{3@pM)l)?df{TuWTBCLBqes5fTPNDcap%U zeJ&KO$TgC(JMT#sGAEPTIUF%#J2mOp3I60PSjZ|YB|C~glKIrGV<(IsfHpRg`H8=`2UCG;;AqM{5EGIqkIhq{I@ z-yibZh9|qy49E6kxPgU~VW*I>6E;1Cr~+SpPAJDV+?Q^+Z$E}_OE>Hk5|!lrs*(Lx zBU1|pLV@B+tIW@{1@?~gzPv>C*Rd0pJ5yfD2B{b1hH{JNSXMq6+R91N%9sg`h8O6Y zZh`j3sEoduoR60CCsrAvJGlVSoGf&Bc&O^|Rn)G&tT={mJh|tbykFnuamoLjWQE{5Is5`f&W zyRaJ1&G{b0YB=Uqv`{8J#tQEGj>QAv*`fL*!tzN^`=tnUsIZ^@J{&Ho9Q(0G^@i~IeTB6sSzp)?9-q-Sf*$U^e0q5LhSOt2Ux*$%NFpo>(Y{4w$3-@1%@Y!% zcrx^h>GJ=v@MDZS0^qLX0+$so48aDhOqwBbfQqrm`${|^iwZE3ME-(3t4Lv3zGv@< ze6I+3XF>Jre1gPQpfCkyM?=szie-+_cEIgOI|t5S>o-_9SfNa`}=CpiSnH zJKjjyO|Ap@>NkvLA;`I?8@L2vZWT+R6RDTy~H61!^hCWgn>ukD9d# ze}Y~36A|^ro4D|w{x>eX)$R+b>~>$!Yq$G?pE%ncUC?fKTCJ#dKglk-^!W%E{Sf#6 zAfHFU?Xsu&d~;^mTe$3V|7Vn4`aEVSlzj-FZ?y|AeLl*CU-#d*@L$*GX`P2zNnmM! zbsi7%ZsqQq>{3g2Zv!FT4v>>IvJe}hqCj?W4z@3-G|#Bqq8u@jqa$;R#4rrEn1`fo zEO|0*pPXrX^L}j8vPRjaXqs)0z>FcV;0RewW@Ws?HZGg1b3evWXv;W7rSX%EBsR6a zK1`+_V-#=1jKVHh5YtZ_$y>FN{Un{h(yqH7yJ?SA)@P9)th{jc;2u+msS!(_!tr=u zEslL_*l-s-g*iuZDsP0aWMgB8WiGKjNK>)T((KXuT&U+D*ef)8Z^N0B@e z4%uhOVtGd96eSgL0uzy2�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 ZN1dlC`!6<6>mV7^rMLaZ+y7q;{0qp{- SpotifyAPI.Web.APIException: invalid_grant \ No newline at end of file diff --git a/Source Files/Crypt.cs b/Source Files/Crypt.cs new file mode 100644 index 0000000..d272cbf --- /dev/null +++ b/Source Files/Crypt.cs @@ -0,0 +1,89 @@ +using System; +using System.Xml; +using System.Security.Cryptography; +using System.Security.Cryptography.Xml; + +namespace MusicBeePlugin +{ + public partial class Plugin + { + public static void Encrypt(XmlDocument Doc, string ElementToEncrypt, string EncryptionElementID, RSA Alg, string KeyName) + { + if (Doc == null) + throw new ArgumentNullException("Doc"); + if (ElementToEncrypt == null) + throw new ArgumentNullException("ElementToEncrypt"); + if (EncryptionElementID == null) + throw new ArgumentNullException("EncryptionElementID"); + if (Alg == null) + throw new ArgumentNullException("Alg"); + if (KeyName == null) + throw new ArgumentNullException("KeyName"); + + XmlElement elementToEncrypt = Doc.GetElementsByTagName(ElementToEncrypt)[0] as XmlElement; + + if (elementToEncrypt == null) + { + throw new XmlException("The specified element was not found"); + } + Aes sessionKey = null; + + try + { + EncryptedXml eXml = new EncryptedXml(); + EncryptedData edElement = new EncryptedData(); + EncryptedKey ek = new EncryptedKey(); + DataReference dRef = new DataReference(); + KeyInfoName kin = new KeyInfoName(); + + sessionKey = Aes.Create(); + + byte[] encryptedElement = eXml.EncryptData(elementToEncrypt, sessionKey, false); + + edElement.Type = EncryptedXml.XmlEncElementUrl; + edElement.Id = EncryptionElementID; + edElement.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncAES256Url); + + byte[] encryptedKey = EncryptedXml.EncryptKey(sessionKey.Key, Alg, false); + + ek.CipherData = new CipherData(encryptedKey); + ek.EncryptionMethod = new EncryptionMethod(EncryptedXml.XmlEncRSA15Url); + dRef.Uri = "#" + EncryptionElementID; + ek.AddReference(dRef); + edElement.KeyInfo.AddClause(new KeyInfoEncryptedKey(ek)); + kin.Value = KeyName; + ek.KeyInfo.AddClause(kin); + edElement.CipherData.CipherValue = encryptedElement; + + EncryptedXml.ReplaceElement(elementToEncrypt, edElement, false); + } + catch (Exception e) + { + throw e; + } + finally + { + if (sessionKey != null) + { + sessionKey.Clear(); + } + } + } + + public static void Decrypt(XmlDocument Doc, RSA Alg, string KeyName) + { + if (Doc == null) + throw new ArgumentNullException("Doc"); + if (Alg == null) + throw new ArgumentNullException("Alg"); + if (KeyName == null) + throw new ArgumentNullException("KeyName"); + + EncryptedXml exml = new EncryptedXml(Doc); + + exml.AddKeyNameMapping(KeyName, Alg); + exml.DecryptDocument(); + } + + } +} diff --git a/Source Files/PanelInterface.cs b/Source Files/PanelInterface.cs index 35ddb56..10c1539 100644 --- a/Source Files/PanelInterface.cs +++ b/Source Files/PanelInterface.cs @@ -3,9 +3,8 @@ using System.Drawing; using System.Windows.Forms; using System.Net; -using System.Threading; using System.Collections.Generic; -using Microsoft.Win32; +using System.Security.Cryptography; namespace MusicBeePlugin { @@ -19,6 +18,10 @@ public partial class Plugin private static string _searchTerm; private bool _runOnce = true; Font largeBold, smallRegular, smallBold; + private RSACryptoServiceProvider _rsaKey; + + // Create a new CspParameters object to specify a key container. + CspParameters _cspParams = new CspParameters(); public PluginInfo Initialise(IntPtr apiInterfacePtr) { @@ -30,15 +33,21 @@ public PluginInfo Initialise(IntPtr apiInterfacePtr) about.Author = "zkhcohen"; about.TargetApplication = "Spotify Plugin"; about.Type = PluginType.PanelView; - about.VersionMajor = 2; + about.VersionMajor = 3; about.VersionMinor = 0; - about.Revision = 2; + about.Revision = 5; about.MinInterfaceVersion = MinInterfaceVersion; about.MinApiRevision = MinApiRevision; about.ReceiveNotifications = (ReceiveNotificationFlags.PlayerEvents | ReceiveNotificationFlags.TagEvents); about.ConfigurationPanelHeight = 0; - _path = mbApiInterface.Setting_GetPersistentStoragePath() + @"token.txt"; + _path = mbApiInterface.Setting_GetPersistentStoragePath() + "token.xml"; + + _cspParams.KeyContainerName = "SPOTIFY_XML_ENC_RSA_KEY"; + + // Create a new RSA key and save it in the container. This key will encrypt + // a symmetric key, which will then be encrypted in the XML document. + _rsaKey = new RSACryptoServiceProvider(_cspParams); //SystemEvents.PowerModeChanged += OnPowerChange; @@ -193,6 +202,7 @@ public List GetMenuItems() public void reAuthSpotify(object sender, EventArgs e) { + File.Delete(_path); SpotifyWebAuth(); _trackMissing = 1; panel.Invalidate(); diff --git a/Source Files/Properties/AssemblyInfo.cs b/Source Files/Properties/AssemblyInfo.cs index 9754288..a954099 100644 --- a/Source Files/Properties/AssemblyInfo.cs +++ b/Source Files/Properties/AssemblyInfo.cs @@ -8,9 +8,9 @@ [assembly: AssemblyTitle("mb_Spotify_Plugin")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("Zachary Cohen")] +[assembly: AssemblyCompany("zkhcohen")] [assembly: AssemblyProduct("mb_Spotify_Plugin")] -[assembly: AssemblyCopyright("Copyright © 2019")] +[assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.2.0")] -[assembly: AssemblyFileVersion("2.0.2.0")] +[assembly: AssemblyVersion("3.0.5.0")] +[assembly: AssemblyFileVersion("3.0.5.0")] diff --git a/Source Files/SpotifyIntegration.cs b/Source Files/SpotifyIntegration.cs index 0b7fbfb..0a59851 100644 --- a/Source Files/SpotifyIntegration.cs +++ b/Source Files/SpotifyIntegration.cs @@ -5,8 +5,9 @@ using System.IO; using System.Linq; using System.Threading.Tasks; -using System.Windows.Forms; using System.Xml.Serialization; +using System.Xml; +using System.Security.Cryptography; namespace MusicBeePlugin { @@ -20,22 +21,46 @@ public partial class Plugin private static string _title, _album, _artist, _trackID, _albumID, _artistID, _imageURL, _path; private static string _clientID = "9076681768d94feda885a7b5eced926d"; - public static void SerializeConfig(PKCETokenResponse data, string path) + public void SerializeConfig(PKCETokenResponse data, string path, RSACryptoServiceProvider rsaKey) { - using (StreamWriter file = new StreamWriter(path, false)) { XmlSerializer controlsDefaultsSerializer = new XmlSerializer(typeof(PKCETokenResponse)); controlsDefaultsSerializer.Serialize(file, data); file.Close(); } + + try + { + // Encrypt + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.PreserveWhitespace = true; + xmlDoc.Load(path); + Encrypt(xmlDoc, "AccessToken", "AccessToken", rsaKey, "rsaKey"); + Encrypt(xmlDoc, "RefreshToken", "RefreshToken", _rsaKey, "rsaKey"); + xmlDoc.Save(path); + + } + catch (Exception e) + { + Console.WriteLine(e.Message); + } + } - public static PKCETokenResponse DeserializeConfig(string path) + public PKCETokenResponse DeserializeConfig(string path, RSACryptoServiceProvider rsaKey) { try { + // Decrypt + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.PreserveWhitespace = true; + xmlDoc.Load(path); + Decrypt(xmlDoc, rsaKey, "rsaKey"); + xmlDoc.Save(path); + + // Deserialize StreamReader file = new StreamReader(path); XmlSerializer xSerial = new XmlSerializer(typeof(PKCETokenResponse)); object oData = xSerial.Deserialize(file); @@ -45,10 +70,19 @@ public static PKCETokenResponse DeserializeConfig(string path) } catch (Exception e) { - Console.Write(e.Message); return null; } + finally + { + // Encrypt + XmlDocument xmlDoc = new XmlDocument(); + xmlDoc.PreserveWhitespace = true; + xmlDoc.Load(path); + Encrypt(xmlDoc, "AccessToken", "AccessToken", rsaKey, "rsaKey"); + Encrypt(xmlDoc, "RefreshToken", "RefreshToken", rsaKey, "rsaKey"); + xmlDoc.Save(path); + } } //static void WriteOutput(PKCETokenResponse InitialToken) @@ -64,13 +98,13 @@ public static PKCETokenResponse DeserializeConfig(string path) //} - static async void SpotifyWebAuth() + async void SpotifyWebAuth() { try { if(File.Exists(_path)) { - var token_response = DeserializeConfig(_path); + var token_response = DeserializeConfig(_path, _rsaKey); //WriteOutput(token_response); @@ -80,7 +114,7 @@ static async void SpotifyWebAuth() .WithAuthenticator(authenticator); _spotify = new SpotifyClient(config); - SerializeConfig(token_response, _path); + SerializeConfig(token_response, _path, _rsaKey); //WriteOutput(token_response); @@ -131,7 +165,7 @@ static async void SpotifyWebAuth() _spotify = new SpotifyClient(config); //WriteOutput(initialResponse); - SerializeConfig(initialResponse, _path); + SerializeConfig(initialResponse, _path, _rsaKey); }; await server.Start(); diff --git a/Source Files/mb_Spotify-Plugin.csproj b/Source Files/mb_Spotify-Plugin.csproj index a3e9563..8ca000a 100644 --- a/Source Files/mb_Spotify-Plugin.csproj +++ b/Source Files/mb_Spotify-Plugin.csproj @@ -41,6 +41,7 @@ + @@ -50,6 +51,7 @@ +