diff --git a/SpotifyLocalAPI/index.html b/SpotifyLocalAPI/index.html new file mode 100644 index 00000000..6f0c9d35 --- /dev/null +++ b/SpotifyLocalAPI/index.html @@ -0,0 +1,318 @@ + + + + + + + + + + + + SpotifyLocalAPI - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

Getting started

+

This API provides some access to the local running Spotify-Client (Windows only).
+You can fetch details for the current track, play/pause, skip/previous track and +get notified on various events.

+

NOTE: This API is unofficial, things may brake in the future and there is no +guarantee everything works out of the box.

+
+

First steps

+

Imports
+So after you added the API to your project, you may want to add following imports to your files:

+
using SpotifyAPI.Local; //Base Namespace
+using SpotifyAPI.Local.Enums; //Enums
+using SpotifyAPI.Local.Models; //Models for the JSON-responses
+
+ +

Basic-Usage
+Now you can actually start fetching infos from your spotify client, just create a new Instance of SpotifyLocalAPI:

+
private static SpotifyLocalAPI _spotify;
+
+public static void Main(String[] args)
+{
+    _spotify = new SpotifyLocalAPI();
+    if (!SpotifyLocalAPI.IsSpotifyRunning())
+      return; //Make sure the spotify client is running
+    if (!SpotifyLocalAPI.IsSpotifyWebHelperRunning())
+      return; //Make sure the WebHelper is running
+
+    if(!_spotify.Connect())
+      return; //We need to call Connect before fetching infos, this will handle Auth stuff
+
+    StatusResponse status = _spotify.GetStatus(); //status contains infos
+}
+
+ +

Configuration

+

Different spotify versions often require different configuration. Some versions run their web-helper on port 4371, others on 4381. Also, some use https, and others use http. You can use SpotifyLocalAPIConfig to configure the API:

+
_spotify = new SpotifyLocalAPI(new SpotifyLocalAPIConfig
+{
+    Port = 4371,
+    HostUrl = "https://127.0.0.1"
+});
+
+ +

Anti-Virus Blocking Response

+

Some Anti-Virus Software blocks the response from spotify due wrong headers. +Currently, it's confirmed for AVG's LinkScanner and Bitdefender. +Adding http://SpotifyAPI.spotilocal.com:4380 to the URL-Exceptions seems to fix it for most users. +More infos can be found here

+

Client Status

+

Calling _spotify.GetStatus() after connecting returns the following StatusResponse:

+
public int Version { get; set; }
+
+public string ClientVersion { get; set; }
+
+public bool Playing { get; set; }
+
+public bool Shuffle { get; set; }
+
+public bool Repeat { get; set; }
+
+public bool PlayEnabled { get; set; }
+
+public bool PrevEnabled { get; set; }
+
+public bool NextEnabled { get; set; }
+
+public Track Track { get; set; }
+
+public double PlayingPosition { get; set; }
+
+public int ServerTime { get; set; }
+
+public double Volume { get; set; }
+
+public bool Online { get; set; }
+
+public bool Running { get; set; }
+
+ +

Most of the properties are self-explanatory, some notes:

+ +

Current Track

+

The current Track can be fetched via _spotify.GetStatus().Track and contains following properties/methods:

+ +

Events

+

To receive events, make sure you listen for them _spotify.ListenForEvents = true;
+You can set a SynchronizingObject, then the events will be called on the specific context

+

Following events can be overriden:

+ +

Methods

+

Furthermore, following methods are available:

+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/albums/index.html b/SpotifyWebAPI/albums/index.html new file mode 100644 index 00000000..95365652 --- /dev/null +++ b/SpotifyWebAPI/albums/index.html @@ -0,0 +1,295 @@ + + + + + + + + + + + + - Albums - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetAlbumTracks

+
+

Get Spotify catalog information about an album's tracks. Optional parameters can be used to limit the number of tracks returned.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the album."5O7V8l4SeXTymVp3IesT9C"
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first track to return. Default: 0 (the first object).0
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a SimpleTrack wrapped inside a Paging-object

+

Usage

+
Paging<SimpleTrack> tracks = _spotify.GetAlbumTracks("5O7V8l4SeXTymVp3IesT9C");
+tracks.Items.ForEach(item => Console.WriteLine(item.Name)); //Display all fetched Track-Names (max 20)
+Console.WriteLine(tracks.Total.ToString()) //Display total album track count
+
+ +
+

GetAlbum

+
+

Get Spotify catalog information for a single album.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the album.5O7V8l4SeXTymVp3IesT9C
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a FullAlbum

+

Usage

+
FullAlbum album = _spotify.GetAlbum("5O7V8l4SeXTymVp3IesT9C");
+Console.WriteLine(album.Name + "| Popularity: " + album.Popularity); //Display name and Popularity
+
+ +
+

GetSeveralAlbums

+
+

Get Spotify catalog information for multiple albums identified by their Spotify IDs.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs for the albums. Maximum: 20 IDs.new List<String>() { "5O7V8l4SeXTymVp3IesT9C" }
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a SeveralAlbums which Property "Albums" contains a list of FullAlbum

+

Usage

+
SeveralAlbums albums = _spotify.GetSeveralAlbums(new List<String>() { "5O7V8l4SeXTymVp3IesT9C" });
+Console.WriteLine(albums.Albums[0].Name);
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/artists/index.html b/SpotifyWebAPI/artists/index.html new file mode 100644 index 00000000..7b1c6fd1 --- /dev/null +++ b/SpotifyWebAPI/artists/index.html @@ -0,0 +1,356 @@ + + + + + + + + + + + + - Artists - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetArtist

+
+

Get Spotify catalog information for a single artist identified by their unique Spotify ID.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the artist."1KpCi9BOfviCVhmpI4G2sY"
+

Returns a FullArtist

+

Usage

+
FullArtist artist = _spotify.GetArtist("1KpCi9BOfviCVhmpI4G2sY");
+Console.WriteLine()
+
+ +
+

GetRelatedArtists

+
+

Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the Spotify community's listening history.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the artist."1KpCi9BOfviCVhmpI4G2sY"
+

Returns a SeveralArtists object which contains the property List<FullArtist> Artists (FullArtist)

+

Usage

+
SeveralArtists artists = _spotify.GetRelatedArtists("1KpCi9BOfviCVhmpI4G2sY");
+Console.WriteLine(artists.Artists[0].Name);
+
+ +
+

GetArtistsTopTracks

+
+

Get Spotify catalog information about an artist's top tracks by country.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the artist."1KpCi9BOfviCVhmpI4G2sY"
countryThe country: an ISO 3166-1 alpha-2 country code."DE"
+

Returns a SeveralTracks object which contains the property List<FullTrack> Tracks (FullTrack)

+

Usage

+
SeveralTracks tracks = _spotify.GetArtistsTopTracks("1KpCi9BOfviCVhmpI4G2sY", "DE");
+Console.WriteLine(tracks.Tracks.Count); //How many tracks did we get?
+
+ +
+

GetArtistsAlbums

+
+

Get Spotify catalog information about an artist's albums. Optional parameters can be specified in the query string to filter and sort the response.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the artist."1KpCi9BOfviCVhmpI4G2sY"
[type]A list of keywords that will be used to filter the response. If not supplied, all album types will be returnedAlbumType.All
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first album to return. Default: 00
[market]An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular geographical market"DE"
+

Returns a SimpleAlbum wrapped inside a Paging-object

+

Usage

+
Paging<SimpleAlbum> albums = _spotify.GetArtistsAlbums("1KpCi9BOfviCVhmpI4G2sY", AlbumType.All);
+albums.Items.ForEach(album => Console.WriteLine(album.Name));
+
+ +
+

GetSeveralArtists

+
+

Get Spotify catalog information for several artists based on their Spotify IDs.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs for the artists. Maximum: 50 IDs.new List<String>() { "1KpCi9BOfviCVhmpI4G2sY" }
+

Returns a SeveralArtists object which contains the property List<FullArtist> Artists (FullArtist)

+

Usage

+
SeveralArtists artists = _spotify.GetSeveralArtists(new List<String>() {"1KpCi9BOfviCVhmpI4G2sY"});
+artists.Artists.ForEach(artist => Console.WriteLine(artist.Name));
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/auth/index.html b/SpotifyWebAPI/auth/index.html new file mode 100644 index 00000000..5a4ab8ca --- /dev/null +++ b/SpotifyWebAPI/auth/index.html @@ -0,0 +1,366 @@ + + + + + + + + + + + + Authentication - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

Auth-Methods

+

Before you can use the Web API full functional, you need the user to authenticate your Application.
+If you want to know more, you can read to the whole auth-process here.

+

Before you start, you need to create a Application at Spotify: Your Applications

+
+

After you created your Application, you will have following important values:

+
+

Client_Id This is your client_id, you don't have to hide it
+Client_Secret Never use this in one of your client-side apps!! Keep it secret!
+Redirect URIs Add "http://localhost", if you want full support for this API

+
+

Now you can start with the User-authentication, Spotify provides 3 ways:

+ +

Note: I would recommend a little PHP Script, which will exchange the Keys using AutorizationCodeAuth. +When using ImplicitGrantAuth, another user could abuse the "localhost" RedirectUri by creating a "fake"-app which uses your ClientId.

+

Overview: +Overview

+

After implementing one of the provided auth-methods, you can start doing requests with the token you get from one of the auth-methods

+

ImplicitGrantAuth

+

This way is recommended and the only auth-process, which does not need a server-side exchange of keys. With this approach, you directly get a Token object after the user authed your application. +You won't be able to refresh the token. If you want to use the internal Http server, please add "http://localhost" to your application redirects.

+

More info: here

+

For this kind of authentication, there is also a WebAPIFactory, it's easier to use and uses an async method:

+
static async void Main(string[] args)
+{
+  WebAPIFactory webApiFactory = new WebAPIFactory(
+       "http://localhost",
+       8000,
+       "XXXXXXXXXXXXXXXX",
+       Scope.UserReadPrivate,
+       TimeSpan.FromSeconds(20)
+  );
+
+  try
+  {
+    //This will open the user's browser and returns once
+    //the user is authorized.
+    _spotify = await webApiFactory.GetWebApi();
+  }
+  catch (Exception ex)
+  {
+     MessageBox.Show(ex.Message);
+  }
+
+  if (_spotify == null)
+     return;
+}
+
+ +

The old way:

+
static ImplicitGrantAuth auth;
+static void Main(string[] args)
+{
+    //Create the auth object
+    auth = new ImplicitGrantAuth()
+    {
+        //Your client Id
+        ClientId = "XXXXXXXXXXXXXXXX",
+        //Set this to localhost if you want to use the built-in HTTP Server
+        RedirectUri = "http://localhost",
+        //How many permissions we need?
+        Scope = Scope.UserReadPrivate,
+    };
+    //Start the internal http server
+    auth.StartHttpServer();
+    //When we got our response
+    auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;
+    //Start
+    auth.DoAuth();
+}
+
+static void auth_OnResponseReceivedEvent(Token token, string state, string error)
+{
+    var spotify = new SpotifyWebApiClass()
+    {
+        TokenType = token.TokenType,
+        AccessToken = token.AccessToken
+    };
+    //We can now make calls with the token object
+
+    //stop the http server
+    auth.StopHttpServer();
+}
+
+ +

AutorizationCodeAuth

+

This way is not recommended and requires server-side code to run securely.
+With this approach, you first get a code which you need to trade against the access-token.
+In this exchange you need to provide your Client-Secret and because of that it's not recommended.
+(But you can e.g exchange to codes via a PHP Script)
+A good thing about this method: You can always refresh your token, without having the user to auth it again

+

More info: here

+
static AutorizationCodeAuth auth;
+static void Main(string[] args)
+{
+    //Create the auth object
+    auth = new AutorizationCodeAuth()
+    {
+        //Your client Id
+        ClientId = "XXXXXXXXXXXXXXX",
+        //Set this to localhost if you want to use the built-in HTTP Server
+        RedirectUri = "http://localhost",
+        //How many permissions we need?
+        Scope = Scope.UserReadPrivate,
+    };
+    //This will be called, if the user cancled/accept the auth-request
+    auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;
+    //a local HTTP Server will be started (Needed for the response)
+    auth.StartHttpServer();
+    //This will open the spotify auth-page. The user can decline/accept the request
+    auth.DoAuth();
+
+    Thread.Sleep(60000);
+    auth.StopHttpServer();
+    Console.WriteLine("Too long, didnt respond, exiting now...");
+}
+
+private static void auth_OnResponseReceivedEvent(AutorizationCodeAuthResponse response)
+{
+
+    //NEVER DO THIS! You would need to provide the ClientSecret.
+    //You would need to do it e.g via a PHP-Script.
+    Token token = auth.ExchangeAuthCode(response.Code, "XXXXXXXXXXX");
+
+    var spotify = new SpotifyWebApiClass()
+    {
+        TokenType = token.TokenType,
+        AccessToken = token.AccessToken
+    };
+
+    //With the token object, you can now make API calls
+
+    //Stop the HTTP Server, done.
+    auth.StopHttpServer();
+}
+
+ +

ClientCredentialsAuth

+

This way is not recommended and requires server-side code to run securely.
+With this approach, you make a POST Request with a base64 encoded string (consists of ClientId + ClientSecret). You will directly get the token (Without a local HTTP Server), but it will expire and can't be refreshed.
+If you want to use it securely, you would need to do it all server-side.
+NOTE: You will only be able to query non-user-related information e.g search for a Track.

+

More info: here

+
static ClientCredentialsAuth auth;
+static void Main(string[] args)
+{
+    //Create the auth object
+    auth = new ClientCredentialsAuth()
+    {
+        //Your client Id
+        ClientId = "XXXXXXXXXXXXXXX",
+        //Your client secret UNSECURE!!
+        ClientSecret = "XXXXXXXXXXXX",
+        //How many permissions we need?
+        Scope = Scope.UserReadPrivate,
+    };
+    //With this token object, we now can make calls
+    Token token = auth.DoAuth();
+    var spotify = new SpotifyWebApiClass()
+    {
+        TokenType = token.TokenType,
+        AccessToken = token.AccessToken,
+        UseAuth = false
+    };
+}
+
+ +

Scopes

+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/browse/index.html b/SpotifyWebAPI/browse/index.html new file mode 100644 index 00000000..09e5f965 --- /dev/null +++ b/SpotifyWebAPI/browse/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + - Browse - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetFeaturedPlaylists

+

AUTH REQUIRED

+
+

Get a list of Spotify featured playlists (shown, for example, on a Spotify player’s “Browse” tab).

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[locale]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."de_DE" //Germany
[country]A country: an ISO 3166-1 alpha-2 country code."DE"
[timestamp]A timestamp in ISO 8601 formatDateTime.Now
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first item to return. Default: 00
+

Returns a FeaturedPlaylists object, which has 2 properties. String Message and Paging<SimplePlaylist> Playlists

+

Usage

+
FeaturedPlaylists playlists = _spotify.GetFeaturedPlaylists();
+Console.WriteLine(playlists.Message);
+playlists.Playlists.Items.ForEach(playlist => Console.WriteLine(playlist.Name));
+
+ +
+

GetNewAlbumReleases

+

AUTH REQUIRED

+
+

Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player’s “Browse” tab).

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[country]A country: an ISO 3166-1 alpha-2 country code."DE"
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first item to return. Default: 00
+

Returns a NewAlbumReleases object, which has the property Paging<SimpleAlbum> Albums.

+

Usage

+
NewAlbumReleases newAlbums = _spotify.GetNewAlbumReleases();
+newAlbums.Albums.Items.ForEach(album => Console.WriteLine(album.Name));
+
+ +
+

GetCategories

+

AUTH REQUIRED

+
+

Get a list of categories used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab).

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[country]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"DE"
[locale]The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore"de_DE"
[limit]The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first item to return. Default: 0 (the first object).0
+

Returns a CategoryList object, which has the property Paging<Category> Categories.

+

Usage

+
CategoryList categoryList = _spotify.GetCategories();
+categoryList.Categories.Items.ForEach(category => Console.WriteLine(category.Name));
+
+ +
+

GetCategory

+

AUTH REQUIRED

+
+

Get a single category used to tag items in Spotify (on, for example, the Spotify player’s “Browse” tab).

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
categoryIdThe Spotify category ID for the category."party"
[country]A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category exists for a particular country."DE"
[locale]The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore"de_DE"
+

Returns a Category

+

Usage

+
Category cat = _spotify.GetCategory("party");
+Console.WriteLine(cat.Name);
+
+ +
+

GetCategoryPlaylists

+

AUTH REQUIRED

+
+

Get a list of Spotify playlists tagged with a particular category.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
categoryIdThe Spotify category ID for the category."party"
[country]A country: an ISO 3166-1 alpha-2 country code."DE"
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first item to return. Default: 00
+

Returns a CategoryPlaylist object, which has the property Paging<SimplePlaylist> Playlists

+

Usage

+
CategoryPlaylist playlists = _spotify.GetCategoryPlaylists("party");
+playlists.Playlists.Items.ForEach(playlist => Console.WriteLine(playlist.Name));
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/examples/index.html b/SpotifyWebAPI/examples/index.html new file mode 100644 index 00000000..8283bfdc --- /dev/null +++ b/SpotifyWebAPI/examples/index.html @@ -0,0 +1,177 @@ + + + + + + + + + + + + Examples - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/follow/index.html b/SpotifyWebAPI/follow/index.html new file mode 100644 index 00000000..2d5b9d68 --- /dev/null +++ b/SpotifyWebAPI/follow/index.html @@ -0,0 +1,414 @@ + + + + + + + + + + + + - Follow - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

Follow

+

AUTH REQUIRED

+
+

Add the current user as a follower of one or more artists or other Spotify users.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
followTypeThe ID type: either artist or user.FollowType.Artist
ids or idA list of the artist or the user Spotify IDs or just a Spotify IDnew List<String> { "1KpCi9BOfviCVhmpI4G2sY" } or "1KpCi9BOfviCVhmpI4G2sY"
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.Follow(FollowType.Artist, "1KpCi9BOfviCVhmpI4G2sY");
+//or if it's a User
+ErrorResponse response = _spotify.Follow(FollowType.User, "1122095781");
+
+ +
+

Unfollow

+

AUTH REQUIRED

+
+

Remove the current user as a follower of one or more artists or other Spotify users.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
followTypeThe ID type: either artist or user.FollowType.Artist
ids or idA list of the artist or the user Spotify IDs or just a Spotify IDnew List<String> { "1KpCi9BOfviCVhmpI4G2sY" } or "1KpCi9BOfviCVhmpI4G2sY"
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.Unfollow(FollowType.Artist, "1KpCi9BOfviCVhmpI4G2sY");
+//or if it's a User
+ErrorResponse response = _spotify.Unfollow(FollowType.User, "1122095781");
+
+ +
+

IsFollowing

+

AUTH REQUIRED

+
+

Check to see if the current user is following one or more artists or other Spotify users.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
followTypeThe ID type: either artist or user.FollowType.Artist
ids or idA list of the artist or the user Spotify IDs or just a Spotify IDnew List<String> { "1KpCi9BOfviCVhmpI4G2sY" } or "1KpCi9BOfviCVhmpI4G2sY"
+

Returns a ListResponse which contains the property List<Boolean> List

+

Usage

+
//Are you one of my Followers? :P
+ListResponse<Boolean> response = _spotify.IsFollowing(FollowType.User, "1122095781");
+Console.WriteLine(response.List[0] ? "Yis!" : "No :(");
+
+ +
+

FollowPlaylist

+

AUTH REQUIRED

+
+

Add the current user as a follower of a playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
ownerIdThe Spotify user ID of the person who owns the playlist."maxloermans"
playlistIdThe Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private status, as long as you know its playlist ID."3SIp2VAsKI03mReF0dFBmI"
[showPublic]If true the playlist will be included in user's public playlists, if false it will remain private.true
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.FollowPlaylist("maxloermans", "3SIp2VAsKI03mReF0dFBmI");
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

UnfollowPlaylist

+

AUTH REQUIRED

+
+

Remove the current user as a follower of a playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
ownerIdThe Spotify user ID of the person who owns the playlist."maxloermans"
playlistIdThe Spotify ID of the playlist that is to be no longer followed."3SIp2VAsKI03mReF0dFBmI"
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.UnfollowPlaylist("maxloermans", "3SIp2VAsKI03mReF0dFBmI");
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

IsFollowingPlaylist

+

AUTH REQUIRED

+
+

Check to see if one or more Spotify users are following a specified playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
ownerIdThe Spotify user ID of the person who owns the playlist."maxloermans"
playlistIdThe Spotify ID of the playlist."3SIp2VAsKI03mReF0dFBmI"
ids or idA list of the artist or the user Spotify IDs or just a Spotify IDnew List<String> { "1KpCi9BOfviCVhmpI4G2sY" } or "1KpCi9BOfviCVhmpI4G2sY"
+

Returns a ListResponse which contains the property List<Boolean> List

+

Usage

+
//Am I following the playlist?
+ListResponse<Boolean> response = _spotify.IsFollowing("maxloermans", "3SIp2VAsKI03mReF0dFBmI", "1122095781");
+Console.WriteLine(response.List[0] ? "Yis!" : "No :(");
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/gettingstarted/index.html b/SpotifyWebAPI/gettingstarted/index.html new file mode 100644 index 00000000..4c3a6975 --- /dev/null +++ b/SpotifyWebAPI/gettingstarted/index.html @@ -0,0 +1,341 @@ + + + + + + + + + + + + Getting started - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

Getting started

+

This API provides full access to the new SpotifyWebAPI introduced here.
+With it, you can search for Tracks/Albums/Artists and also get User-based information.
+It's also possible to create new playlists and add tracks to it.

+
+

First steps

+

Imports
+So after you added the API to your project, you may want to add following imports to your files:

+
using SpotifyAPI.Web; //Base Namespace
+using SpotifyAPI.Web.Auth; //All Authentication-related classes
+using SpotifyAPI.Web.Enums; //Enums
+using SpotifyAPI.Web.Models; //Models for the JSON-responses
+
+ +

Basic-Usage
+Now you can actually start doing calls to the SpotifyAPI, just create a new Instance of SpotifyWebAPI:

+
private static SpotifyWebAPI _spotify;
+
+public static void Main(String[] args)
+{
+        _spotify = new SpotifyWebAPI()
+        {
+            UseAuth = false, //This will disable Authentication.
+        }
+        FullTrack track = _spotify.GetTrack("3Hvu1pq89D4R0lyPBoujSv");
+        Console.WriteLine(track.Name); //Yeay! We just printed a tracks name.
+        //...
+}
+
+ +
+

Authentication

+

If you look through the available API-Methods, you will soon notice nearly all of them require Authentication. +Further infos on how to implement Authentication can be found here

+
+

Examples

+

A list of small examples can be found here. Do you think a specific example is missing? Feel free to open a PR/Issue!

+
+

Error-Handling

+

Every API-Call returns a reponse-model which consists of base-error model. To check if a specific API-Call was successful, use the following approach:

+
PrivateProfile profile = _spotify.GetPrivateProfile();
+if (profile.HasError())
+{
+    Console.WriteLine("Error Status: " + profile.Error.Status);
+    Console.WriteLine("Error Msg: " + profile.Error.Message);
+}
+
+ +

Asynchronous

+

Every API-Call now has an asynchronous method. Just append Async to the Method-Name.
+Example:

+
public async void Test()
+{
+    var profile = await _spotify.GetPrivateProfileAsync();
+    Console.WriteLine(profile.DisplayName);
+}
+
+ +
+

API-Reference

+

Albums

+ +

Artists

+ +

Browse

+ +

Follow

+ +

Library

+ +

Player

+ +

Playlists

+ +

Profiles

+ + + +

Tracks

+ +

Util

+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/library/index.html b/SpotifyWebAPI/library/index.html new file mode 100644 index 00000000..26251b52 --- /dev/null +++ b/SpotifyWebAPI/library/index.html @@ -0,0 +1,524 @@ + + + + + + + + + + + + - Library - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

SaveTracks

+

AUTH REQUIRED

+
+

Save one or more tracks to the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDsnew List<String> { "3Hvu1pq89D4R0lyPBoujSv" }
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.SaveTracks(new List<string> { "3Hvu1pq89D4R0lyPBoujSv" });
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

SaveTrack

+

AUTH REQUIRED

+
+

Save one track to the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idA Spotify ID"3Hvu1pq89D4R0lyPBoujSv"
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.SaveTrack("3Hvu1pq89D4R0lyPBoujSv");
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

GetSavedTracks

+

AUTH REQUIRED

+
+

Get a list of the songs saved in the current Spotify user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[limit]The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first object to return. Default: 0 (i.e., the first object)0
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.DE
+

Returns a Paging, SavedTrack contains 2 properties, DateTime AddedAt and FullTrack Track

+

Usage

+
Paging<SavedTrack> savedTracks = _spotify.GetSavedTracks();
+savedTracks.Items.ForEach(track => Console.WriteLine(track.Track.Name));
+
+ +
+

RemoveSavedTracks

+

AUTH REQUIRED

+
+

Remove one or more tracks from the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs.new List<String> { "3Hvu1pq89D4R0lyPBoujSv" }
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.RemoveSavedTracks(new List<string> { "3Hvu1pq89D4R0lyPBoujSv" });
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

CheckSavedTracks

+

AUTH REQUIRED

+
+

Check if one or more tracks is already saved in the current Spotify user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs.new List<String> { "3Hvu1pq89D4R0lyPBoujSv" }
+

Returns a ListResponse which contains a property, List<bool> List

+

Usage

+
ListResponse<bool> tracksSaved = _spotify.CheckSavedTracks(new List<String> { "3Hvu1pq89D4R0lyPBoujSv" });
+if(tracksSaved.List[0])
+    Console.WriteLine("The track is in your library!");
+
+ +
+

SaveAlbums

+

AUTH REQUIRED

+
+

Save one or more albums to the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDsnew List<String> { "1cq06d0kTUnFmJHixz1RaF" }
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.SaveAlbums(new List<string> { "1cq06d0kTUnFmJHixz1RaF" });
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

SaveAlbum

+

AUTH REQUIRED

+
+

Save one album to the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idA Spotify ID"1cq06d0kTUnFmJHixz1RaF"
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.SaveAlbum("1cq06d0kTUnFmJHixz1RaF");
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

GetSavedAlbums

+

AUTH REQUIRED

+
+

Get a list of the albums saved in the current Spotify user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[limit]The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first object to return. Default: 0 (i.e., the first object)0
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.DE
+

Returns a Paging<SavedAlbum>, SavedAlbum contains 2 properties, DateTime AddedAt and FullAlbum Album

+

Usage

+
Paging<SavedAlbum> savedAlbums = _spotify.GetSavedAlbums();
+savedAlbums.Items.ForEach(album => Console.WriteLine(album.Album.Name));
+
+ +
+

RemoveSavedAlbums

+

AUTH REQUIRED

+
+

Remove one or more albums from the current user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs.new List<String> { "1cq06d0kTUnFmJHixz1RaF" }
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.RemoveSavedAlbums(new List<string> { "1cq06d0kTUnFmJHixz1RaF" });
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

CheckSavedAlbums

+

AUTH REQUIRED

+
+

Check if one or more albums is already saved in the current Spotify user’s “Your Music” library.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs.new List<String> { "1cq06d0kTUnFmJHixz1RaF" }
+

Returns a ListResponse which contains a property, List<bool> List

+

Usage

+
ListResponse<bool> albumsSaved = _spotify.CheckSavedAlbums(new List<String> { "1cq06d0kTUnFmJHixz1RaF" });
+if(albumsSaved.List[0])
+    Console.WriteLine("The album is in your library!");
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/player/index.html b/SpotifyWebAPI/player/index.html new file mode 100644 index 00000000..c7c677f3 --- /dev/null +++ b/SpotifyWebAPI/player/index.html @@ -0,0 +1,570 @@ + + + + + + + + + + + + - Player - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetDevices

+
+

Get information about a user’s available devices.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
+

Usage

+
AvailabeDevices devices = _spotify.GetDevices();
+devices.Devices.ForEach(device => Console.WriteLine(device.Name));
+
+ +
+

GetPlayback

+
+

Get information about the user’s current playback state, including track, track progress, and active device.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Usage

+
PlaybackContext context = _spotify.GetPlayback();
+if(contex.Item != null)
+  Console.WriteLine(context.Item.Name)); //Print the current song
+
+ +
+

GetPlayingTrack

+
+

Get the object currently being played on the user’s Spotify account.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

This is a simpler (less data) version of GetPlayback

+

Usage

+
PlaybackContext context = _spotify.GetPlayingTrack();
+if(contex.Item != null)
+  Console.WriteLine(context.Item.Name)); //Print the current song
+
+ +
+

TransferPlayback

+
+

Transfer playback to a new device and determine if it should start playing.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
deviceIds or deviceIdA JSON array containing the ID of the device on which playback should be started/transferred"XXXX-XXXX-XXXX-XXXX"
playtrue: ensure playback happens on new device, false: keep current playback statetrue
+

Usage

+
ErrorResponse error = _spotify.TransferPlayback("XXXX-XXXX-XXXX-XXXX");
+
+ +
+

ResumePlayback

+
+

Start a new context or resume current playback on the user’s active device.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
contextUriSpotify URI of the context to play"spotify:album:1Je1IMUlBXcx1Fz0WE7oPT"
urisAn array of the Spotify track URIs to play.new List<string> { "spotify:track:4iV5W9uYEdYUVa79Axb7Rh" }
offsetIndicates 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.0
+

Usage

+
ErrorResponse error = _spotify.ResumePlayback(uris: new List<string> { "spotify:track:4iV5W9uYEdYUVa79Axb7Rh" });
+
+ +
+

PausePlayback

+
+

Pause playback on the user’s account.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.PausePlayback();
+
+ +
+

SkipPlaybackToNext

+
+

Skips to next track in the user’s queue.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SkipPlaybackToNext();
+
+ +
+

SkipPlaybackToPrevious

+
+

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.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SkipPlaybackToPrevious();
+
+ +
+

SeekPlayback

+
+

Seeks to the given position in the user’s currently playing track.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
positionMsThe 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.50
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SeekPlayback(50);
+
+ +
+

SetRepeatMode

+
+

Set the repeat mode for the user’s playback. Options are repeat-track, repeat-context, and off.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
statetrack, context or off.RepeatState.Track
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SetRepeatMode(RepeatState.Track);
+
+ +
+

SetVolume

+
+

Set the volume for the user’s current playback device.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
volumePercentInteger. The volume to set. Must be a value from 0 to 100 inclusive.50
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SetVolume(50);
+
+ +
+

SetShuffle

+
+

Toggle shuffle on or off for user’s playback.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
shuffleTrue or Falsefalse
[deviceId]The id of the device this command is targeting. If not supplied, the user's currently active device is the target."XXXX-XXXX-XXXX-XXXX"
+

Usage

+
ErrorResponse error = _spotify.SetShuffle(false);
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/playlists/index.html b/SpotifyWebAPI/playlists/index.html new file mode 100644 index 00000000..252bd1f6 --- /dev/null +++ b/SpotifyWebAPI/playlists/index.html @@ -0,0 +1,706 @@ + + + + + + + + + + + + - Playlists - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetUserPlaylists

+

AUTH REQUIRED

+
+

Get a list of the playlists owned or followed by a Spotify user.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
[limit]The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first playlist to return. Default: 0 (the first object)0
+

Returns a SimplePlaylist wrapped inside a Paging Object

+

Usage

+
Paging<SimplePlaylist> userPlaylists = _spotify.GetUserPlaylists("1122095781");
+userPlaylists.Items.ForEach(playlist => playlist.Owner.DisplayName) //Who is the owner of the playlist?
+
+ +
+

GetPlaylist

+

AUTH REQUIRED

+
+

Get a playlist owned by a Spotify user.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
[fields]Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned."description,uri"
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a FullTrack

+

Usage

+
FullPlaylist playlist = _spotify.GetPlaylist("1122095781", "1TtEejT1y4D1WmcOnLfha2");
+playlist.Tracks.Items.ForEach(track => Console.WriteLine(track.Track.Name));
+
+ +
+

GetPlaylistTracks

+

AUTH REQUIRED

+
+

Get full details of the tracks of a playlist owned by a Spotify user.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
[fields]Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned."description,uri"
[limit]The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100.100
[offset]The index of the first object to return. Default: 0 (i.e., the first object)0
[market]An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.DE
+

Returns a PlaylistTrack wrapped inside a Paging Object

+

Usage

+
Paging<PlaylistTrack> playlist = _spotify.GetPlaylistTracks("1122095781", "1TtEejT1y4D1WmcOnLfha2");
+playlist.Items.ForEach(track => Console.WriteLine(track.Track.Name));
+
+ +
+

CreatePlaylist

+

AUTH REQUIRED

+
+

Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.)

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistNameThe name for the new playlist, for example "Your Coolest Playlist". This name does not need to be unique."This is my new Playlist"
[isPublic]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.true
+

Returns a FullPlaylist

+

Usage

+
FullPlaylist playlist = _spotify.CreatePlaylist("1122095781", "This is my new Playlist");
+if(!playlist.HasError())
+    Console.WriteLine("Playlist-URI: " + playlist.Uri);
+
+ +
+

UpdatePlaylist

+

AUTH REQUIRED

+
+

Change a playlist’s name and public/private state. (The user must, of course, own the playlist.)

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
[newName]The new name for the playlist, for example "My New Playlist Title"."New Playlistname"
[newPublic]If true the playlist will be public, if false it will be private.EXAMPLE
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.UpdatePlaylist("1122095781", "1TtEejT1y4D1WmcOnLfha2", "New Name", true);
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

ReplacePlaylistTracks

+

AUTH REQUIRED

+
+

Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for replacing tracks, re-ordering existing tracks, or clearing the playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
urisA list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request.new List<string> { "1ri6UZpjPLmTCswIXZ6Uq1" }
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.ReplacePlaylistTracks("1122095781", "1TtEejT1y4D1WmcOnLfha2", new List<string> { "1ri6UZpjPLmTCswIXZ6Uq1" });
+if(!response.HasError())
+    Console.WriteLine("success");
+
+ +
+

RemovePlaylistTracks

+

AUTH REQUIRED

+
+

Remove one or more tracks from a user’s playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
urisarray of objects containing Spotify URI strings (and their position in the playlist). A maximum of 100 objects can be sent at once.(example below)
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
//Remove multiple tracks
+ErrorResponse playlist = _spotify.RemovePlaylistTracks("1122095781", "1TtEejT1y4D1WmcOnLfha2", new List<DeleteTrackUri>()
+{
+    new DeleteTrackUri("1ri6UZpjPLmTCswIXZ6Uq1"),
+    new DeleteTrackUri("47xtGU3vht7mXLHqnbaau5")
+});
+//Remove multiple tracks at their specified positions
+ErrorResponse playlist = _spotify.RemovePlaylistTracks("1122095781", "1TtEejT1y4D1WmcOnLfha2", new List<DeleteTrackUri>()
+{
+    new DeleteTrackUri("1ri6UZpjPLmTCswIXZ6Uq1", 2),
+    new DeleteTrackUri("47xtGU3vht7mXLHqnbaau5", 0, 50)
+});
+
+ +
+

RemovePlaylistTrack

+

AUTH REQUIRED

+
+

Remove one or more tracks from a user’s playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
uriSpotify URInew DeleteTrackUri("1ri6UZpjPLmTCswIXZ6Uq1")
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
//Remove all tracks with the specified URI
+ErrorResponse response = _spotify.RemovePlaylistTrack("1122095781", "1TtEejT1y4D1WmcOnLfha2", new DeleteTrackUri("1ri6UZpjPLmTCswIXZ6Uq1"));
+//Remove all tracks with the specified URI and the specified positions
+ErrorResponse response = _spotify.RemovePlaylistTrack("1122095781", "1TtEejT1y4D1WmcOnLfha2", new DeleteTrackUri("1ri6UZpjPLmTCswIXZ6Uq1", 0, 10, 20));
+
+ +
+

AddPlaylistTracks

+

AUTH REQUIRED

+
+

Add one or more tracks to a user’s playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
urisA list of Spotify track URIs to addnew List<string> { "1ri6UZpjPLmTCswIXZ6Uq1" }
[position]The position to insert the tracks, a zero-based index10
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.AddPlaylistTracks("1122095781", "1TtEejT1y4D1WmcOnLfha2", new List<string> { "1ri6UZpjPLmTCswIXZ6Uq1" });
+if(!response.HasError())
+    Console.WriteLine("Success");
+
+ +
+

AddPlaylistTrack

+

AUTH REQUIRED

+
+

Add one or more tracks to a user’s playlist.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
uriA Spotify Track URI"1ri6UZpjPLmTCswIXZ6Uq1"
positionThe position to insert the tracks, a zero-based index10
+

Returns a ErrorResponse which just contains a possible error. (response.HasError() and response.Error)

+

Usage

+
ErrorResponse response = _spotify.AddPlaylistTrack("1122095781", "1TtEejT1y4D1WmcOnLfha2", "1ri6UZpjPLmTCswIXZ6Uq1");
+if(!response.HasError())
+    Console.WriteLine("Success");
+
+ +
+

ReorderPlaylist

+

AUTH REQUIRED

+
+

Reorder a track or a group of tracks in a playlist. +More Info: Reorder-Playlist

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID."1122095781"
playlistIdThe Spotify ID for the playlist."1TtEejT1y4D1WmcOnLfha2"
rangeStartThe position of the first track to be reordered.2
insertBeforeThe position where the tracks should be inserted.0
[rangeLength]The amount of tracks to be reordered. Defaults to 1 if not set.2
[snapshotId]The playlist's snapshot ID against which you want to make the changes.``
+

Returns a Snapshot-Object which contains the property String SnapshotId

+

Usage

+
Snapshot snapshot = _spotify.ReorderPlaylist("1122095781", "1TtEejT1y4D1WmcOnLfha2", 2, 0, 2);
+Console.WriteLine("New SnapshotId: " + snapshot.SnapshotId);
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/profiles/index.html b/SpotifyWebAPI/profiles/index.html new file mode 100644 index 00000000..9f058ebc --- /dev/null +++ b/SpotifyWebAPI/profiles/index.html @@ -0,0 +1,237 @@ + + + + + + + + + + + + - Profiles - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetPrivateProfile

+

AUTH REQUIRED

+
+

Get detailed profile information about the current user (including the current user’s username).

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
+

Returns a PrivateProfile

+

Usage

+
PrivateUser user = _spotify.GetPrivateProfile();
+Console.WriteLine(user.DisplayName);
+
+ +
+

GetPublicProfile

+
+

Get public profile information about a Spotify user.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
userIdThe user's Spotify user ID.EXAMPLE
+

Returns a PublicProfile

+

Usage

+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/search/index.html b/SpotifyWebAPI/search/index.html new file mode 100644 index 00000000..bc7d860d --- /dev/null +++ b/SpotifyWebAPI/search/index.html @@ -0,0 +1,227 @@ + + + + + + + + + + + + - Search - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

SearchItems

+
+

Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
qThe search query's keywords (and optional field filters and operators), for example q=roadhouse+blues."roadhouse+blues"
typeA list of item types to search across.SearchType.Album
[limit]The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.20
[offset]The index of the first result to return. Default: 00
[market]An ISO 3166-1 alpha-2 country code or the string from_token."de"
+

Returns a SearchItem which contains the properties Paging<FullArtist> Artists,Paging<FullTrack> Tracks, Paging<SimpleAlbum> Albums, Paging<SimplePlaylist> Playlists. They are filled based on your search-type.

+

Usage

+
SearchItem item = _spotify.SearchItems("roadhouse+blues", SearchType.Album | SearchType.Playlist);
+Console.WriteLine(item.Albums.Total); //How many results are there in total? NOTE: item.Tracks = item.Artists = null
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/tracks/index.html b/SpotifyWebAPI/tracks/index.html new file mode 100644 index 00000000..006e459f --- /dev/null +++ b/SpotifyWebAPI/tracks/index.html @@ -0,0 +1,279 @@ + + + + + + + + + + + + - Tracks - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

GetSeveralTracks

+
+

Get Spotify catalog information for multiple tracks based on their Spotify IDs.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idsA list of the Spotify IDs for the tracks. Maximum: 50 IDs.new List<String> {"6Y1CLPwYe7zvI8PJiWVz6T"}
marketAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a SeveralTracks object which has one property, List<FullTrack> Tracks

+

Usage

+
SeveralTracks severalTracks = _spotify.GetSeveralTracks(new List<String> {"6Y1CLPwYe7zvI8PJiWVz6T"});
+severalTracks.Tracks.ForEach(track => Console.WriteLine(track.Name));
+
+ +
+

GetTrack

+
+

Get Spotify catalog information for a single track identified by its unique Spotify ID.

+
+

Paramters

+ + + + + + + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the track."6Y1CLPwYe7zvI8PJiWVz6T"
marketAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking."DE"
+

Returns a FullTrack

+

Usage

+
FullTrack track = _spotify.GetTrack("6Y1CLPwYe7zvI8PJiWVz6T");
+Console.WriteLine(track.Name);
+
+ +
+

GetAudioAnalysis

+
+

Get a detailed audio analysis for a single track identified by its unique Spotify ID.

+
+

Paramters

+ + + + + + + + + + + + + + + +
NameDescriptionExample
idThe Spotify ID for the track."6Y1CLPwYe7zvI8PJiWVz6T"
+

Returns a AudioAnalysis. This object is currently lacking Spotify documentation but archived EchoNest documentation is relevant.

+

Usage

+
AudioAnalysis analysis = _spotify.GetAudioAnalysis("6Y1CLPwYe7zvI8PJiWVz6T");
+Console.WriteLine(analysis.Meta.DetailedStatus);
+
+ +
+
+ + + + + + + + + + \ No newline at end of file diff --git a/SpotifyWebAPI/util/index.html b/SpotifyWebAPI/util/index.html new file mode 100644 index 00000000..7f23a40c --- /dev/null +++ b/SpotifyWebAPI/util/index.html @@ -0,0 +1,192 @@ + + + + + + + + + + + + - Util - SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

Paging-Methods

+

The SpotifyWebAPI features two paging-helper Methods, GetNextPage(Paging<T> page) and GetPreviousPage(Paging<T> page). +Both are an easy way to receive the next/previous page of a Paging-Object.

+

Sample:

+
var playlistTracks = _spotify.GetPlaylistTracks("1122095781", "4EcNf2l8rXInbJOf3tQdgU", "", 50);
+while (true)
+{
+    Console.WriteLine(playlistTracks.Items.Count);
+    if (!playlistTracks.HasNextPage())
+        break;
+    playlistTracks = _spotify.GetNextPage(playlistTracks);
+}
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/css/base.css b/css/base.css new file mode 100644 index 00000000..d59fd720 --- /dev/null +++ b/css/base.css @@ -0,0 +1,105 @@ +body { + padding-top: 70px; +} + +ul.nav li.main { + font-weight: bold; +} + +div.col-md-3 { + padding-left: 0; +} + +div.col-md-9 { + padding-bottom: 100px; +} + +div.source-links { + float: right; +} + +/* + * Side navigation + * + * Scrollspy and affixed enhanced navigation to highlight sections and secondary + * sections of docs content. + */ + +/* By default it's not affixed in mobile views, so undo that */ +.bs-sidebar.affix { + position: static; +} + +.bs-sidebar.well { + padding: 0; +} + +/* First level of nav */ +.bs-sidenav { + margin-top: 30px; + margin-bottom: 30px; + padding-top: 10px; + padding-bottom: 10px; + border-radius: 5px; +} + +/* All levels of nav */ +.bs-sidebar .nav > li > a { + display: block; + padding: 5px 20px; +} +.bs-sidebar .nav > li > a:hover, +.bs-sidebar .nav > li > a:focus { + text-decoration: none; + border-right: 1px solid; +} +.bs-sidebar .nav > .active > a, +.bs-sidebar .nav > .active:hover > a, +.bs-sidebar .nav > .active:focus > a { + font-weight: bold; + background-color: transparent; + border-right: 1px solid; +} + +/* Nav: second level (shown on .active) */ +.bs-sidebar .nav .nav { + display: none; /* Hide by default, but at >768px, show it */ + margin-bottom: 8px; +} +.bs-sidebar .nav .nav > li > a { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 30px; + font-size: 90%; +} + +/* Show and affix the side nav when space allows it */ +@media (min-width: 992px) { + .bs-sidebar .nav > .active > ul { + display: block; + } + /* Widen the fixed sidebar */ + .bs-sidebar.affix, + .bs-sidebar.affix-bottom { + width: 213px; + } + .bs-sidebar.affix { + position: fixed; /* Undo the static from mobile first approach */ + top: 80px; + } + .bs-sidebar.affix-bottom { + position: absolute; /* Undo the static from mobile first approach */ + } + .bs-sidebar.affix-bottom .bs-sidenav, + .bs-sidebar.affix .bs-sidenav { + margin-top: 0; + margin-bottom: 0; + } +} +@media (min-width: 1200px) { + /* Widen the fixed sidebar again */ + .bs-sidebar.affix-bottom, + .bs-sidebar.affix { + width: 263px; + } +} \ No newline at end of file diff --git a/css/bootstrap-custom.min.css b/css/bootstrap-custom.min.css new file mode 100644 index 00000000..290b2860 --- /dev/null +++ b/css/bootstrap-custom.min.css @@ -0,0 +1 @@ +@import url("//fonts.googleapis.com/css?family=Open+Sans:400italic,700italic,400,700");/*! normalize.css v2.1.3 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden],template{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a{background:transparent}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Open Sans",Calibri,Candara,Arial,sans-serif;font-size:15px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#007fff;text-decoration:none}a:hover,a:focus{color:#0059b3;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:0}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #e6e6e6}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Open Sans",Calibri,Candara,Arial,sans-serif;font-weight:300;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:21px;margin-bottom:10.5px}h1 small,h2 small,h3 small,h1 .small,h2 .small,h3 .small{font-size:65%}h4,h5,h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,h5 small,h6 small,h4 .small,h5 .small,h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#007fff}.text-primary:hover{color:#06c}.text-warning{color:#fff}.text-warning:hover{color:#e6e6e6}.text-danger{color:#fff}.text-danger:hover{color:#e6e6e6}.text-success{color:#fff}.text-success:hover{color:#e6e6e6}.text-info{color:#fff}.text-info:hover{color:#e6e6e6}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid #e6e6e6}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;border-left:5px solid #e6e6e6}blockquote p{font-size:15.75px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small,blockquote .small{display:block;line-height:1.428571429;color:#999}blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #e6e6e6;border-left:0}blockquote.pull-right p,blockquote.pull-right small,blockquote.pull-right .small{text-align:right}blockquote.pull-right small:before,blockquote.pull-right .small:before{content:''}blockquote.pull-right small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}blockquote:before,blockquote:after{content:""}address{margin-bottom:21px;font-style:normal;line-height:1.428571429}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:0}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}@media(min-width:768px){.container{width:750px}}@media(min-width:992px){.container{width:970px}}@media(min-width:1200px){.container{width:1170px}}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media(min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media(min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media(min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{position:static;display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>.active,.table>tbody>tr>.active,.table>tfoot>tr>.active,.table>thead>.active>td,.table>tbody>.active>td,.table>tfoot>.active>td,.table>thead>.active>th,.table>tbody>.active>th,.table>tfoot>.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>.active:hover,.table-hover>tbody>.active:hover>td,.table-hover>tbody>.active:hover>th{background-color:#e8e8e8}.table>thead>tr>.success,.table>tbody>tr>.success,.table>tfoot>tr>.success,.table>thead>.success>td,.table>tbody>.success>td,.table>tfoot>.success>td,.table>thead>.success>th,.table>tbody>.success>th,.table>tfoot>.success>th{background-color:#3fb618}.table-hover>tbody>tr>.success:hover,.table-hover>tbody>.success:hover>td,.table-hover>tbody>.success:hover>th{background-color:#379f15}.table>thead>tr>.danger,.table>tbody>tr>.danger,.table>tfoot>tr>.danger,.table>thead>.danger>td,.table>tbody>.danger>td,.table>tfoot>.danger>td,.table>thead>.danger>th,.table>tbody>.danger>th,.table>tfoot>.danger>th{background-color:#ff0039}.table-hover>tbody>tr>.danger:hover,.table-hover>tbody>.danger:hover>td,.table-hover>tbody>.danger:hover>th{background-color:#e60033}.table>thead>tr>.warning,.table>tbody>tr>.warning,.table>tfoot>tr>.warning,.table>thead>.warning>td,.table>tbody>.warning>td,.table>tfoot>.warning>td,.table>thead>.warning>th,.table>tbody>.warning>th,.table>tfoot>.warning>th{background-color:#ff7518}.table-hover>tbody>tr>.warning:hover,.table-hover>tbody>.warning:hover>td,.table-hover>tbody>.warning:hover>th{background-color:#fe6600}@media(max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd;-ms-overflow-style:-ms-autohiding-scrollbar;-webkit-overflow-scrolling:touch}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}output{display:block;padding-top:11px;font-size:15px;line-height:1.428571429;color:#333;vertical-align:middle}.form-control{display:block;width:100%;height:43px;padding:10px 18px;font-size:15px;line-height:1.428571429;color:#333;vertical-align:middle;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#e6e6e6}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:21px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-sm{height:31px;line-height:31px}textarea.input-sm{height:auto}.input-lg{height:64px;padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}select.input-lg{height:64px;line-height:64px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{color:#fff}.has-warning .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#fff;background-color:#ff7518;border-color:#fff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline{color:#fff}.has-error .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#fff;background-color:#ff0039;border-color:#fff}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{color:#fff}.has-success .form-control{border-color:#fff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#fff;background-color:#3fb618;border-color:#fff}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline select.form-control{width:auto}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:11px;margin-top:0;margin-bottom:0}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-control-static{padding-top:11px}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:10px 18px;margin-bottom:0;font-size:15px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;border-radius:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#fff;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#fff;background-color:#222;border-color:#222}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#fff;background-color:#0e0e0e;border-color:#040404}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#222;border-color:#222}.btn-default .badge{color:#222;background-color:#fff}.btn-primary{color:#fff;background-color:#007fff;border-color:#007fff}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#006bd6;border-color:#0061c2}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#007fff;border-color:#007fff}.btn-primary .badge{color:#007fff;background-color:#fff}.btn-warning{color:#fff;background-color:#ff7518;border-color:#ff7518}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ee6000;border-color:#da5800}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#ff7518;border-color:#ff7518}.btn-warning .badge{color:#ff7518;background-color:#fff}.btn-danger{color:#fff;background-color:#ff0039;border-color:#ff0039}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d60030;border-color:#c2002b}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#ff0039;border-color:#ff0039}.btn-danger .badge{color:#ff0039;background-color:#fff}.btn-success{color:#fff;background-color:#3fb618;border-color:#3fb618}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#339213;border-color:#2c8011}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#3fb618;border-color:#3fb618}.btn-success .badge{color:#3fb618;background-color:#fff}.btn-info{color:#fff;background-color:#9954bb;border-color:#9954bb}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#8441a5;border-color:#783c96}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#9954bb;border-color:#9954bb}.btn-info .badge{color:#9954bb;background-color:#fff}.btn-link{font-weight:normal;color:#007fff;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0059b3;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}.btn-sm{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-xs{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1;-moz-osx-font-smoothing:grayscale}.glyphicon:empty{width:1em}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:15px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:0;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#007fff}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#007fff;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:0}.btn-group-sm>.btn{padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}.btn-group-lg>.btn{padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:64px;padding:18px 30px;font-size:19px;line-height:1.33;border-radius:0}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:64px;line-height:64px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:31px;padding:5px 10px;font-size:13px;line-height:1.5;border-radius:0}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:31px;line-height:31px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 18px;font-size:15px;font-weight:normal;line-height:1;color:#333;text-align:center;background-color:#e6e6e6;border:1px solid #ccc;border-radius:0}.input-group-addon.input-sm{padding:5px 10px;font-size:13px;border-radius:0}.input-group-addon.input-lg{padding:18px 30px;font-size:19px;border-radius:0}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn:first-child>.btn{margin-right:-1px}.input-group-btn:last-child>.btn{margin-left:-1px}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#e6e6e6}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#e6e6e6;border-color:#007fff}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:0}.nav-tabs>li>a:hover{border-color:#e6e6e6 #e6e6e6 #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:0}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#007fff}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media(min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:21px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:0}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-right:0;padding-left:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:14.5px 15px;font-size:19px;line-height:21px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.25px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:14.5px;padding-bottom:14.5px}.navbar-nav.navbar-right:last-child{margin-right:-15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:3.5px;margin-right:-15px;margin-bottom:3.5px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form select.form-control{width:auto}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:3.5px;margin-bottom:3.5px}.navbar-btn.btn-sm{margin-top:9.5px;margin-bottom:9.5px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:14.5px;margin-bottom:14.5px}@media(min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#222;border-color:#121212}.navbar-default .navbar-brand{color:#fff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#fff;background-color:none}.navbar-default .navbar-text{color:#fff}.navbar-default .navbar-nav>li>a{color:#fff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#fff;background-color:#090909}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#fff;background-color:#090909}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:transparent}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#090909}.navbar-default .navbar-toggle .icon-bar{background-color:#fff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#121212}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#fff;background-color:#090909}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#090909}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#fff}.navbar-default .navbar-link:hover{color:#fff}.navbar-inverse{background-color:#007fff;border-color:#06c}.navbar-inverse .navbar-brand{color:#fff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:none}.navbar-inverse .navbar-text{color:#fff}.navbar-inverse .navbar-nav>li>a{color:#fff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:#06c}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#06c}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:transparent}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#06c}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#006ddb}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#06c}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#06c}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#06c}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#fff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:#06c}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#06c}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#fff;background-color:transparent}}.navbar-inverse .navbar-link{color:#fff}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#f5f5f5;border-radius:0}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 18px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:0;border-top-left-radius:0}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#e6e6e6}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#999;cursor:default;background-color:#f5f5f5;border-color:#f5f5f5}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 30px;font-size:19px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:13px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:0;border-top-left-radius:0}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:0;border-bottom-right-radius:0}.pager{padding-left:0;margin:21px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:0}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#e6e6e6}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#222}.label-default[href]:hover,.label-default[href]:focus{background-color:#090909}.label-primary{background-color:#007fff}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#06c}.label-success{background-color:#3fb618}.label-success[href]:hover,.label-success[href]:focus{background-color:#2f8912}.label-info{background-color:#9954bb}.label-info[href]:hover,.label-info[href]:focus{background-color:#7e3f9d}.label-warning{background-color:#ff7518}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#e45c00}.label-danger{background-color:#ff0039}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#cc002e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#007fff;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:23px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#e6e6e6}.jumbotron h1,.jumbotron .h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:0}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1,.jumbotron .h1{font-size:67.5px}}.thumbnail{display:block;padding:4px;margin-bottom:21px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:0;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#007fff}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:0}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#fff;background-color:#3fb618;border-color:#4e9f15}.alert-success hr{border-top-color:#438912}.alert-success .alert-link{color:#e6e6e6}.alert-info{color:#fff;background-color:#9954bb;border-color:#7643a8}.alert-info hr{border-top-color:#693c96}.alert-info .alert-link{color:#e6e6e6}.alert-warning{color:#fff;background-color:#ff7518;border-color:#ff4309}.alert-warning hr{border-top-color:#ee3800}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{color:#fff;background-color:#ff0039;border-color:#f0005e}.alert-danger hr{border-top-color:#d60054}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:21px;margin-bottom:21px;overflow:hidden;background-color:#ccc;border-radius:0;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:13px;line-height:21px;color:#fff;text-align:center;background-color:#007fff;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#3fb618}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#9954bb}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#ff7518}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#ff0039}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,0.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.15) 50%,rgba(255,255,255,0.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#007fff;border-color:#007fff}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#cce5ff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#fff;border:1px solid transparent;border-radius:0;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child th,.panel>.table>tbody:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:-1;border-top-left-radius:-1}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:-1;border-bottom-left-radius:-1}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:0}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#007fff}.panel-primary>.panel-heading{color:#fff;background-color:#007fff;border-color:#007fff}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#007fff}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#007fff}.panel-success{border-color:#4e9f15}.panel-success>.panel-heading{color:#fff;background-color:#3fb618;border-color:#4e9f15}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#4e9f15}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#4e9f15}.panel-warning{border-color:#ff4309}.panel-warning>.panel-heading{color:#fff;background-color:#ff7518;border-color:#ff4309}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#ff4309}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ff4309}.panel-danger{border-color:#f0005e}.panel-danger>.panel-heading{color:#fff;background-color:#ff0039;border-color:#f0005e}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#f0005e}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#f0005e}.panel-info{border-color:#7643a8}.panel-info>.panel-heading{color:#fff;background-color:#9954bb;border-color:#7643a8}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#7643a8}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#7643a8}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:0}.well-sm{padding:9px;border-radius:0}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;z-index:1050;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:0;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:13px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:rgba(0,0,0,0.9);border-radius:0}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:rgba(0,0,0,0.9);border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:rgba(0,0,0,0.9);border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:rgba(0,0,0,0.9);border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:rgba(0,0,0,0.9);border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:0;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:15px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;outline:0;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}table.visible-xs.visible-sm{display:table}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}table.visible-xs.visible-md{display:table}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}table.visible-xs.visible-lg{display:table}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}table.visible-sm.visible-xs{display:table}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}table.visible-sm.visible-md{display:table}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}table.visible-sm.visible-lg{display:table}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}table.visible-md.visible-xs{display:table}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}table.visible-md.visible-sm{display:table}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}table.visible-md.visible-lg{display:table}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}table.visible-lg.visible-xs{display:table}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}table.visible-lg.visible-sm{display:table}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}table.visible-lg.visible-md{display:table}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}table.hidden-xs{display:table}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,tr.hidden-xs.hidden-md,th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}table.hidden-sm{display:table}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,tr.hidden-sm.hidden-md,th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}table.hidden-md{display:table}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs,tr.hidden-md.hidden-xs,th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,tr.hidden-md.hidden-sm,th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg,tr.hidden-md.hidden-lg,th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}table.hidden-lg{display:table}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,tr.hidden-lg.hidden-md,th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}}.btn{border:0}.text-primary,.text-primary:hover{color:#007fff}.text-success,.text-success:hover{color:#3fb618}.text-danger,.text-danger:hover{color:#ff0039}.text-warning,.text-warning:hover{color:#ff7518}.text-info,.text-info:hover{color:#9954bb}.table tr.success,.table tr.warning,.table tr.danger{color:#fff}.has-warning .help-block,.has-warning .control-label{color:#ff7518}.has-warning .form-control,.has-warning .form-control:focus{border:1px solid #ff7518}.has-error .help-block,.has-error .control-label{color:#ff0039}.has-error .form-control,.has-error .form-control:focus{border:1px solid #ff0039}.has-success .help-block,.has-success .control-label{color:#3fb618}.has-success .form-control,.has-success .form-control:focus{border:1px solid #3fb618}.nav-pills>li>a{border-radius:0}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{background-image:none}.pagination .active>a,.pagination .active>a:hover{border-color:#ddd}.alert{border:0}.alert .alert-link{color:#fff;text-decoration:underline}.label{border-radius:0}.close{opacity:1}.progress{height:8px;-webkit-box-shadow:none;box-shadow:none}.panel-heading,.panel-footer{border-top-right-radius:0;border-top-left-radius:0}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed} \ No newline at end of file diff --git a/css/font-awesome-4.0.3.css b/css/font-awesome-4.0.3.css new file mode 100644 index 00000000..048cff97 --- /dev/null +++ b/css/font-awesome-4.0.3.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome-webfont.eot?v=4.0.3'); + src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/css/prettify-1.0.css b/css/prettify-1.0.css new file mode 100644 index 00000000..e0df2455 --- /dev/null +++ b/css/prettify-1.0.css @@ -0,0 +1,28 @@ +.com { color: #93a1a1; } +.lit { color: #195f91; } +.pun, .opn, .clo { color: #93a1a1; } +.fun { color: #dc322f; } +.str, .atv { color: #D14; } +.kwd, .prettyprint .tag { color: #1e347b; } +.typ, .atn, .dec, .var { color: teal; } +.pln { color: #48484c; } + +.prettyprint { + padding: 8px; +} +.prettyprint.linenums { + -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; + box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0; +} + +/* Specify class=linenums on a pre to get line numbering */ +ol.linenums { + margin: 0 0 0 33px; /* IE indents via margin-left */ +} +ol.linenums li { + padding-left: 12px; + color: #bebec5; + line-height: 20px; + text-shadow: 0 1px 0 #fff; +} diff --git a/fonts/fontawesome-webfont.eot b/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..7c79c6a6 Binary files /dev/null and b/fonts/fontawesome-webfont.eot differ diff --git a/fonts/fontawesome-webfont.svg b/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..45fdf338 --- /dev/null +++ b/fonts/fontawesome-webfont.svg @@ -0,0 +1,414 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/fontawesome-webfont.ttf b/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..e89738de Binary files /dev/null and b/fonts/fontawesome-webfont.ttf differ diff --git a/fonts/fontawesome-webfont.woff b/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..8c1748aa Binary files /dev/null and b/fonts/fontawesome-webfont.woff differ diff --git a/highlight.js b/highlight.js new file mode 100644 index 00000000..e2f4f43f --- /dev/null +++ b/highlight.js @@ -0,0 +1 @@ +hljs.initHighlightingOnLoad(); \ No newline at end of file diff --git a/img/favicon.ico b/img/favicon.ico new file mode 100644 index 00000000..e85006a3 Binary files /dev/null and b/img/favicon.ico differ diff --git a/index.html b/index.html new file mode 100644 index 00000000..5d02c719 --- /dev/null +++ b/index.html @@ -0,0 +1,219 @@ + + + + + + + + + + + + SpotifyAPI-NET + + + + + + + + + + + + + + + +
+
+
+ +

SpotifyAPI-NET Documentation

+

About

+

This Library, written in C#/.NET, combines two independent SpotifyAPIs into one.

+

Spotify's Web API (link)

+
+

Based on simple REST principles, our Web API endpoints return metadata in JSON format about artists, albums, and tracks directly from the Spotify catalogue. +The API also provides access to user-related data such as playlists and music saved in a “Your Music” library, subject to user’s authorization.

+
+

Spotify's unofficial Local API

+
+

Do you ever wanted to control your local Spotify Client with some sort of API? Now you can! This API gives you full control over your spotify client. +You can get infos about the currently playing song, get its Album-Art, skip/pause and much more. It also features multiple Event-Interfaces.

+
+

Both combined can be used for any kind of application.

+
+

Installing

+ +
Install-Package SpotifyAPI-NET
+//or
+Install-Package SpotifyAPI-NET -pre
+
+ + +
+

Projects

+

Spofy by @eltoncezar

+
+

A Spotify mini player and notifier for Windows

+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/js/base.js b/js/base.js new file mode 100644 index 00000000..860efef9 --- /dev/null +++ b/js/base.js @@ -0,0 +1,52 @@ + +/* Prettyify */ +$( document ).ready(function() { + hljs.initHighlightingOnLoad(); + $('table').addClass('table table-striped table-hover'); +}); + +/* Scrollspy */ +var navHeight = $('.navbar').outerHeight(true) + 10 + +$('body').scrollspy({ + target: '.bs-sidebar', + offset: navHeight +}) + + +/* Prevent disabled links from causing a page reload */ +$("li.disabled a").click(function() { + event.preventDefault(); +}); + + +/* Adjust the scroll height of anchors to compensate for the fixed navbar */ +window.disableShift = false; +var shiftWindow = function() { + if (window.disableShift) { + window.disableShift = false; + } else { + /* If we're at the bottom of the page, don't erronously scroll up */ + var scrolledToBottomOfPage = ( + (window.innerHeight + window.scrollY) >= document.body.offsetHeight + ); + if (!scrolledToBottomOfPage) { + scrollBy(0, -60); + }; + }; +}; +if (location.hash) {shiftWindow();} +window.addEventListener("hashchange", shiftWindow); + + +/* Deal with clicks on nav links that do not change the current anchor link. */ +$("ul.nav a" ).click(function() { + var href = this.href; + var suffix = location.hash; + var matchesCurrentHash = (href.indexOf(suffix, href.length - suffix.length) !== -1); + if (location.hash && matchesCurrentHash) { + /* Force a single 'hashchange' event to occur after the click event */ + window.disableShift = true; + location.hash=''; + }; +}); diff --git a/js/bootstrap-3.0.3.min.js b/js/bootstrap-3.0.3.min.js new file mode 100644 index 00000000..1a6258ef --- /dev/null +++ b/js/bootstrap-3.0.3.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.0.3 (http://getbootstrap.com) + * Copyright 2013 Twitter, Inc. + * Licensed under http://www.apache.org/licenses/LICENSE-2.0 + */ + +if("undefined"==typeof jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]'),b=!0;if(a.length){var c=this.$element.find("input");"radio"===c.prop("type")&&(c.prop("checked")&&this.$element.hasClass("active")?b=!1:a.find(".active").removeClass("active")),b&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}b&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file diff --git a/js/prettify-1.0.min.js b/js/prettify-1.0.min.js new file mode 100644 index 00000000..eef5ad7e --- /dev/null +++ b/js/prettify-1.0.min.js @@ -0,0 +1,28 @@ +var q=null;window.PR_SHOULD_USE_CONTINUATION=!0; +(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a= +[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;ci[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m), +l=[],p={},d=0,g=e.length;d=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/, +q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/, +q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g, +"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a), +a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e} +for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"], +"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"], +H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"], +J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+ +I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]), +["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css", +/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}), +["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes", +hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p=0){var k=k.match(g),f,b;if(b= +!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}pr;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(en.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone();for(var r=0,o=n.toArray();rp;p++)c[p]===a&&d++;h+=d/f*l.boost}}this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(this.tokenizerFn(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),d=Object.keys(f),p=d.length,v=0;p>v;v++)l.add(f[d[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,tokenizer:this.tokenizerFn.label,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),d=new RegExp(u),p=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,g=/^(.+?)eed$/,m=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),k=new RegExp("^"+r+i+"[^aeiouwxy]$"),x=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,F=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,_=/^(.+?)(s|t)(ion)$/,z=/^(.+?)e$/,O=/ll$/,P=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=p,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=g,a=m,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=d,a.test(i)&&(n=i,a=S,h=w,u=k,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=x,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=F,a=_,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=z,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=P,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=O,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n":">",'"':""","'":"'","/":"/"};function escapeHtml(string){return String(string).replace(/[&<>"'\/]/g,function(s){return entityMap[s]})}var whiteRe=/\s*/;var spaceRe=/\s+/;var equalsRe=/\s*=/;var curlyRe=/\s*\}/;var tagRe=/#|\^|\/|>|\{|&|=|!/;function parseTemplate(template,tags){if(!template)return[];var sections=[];var tokens=[];var spaces=[];var hasTag=false;var nonSpace=false;function stripSpace(){if(hasTag&&!nonSpace){while(spaces.length)delete tokens[spaces.pop()]}else{spaces=[]}hasTag=false;nonSpace=false}var openingTagRe,closingTagRe,closingCurlyRe;function compileTags(tags){if(typeof tags==="string")tags=tags.split(spaceRe,2);if(!isArray(tags)||tags.length!==2)throw new Error("Invalid tags: "+tags);openingTagRe=new RegExp(escapeRegExp(tags[0])+"\\s*");closingTagRe=new RegExp("\\s*"+escapeRegExp(tags[1]));closingCurlyRe=new RegExp("\\s*"+escapeRegExp("}"+tags[1]))}compileTags(tags||mustache.tags);var scanner=new Scanner(template);var start,type,value,chr,token,openSection;while(!scanner.eos()){start=scanner.pos;value=scanner.scanUntil(openingTagRe);if(value){for(var i=0,valueLength=value.length;i0?sections[sections.length-1][4]:nestedTokens;break;default:collector.push(token)}}return nestedTokens}function Scanner(string){this.string=string;this.tail=string;this.pos=0}Scanner.prototype.eos=function(){return this.tail===""};Scanner.prototype.scan=function(re){var match=this.tail.match(re);if(!match||match.index!==0)return"";var string=match[0];this.tail=this.tail.substring(string.length);this.pos+=string.length;return string};Scanner.prototype.scanUntil=function(re){var index=this.tail.search(re),match;switch(index){case-1:match=this.tail;this.tail="";break;case 0:match="";break;default:match=this.tail.substring(0,index);this.tail=this.tail.substring(index)}this.pos+=match.length;return match};function Context(view,parentContext){this.view=view;this.cache={".":this.view};this.parent=parentContext}Context.prototype.push=function(view){return new Context(view,this)};Context.prototype.lookup=function(name){var cache=this.cache;var value;if(name in cache){value=cache[name]}else{var context=this,names,index,lookupHit=false;while(context){if(name.indexOf(".")>0){value=context.view;names=name.split(".");index=0;while(value!=null&&index")value=this._renderPartial(token,context,partials,originalTemplate);else if(symbol==="&")value=this._unescapedValue(token,context);else if(symbol==="name")value=this._escapedValue(token,context);else if(symbol==="text")value=this._rawValue(token);if(value!==undefined)buffer+=value}return buffer};Writer.prototype._renderSection=function(token,context,partials,originalTemplate){var self=this;var buffer="";var value=context.lookup(token[1]);function subRender(template){return self.render(template,context,partials)}if(!value)return;if(isArray(value)){for(var j=0,valueLength=value.length;jthis.depCount&&!this.defined){if(G(l)){if(this.events.error&&this.map.isDefine||g.onError!==ca)try{f=i.execCb(c,l,b,f)}catch(d){a=d}else f=i.execCb(c,l,b,f);this.map.isDefine&&void 0===f&&((b=this.module)?f=b.exports:this.usingExports&& +(f=this.exports));if(a)return a.requireMap=this.map,a.requireModules=this.map.isDefine?[this.map.id]:null,a.requireType=this.map.isDefine?"define":"require",w(this.error=a)}else f=l;this.exports=f;if(this.map.isDefine&&!this.ignore&&(r[c]=f,g.onResourceLoad))g.onResourceLoad(i,this.map,this.depMaps);y(c);this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a= +this.map,b=a.id,d=p(a.prefix);this.depMaps.push(d);q(d,"defined",u(this,function(f){var l,d;d=m(aa,this.map.id);var e=this.map.name,P=this.map.parentMap?this.map.parentMap.name:null,n=i.makeRequire(a.parentMap,{enableBuildCallback:!0});if(this.map.unnormalized){if(f.normalize&&(e=f.normalize(e,function(a){return c(a,P,!0)})||""),f=p(a.prefix+"!"+e,this.map.parentMap),q(f,"defined",u(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=m(h,f.id)){this.depMaps.push(f); +if(this.events.error)d.on("error",u(this,function(a){this.emit("error",a)}));d.enable()}}else d?(this.map.url=i.nameToUrl(d),this.load()):(l=u(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),l.error=u(this,function(a){this.inited=!0;this.error=a;a.requireModules=[b];B(h,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&y(a.map.id)});w(a)}),l.fromText=u(this,function(f,c){var d=a.name,e=p(d),P=M;c&&(f=c);P&&(M=!1);s(e);t(j.config,b)&&(j.config[d]=j.config[b]);try{g.exec(f)}catch(h){return w(C("fromtexteval", +"fromText eval for "+b+" failed: "+h,h,[b]))}P&&(M=!0);this.depMaps.push(e);i.completeLoad(d);n([d],l)}),f.load(a.name,n,l,j))}));i.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){V[this.map.id]=this;this.enabling=this.enabled=!0;v(this.depMaps,u(this,function(a,b){var c,f;if("string"===typeof a){a=p(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=m(L,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;q(a,"defined",u(this,function(a){this.defineDep(b, +a);this.check()}));this.errback?q(a,"error",u(this,this.errback)):this.events.error&&q(a,"error",u(this,function(a){this.emit("error",a)}))}c=a.id;f=h[c];!t(L,c)&&(f&&!f.enabled)&&i.enable(a,this)}));B(this.pluginMaps,u(this,function(a){var b=m(h,a.id);b&&!b.enabled&&i.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c=this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){v(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};i={config:j,contextName:b, +registry:h,defined:r,urlFetched:S,defQueue:A,Module:Z,makeModuleMap:p,nextTick:g.nextTick,onError:w,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=j.shim,c={paths:!0,bundles:!0,config:!0,map:!0};B(a,function(a,b){c[b]?(j[b]||(j[b]={}),U(j[b],a,!0,!0)):j[b]=a});a.bundles&&B(a.bundles,function(a,b){v(a,function(a){a!==b&&(aa[a]=b)})});a.shim&&(B(a.shim,function(a,c){H(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=i.makeShimExports(a); +b[c]=a}),j.shim=b);a.packages&&v(a.packages,function(a){var b,a="string"===typeof a?{name:a}:a;b=a.name;a.location&&(j.paths[b]=a.location);j.pkgs[b]=a.name+"/"+(a.main||"main").replace(ia,"").replace(Q,"")});B(h,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=p(b))});if(a.deps||a.callback)i.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(ba,arguments));return b||a.exports&&da(a.exports)}},makeRequire:function(a,e){function j(c,d,m){var n, +q;e.enableBuildCallback&&(d&&G(d))&&(d.__requireJsBuild=!0);if("string"===typeof c){if(G(d))return w(C("requireargs","Invalid require call"),m);if(a&&t(L,c))return L[c](h[a.id]);if(g.get)return g.get(i,c,a,j);n=p(c,a,!1,!0);n=n.id;return!t(r,n)?w(C("notloaded",'Module name "'+n+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):r[n]}J();i.nextTick(function(){J();q=s(p(null,a));q.skipMap=e.skipMap;q.init(c,d,m,{enabled:!0});D()});return j}e=e||{};U(j,{isBrowser:z,toUrl:function(b){var d, +e=b.lastIndexOf("."),k=b.split("/")[0];if(-1!==e&&(!("."===k||".."===k)||1e.attachEvent.toString().indexOf("[native code"))&& +!Y?(M=!0,e.attachEvent("onreadystatechange",b.onScriptLoad)):(e.addEventListener("load",b.onScriptLoad,!1),e.addEventListener("error",b.onScriptError,!1)),e.src=d,J=e,D?y.insertBefore(e,D):y.appendChild(e),J=null,e;if(ea)try{importScripts(d),b.completeLoad(c)}catch(m){b.onError(C("importscripts","importScripts failed for "+c+" at "+d,m,[c]))}};z&&!q.skipDataMain&&T(document.getElementsByTagName("script"),function(b){y||(y=b.parentNode);if(I=b.getAttribute("data-main"))return s=I,q.baseUrl||(E=s.split("/"), +s=E.pop(),O=E.length?E.join("/")+"/":"./",q.baseUrl=O),s=s.replace(Q,""),g.jsExtRegExp.test(s)&&(s=I),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var e,g;"string"!==typeof b&&(d=c,c=b,b=null);H(c)||(d=c,c=null);!c&&G(d)&&(c=[],d.length&&(d.toString().replace(ka,"").replace(la,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c)));if(M){if(!(e=J))N&&"interactive"===N.readyState||T(document.getElementsByTagName("script"),function(b){if("interactive"=== +b.readyState)return N=b}),e=N;e&&(b||(b=e.getAttribute("data-requiremodule")),g=F[e.getAttribute("data-requirecontext")])}(g?g.defQueue:R).push([b,c,d])};define.amd={jQuery:!0};g.exec=function(b){return eval(b)};g(q)}})(this); diff --git a/mkdocs/js/search-results-template.mustache b/mkdocs/js/search-results-template.mustache new file mode 100644 index 00000000..a8b3862f --- /dev/null +++ b/mkdocs/js/search-results-template.mustache @@ -0,0 +1,4 @@ + diff --git a/mkdocs/js/search.js b/mkdocs/js/search.js new file mode 100644 index 00000000..d5c86616 --- /dev/null +++ b/mkdocs/js/search.js @@ -0,0 +1,88 @@ +require([ + base_url + '/mkdocs/js/mustache.min.js', + base_url + '/mkdocs/js/lunr.min.js', + 'text!search-results-template.mustache', + 'text!../search_index.json', +], function (Mustache, lunr, results_template, data) { + "use strict"; + + function getSearchTerm() + { + var sPageURL = window.location.search.substring(1); + var sURLVariables = sPageURL.split('&'); + for (var i = 0; i < sURLVariables.length; i++) + { + var sParameterName = sURLVariables[i].split('='); + if (sParameterName[0] == 'q') + { + return decodeURIComponent(sParameterName[1].replace(/\+/g, '%20')); + } + } + } + + var index = lunr(function () { + this.field('title', {boost: 10}); + this.field('text'); + this.ref('location'); + }); + + data = JSON.parse(data); + var documents = {}; + + for (var i=0; i < data.docs.length; i++){ + var doc = data.docs[i]; + doc.location = base_url + doc.location; + index.add(doc); + documents[doc.location] = doc; + } + + var search = function(){ + + var query = document.getElementById('mkdocs-search-query').value; + var search_results = document.getElementById("mkdocs-search-results"); + while (search_results.firstChild) { + search_results.removeChild(search_results.firstChild); + } + + if(query === ''){ + return; + } + + var results = index.search(query); + + if (results.length > 0){ + for (var i=0; i < results.length; i++){ + var result = results[i]; + doc = documents[result.ref]; + doc.base_url = base_url; + doc.summary = doc.text.substring(0, 200); + var html = Mustache.to_html(results_template, doc); + search_results.insertAdjacentHTML('beforeend', html); + } + } else { + search_results.insertAdjacentHTML('beforeend', "

No results found

"); + } + + if(jQuery){ + /* + * We currently only automatically hide bootstrap models. This + * requires jQuery to work. + */ + jQuery('#mkdocs_search_modal a').click(function(){ + jQuery('#mkdocs_search_modal').modal('hide'); + }); + } + + }; + + var search_input = document.getElementById('mkdocs-search-query'); + + var term = getSearchTerm(); + if (term){ + search_input.value = term; + search(); + } + + search_input.addEventListener("keyup", search); + +}); diff --git a/mkdocs/js/text.js b/mkdocs/js/text.js new file mode 100644 index 00000000..17921b6e --- /dev/null +++ b/mkdocs/js/text.js @@ -0,0 +1,390 @@ +/** + * @license RequireJS text 2.0.12 Copyright (c) 2010-2014, The Dojo Foundation All Rights Reserved. + * Available via the MIT or new BSD license. + * see: http://github.com/requirejs/text for details + */ +/*jslint regexp: true */ +/*global require, XMLHttpRequest, ActiveXObject, + define, window, process, Packages, + java, location, Components, FileUtils */ + +define(['module'], function (module) { + 'use strict'; + + var text, fs, Cc, Ci, xpcIsWindows, + progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], + xmlRegExp = /^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, + bodyRegExp = /]*>\s*([\s\S]+)\s*<\/body>/im, + hasLocation = typeof location !== 'undefined' && location.href, + defaultProtocol = hasLocation && location.protocol && location.protocol.replace(/\:/, ''), + defaultHostName = hasLocation && location.hostname, + defaultPort = hasLocation && (location.port || undefined), + buildMap = {}, + masterConfig = (module.config && module.config()) || {}; + + text = { + version: '2.0.12', + + strip: function (content) { + //Strips declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if (content) { + content = content.replace(xmlRegExp, ""); + var matches = content.match(bodyRegExp); + if (matches) { + content = matches[1]; + } + } else { + content = ""; + } + return content; + }, + + jsEscape: function (content) { + return content.replace(/(['\\])/g, '\\$1') + .replace(/[\f]/g, "\\f") + .replace(/[\b]/g, "\\b") + .replace(/[\n]/g, "\\n") + .replace(/[\t]/g, "\\t") + .replace(/[\r]/g, "\\r") + .replace(/[\u2028]/g, "\\u2028") + .replace(/[\u2029]/g, "\\u2029"); + }, + + createXhr: masterConfig.createXhr || function () { + //Would love to dump the ActiveX crap in here. Need IE 6 to die first. + var xhr, i, progId; + if (typeof XMLHttpRequest !== "undefined") { + return new XMLHttpRequest(); + } else if (typeof ActiveXObject !== "undefined") { + for (i = 0; i < 3; i += 1) { + progId = progIds[i]; + try { + xhr = new ActiveXObject(progId); + } catch (e) {} + + if (xhr) { + progIds = [progId]; // so faster next time + break; + } + } + } + + return xhr; + }, + + /** + * Parses a resource name into its component parts. Resource names + * look like: module/name.ext!strip, where the !strip part is + * optional. + * @param {String} name the resource name + * @returns {Object} with properties "moduleName", "ext" and "strip" + * where strip is a boolean. + */ + parseName: function (name) { + var modName, ext, temp, + strip = false, + index = name.indexOf("."), + isRelative = name.indexOf('./') === 0 || + name.indexOf('../') === 0; + + if (index !== -1 && (!isRelative || index > 1)) { + modName = name.substring(0, index); + ext = name.substring(index + 1, name.length); + } else { + modName = name; + } + + temp = ext || modName; + index = temp.indexOf("!"); + if (index !== -1) { + //Pull off the strip arg. + strip = temp.substring(index + 1) === "strip"; + temp = temp.substring(0, index); + if (ext) { + ext = temp; + } else { + modName = temp; + } + } + + return { + moduleName: modName, + ext: ext, + strip: strip + }; + }, + + xdRegExp: /^((\w+)\:)?\/\/([^\/\\]+)/, + + /** + * Is an URL on another domain. Only works for browser use, returns + * false in non-browser environments. Only used to know if an + * optimized .js version of a text resource should be loaded + * instead. + * @param {String} url + * @returns Boolean + */ + useXhr: function (url, protocol, hostname, port) { + var uProtocol, uHostName, uPort, + match = text.xdRegExp.exec(url); + if (!match) { + return true; + } + uProtocol = match[2]; + uHostName = match[3]; + + uHostName = uHostName.split(':'); + uPort = uHostName[1]; + uHostName = uHostName[0]; + + return (!uProtocol || uProtocol === protocol) && + (!uHostName || uHostName.toLowerCase() === hostname.toLowerCase()) && + ((!uPort && !uHostName) || uPort === port); + }, + + finishLoad: function (name, strip, content, onLoad) { + content = strip ? text.strip(content) : content; + if (masterConfig.isBuild) { + buildMap[name] = content; + } + onLoad(content); + }, + + load: function (name, req, onLoad, config) { + //Name has format: some.module.filext!strip + //The strip part is optional. + //if strip is present, then that means only get the string contents + //inside a body tag in an HTML string. For XML/SVG content it means + //removing the declarations so the content can be inserted + //into the current doc without problems. + + // Do not bother with the work if a build and text will + // not be inlined. + if (config && config.isBuild && !config.inlineText) { + onLoad(); + return; + } + + masterConfig.isBuild = config && config.isBuild; + + var parsed = text.parseName(name), + nonStripName = parsed.moduleName + + (parsed.ext ? '.' + parsed.ext : ''), + url = req.toUrl(nonStripName), + useXhr = (masterConfig.useXhr) || + text.useXhr; + + // Do not load if it is an empty: url + if (url.indexOf('empty:') === 0) { + onLoad(); + return; + } + + //Load the text. Use XHR if possible and in a browser. + if (!hasLocation || useXhr(url, defaultProtocol, defaultHostName, defaultPort)) { + text.get(url, function (content) { + text.finishLoad(name, parsed.strip, content, onLoad); + }, function (err) { + if (onLoad.error) { + onLoad.error(err); + } + }); + } else { + //Need to fetch the resource across domains. Assume + //the resource has been optimized into a JS module. Fetch + //by the module name + extension, but do not include the + //!strip part to avoid file system issues. + req([nonStripName], function (content) { + text.finishLoad(parsed.moduleName + '.' + parsed.ext, + parsed.strip, content, onLoad); + }); + } + }, + + write: function (pluginName, moduleName, write, config) { + if (buildMap.hasOwnProperty(moduleName)) { + var content = text.jsEscape(buildMap[moduleName]); + write.asModule(pluginName + "!" + moduleName, + "define(function () { return '" + + content + + "';});\n"); + } + }, + + writeFile: function (pluginName, moduleName, req, write, config) { + var parsed = text.parseName(moduleName), + extPart = parsed.ext ? '.' + parsed.ext : '', + nonStripName = parsed.moduleName + extPart, + //Use a '.js' file name so that it indicates it is a + //script that can be loaded across domains. + fileName = req.toUrl(parsed.moduleName + extPart) + '.js'; + + //Leverage own load() method to load plugin value, but only + //write out values that do not have the strip argument, + //to avoid any potential issues with ! in file names. + text.load(nonStripName, req, function (value) { + //Use own write() method to construct full module value. + //But need to create shell that translates writeFile's + //write() to the right interface. + var textWrite = function (contents) { + return write(fileName, contents); + }; + textWrite.asModule = function (moduleName, contents) { + return write.asModule(moduleName, fileName, contents); + }; + + text.write(pluginName, nonStripName, textWrite, config); + }, config); + } + }; + + if (masterConfig.env === 'node' || (!masterConfig.env && + typeof process !== "undefined" && + process.versions && + !!process.versions.node && + !process.versions['node-webkit'])) { + //Using special require.nodeRequire, something added by r.js. + fs = require.nodeRequire('fs'); + + text.get = function (url, callback, errback) { + try { + var file = fs.readFileSync(url, 'utf8'); + //Remove BOM (Byte Mark Order) from utf8 files if it is there. + if (file.indexOf('\uFEFF') === 0) { + file = file.substring(1); + } + callback(file); + } catch (e) { + if (errback) { + errback(e); + } + } + }; + } else if (masterConfig.env === 'xhr' || (!masterConfig.env && + text.createXhr())) { + text.get = function (url, callback, errback, headers) { + var xhr = text.createXhr(), header; + xhr.open('GET', url, true); + + //Allow plugins direct access to xhr headers + if (headers) { + for (header in headers) { + if (headers.hasOwnProperty(header)) { + xhr.setRequestHeader(header.toLowerCase(), headers[header]); + } + } + } + + //Allow overrides specified in config + if (masterConfig.onXhr) { + masterConfig.onXhr(xhr, url); + } + + xhr.onreadystatechange = function (evt) { + var status, err; + //Do not explicitly handle errors, those should be + //visible via console output in the browser. + if (xhr.readyState === 4) { + status = xhr.status || 0; + if (status > 399 && status < 600) { + //An http 4xx or 5xx error. Signal an error. + err = new Error(url + ' HTTP status: ' + status); + err.xhr = xhr; + if (errback) { + errback(err); + } + } else { + callback(xhr.responseText); + } + + if (masterConfig.onXhrComplete) { + masterConfig.onXhrComplete(xhr, url); + } + } + }; + xhr.send(null); + }; + } else if (masterConfig.env === 'rhino' || (!masterConfig.env && + typeof Packages !== 'undefined' && typeof java !== 'undefined')) { + //Why Java, why is this so awkward? + text.get = function (url, callback) { + var stringBuffer, line, + encoding = "utf-8", + file = new java.io.File(url), + lineSeparator = java.lang.System.getProperty("line.separator"), + input = new java.io.BufferedReader(new java.io.InputStreamReader(new java.io.FileInputStream(file), encoding)), + content = ''; + try { + stringBuffer = new java.lang.StringBuffer(); + line = input.readLine(); + + // Byte Order Mark (BOM) - The Unicode Standard, version 3.0, page 324 + // http://www.unicode.org/faq/utf_bom.html + + // Note that when we use utf-8, the BOM should appear as "EF BB BF", but it doesn't due to this bug in the JDK: + // http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4508058 + if (line && line.length() && line.charAt(0) === 0xfeff) { + // Eat the BOM, since we've already found the encoding on this file, + // and we plan to concatenating this buffer with others; the BOM should + // only appear at the top of a file. + line = line.substring(1); + } + + if (line !== null) { + stringBuffer.append(line); + } + + while ((line = input.readLine()) !== null) { + stringBuffer.append(lineSeparator); + stringBuffer.append(line); + } + //Make sure we return a JavaScript string and not a Java string. + content = String(stringBuffer.toString()); //String + } finally { + input.close(); + } + callback(content); + }; + } else if (masterConfig.env === 'xpconnect' || (!masterConfig.env && + typeof Components !== 'undefined' && Components.classes && + Components.interfaces)) { + //Avert your gaze! + Cc = Components.classes; + Ci = Components.interfaces; + Components.utils['import']('resource://gre/modules/FileUtils.jsm'); + xpcIsWindows = ('@mozilla.org/windows-registry-key;1' in Cc); + + text.get = function (url, callback) { + var inStream, convertStream, fileObj, + readData = {}; + + if (xpcIsWindows) { + url = url.replace(/\//g, '\\'); + } + + fileObj = new FileUtils.File(url); + + //XPCOM, you so crazy + try { + inStream = Cc['@mozilla.org/network/file-input-stream;1'] + .createInstance(Ci.nsIFileInputStream); + inStream.init(fileObj, 1, 0, false); + + convertStream = Cc['@mozilla.org/intl/converter-input-stream;1'] + .createInstance(Ci.nsIConverterInputStream); + convertStream.init(inStream, "utf-8", inStream.available(), + Ci.nsIConverterInputStream.DEFAULT_REPLACEMENT_CHARACTER); + + convertStream.readString(inStream.available(), readData); + convertStream.close(); + inStream.close(); + callback(readData.value); + } catch (e) { + throw new Error((fileObj && fileObj.path || '') + ': ' + e); + } + }; + } + return text; +}); diff --git a/mkdocs/search_index.json b/mkdocs/search_index.json new file mode 100644 index 00000000..8c6e4f91 --- /dev/null +++ b/mkdocs/search_index.json @@ -0,0 +1,559 @@ +{ + "docs": [ + { + "location": "/", + "text": "SpotifyAPI-NET Documentation\n\n\nAbout\n\n\nThis Library, written in C#/.NET, combines two independent SpotifyAPIs into one.\n\n\nSpotify's Web API\n (\nlink\n)\n\n\n\n\nBased on simple REST principles, our Web API endpoints return metadata in JSON format about artists, albums, and tracks directly from the Spotify catalogue.\nThe API also provides access to user-related data such as playlists and music saved in a \u201cYour Music\u201d library, subject to user\u2019s authorization.\n\n\n\n\nSpotify's \nunofficial\n Local API\n\n\n\n\nDo you ever wanted to control your local Spotify Client with some sort of API? Now you can! This API gives you full control over your spotify client.\nYou can get infos about the currently playing song, get its Album-Art, skip/pause and much more. It also features multiple Event-Interfaces.\n\n\n\n\nBoth combined can be used for any kind of application.\n\n\n\n\nInstalling\n\n\n\n\nVia NuGet Package:\n\n\n\n\nInstall-Package SpotifyAPI-NET\n//or\nInstall-Package SpotifyAPI-NET -pre\n\n\n\n\n\n\nDownload the latest binaries on the \nGitHub Release Page\n and add it to your Project\n\n\nClone the Repo and build the project on your local machine.\n\n\n\n\n\n\nProjects\n\n\nSpofy\n by \n@eltoncezar\n\n\n\n\nA Spotify mini player and notifier for Windows", + "title": "Home" + }, + { + "location": "/#spotifyapi-net-documentation", + "text": "", + "title": "SpotifyAPI-NET Documentation" + }, + { + "location": "/#about", + "text": "This Library, written in C#/.NET, combines two independent SpotifyAPIs into one. Spotify's Web API ( link ) Based on simple REST principles, our Web API endpoints return metadata in JSON format about artists, albums, and tracks directly from the Spotify catalogue.\nThe API also provides access to user-related data such as playlists and music saved in a \u201cYour Music\u201d library, subject to user\u2019s authorization. Spotify's unofficial Local API Do you ever wanted to control your local Spotify Client with some sort of API? Now you can! This API gives you full control over your spotify client.\nYou can get infos about the currently playing song, get its Album-Art, skip/pause and much more. It also features multiple Event-Interfaces. Both combined can be used for any kind of application.", + "title": "About" + }, + { + "location": "/#installing", + "text": "Via NuGet Package: Install-Package SpotifyAPI-NET\n//or\nInstall-Package SpotifyAPI-NET -pre Download the latest binaries on the GitHub Release Page and add it to your Project Clone the Repo and build the project on your local machine.", + "title": "Installing" + }, + { + "location": "/#projects", + "text": "", + "title": "Projects" + }, + { + "location": "/#spofy-by-eltoncezar", + "text": "A Spotify mini player and notifier for Windows", + "title": "Spofy by @eltoncezar" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/", + "text": "Getting started\n\n\nThis API provides full access to the new SpotifyWebAPI introduced \nhere\n.\n\nWith it, you can search for Tracks/Albums/Artists and also get User-based information.\n\nIt's also possible to create new playlists and add tracks to it.\n\n\n\n\nFirst steps\n\n\nImports\n\nSo after you added the API to your project, you may want to add following imports to your files:\n\n\nusing SpotifyAPI.Web; //Base Namespace\nusing SpotifyAPI.Web.Auth; //All Authentication-related classes\nusing SpotifyAPI.Web.Enums; //Enums\nusing SpotifyAPI.Web.Models; //Models for the JSON-responses\n\n\n\n\nBasic-Usage\n\nNow you can actually start doing calls to the SpotifyAPI, just create a new Instance of SpotifyWebAPI:\n\n\nprivate static SpotifyWebAPI _spotify;\n\npublic static void Main(String[] args)\n{\n _spotify = new SpotifyWebAPI()\n {\n UseAuth = false, //This will disable Authentication.\n }\n FullTrack track = _spotify.GetTrack(\n3Hvu1pq89D4R0lyPBoujSv\n);\n Console.WriteLine(track.Name); //Yeay! We just printed a tracks name.\n //...\n}\n\n\n\n\n\n\nAuthentication\n\n\nIf you look through the available API-Methods, you will soon notice nearly all of them require Authentication.\nFurther infos on how to implement Authentication can be found \nhere\n\n\n\n\nExamples\n\n\nA list of small examples can be found \nhere\n. Do you think a specific example is missing? Feel free to open a PR/Issue!\n\n\n\n\nError-Handling\n\n\nEvery API-Call returns a reponse-model which consists of base-error model. To check if a specific API-Call was successful, use the following approach:\n\n\nPrivateProfile profile = _spotify.GetPrivateProfile();\nif (profile.HasError())\n{\n Console.WriteLine(\nError Status: \n + profile.Error.Status);\n Console.WriteLine(\nError Msg: \n + profile.Error.Message);\n}\n\n\n\n\nAsynchronous\n\n\nEvery API-Call now has an asynchronous method. Just append \nAsync\n to the Method-Name.\n\nExample:\n\n\npublic async void Test()\n{\n var profile = await _spotify.GetPrivateProfileAsync();\n Console.WriteLine(profile.DisplayName);\n}\n\n\n\n\n\n\nAPI-Reference\n\n\nAlbums\n\n\n\n\nGetAlbumTracks\n\n\nGetAlbum\n\n\nGetSeveralAlbums\n\n\n\n\nArtists\n\n\n\n\nGetArtist\n\n\nGetRelatedArtists\n\n\nGetArtistsTopTracks\n\n\nGetArtistsAlbums\n\n\nGetSeveralArtists\n\n\n\n\nBrowse\n\n\n\n\nGetFeaturedPlaylists\n\n\nGetNewAlbumReleases\n\n\nGetCategories\n\n\nGetCategory\n\n\nGetCategoryPlaylists\n\n\n\n\nFollow\n\n\n\n\nFollow\n\n\nUnfollow\n\n\nIsFollowing\n\n\nFollowPlaylist\n\n\nUnfollowPlaylist\n\n\nIsFollowingPlaylist\n\n\n\n\nLibrary\n\n\n\n\nSaveTracks\n\n\nSaveTrack\n\n\nGetSavedTracks\n\n\nRemoveSavedTracks\n\n\nCheckSavedTracks\n\n\nSaveAlbums\n\n\nSaveAlbum\n\n\nGetSavedAlbums\n\n\nRemoveSavedAlbums\n\n\nCheckSavedAlbums\n\n\n\n\nPlayer\n\n\n\n\nGetDevices\n\n\nGetPlayback\n\n\nGetPlayingTrack\n\n\nTransferPlayback\n\n\nResumePlayback\n\n\nPausePlayback\n\n\nSkipPlaybackToNext\n\n\nSkipPlaybackToPrevious\n\n\nSetRepeatMode\n\n\nSetVolume\n\n\nSetShuffle\n\n\n\n\nPlaylists\n\n\n\n\nGetUserPlaylists\n\n\nGetPlaylist\n\n\nGetPlaylistTracks\n\n\nCreatePlaylist\n\n\nUpdatePlaylist\n\n\nReplacePlaylistTracks\n\n\nRemovePlaylistTracks\n\n\nRemovePlaylistTrack\n\n\nAddPlaylistTracks\n\n\nAddPlaylistTrack\n\n\nReorderPlaylist\n\n\n\n\nProfiles\n\n\n\n\nGetPublicProfile\n\n\nGetPrivateProfile\n\n\n\n\nSearch\n\n\n\n\nSearchItems\n\n\n\n\nTracks\n\n\n\n\nGetSeveralTracks\n\n\nGetTrack\n\n\n\n\nUtil\n\n\n\n\nUtility-Functions", + "title": "Getting started" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#getting-started", + "text": "This API provides full access to the new SpotifyWebAPI introduced here . \nWith it, you can search for Tracks/Albums/Artists and also get User-based information. \nIt's also possible to create new playlists and add tracks to it.", + "title": "Getting started" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#first-steps", + "text": "Imports \nSo after you added the API to your project, you may want to add following imports to your files: using SpotifyAPI.Web; //Base Namespace\nusing SpotifyAPI.Web.Auth; //All Authentication-related classes\nusing SpotifyAPI.Web.Enums; //Enums\nusing SpotifyAPI.Web.Models; //Models for the JSON-responses Basic-Usage \nNow you can actually start doing calls to the SpotifyAPI, just create a new Instance of SpotifyWebAPI: private static SpotifyWebAPI _spotify;\n\npublic static void Main(String[] args)\n{\n _spotify = new SpotifyWebAPI()\n {\n UseAuth = false, //This will disable Authentication.\n }\n FullTrack track = _spotify.GetTrack( 3Hvu1pq89D4R0lyPBoujSv );\n Console.WriteLine(track.Name); //Yeay! We just printed a tracks name.\n //...\n}", + "title": "First steps" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#authentication", + "text": "If you look through the available API-Methods, you will soon notice nearly all of them require Authentication.\nFurther infos on how to implement Authentication can be found here", + "title": "Authentication" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#examples", + "text": "A list of small examples can be found here . Do you think a specific example is missing? Feel free to open a PR/Issue!", + "title": "Examples" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#error-handling", + "text": "Every API-Call returns a reponse-model which consists of base-error model. To check if a specific API-Call was successful, use the following approach: PrivateProfile profile = _spotify.GetPrivateProfile();\nif (profile.HasError())\n{\n Console.WriteLine( Error Status: + profile.Error.Status);\n Console.WriteLine( Error Msg: + profile.Error.Message);\n}", + "title": "Error-Handling" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#asynchronous", + "text": "Every API-Call now has an asynchronous method. Just append Async to the Method-Name. \nExample: public async void Test()\n{\n var profile = await _spotify.GetPrivateProfileAsync();\n Console.WriteLine(profile.DisplayName);\n}", + "title": "Asynchronous" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#api-reference", + "text": "", + "title": "API-Reference" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#albums", + "text": "GetAlbumTracks GetAlbum GetSeveralAlbums", + "title": "Albums" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#artists", + "text": "GetArtist GetRelatedArtists GetArtistsTopTracks GetArtistsAlbums GetSeveralArtists", + "title": "Artists" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#browse", + "text": "GetFeaturedPlaylists GetNewAlbumReleases GetCategories GetCategory GetCategoryPlaylists", + "title": "Browse" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#follow", + "text": "Follow Unfollow IsFollowing FollowPlaylist UnfollowPlaylist IsFollowingPlaylist", + "title": "Follow" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#library", + "text": "SaveTracks SaveTrack GetSavedTracks RemoveSavedTracks CheckSavedTracks SaveAlbums SaveAlbum GetSavedAlbums RemoveSavedAlbums CheckSavedAlbums", + "title": "Library" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#player", + "text": "GetDevices GetPlayback GetPlayingTrack TransferPlayback ResumePlayback PausePlayback SkipPlaybackToNext SkipPlaybackToPrevious SetRepeatMode SetVolume SetShuffle", + "title": "Player" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#playlists", + "text": "GetUserPlaylists GetPlaylist GetPlaylistTracks CreatePlaylist UpdatePlaylist ReplacePlaylistTracks RemovePlaylistTracks RemovePlaylistTrack AddPlaylistTracks AddPlaylistTrack ReorderPlaylist", + "title": "Playlists" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#profiles", + "text": "GetPublicProfile GetPrivateProfile", + "title": "Profiles" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#search", + "text": "SearchItems", + "title": "Search" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#tracks", + "text": "GetSeveralTracks GetTrack", + "title": "Tracks" + }, + { + "location": "/SpotifyWebAPI/gettingstarted/#util", + "text": "Utility-Functions", + "title": "Util" + }, + { + "location": "/SpotifyWebAPI/examples/", + "text": "", + "title": "Examples" + }, + { + "location": "/SpotifyWebAPI/auth/", + "text": "Auth-Methods\n\n\nBefore you can use the Web API full functional, you need the user to authenticate your Application.\n\nIf you want to know more, you can read to the whole auth-process \nhere\n.\n\n\nBefore you start, you need to create a Application at Spotify: \nYour Applications\n\n\n\n\nAfter you created your Application, you will have following important values: \n\n\n\n\nClient_Id\n This is your client_id, you don't have to hide it\n\n\nClient_Secret\n Never use this in one of your client-side apps!! Keep it secret!\n\n\nRedirect URIs\n Add \"http://localhost\", if you want full support for this API \n\n\n\n\nNow you can start with the User-authentication, Spotify provides 3 ways:\n\n\n\n\n\n\nImplicitGrantAuth\n (\nRecommended\n, no server-side code needed) \n\n\n\n\n\n\nAutorizationCodeAuth\n (Not Recommended, Server-side code needed, else it's unsecure)\n\n\n\n\n\n\nClientCredentialsAuth\n (Not Recommended, Server-side code needed, else it's unsecure) \n\n\n\n\n\n\nNote:\n I would recommend a little PHP Script, which will exchange the Keys using AutorizationCodeAuth.\nWhen using ImplicitGrantAuth, another user could abuse the \"localhost\" RedirectUri by creating a \"fake\"-app which uses your ClientId.\n\n\nOverview:\n\n\n\nAfter implementing one of the provided auth-methods, you can start doing requests with the token you get from one of the auth-methods\n\n\nImplicitGrantAuth\n\n\nThis way is \nrecommended\n and the only auth-process, which does not need a server-side exchange of keys. With this approach, you directly get a Token object after the user authed your application.\nYou won't be able to refresh the token. If you want to use the internal Http server, please add \"http://localhost\" to your application redirects.\n\n\nMore info: \nhere\n\n\nFor this kind of authentication, there is also a \nWebAPIFactory\n, it's easier to use and uses an async method:\n\n\nstatic async void Main(string[] args)\n{\n WebAPIFactory webApiFactory = new WebAPIFactory(\n \nhttp://localhost\n,\n 8000,\n \nXXXXXXXXXXXXXXXX\n,\n Scope.UserReadPrivate,\n TimeSpan.FromSeconds(20)\n );\n\n try\n {\n //This will open the user's browser and returns once\n //the user is authorized.\n _spotify = await webApiFactory.GetWebApi();\n }\n catch (Exception ex)\n {\n MessageBox.Show(ex.Message);\n }\n\n if (_spotify == null)\n return;\n}\n\n\n\n\nThe old way:\n\n\nstatic ImplicitGrantAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new ImplicitGrantAuth()\n {\n //Your client Id\n ClientId = \nXXXXXXXXXXXXXXXX\n,\n //Set this to localhost if you want to use the built-in HTTP Server\n RedirectUri = \nhttp://localhost\n,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //Start the internal http server\n auth.StartHttpServer();\n //When we got our response\n auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;\n //Start\n auth.DoAuth();\n}\n\nstatic void auth_OnResponseReceivedEvent(Token token, string state, string error)\n{\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken\n };\n //We can now make calls with the token object\n\n //stop the http server\n auth.StopHttpServer();\n}\n\n\n\n\nAutorizationCodeAuth\n\n\nThis way is \nnot recommended\n and requires server-side code to run securely.\n\nWith this approach, you first get a code which you need to trade against the access-token.\n\nIn this exchange you need to provide your Client-Secret and because of that it's not recommended.\n\n(But you can e.g exchange to codes via a PHP Script)\n\nA good thing about this method: You can always refresh your token, without having the user to auth it again\n\n\nMore info: \nhere\n\n\nstatic AutorizationCodeAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new AutorizationCodeAuth()\n {\n //Your client Id\n ClientId = \nXXXXXXXXXXXXXXX\n,\n //Set this to localhost if you want to use the built-in HTTP Server\n RedirectUri = \nhttp://localhost\n,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //This will be called, if the user cancled/accept the auth-request\n auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;\n //a local HTTP Server will be started (Needed for the response)\n auth.StartHttpServer();\n //This will open the spotify auth-page. The user can decline/accept the request\n auth.DoAuth();\n\n Thread.Sleep(60000);\n auth.StopHttpServer();\n Console.WriteLine(\nToo long, didnt respond, exiting now...\n);\n}\n\nprivate static void auth_OnResponseReceivedEvent(AutorizationCodeAuthResponse response)\n{\n\n //NEVER DO THIS! You would need to provide the ClientSecret.\n //You would need to do it e.g via a PHP-Script.\n Token token = auth.ExchangeAuthCode(response.Code, \nXXXXXXXXXXX\n);\n\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken\n };\n\n //With the token object, you can now make API calls\n\n //Stop the HTTP Server, done.\n auth.StopHttpServer();\n}\n\n\n\n\nClientCredentialsAuth\n\n\nThis way is \nnot recommended\n and requires server-side code to run securely.\n\nWith this approach, you make a POST Request with a base64 encoded string (consists of ClientId + ClientSecret). You will directly get the token (Without a local HTTP Server), but it will expire and can't be refreshed.\n\nIf you want to use it securely, you would need to do it all server-side.\n\n\nNOTE:\n You will only be able to query non-user-related information e.g search for a Track.\n\n\nMore info: \nhere\n\n\nstatic ClientCredentialsAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new ClientCredentialsAuth()\n {\n //Your client Id\n ClientId = \nXXXXXXXXXXXXXXX\n,\n //Your client secret UNSECURE!!\n ClientSecret = \nXXXXXXXXXXXX\n,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //With this token object, we now can make calls\n Token token = auth.DoAuth();\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken,\n UseAuth = false\n };\n}\n\n\n\n\nScopes", + "title": "Authentication" + }, + { + "location": "/SpotifyWebAPI/auth/#auth-methods", + "text": "Before you can use the Web API full functional, you need the user to authenticate your Application. \nIf you want to know more, you can read to the whole auth-process here . Before you start, you need to create a Application at Spotify: Your Applications After you created your Application, you will have following important values: Client_Id This is your client_id, you don't have to hide it Client_Secret Never use this in one of your client-side apps!! Keep it secret! Redirect URIs Add \"http://localhost\", if you want full support for this API Now you can start with the User-authentication, Spotify provides 3 ways: ImplicitGrantAuth ( Recommended , no server-side code needed) AutorizationCodeAuth (Not Recommended, Server-side code needed, else it's unsecure) ClientCredentialsAuth (Not Recommended, Server-side code needed, else it's unsecure) Note: I would recommend a little PHP Script, which will exchange the Keys using AutorizationCodeAuth.\nWhen using ImplicitGrantAuth, another user could abuse the \"localhost\" RedirectUri by creating a \"fake\"-app which uses your ClientId. Overview: After implementing one of the provided auth-methods, you can start doing requests with the token you get from one of the auth-methods", + "title": "Auth-Methods" + }, + { + "location": "/SpotifyWebAPI/auth/#implicitgrantauth", + "text": "This way is recommended and the only auth-process, which does not need a server-side exchange of keys. With this approach, you directly get a Token object after the user authed your application.\nYou won't be able to refresh the token. If you want to use the internal Http server, please add \"http://localhost\" to your application redirects. More info: here For this kind of authentication, there is also a WebAPIFactory , it's easier to use and uses an async method: static async void Main(string[] args)\n{\n WebAPIFactory webApiFactory = new WebAPIFactory(\n http://localhost ,\n 8000,\n XXXXXXXXXXXXXXXX ,\n Scope.UserReadPrivate,\n TimeSpan.FromSeconds(20)\n );\n\n try\n {\n //This will open the user's browser and returns once\n //the user is authorized.\n _spotify = await webApiFactory.GetWebApi();\n }\n catch (Exception ex)\n {\n MessageBox.Show(ex.Message);\n }\n\n if (_spotify == null)\n return;\n} The old way: static ImplicitGrantAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new ImplicitGrantAuth()\n {\n //Your client Id\n ClientId = XXXXXXXXXXXXXXXX ,\n //Set this to localhost if you want to use the built-in HTTP Server\n RedirectUri = http://localhost ,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //Start the internal http server\n auth.StartHttpServer();\n //When we got our response\n auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;\n //Start\n auth.DoAuth();\n}\n\nstatic void auth_OnResponseReceivedEvent(Token token, string state, string error)\n{\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken\n };\n //We can now make calls with the token object\n\n //stop the http server\n auth.StopHttpServer();\n}", + "title": "ImplicitGrantAuth" + }, + { + "location": "/SpotifyWebAPI/auth/#autorizationcodeauth", + "text": "This way is not recommended and requires server-side code to run securely. \nWith this approach, you first get a code which you need to trade against the access-token. \nIn this exchange you need to provide your Client-Secret and because of that it's not recommended. \n(But you can e.g exchange to codes via a PHP Script) \nA good thing about this method: You can always refresh your token, without having the user to auth it again More info: here static AutorizationCodeAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new AutorizationCodeAuth()\n {\n //Your client Id\n ClientId = XXXXXXXXXXXXXXX ,\n //Set this to localhost if you want to use the built-in HTTP Server\n RedirectUri = http://localhost ,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //This will be called, if the user cancled/accept the auth-request\n auth.OnResponseReceivedEvent += auth_OnResponseReceivedEvent;\n //a local HTTP Server will be started (Needed for the response)\n auth.StartHttpServer();\n //This will open the spotify auth-page. The user can decline/accept the request\n auth.DoAuth();\n\n Thread.Sleep(60000);\n auth.StopHttpServer();\n Console.WriteLine( Too long, didnt respond, exiting now... );\n}\n\nprivate static void auth_OnResponseReceivedEvent(AutorizationCodeAuthResponse response)\n{\n\n //NEVER DO THIS! You would need to provide the ClientSecret.\n //You would need to do it e.g via a PHP-Script.\n Token token = auth.ExchangeAuthCode(response.Code, XXXXXXXXXXX );\n\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken\n };\n\n //With the token object, you can now make API calls\n\n //Stop the HTTP Server, done.\n auth.StopHttpServer();\n}", + "title": "AutorizationCodeAuth" + }, + { + "location": "/SpotifyWebAPI/auth/#clientcredentialsauth", + "text": "This way is not recommended and requires server-side code to run securely. \nWith this approach, you make a POST Request with a base64 encoded string (consists of ClientId + ClientSecret). You will directly get the token (Without a local HTTP Server), but it will expire and can't be refreshed. \nIf you want to use it securely, you would need to do it all server-side. NOTE: You will only be able to query non-user-related information e.g search for a Track. More info: here static ClientCredentialsAuth auth;\nstatic void Main(string[] args)\n{\n //Create the auth object\n auth = new ClientCredentialsAuth()\n {\n //Your client Id\n ClientId = XXXXXXXXXXXXXXX ,\n //Your client secret UNSECURE!!\n ClientSecret = XXXXXXXXXXXX ,\n //How many permissions we need?\n Scope = Scope.UserReadPrivate,\n };\n //With this token object, we now can make calls\n Token token = auth.DoAuth();\n var spotify = new SpotifyWebApiClass()\n {\n TokenType = token.TokenType,\n AccessToken = token.AccessToken,\n UseAuth = false\n };\n}", + "title": "ClientCredentialsAuth" + }, + { + "location": "/SpotifyWebAPI/auth/#scopes", + "text": "", + "title": "Scopes" + }, + { + "location": "/SpotifyWebAPI/albums/", + "text": "GetAlbumTracks\n\n\n\n\nGet Spotify catalog information about an album's tracks. Optional parameters can be used to limit the number of tracks returned.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the album.\n\n\n\"5O7V8l4SeXTymVp3IesT9C\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first track to return. Default: 0 (the first object).\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nSimpleTrack\n wrapped inside a \nPaging-object\n\n\nUsage\n \n\n\nPaging\nSimpleTrack\n tracks = _spotify.GetAlbumTracks(\n5O7V8l4SeXTymVp3IesT9C\n);\ntracks.Items.ForEach(item =\n Console.WriteLine(item.Name)); //Display all fetched Track-Names (max 20)\nConsole.WriteLine(tracks.Total.ToString()) //Display total album track count\n\n\n\n\n\n\nGetAlbum\n\n\n\n\nGet Spotify catalog information for a single album.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the album.\n\n\n5O7V8l4SeXTymVp3IesT9C\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nFullAlbum\n\n\nUsage\n \n\n\nFullAlbum album = _spotify.GetAlbum(\n5O7V8l4SeXTymVp3IesT9C\n);\nConsole.WriteLine(album.Name + \n| Popularity: \n + album.Popularity); //Display name and Popularity\n\n\n\n\n\n\nGetSeveralAlbums\n\n\n\n\nGet Spotify catalog information for multiple albums identified by their Spotify IDs.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs for the albums. Maximum: 20 IDs.\n\n\nnew List\nString\n() { \"5O7V8l4SeXTymVp3IesT9C\" }\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nSeveralAlbums\n which Property \"Albums\" contains a list of \nFullAlbum\n\n\nUsage\n \n\n\nSeveralAlbums albums = _spotify.GetSeveralAlbums(new List\nString\n() { \n5O7V8l4SeXTymVp3IesT9C\n });\nConsole.WriteLine(albums.Albums[0].Name);", + "title": "- Albums" + }, + { + "location": "/SpotifyWebAPI/albums/#getalbumtracks", + "text": "Get Spotify catalog information about an album's tracks. Optional parameters can be used to limit the number of tracks returned. Paramters Name Description Example id The Spotify ID for the album. \"5O7V8l4SeXTymVp3IesT9C\" [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first track to return. Default: 0 (the first object). 0 [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a SimpleTrack wrapped inside a Paging-object Usage Paging SimpleTrack tracks = _spotify.GetAlbumTracks( 5O7V8l4SeXTymVp3IesT9C );\ntracks.Items.ForEach(item = Console.WriteLine(item.Name)); //Display all fetched Track-Names (max 20)\nConsole.WriteLine(tracks.Total.ToString()) //Display total album track count", + "title": "GetAlbumTracks" + }, + { + "location": "/SpotifyWebAPI/albums/#getalbum", + "text": "Get Spotify catalog information for a single album. Paramters Name Description Example id The Spotify ID for the album. 5O7V8l4SeXTymVp3IesT9C [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a FullAlbum Usage FullAlbum album = _spotify.GetAlbum( 5O7V8l4SeXTymVp3IesT9C );\nConsole.WriteLine(album.Name + | Popularity: + album.Popularity); //Display name and Popularity", + "title": "GetAlbum" + }, + { + "location": "/SpotifyWebAPI/albums/#getseveralalbums", + "text": "Get Spotify catalog information for multiple albums identified by their Spotify IDs. Paramters Name Description Example ids A list of the Spotify IDs for the albums. Maximum: 20 IDs. new List String () { \"5O7V8l4SeXTymVp3IesT9C\" } [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a SeveralAlbums which Property \"Albums\" contains a list of FullAlbum Usage SeveralAlbums albums = _spotify.GetSeveralAlbums(new List String () { 5O7V8l4SeXTymVp3IesT9C });\nConsole.WriteLine(albums.Albums[0].Name);", + "title": "GetSeveralAlbums" + }, + { + "location": "/SpotifyWebAPI/artists/", + "text": "GetArtist\n\n\n\n\nGet Spotify catalog information for a single artist identified by their unique Spotify ID.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the artist.\n\n\n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nFullArtist\n\n\nUsage\n \n\n\nFullArtist artist = _spotify.GetArtist(\n1KpCi9BOfviCVhmpI4G2sY\n);\nConsole.WriteLine()\n\n\n\n\n\n\nGetRelatedArtists\n\n\n\n\nGet Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the Spotify community's listening history.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the artist.\n\n\n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nSeveralArtists\n object which contains the property \nList\nFullArtist\n Artists\n (\nFullArtist\n)\n\n\nUsage\n \n\n\nSeveralArtists artists = _spotify.GetRelatedArtists(\n1KpCi9BOfviCVhmpI4G2sY\n);\nConsole.WriteLine(artists.Artists[0].Name);\n\n\n\n\n\n\nGetArtistsTopTracks\n\n\n\n\nGet Spotify catalog information about an artist's top tracks by country.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the artist.\n\n\n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\ncountry\n\n\nThe country: an ISO 3166-1 alpha-2 country code.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nSeveralTracks\n object which contains the property \nList\nFullTrack\n Tracks\n (\nFullTrack\n)\n\n\nUsage\n \n\n\nSeveralTracks tracks = _spotify.GetArtistsTopTracks(\n1KpCi9BOfviCVhmpI4G2sY\n, \nDE\n);\nConsole.WriteLine(tracks.Tracks.Count); //How many tracks did we get?\n\n\n\n\n\n\nGetArtistsAlbums\n\n\n\n\nGet Spotify catalog information about an artist's albums. Optional parameters can be specified in the query string to filter and sort the response.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the artist.\n\n\n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n[type]\n\n\nA list of keywords that will be used to filter the response. If not supplied, all album types will be returned\n\n\nAlbumType.All\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first album to return. Default: 0\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular geographical market\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nSimpleAlbum\n wrapped inside a \nPaging-object\n\n\nUsage\n \n\n\nPaging\nSimpleAlbum\n albums = _spotify.GetArtistsAlbums(\n1KpCi9BOfviCVhmpI4G2sY\n, AlbumType.All);\nalbums.Items.ForEach(album =\n Console.WriteLine(album.Name));\n\n\n\n\n\n\nGetSeveralArtists\n\n\n\n\nGet Spotify catalog information for several artists based on their Spotify IDs.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs for the artists. Maximum: 50 IDs.\n\n\nnew List\nString\n() { \"1KpCi9BOfviCVhmpI4G2sY\" }\n\n\n\n\n\n\n\n\nReturns a \nSeveralArtists\n object which contains the property \nList\nFullArtist\n Artists\n (\nFullArtist\n)\n\n\nUsage\n \n\n\nSeveralArtists artists = _spotify.GetSeveralArtists(new List\nString\n() {\n1KpCi9BOfviCVhmpI4G2sY\n});\nartists.Artists.ForEach(artist =\n Console.WriteLine(artist.Name));", + "title": "- Artists" + }, + { + "location": "/SpotifyWebAPI/artists/#getartist", + "text": "Get Spotify catalog information for a single artist identified by their unique Spotify ID. Paramters Name Description Example id The Spotify ID for the artist. \"1KpCi9BOfviCVhmpI4G2sY\" Returns a FullArtist Usage FullArtist artist = _spotify.GetArtist( 1KpCi9BOfviCVhmpI4G2sY );\nConsole.WriteLine()", + "title": "GetArtist" + }, + { + "location": "/SpotifyWebAPI/artists/#getrelatedartists", + "text": "Get Spotify catalog information about artists similar to a given artist. Similarity is based on analysis of the Spotify community's listening history. Paramters Name Description Example id The Spotify ID for the artist. \"1KpCi9BOfviCVhmpI4G2sY\" Returns a SeveralArtists object which contains the property List FullArtist Artists ( FullArtist ) Usage SeveralArtists artists = _spotify.GetRelatedArtists( 1KpCi9BOfviCVhmpI4G2sY );\nConsole.WriteLine(artists.Artists[0].Name);", + "title": "GetRelatedArtists" + }, + { + "location": "/SpotifyWebAPI/artists/#getartiststoptracks", + "text": "Get Spotify catalog information about an artist's top tracks by country. Paramters Name Description Example id The Spotify ID for the artist. \"1KpCi9BOfviCVhmpI4G2sY\" country The country: an ISO 3166-1 alpha-2 country code. \"DE\" Returns a SeveralTracks object which contains the property List FullTrack Tracks ( FullTrack ) Usage SeveralTracks tracks = _spotify.GetArtistsTopTracks( 1KpCi9BOfviCVhmpI4G2sY , DE );\nConsole.WriteLine(tracks.Tracks.Count); //How many tracks did we get?", + "title": "GetArtistsTopTracks" + }, + { + "location": "/SpotifyWebAPI/artists/#getartistsalbums", + "text": "Get Spotify catalog information about an artist's albums. Optional parameters can be specified in the query string to filter and sort the response. Paramters Name Description Example id The Spotify ID for the artist. \"1KpCi9BOfviCVhmpI4G2sY\" [type] A list of keywords that will be used to filter the response. If not supplied, all album types will be returned AlbumType.All [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first album to return. Default: 0 0 [market] An ISO 3166-1 alpha-2 country code. Supply this parameter to limit the response to one particular geographical market \"DE\" Returns a SimpleAlbum wrapped inside a Paging-object Usage Paging SimpleAlbum albums = _spotify.GetArtistsAlbums( 1KpCi9BOfviCVhmpI4G2sY , AlbumType.All);\nalbums.Items.ForEach(album = Console.WriteLine(album.Name));", + "title": "GetArtistsAlbums" + }, + { + "location": "/SpotifyWebAPI/artists/#getseveralartists", + "text": "Get Spotify catalog information for several artists based on their Spotify IDs. Paramters Name Description Example ids A list of the Spotify IDs for the artists. Maximum: 50 IDs. new List String () { \"1KpCi9BOfviCVhmpI4G2sY\" } Returns a SeveralArtists object which contains the property List FullArtist Artists ( FullArtist ) Usage SeveralArtists artists = _spotify.GetSeveralArtists(new List String () { 1KpCi9BOfviCVhmpI4G2sY });\nartists.Artists.ForEach(artist = Console.WriteLine(artist.Name));", + "title": "GetSeveralArtists" + }, + { + "location": "/SpotifyWebAPI/browse/", + "text": "GetFeaturedPlaylists\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of Spotify featured playlists (shown, for example, on a Spotify player\u2019s \u201cBrowse\u201d tab).\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[locale]\n\n\nThe desired language, consisting of a lowercase ISO 639 language code and an uppercase ISO 3166-1 alpha-2 country code, joined by an underscore.\n\n\n\"de_DE\" //Germany\n\n\n\n\n\n\n[country]\n\n\nA country: an ISO 3166-1 alpha-2 country code.\n\n\n\"DE\"\n\n\n\n\n\n\n[timestamp]\n\n\nA timestamp in ISO 8601 format\n\n\nDateTime.Now\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first item to return. Default: 0\n\n\n0\n\n\n\n\n\n\n\n\nReturns a \nFeaturedPlaylists\n object, which has 2 properties. \nString Message\n and \nPaging\nSimplePlaylist\n Playlists\n\n\nUsage\n \n\n\nFeaturedPlaylists playlists = _spotify.GetFeaturedPlaylists();\nConsole.WriteLine(playlists.Message);\nplaylists.Playlists.Items.ForEach(playlist =\n Console.WriteLine(playlist.Name));\n\n\n\n\n\n\nGetNewAlbumReleases\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of new album releases featured in Spotify (shown, for example, on a Spotify player\u2019s \u201cBrowse\u201d tab).\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[country]\n\n\nA country: an ISO 3166-1 alpha-2 country code.\n\n\n\"DE\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first item to return. Default: 0\n\n\n0\n\n\n\n\n\n\n\n\nReturns a \nNewAlbumReleases\n object, which has the property \nPaging\nSimpleAlbum\n Albums\n.\n\n\nUsage\n \n\n\nNewAlbumReleases newAlbums = _spotify.GetNewAlbumReleases();\nnewAlbums.Albums.Items.ForEach(album =\n Console.WriteLine(album.Name));\n\n\n\n\n\n\nGetCategories\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of categories used to tag items in Spotify (on, for example, the Spotify player\u2019s \u201cBrowse\u201d tab).\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[country]\n\n\nA 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\n\n\n\"DE\"\n\n\n\n\n\n\n[locale]\n\n\nThe desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore\n\n\n\"de_DE\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first item to return. Default: 0 (the first object).\n\n\n0\n\n\n\n\n\n\n\n\nReturns a \nCategoryList\n object, which has the property \nPaging\nCategory\n Categories\n.\n\n\nUsage\n \n\n\nCategoryList categoryList = _spotify.GetCategories();\ncategoryList.Categories.Items.ForEach(category =\n Console.WriteLine(category.Name));\n\n\n\n\n\n\nGetCategory\n\n\nAUTH REQUIRED\n\n\n\n\nGet a single category used to tag items in Spotify (on, for example, the Spotify player\u2019s \u201cBrowse\u201d tab).\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\ncategoryId\n\n\nThe Spotify category ID for the category.\n\n\n\"party\"\n\n\n\n\n\n\n[country]\n\n\nA country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category exists for a particular country.\n\n\n\"DE\"\n\n\n\n\n\n\n[locale]\n\n\nThe desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore\n\n\n\"de_DE\"\n\n\n\n\n\n\n\n\nReturns a \nCategory\n\n\nUsage\n \n\n\nCategory cat = _spotify.GetCategory(\nparty\n);\nConsole.WriteLine(cat.Name);\n\n\n\n\n\n\nGetCategoryPlaylists\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of Spotify playlists tagged with a particular category.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\ncategoryId\n\n\nThe Spotify category ID for the category.\n\n\n\"party\"\n\n\n\n\n\n\n[country]\n\n\nA country: an ISO 3166-1 alpha-2 country code.\n\n\n\"DE\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first item to return. Default: 0\n\n\n0\n\n\n\n\n\n\n\n\nReturns a \nCategoryPlaylist\n object, which has the property \nPaging\nSimplePlaylist\n Playlists\n\n\nUsage\n \n\n\nCategoryPlaylist playlists = _spotify.GetCategoryPlaylists(\nparty\n);\nplaylists.Playlists.Items.ForEach(playlist =\n Console.WriteLine(playlist.Name));", + "title": "- Browse" + }, + { + "location": "/SpotifyWebAPI/browse/#getfeaturedplaylists", + "text": "AUTH REQUIRED Get a list of Spotify featured playlists (shown, for example, on a Spotify player\u2019s \u201cBrowse\u201d tab). Paramters Name Description Example [locale] 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. \"de_DE\" //Germany [country] A country: an ISO 3166-1 alpha-2 country code. \"DE\" [timestamp] A timestamp in ISO 8601 format DateTime.Now [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first item to return. Default: 0 0 Returns a FeaturedPlaylists object, which has 2 properties. String Message and Paging SimplePlaylist Playlists Usage FeaturedPlaylists playlists = _spotify.GetFeaturedPlaylists();\nConsole.WriteLine(playlists.Message);\nplaylists.Playlists.Items.ForEach(playlist = Console.WriteLine(playlist.Name));", + "title": "GetFeaturedPlaylists" + }, + { + "location": "/SpotifyWebAPI/browse/#getnewalbumreleases", + "text": "AUTH REQUIRED Get a list of new album releases featured in Spotify (shown, for example, on a Spotify player\u2019s \u201cBrowse\u201d tab). Paramters Name Description Example [country] A country: an ISO 3166-1 alpha-2 country code. \"DE\" [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first item to return. Default: 0 0 Returns a NewAlbumReleases object, which has the property Paging SimpleAlbum Albums . Usage NewAlbumReleases newAlbums = _spotify.GetNewAlbumReleases();\nnewAlbums.Albums.Items.ForEach(album = Console.WriteLine(album.Name));", + "title": "GetNewAlbumReleases" + }, + { + "location": "/SpotifyWebAPI/browse/#getcategories", + "text": "AUTH REQUIRED Get a list of categories used to tag items in Spotify (on, for example, the Spotify player\u2019s \u201cBrowse\u201d tab). Paramters Name Description Example [country] 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 \"DE\" [locale] The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore \"de_DE\" [limit] The maximum number of categories to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first item to return. Default: 0 (the first object). 0 Returns a CategoryList object, which has the property Paging Category Categories . Usage CategoryList categoryList = _spotify.GetCategories();\ncategoryList.Categories.Items.ForEach(category = Console.WriteLine(category.Name));", + "title": "GetCategories" + }, + { + "location": "/SpotifyWebAPI/browse/#getcategory", + "text": "AUTH REQUIRED Get a single category used to tag items in Spotify (on, for example, the Spotify player\u2019s \u201cBrowse\u201d tab). Paramters Name Description Example categoryId The Spotify category ID for the category. \"party\" [country] A country: an ISO 3166-1 alpha-2 country code. Provide this parameter to ensure that the category exists for a particular country. \"DE\" [locale] The desired language, consisting of an ISO 639 language code and an ISO 3166-1 alpha-2 country code, joined by an underscore \"de_DE\" Returns a Category Usage Category cat = _spotify.GetCategory( party );\nConsole.WriteLine(cat.Name);", + "title": "GetCategory" + }, + { + "location": "/SpotifyWebAPI/browse/#getcategoryplaylists", + "text": "AUTH REQUIRED Get a list of Spotify playlists tagged with a particular category. Paramters Name Description Example categoryId The Spotify category ID for the category. \"party\" [country] A country: an ISO 3166-1 alpha-2 country code. \"DE\" [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first item to return. Default: 0 0 Returns a CategoryPlaylist object, which has the property Paging SimplePlaylist Playlists Usage CategoryPlaylist playlists = _spotify.GetCategoryPlaylists( party );\nplaylists.Playlists.Items.ForEach(playlist = Console.WriteLine(playlist.Name));", + "title": "GetCategoryPlaylists" + }, + { + "location": "/SpotifyWebAPI/follow/", + "text": "Follow\n\n\nAUTH REQUIRED\n\n\n\n\nAdd the current user as a follower of one or more artists or other Spotify users.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nfollowType\n\n\nThe ID type: either artist or user.\n\n\nFollowType.Artist\n\n\n\n\n\n\nids or id\n\n\nA list of the artist or the user Spotify IDs or just a Spotify ID\n\n\nnew List\nString\n { \"1KpCi9BOfviCVhmpI4G2sY\" }\n or \n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.Follow(FollowType.Artist, \n1KpCi9BOfviCVhmpI4G2sY\n);\n//or if it's a User\nErrorResponse response = _spotify.Follow(FollowType.User, \n1122095781\n);\n\n\n\n\n\n\nUnfollow\n\n\nAUTH REQUIRED\n\n\n\n\nRemove the current user as a follower of one or more artists or other Spotify users.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nfollowType\n\n\nThe ID type: either artist or user.\n\n\nFollowType.Artist\n\n\n\n\n\n\nids or id\n\n\nA list of the artist or the user Spotify IDs or just a Spotify ID\n\n\nnew List\nString\n { \"1KpCi9BOfviCVhmpI4G2sY\" }\n or \n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.Unfollow(FollowType.Artist, \n1KpCi9BOfviCVhmpI4G2sY\n);\n//or if it's a User\nErrorResponse response = _spotify.Unfollow(FollowType.User, \n1122095781\n);\n\n\n\n\n\n\nIsFollowing\n\n\nAUTH REQUIRED\n\n\n\n\nCheck to see if the current user is following one or more artists or other Spotify users.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nfollowType\n\n\nThe ID type: either artist or user.\n\n\nFollowType.Artist\n\n\n\n\n\n\nids or id\n\n\nA list of the artist or the user Spotify IDs or just a Spotify ID\n\n\nnew List\nString\n { \"1KpCi9BOfviCVhmpI4G2sY\" }\n or \n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nListResponse\n which contains the property \nList\nBoolean\n List\n\n\nUsage\n \n\n\n//Are you one of my Followers? :P\nListResponse\nBoolean\n response = _spotify.IsFollowing(FollowType.User, \n1122095781\n);\nConsole.WriteLine(response.List[0] ? \nYis!\n : \nNo :(\n);\n\n\n\n\n\n\nFollowPlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nAdd the current user as a follower of a playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nownerId\n\n\nThe Spotify user ID of the person who owns the playlist.\n\n\n\"maxloermans\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID of the playlist. Any playlist can be followed, regardless of its public/private status, as long as you know its playlist ID.\n\n\n\"3SIp2VAsKI03mReF0dFBmI\"\n\n\n\n\n\n\n[showPublic]\n\n\nIf true the playlist will be included in user's public playlists, if false it will remain private.\n\n\ntrue\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.FollowPlaylist(\nmaxloermans\n, \n3SIp2VAsKI03mReF0dFBmI\n);\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nUnfollowPlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nRemove the current user as a follower of a playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nownerId\n\n\nThe Spotify user ID of the person who owns the playlist.\n\n\n\"maxloermans\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID of the playlist that is to be no longer followed.\n\n\n\"3SIp2VAsKI03mReF0dFBmI\"\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.UnfollowPlaylist(\nmaxloermans\n, \n3SIp2VAsKI03mReF0dFBmI\n);\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nIsFollowingPlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nCheck to see if one or more Spotify users are following a specified playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nownerId\n\n\nThe Spotify user ID of the person who owns the playlist.\n\n\n\"maxloermans\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID of the playlist.\n\n\n\"3SIp2VAsKI03mReF0dFBmI\"\n\n\n\n\n\n\nids or id\n\n\nA list of the artist or the user Spotify IDs or just a Spotify ID\n\n\nnew List\nString\n { \"1KpCi9BOfviCVhmpI4G2sY\" }\n or \n\"1KpCi9BOfviCVhmpI4G2sY\"\n\n\n\n\n\n\n\n\nReturns a \nListResponse\n which contains the property \nList\nBoolean\n List\n\n\nUsage\n \n\n\n//Am I following the playlist?\nListResponse\nBoolean\n response = _spotify.IsFollowing(\nmaxloermans\n, \n3SIp2VAsKI03mReF0dFBmI\n, \n1122095781\n);\nConsole.WriteLine(response.List[0] ? \nYis!\n : \nNo :(\n);", + "title": "- Follow" + }, + { + "location": "/SpotifyWebAPI/follow/#follow", + "text": "AUTH REQUIRED Add the current user as a follower of one or more artists or other Spotify users. Paramters Name Description Example followType The ID type: either artist or user. FollowType.Artist ids or id A list of the artist or the user Spotify IDs or just a Spotify ID new List String { \"1KpCi9BOfviCVhmpI4G2sY\" } or \"1KpCi9BOfviCVhmpI4G2sY\" Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.Follow(FollowType.Artist, 1KpCi9BOfviCVhmpI4G2sY );\n//or if it's a User\nErrorResponse response = _spotify.Follow(FollowType.User, 1122095781 );", + "title": "Follow" + }, + { + "location": "/SpotifyWebAPI/follow/#unfollow", + "text": "AUTH REQUIRED Remove the current user as a follower of one or more artists or other Spotify users. Paramters Name Description Example followType The ID type: either artist or user. FollowType.Artist ids or id A list of the artist or the user Spotify IDs or just a Spotify ID new List String { \"1KpCi9BOfviCVhmpI4G2sY\" } or \"1KpCi9BOfviCVhmpI4G2sY\" Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.Unfollow(FollowType.Artist, 1KpCi9BOfviCVhmpI4G2sY );\n//or if it's a User\nErrorResponse response = _spotify.Unfollow(FollowType.User, 1122095781 );", + "title": "Unfollow" + }, + { + "location": "/SpotifyWebAPI/follow/#isfollowing", + "text": "AUTH REQUIRED Check to see if the current user is following one or more artists or other Spotify users. Paramters Name Description Example followType The ID type: either artist or user. FollowType.Artist ids or id A list of the artist or the user Spotify IDs or just a Spotify ID new List String { \"1KpCi9BOfviCVhmpI4G2sY\" } or \"1KpCi9BOfviCVhmpI4G2sY\" Returns a ListResponse which contains the property List Boolean List Usage //Are you one of my Followers? :P\nListResponse Boolean response = _spotify.IsFollowing(FollowType.User, 1122095781 );\nConsole.WriteLine(response.List[0] ? Yis! : No :( );", + "title": "IsFollowing" + }, + { + "location": "/SpotifyWebAPI/follow/#followplaylist", + "text": "AUTH REQUIRED Add the current user as a follower of a playlist. Paramters Name Description Example ownerId The Spotify user ID of the person who owns the playlist. \"maxloermans\" playlistId 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. \"3SIp2VAsKI03mReF0dFBmI\" [showPublic] If true the playlist will be included in user's public playlists, if false it will remain private. true Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.FollowPlaylist( maxloermans , 3SIp2VAsKI03mReF0dFBmI );\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "FollowPlaylist" + }, + { + "location": "/SpotifyWebAPI/follow/#unfollowplaylist", + "text": "AUTH REQUIRED Remove the current user as a follower of a playlist. Paramters Name Description Example ownerId The Spotify user ID of the person who owns the playlist. \"maxloermans\" playlistId The Spotify ID of the playlist that is to be no longer followed. \"3SIp2VAsKI03mReF0dFBmI\" Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.UnfollowPlaylist( maxloermans , 3SIp2VAsKI03mReF0dFBmI );\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "UnfollowPlaylist" + }, + { + "location": "/SpotifyWebAPI/follow/#isfollowingplaylist", + "text": "AUTH REQUIRED Check to see if one or more Spotify users are following a specified playlist. Paramters Name Description Example ownerId The Spotify user ID of the person who owns the playlist. \"maxloermans\" playlistId The Spotify ID of the playlist. \"3SIp2VAsKI03mReF0dFBmI\" ids or id A list of the artist or the user Spotify IDs or just a Spotify ID new List String { \"1KpCi9BOfviCVhmpI4G2sY\" } or \"1KpCi9BOfviCVhmpI4G2sY\" Returns a ListResponse which contains the property List Boolean List Usage //Am I following the playlist?\nListResponse Boolean response = _spotify.IsFollowing( maxloermans , 3SIp2VAsKI03mReF0dFBmI , 1122095781 );\nConsole.WriteLine(response.List[0] ? Yis! : No :( );", + "title": "IsFollowingPlaylist" + }, + { + "location": "/SpotifyWebAPI/library/", + "text": "SaveTracks\n\n\nAUTH REQUIRED\n\n\n\n\nSave one or more tracks to the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs\n\n\nnew List\nString\n { \"3Hvu1pq89D4R0lyPBoujSv\" }\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.SaveTracks(new List\nstring\n { \n3Hvu1pq89D4R0lyPBoujSv\n });\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nSaveTrack\n\n\nAUTH REQUIRED\n\n\n\n\nSave one track to the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nA Spotify ID\n\n\n\"3Hvu1pq89D4R0lyPBoujSv\"\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.SaveTrack(\n3Hvu1pq89D4R0lyPBoujSv\n);\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nGetSavedTracks\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of the songs saved in the current Spotify user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first object to return. Default: 0 (i.e., the first object)\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\nDE\n\n\n\n\n\n\n\n\nReturns a \nPaging\n, \nSavedTrack\n contains 2 properties, \nDateTime AddedAt\n and \nFullTrack Track\n\n\nUsage\n \n\n\nPaging\nSavedTrack\n savedTracks = _spotify.GetSavedTracks();\nsavedTracks.Items.ForEach(track =\n Console.WriteLine(track.Track.Name));\n\n\n\n\n\n\nRemoveSavedTracks\n\n\nAUTH REQUIRED\n\n\n\n\nRemove one or more tracks from the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs.\n\n\nnew List\nString\n { \"3Hvu1pq89D4R0lyPBoujSv\" }\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.RemoveSavedTracks(new List\nstring\n { \n3Hvu1pq89D4R0lyPBoujSv\n });\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nCheckSavedTracks\n\n\nAUTH REQUIRED\n\n\n\n\nCheck if one or more tracks is already saved in the current Spotify user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs.\n\n\nnew List\nString\n { \"3Hvu1pq89D4R0lyPBoujSv\" }\n\n\n\n\n\n\n\n\nReturns a \nListResponse\n which contains a property, \nList\nbool\n List\n\n\nUsage\n \n\n\nListResponse\nbool\n tracksSaved = _spotify.CheckSavedTracks(new List\nString\n { \n3Hvu1pq89D4R0lyPBoujSv\n });\nif(tracksSaved.List[0])\n Console.WriteLine(\nThe track is in your library!\n);\n\n\n\n\n\n\nSaveAlbums\n\n\nAUTH REQUIRED\n\n\n\n\nSave one or more albums to the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs\n\n\nnew List\nString\n { \"1cq06d0kTUnFmJHixz1RaF\" }\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.SaveAlbums(new List\nstring\n { \n1cq06d0kTUnFmJHixz1RaF\n });\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nSaveAlbum\n\n\nAUTH REQUIRED\n\n\n\n\nSave one album to the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nA Spotify ID\n\n\n\"1cq06d0kTUnFmJHixz1RaF\"\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.SaveAlbum(\n1cq06d0kTUnFmJHixz1RaF\n);\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nGetSavedAlbums\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of the albums saved in the current Spotify user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first object to return. Default: 0 (i.e., the first object)\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\nDE\n\n\n\n\n\n\n\n\nReturns a \nPaging\nSavedAlbum\n, \nSavedAlbum\n contains 2 properties, \nDateTime AddedAt\n and \nFullAlbum Album\n\n\nUsage\n \n\n\nPaging\nSavedAlbum\n savedAlbums = _spotify.GetSavedAlbums();\nsavedAlbums.Items.ForEach(album =\n Console.WriteLine(album.Album.Name));\n\n\n\n\n\n\nRemoveSavedAlbums\n\n\nAUTH REQUIRED\n\n\n\n\nRemove one or more albums from the current user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs.\n\n\nnew List\nString\n { \"1cq06d0kTUnFmJHixz1RaF\" }\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.RemoveSavedAlbums(new List\nstring\n { \n1cq06d0kTUnFmJHixz1RaF\n });\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nCheckSavedAlbums\n\n\nAUTH REQUIRED\n\n\n\n\nCheck if one or more albums is already saved in the current Spotify user\u2019s \u201cYour Music\u201d library.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs.\n\n\nnew List\nString\n { \"1cq06d0kTUnFmJHixz1RaF\" }\n\n\n\n\n\n\n\n\nReturns a \nListResponse\n which contains a property, \nList\nbool\n List\n\n\nUsage\n \n\n\nListResponse\nbool\n albumsSaved = _spotify.CheckSavedAlbums(new List\nString\n { \n1cq06d0kTUnFmJHixz1RaF\n });\nif(albumsSaved.List[0])\n Console.WriteLine(\nThe album is in your library!\n);", + "title": "- Library" + }, + { + "location": "/SpotifyWebAPI/library/#savetracks", + "text": "AUTH REQUIRED Save one or more tracks to the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs new List String { \"3Hvu1pq89D4R0lyPBoujSv\" } Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.SaveTracks(new List string { 3Hvu1pq89D4R0lyPBoujSv });\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "SaveTracks" + }, + { + "location": "/SpotifyWebAPI/library/#savetrack", + "text": "AUTH REQUIRED Save one track to the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example id A Spotify ID \"3Hvu1pq89D4R0lyPBoujSv\" Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.SaveTrack( 3Hvu1pq89D4R0lyPBoujSv );\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "SaveTrack" + }, + { + "location": "/SpotifyWebAPI/library/#getsavedtracks", + "text": "AUTH REQUIRED Get a list of the songs saved in the current Spotify user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example [limit] The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first object to return. Default: 0 (i.e., the first object) 0 [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. DE Returns a Paging , SavedTrack contains 2 properties, DateTime AddedAt and FullTrack Track Usage Paging SavedTrack savedTracks = _spotify.GetSavedTracks();\nsavedTracks.Items.ForEach(track = Console.WriteLine(track.Track.Name));", + "title": "GetSavedTracks" + }, + { + "location": "/SpotifyWebAPI/library/#removesavedtracks", + "text": "AUTH REQUIRED Remove one or more tracks from the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs. new List String { \"3Hvu1pq89D4R0lyPBoujSv\" } Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.RemoveSavedTracks(new List string { 3Hvu1pq89D4R0lyPBoujSv });\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "RemoveSavedTracks" + }, + { + "location": "/SpotifyWebAPI/library/#checksavedtracks", + "text": "AUTH REQUIRED Check if one or more tracks is already saved in the current Spotify user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs. new List String { \"3Hvu1pq89D4R0lyPBoujSv\" } Returns a ListResponse which contains a property, List bool List Usage ListResponse bool tracksSaved = _spotify.CheckSavedTracks(new List String { 3Hvu1pq89D4R0lyPBoujSv });\nif(tracksSaved.List[0])\n Console.WriteLine( The track is in your library! );", + "title": "CheckSavedTracks" + }, + { + "location": "/SpotifyWebAPI/library/#savealbums", + "text": "AUTH REQUIRED Save one or more albums to the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs new List String { \"1cq06d0kTUnFmJHixz1RaF\" } Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.SaveAlbums(new List string { 1cq06d0kTUnFmJHixz1RaF });\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "SaveAlbums" + }, + { + "location": "/SpotifyWebAPI/library/#savealbum", + "text": "AUTH REQUIRED Save one album to the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example id A Spotify ID \"1cq06d0kTUnFmJHixz1RaF\" Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.SaveAlbum( 1cq06d0kTUnFmJHixz1RaF );\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "SaveAlbum" + }, + { + "location": "/SpotifyWebAPI/library/#getsavedalbums", + "text": "AUTH REQUIRED Get a list of the albums saved in the current Spotify user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example [limit] The maximum number of objects to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first object to return. Default: 0 (i.e., the first object) 0 [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. DE Returns a Paging SavedAlbum , SavedAlbum contains 2 properties, DateTime AddedAt and FullAlbum Album Usage Paging SavedAlbum savedAlbums = _spotify.GetSavedAlbums();\nsavedAlbums.Items.ForEach(album = Console.WriteLine(album.Album.Name));", + "title": "GetSavedAlbums" + }, + { + "location": "/SpotifyWebAPI/library/#removesavedalbums", + "text": "AUTH REQUIRED Remove one or more albums from the current user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs. new List String { \"1cq06d0kTUnFmJHixz1RaF\" } Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.RemoveSavedAlbums(new List string { 1cq06d0kTUnFmJHixz1RaF });\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "RemoveSavedAlbums" + }, + { + "location": "/SpotifyWebAPI/library/#checksavedalbums", + "text": "AUTH REQUIRED Check if one or more albums is already saved in the current Spotify user\u2019s \u201cYour Music\u201d library. Paramters Name Description Example ids A list of the Spotify IDs. new List String { \"1cq06d0kTUnFmJHixz1RaF\" } Returns a ListResponse which contains a property, List bool List Usage ListResponse bool albumsSaved = _spotify.CheckSavedAlbums(new List String { 1cq06d0kTUnFmJHixz1RaF });\nif(albumsSaved.List[0])\n Console.WriteLine( The album is in your library! );", + "title": "CheckSavedAlbums" + }, + { + "location": "/SpotifyWebAPI/player/", + "text": "GetDevices\n\n\n\n\nGet information about a user\u2019s available devices.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUsage\n \n\n\nAvailabeDevices devices = _spotify.GetDevices();\ndevices.Devices.ForEach(device =\n Console.WriteLine(device.Name));\n\n\n\n\n\n\nGetPlayback\n\n\n\n\nGet information about the user\u2019s current playback state, including track, track progress, and active device.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nPlaybackContext context = _spotify.GetPlayback();\nif(contex.Item != null)\n Console.WriteLine(context.Item.Name)); //Print the current song\n\n\n\n\n\n\nGetPlayingTrack\n\n\n\n\nGet the object currently being played on the user\u2019s Spotify account.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nThis is a simpler (less data) version of \nGetPlayback\n\n\nUsage\n \n\n\nPlaybackContext context = _spotify.GetPlayingTrack();\nif(contex.Item != null)\n Console.WriteLine(context.Item.Name)); //Print the current song\n\n\n\n\n\n\nTransferPlayback\n\n\n\n\nTransfer playback to a new device and determine if it should start playing.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\ndeviceIds or deviceId\n\n\nA JSON array containing the ID of the device on which playback should be started/transferred\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\nplay\n\n\ntrue: ensure playback happens on new device, false: keep current playback state\n\n\ntrue\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.TransferPlayback(\nXXXX-XXXX-XXXX-XXXX\n);\n\n\n\n\n\n\nResumePlayback\n\n\n\n\nStart a new context or resume current playback on the user\u2019s active device.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\ncontextUri\n\n\nSpotify URI of the context to play\n\n\n\"spotify:album:1Je1IMUlBXcx1Fz0WE7oPT\"\n\n\n\n\n\n\nuris\n\n\nAn array of the Spotify track URIs to play.\n\n\nnew List\nstring\n { \"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\" }\n\n\n\n\n\n\noffset\n\n\nIndicates 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.\n\n\n0\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.ResumePlayback(uris: new List\nstring\n { \nspotify:track:4iV5W9uYEdYUVa79Axb7Rh\n });\n\n\n\n\n\n\nPausePlayback\n\n\n\n\nPause playback on the user\u2019s account.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.PausePlayback();\n\n\n\n\n\n\nSkipPlaybackToNext\n\n\n\n\nSkips to next track in the user\u2019s queue.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SkipPlaybackToNext();\n\n\n\n\n\n\nSkipPlaybackToPrevious\n\n\n\n\nSkips to previous track in the user\u2019s queue.\nNote that this will ALWAYS skip to the previous track, regardless of the current track\u2019s progress.\nReturning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SkipPlaybackToPrevious();\n\n\n\n\n\n\nSeekPlayback\n\n\n\n\nSeeks to the given position in the user\u2019s currently playing track.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\npositionMs\n\n\nThe 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.\n\n\n50\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SeekPlayback(50);\n\n\n\n\n\n\nSetRepeatMode\n\n\n\n\nSet the repeat mode for the user\u2019s playback. Options are repeat-track, repeat-context, and off.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nstate\n\n\ntrack, context or off.\n\n\nRepeatState.Track\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SetRepeatMode(RepeatState.Track);\n\n\n\n\n\n\nSetVolume\n\n\n\n\nSet the volume for the user\u2019s current playback device.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nvolumePercent\n\n\nInteger. The volume to set. Must be a value from 0 to 100 inclusive.\n\n\n50\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SetVolume(50);\n\n\n\n\n\n\nSetShuffle\n\n\n\n\nToggle shuffle on or off for user\u2019s playback.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nshuffle\n\n\nTrue or False\n\n\nfalse\n\n\n\n\n\n\n[deviceId]\n\n\nThe id of the device this command is targeting. If not supplied, the user's currently active device is the target.\n\n\n\"XXXX-XXXX-XXXX-XXXX\"\n\n\n\n\n\n\n\n\nUsage\n \n\n\nErrorResponse error = _spotify.SetShuffle(false);", + "title": "- Player" + }, + { + "location": "/SpotifyWebAPI/player/#getdevices", + "text": "Get information about a user\u2019s available devices. Paramters Name Description Example Usage AvailabeDevices devices = _spotify.GetDevices();\ndevices.Devices.ForEach(device = Console.WriteLine(device.Name));", + "title": "GetDevices" + }, + { + "location": "/SpotifyWebAPI/player/#getplayback", + "text": "Get information about the user\u2019s current playback state, including track, track progress, and active device. Paramters Name Description Example [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Usage PlaybackContext context = _spotify.GetPlayback();\nif(contex.Item != null)\n Console.WriteLine(context.Item.Name)); //Print the current song", + "title": "GetPlayback" + }, + { + "location": "/SpotifyWebAPI/player/#getplayingtrack", + "text": "Get the object currently being played on the user\u2019s Spotify account. Paramters Name Description Example [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" This is a simpler (less data) version of GetPlayback Usage PlaybackContext context = _spotify.GetPlayingTrack();\nif(contex.Item != null)\n Console.WriteLine(context.Item.Name)); //Print the current song", + "title": "GetPlayingTrack" + }, + { + "location": "/SpotifyWebAPI/player/#transferplayback", + "text": "Transfer playback to a new device and determine if it should start playing. Paramters Name Description Example deviceIds or deviceId A JSON array containing the ID of the device on which playback should be started/transferred \"XXXX-XXXX-XXXX-XXXX\" play true: ensure playback happens on new device, false: keep current playback state true Usage ErrorResponse error = _spotify.TransferPlayback( XXXX-XXXX-XXXX-XXXX );", + "title": "TransferPlayback" + }, + { + "location": "/SpotifyWebAPI/player/#resumeplayback", + "text": "Start a new context or resume current playback on the user\u2019s active device. Paramters Name Description Example [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" contextUri Spotify URI of the context to play \"spotify:album:1Je1IMUlBXcx1Fz0WE7oPT\" uris An array of the Spotify track URIs to play. new List string { \"spotify:track:4iV5W9uYEdYUVa79Axb7Rh\" } offset 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. 0 Usage ErrorResponse error = _spotify.ResumePlayback(uris: new List string { spotify:track:4iV5W9uYEdYUVa79Axb7Rh });", + "title": "ResumePlayback" + }, + { + "location": "/SpotifyWebAPI/player/#pauseplayback", + "text": "Pause playback on the user\u2019s account. Paramters Name Description Example [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.PausePlayback();", + "title": "PausePlayback" + }, + { + "location": "/SpotifyWebAPI/player/#skipplaybacktonext", + "text": "Skips to next track in the user\u2019s queue. Paramters Name Description Example [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SkipPlaybackToNext();", + "title": "SkipPlaybackToNext" + }, + { + "location": "/SpotifyWebAPI/player/#skipplaybacktoprevious", + "text": "Skips to previous track in the user\u2019s queue.\nNote that this will ALWAYS skip to the previous track, regardless of the current track\u2019s progress.\nReturning to the start of the current track should be performed using the https://api.spotify.com/v1/me/player/seek endpoint. Paramters Name Description Example [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SkipPlaybackToPrevious();", + "title": "SkipPlaybackToPrevious" + }, + { + "location": "/SpotifyWebAPI/player/#seekplayback", + "text": "Seeks to the given position in the user\u2019s currently playing track. Paramters Name Description Example 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. 50 [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SeekPlayback(50);", + "title": "SeekPlayback" + }, + { + "location": "/SpotifyWebAPI/player/#setrepeatmode", + "text": "Set the repeat mode for the user\u2019s playback. Options are repeat-track, repeat-context, and off. Paramters Name Description Example state track, context or off. RepeatState.Track [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SetRepeatMode(RepeatState.Track);", + "title": "SetRepeatMode" + }, + { + "location": "/SpotifyWebAPI/player/#setvolume", + "text": "Set the volume for the user\u2019s current playback device. Paramters Name Description Example volumePercent Integer. The volume to set. Must be a value from 0 to 100 inclusive. 50 [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SetVolume(50);", + "title": "SetVolume" + }, + { + "location": "/SpotifyWebAPI/player/#setshuffle", + "text": "Toggle shuffle on or off for user\u2019s playback. Paramters Name Description Example shuffle True or False false [deviceId] The id of the device this command is targeting. If not supplied, the user's currently active device is the target. \"XXXX-XXXX-XXXX-XXXX\" Usage ErrorResponse error = _spotify.SetShuffle(false);", + "title": "SetShuffle" + }, + { + "location": "/SpotifyWebAPI/playlists/", + "text": "GetUserPlaylists\n\n\nAUTH REQUIRED\n\n\n\n\nGet a list of the playlists owned or followed by a Spotify user.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first playlist to return. Default: 0 (the first object)\n\n\n0\n\n\n\n\n\n\n\n\nReturns a \nSimplePlaylist\n wrapped inside a \nPaging Object\n\n\nUsage\n \n\n\nPaging\nSimplePlaylist\n userPlaylists = _spotify.GetUserPlaylists(\n1122095781\n);\nuserPlaylists.Items.ForEach(playlist =\n playlist.Owner.DisplayName) //Who is the owner of the playlist?\n\n\n\n\n\n\nGetPlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nGet a playlist owned by a Spotify user.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\n[fields]\n\n\nFilters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned.\n\n\n\"description,uri\"\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nFullTrack\n\n\nUsage\n \n\n\nFullPlaylist playlist = _spotify.GetPlaylist(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n);\nplaylist.Tracks.Items.ForEach(track =\n Console.WriteLine(track.Track.Name));\n\n\n\n\n\n\nGetPlaylistTracks\n\n\nAUTH REQUIRED\n\n\n\n\nGet full details of the tracks of a playlist owned by a Spotify user.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\n[fields]\n\n\nFilters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned.\n\n\n\"description,uri\"\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100.\n\n\n100\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first object to return. Default: 0 (i.e., the first object)\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\nDE\n\n\n\n\n\n\n\n\nReturns a \nPlaylistTrack\n wrapped inside a \nPaging Object\n\n\nUsage\n \n\n\nPaging\nPlaylistTrack\n playlist = _spotify.GetPlaylistTracks(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n);\nplaylist.Items.ForEach(track =\n Console.WriteLine(track.Track.Name));\n\n\n\n\n\n\nCreatePlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nCreate a playlist for a Spotify user. (The playlist will be empty until you add tracks.)\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistName\n\n\nThe name for the new playlist, for example \"Your Coolest Playlist\". This name does not need to be unique.\n\n\n\"This is my new Playlist\"\n\n\n\n\n\n\n[isPublic]\n\n\ndefault 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.\n\n\ntrue\n\n\n\n\n\n\n\n\nReturns a \nFullPlaylist\n\n\nUsage\n \n\n\nFullPlaylist playlist = _spotify.CreatePlaylist(\n1122095781\n, \nThis is my new Playlist\n);\nif(!playlist.HasError())\n Console.WriteLine(\nPlaylist-URI: \n + playlist.Uri);\n\n\n\n\n\n\nUpdatePlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nChange a playlist\u2019s name and public/private state. (The user must, of course, own the playlist.)\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\n[newName]\n\n\nThe new name for the playlist, for example \"My New Playlist Title\".\n\n\n\"New Playlistname\"\n\n\n\n\n\n\n[newPublic]\n\n\nIf true the playlist will be public, if false it will be private.\n\n\nEXAMPLE\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.UpdatePlaylist(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, \nNew Name\n, true);\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nReplacePlaylistTracks\n\n\nAUTH REQUIRED\n\n\n\n\nReplace 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.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nuris\n\n\nA list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request.\n\n\nnew List\nstring\n { \"1ri6UZpjPLmTCswIXZ6Uq1\" }\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.ReplacePlaylistTracks(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new List\nstring\n { \n1ri6UZpjPLmTCswIXZ6Uq1\n });\nif(!response.HasError())\n Console.WriteLine(\nsuccess\n);\n\n\n\n\n\n\nRemovePlaylistTracks\n\n\nAUTH REQUIRED\n\n\n\n\nRemove one or more tracks from a user\u2019s playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nuris\n\n\narray of objects containing Spotify URI strings (and their position in the playlist). A maximum of 100 objects can be sent at once.\n\n\n(example below)\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\n//Remove multiple tracks\nErrorResponse playlist = _spotify.RemovePlaylistTracks(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new List\nDeleteTrackUri\n()\n{\n new DeleteTrackUri(\n1ri6UZpjPLmTCswIXZ6Uq1\n),\n new DeleteTrackUri(\n47xtGU3vht7mXLHqnbaau5\n)\n});\n//Remove multiple tracks at their specified positions\nErrorResponse playlist = _spotify.RemovePlaylistTracks(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new List\nDeleteTrackUri\n()\n{\n new DeleteTrackUri(\n1ri6UZpjPLmTCswIXZ6Uq1\n, 2),\n new DeleteTrackUri(\n47xtGU3vht7mXLHqnbaau5\n, 0, 50)\n});\n\n\n\n\n\n\nRemovePlaylistTrack\n\n\nAUTH REQUIRED\n\n\n\n\nRemove one or more tracks from a user\u2019s playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nuri\n\n\nSpotify URI\n\n\nnew DeleteTrackUri(\"1ri6UZpjPLmTCswIXZ6Uq1\")\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\n//Remove all tracks with the specified URI\nErrorResponse response = _spotify.RemovePlaylistTrack(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new DeleteTrackUri(\n1ri6UZpjPLmTCswIXZ6Uq1\n));\n//Remove all tracks with the specified URI and the specified positions\nErrorResponse response = _spotify.RemovePlaylistTrack(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new DeleteTrackUri(\n1ri6UZpjPLmTCswIXZ6Uq1\n, 0, 10, 20));\n\n\n\n\n\n\nAddPlaylistTracks\n\n\nAUTH REQUIRED\n\n\n\n\nAdd one or more tracks to a user\u2019s playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nuris\n\n\nA list of Spotify track URIs to add\n\n\nnew List\nstring\n { \"1ri6UZpjPLmTCswIXZ6Uq1\" }\n\n\n\n\n\n\n[position]\n\n\nThe position to insert the tracks, a zero-based index\n\n\n10\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.AddPlaylistTracks(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, new List\nstring\n { \n1ri6UZpjPLmTCswIXZ6Uq1\n });\nif(!response.HasError())\n Console.WriteLine(\nSuccess\n);\n\n\n\n\n\n\nAddPlaylistTrack\n\n\nAUTH REQUIRED\n\n\n\n\nAdd one or more tracks to a user\u2019s playlist.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nuri\n\n\nA Spotify Track URI\n\n\n\"1ri6UZpjPLmTCswIXZ6Uq1\"\n\n\n\n\n\n\nposition\n\n\nThe position to insert the tracks, a zero-based index\n\n\n10\n\n\n\n\n\n\n\n\nReturns a \nErrorResponse\n which just contains a possible error. (\nresponse.HasError()\n and \nresponse.Error\n)\n\n\nUsage\n \n\n\nErrorResponse response = _spotify.AddPlaylistTrack(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, \n1ri6UZpjPLmTCswIXZ6Uq1\n);\nif(!response.HasError())\n Console.WriteLine(\nSuccess\n);\n\n\n\n\n\n\nReorderPlaylist\n\n\nAUTH REQUIRED\n\n\n\n\nReorder a track or a group of tracks in a playlist.\nMore Info: \nReorder-Playlist\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\n\"1122095781\"\n\n\n\n\n\n\nplaylistId\n\n\nThe Spotify ID for the playlist.\n\n\n\"1TtEejT1y4D1WmcOnLfha2\"\n\n\n\n\n\n\nrangeStart\n\n\nThe position of the first track to be reordered.\n\n\n2\n\n\n\n\n\n\ninsertBefore\n\n\nThe position where the tracks should be inserted.\n\n\n0\n\n\n\n\n\n\n[rangeLength]\n\n\nThe amount of tracks to be reordered. Defaults to 1 if not set.\n\n\n2\n\n\n\n\n\n\n[snapshotId]\n\n\nThe playlist's snapshot ID against which you want to make the changes.\n\n\n``\n\n\n\n\n\n\n\n\nReturns a \nSnapshot\n-Object which contains the property \nString SnapshotId\n\n\nUsage\n \n\n\nSnapshot snapshot = _spotify.ReorderPlaylist(\n1122095781\n, \n1TtEejT1y4D1WmcOnLfha2\n, 2, 0, 2);\nConsole.WriteLine(\nNew SnapshotId: \n + snapshot.SnapshotId);", + "title": "- Playlists" + }, + { + "location": "/SpotifyWebAPI/playlists/#getuserplaylists", + "text": "AUTH REQUIRED Get a list of the playlists owned or followed by a Spotify user. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" [limit] The maximum number of playlists to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first playlist to return. Default: 0 (the first object) 0 Returns a SimplePlaylist wrapped inside a Paging Object Usage Paging SimplePlaylist userPlaylists = _spotify.GetUserPlaylists( 1122095781 );\nuserPlaylists.Items.ForEach(playlist = playlist.Owner.DisplayName) //Who is the owner of the playlist?", + "title": "GetUserPlaylists" + }, + { + "location": "/SpotifyWebAPI/playlists/#getplaylist", + "text": "AUTH REQUIRED Get a playlist owned by a Spotify user. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" [fields] Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned. \"description,uri\" [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a FullTrack Usage FullPlaylist playlist = _spotify.GetPlaylist( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 );\nplaylist.Tracks.Items.ForEach(track = Console.WriteLine(track.Track.Name));", + "title": "GetPlaylist" + }, + { + "location": "/SpotifyWebAPI/playlists/#getplaylisttracks", + "text": "AUTH REQUIRED Get full details of the tracks of a playlist owned by a Spotify user. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" [fields] Filters for the query: a comma-separated list of the fields to return. If omitted, all fields are returned. \"description,uri\" [limit] The maximum number of tracks to return. Default: 100. Minimum: 1. Maximum: 100. 100 [offset] The index of the first object to return. Default: 0 (i.e., the first object) 0 [market] An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. DE Returns a PlaylistTrack wrapped inside a Paging Object Usage Paging PlaylistTrack playlist = _spotify.GetPlaylistTracks( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 );\nplaylist.Items.ForEach(track = Console.WriteLine(track.Track.Name));", + "title": "GetPlaylistTracks" + }, + { + "location": "/SpotifyWebAPI/playlists/#createplaylist", + "text": "AUTH REQUIRED Create a playlist for a Spotify user. (The playlist will be empty until you add tracks.) Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistName The name for the new playlist, for example \"Your Coolest Playlist\". This name does not need to be unique. \"This is my new Playlist\" [isPublic] 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. true Returns a FullPlaylist Usage FullPlaylist playlist = _spotify.CreatePlaylist( 1122095781 , This is my new Playlist );\nif(!playlist.HasError())\n Console.WriteLine( Playlist-URI: + playlist.Uri);", + "title": "CreatePlaylist" + }, + { + "location": "/SpotifyWebAPI/playlists/#updateplaylist", + "text": "AUTH REQUIRED Change a playlist\u2019s name and public/private state. (The user must, of course, own the playlist.) Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" [newName] The new name for the playlist, for example \"My New Playlist Title\". \"New Playlistname\" [newPublic] If true the playlist will be public, if false it will be private. EXAMPLE Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.UpdatePlaylist( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , New Name , true);\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "UpdatePlaylist" + }, + { + "location": "/SpotifyWebAPI/playlists/#replaceplaylisttracks", + "text": "AUTH REQUIRED Replace all the tracks in a playlist, overwriting its existing tracks. This powerful request can be useful for replacing tracks, re-ordering existing tracks, or clearing the playlist. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" uris A list of Spotify track URIs to set. A maximum of 100 tracks can be set in one request. new List string { \"1ri6UZpjPLmTCswIXZ6Uq1\" } Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.ReplacePlaylistTracks( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new List string { 1ri6UZpjPLmTCswIXZ6Uq1 });\nif(!response.HasError())\n Console.WriteLine( success );", + "title": "ReplacePlaylistTracks" + }, + { + "location": "/SpotifyWebAPI/playlists/#removeplaylisttracks", + "text": "AUTH REQUIRED Remove one or more tracks from a user\u2019s playlist. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" uris array of objects containing Spotify URI strings (and their position in the playlist). A maximum of 100 objects can be sent at once. (example below) Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage //Remove multiple tracks\nErrorResponse playlist = _spotify.RemovePlaylistTracks( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new List DeleteTrackUri ()\n{\n new DeleteTrackUri( 1ri6UZpjPLmTCswIXZ6Uq1 ),\n new DeleteTrackUri( 47xtGU3vht7mXLHqnbaau5 )\n});\n//Remove multiple tracks at their specified positions\nErrorResponse playlist = _spotify.RemovePlaylistTracks( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new List DeleteTrackUri ()\n{\n new DeleteTrackUri( 1ri6UZpjPLmTCswIXZ6Uq1 , 2),\n new DeleteTrackUri( 47xtGU3vht7mXLHqnbaau5 , 0, 50)\n});", + "title": "RemovePlaylistTracks" + }, + { + "location": "/SpotifyWebAPI/playlists/#removeplaylisttrack", + "text": "AUTH REQUIRED Remove one or more tracks from a user\u2019s playlist. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" uri Spotify URI new DeleteTrackUri(\"1ri6UZpjPLmTCswIXZ6Uq1\") Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage //Remove all tracks with the specified URI\nErrorResponse response = _spotify.RemovePlaylistTrack( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new DeleteTrackUri( 1ri6UZpjPLmTCswIXZ6Uq1 ));\n//Remove all tracks with the specified URI and the specified positions\nErrorResponse response = _spotify.RemovePlaylistTrack( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new DeleteTrackUri( 1ri6UZpjPLmTCswIXZ6Uq1 , 0, 10, 20));", + "title": "RemovePlaylistTrack" + }, + { + "location": "/SpotifyWebAPI/playlists/#addplaylisttracks", + "text": "AUTH REQUIRED Add one or more tracks to a user\u2019s playlist. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" uris A list of Spotify track URIs to add new List string { \"1ri6UZpjPLmTCswIXZ6Uq1\" } [position] The position to insert the tracks, a zero-based index 10 Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.AddPlaylistTracks( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , new List string { 1ri6UZpjPLmTCswIXZ6Uq1 });\nif(!response.HasError())\n Console.WriteLine( Success );", + "title": "AddPlaylistTracks" + }, + { + "location": "/SpotifyWebAPI/playlists/#addplaylisttrack", + "text": "AUTH REQUIRED Add one or more tracks to a user\u2019s playlist. Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" uri A Spotify Track URI \"1ri6UZpjPLmTCswIXZ6Uq1\" position The position to insert the tracks, a zero-based index 10 Returns a ErrorResponse which just contains a possible error. ( response.HasError() and response.Error ) Usage ErrorResponse response = _spotify.AddPlaylistTrack( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , 1ri6UZpjPLmTCswIXZ6Uq1 );\nif(!response.HasError())\n Console.WriteLine( Success );", + "title": "AddPlaylistTrack" + }, + { + "location": "/SpotifyWebAPI/playlists/#reorderplaylist", + "text": "AUTH REQUIRED Reorder a track or a group of tracks in a playlist.\nMore Info: Reorder-Playlist Paramters Name Description Example userId The user's Spotify user ID. \"1122095781\" playlistId The Spotify ID for the playlist. \"1TtEejT1y4D1WmcOnLfha2\" rangeStart The position of the first track to be reordered. 2 insertBefore The position where the tracks should be inserted. 0 [rangeLength] The amount of tracks to be reordered. Defaults to 1 if not set. 2 [snapshotId] The playlist's snapshot ID against which you want to make the changes. `` Returns a Snapshot -Object which contains the property String SnapshotId Usage Snapshot snapshot = _spotify.ReorderPlaylist( 1122095781 , 1TtEejT1y4D1WmcOnLfha2 , 2, 0, 2);\nConsole.WriteLine( New SnapshotId: + snapshot.SnapshotId);", + "title": "ReorderPlaylist" + }, + { + "location": "/SpotifyWebAPI/profiles/", + "text": "GetPrivateProfile\n\n\nAUTH REQUIRED\n\n\n\n\nGet detailed profile information about the current user (including the current user\u2019s username).\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nReturns a \nPrivateProfile\n\n\nUsage\n \n\n\nPrivateUser user = _spotify.GetPrivateProfile();\nConsole.WriteLine(user.DisplayName);\n\n\n\n\n\n\nGetPublicProfile\n\n\n\n\nGet public profile information about a Spotify user.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nuserId\n\n\nThe user's Spotify user ID.\n\n\nEXAMPLE\n\n\n\n\n\n\n\n\nReturns a \nPublicProfile\n\n\nUsage", + "title": "- Profiles" + }, + { + "location": "/SpotifyWebAPI/profiles/#getprivateprofile", + "text": "AUTH REQUIRED Get detailed profile information about the current user (including the current user\u2019s username). Paramters Name Description Example Returns a PrivateProfile Usage PrivateUser user = _spotify.GetPrivateProfile();\nConsole.WriteLine(user.DisplayName);", + "title": "GetPrivateProfile" + }, + { + "location": "/SpotifyWebAPI/profiles/#getpublicprofile", + "text": "Get public profile information about a Spotify user. Paramters Name Description Example userId The user's Spotify user ID. EXAMPLE Returns a PublicProfile Usage", + "title": "GetPublicProfile" + }, + { + "location": "/SpotifyWebAPI/search/", + "text": "SearchItems\n\n\n\n\nGet Spotify catalog information about artists, albums, tracks or playlists that match a keyword string.\n\n\n\n\nParamters\n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nq\n\n\nThe search query's keywords (and optional field filters and operators), for example q=roadhouse+blues.\n\n\n\"roadhouse+blues\"\n\n\n\n\n\n\ntype\n\n\nA list of item types to search across.\n\n\nSearchType.Album\n\n\n\n\n\n\n[limit]\n\n\nThe maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50.\n\n\n20\n\n\n\n\n\n\n[offset]\n\n\nThe index of the first result to return. Default: 0\n\n\n0\n\n\n\n\n\n\n[market]\n\n\nAn ISO 3166-1 alpha-2 country code or the string from_token.\n\n\n\"de\"\n\n\n\n\n\n\n\n\nReturns a \nSearchItem\n which contains the properties \nPaging\nFullArtist\n Artists\n,\nPaging\nFullTrack\n Tracks\n, \nPaging\nSimpleAlbum\n Albums\n, \nPaging\nSimplePlaylist\n Playlists\n. They are filled based on your search-type.\n\n\nUsage\n\n\nSearchItem item = _spotify.SearchItems(\nroadhouse+blues\n, SearchType.Album | SearchType.Playlist);\nConsole.WriteLine(item.Albums.Total); //How many results are there in total? NOTE: item.Tracks = item.Artists = null", + "title": "- Search" + }, + { + "location": "/SpotifyWebAPI/search/#searchitems", + "text": "Get Spotify catalog information about artists, albums, tracks or playlists that match a keyword string. Paramters Name Description Example q The search query's keywords (and optional field filters and operators), for example q=roadhouse+blues. \"roadhouse+blues\" type A list of item types to search across. SearchType.Album [limit] The maximum number of items to return. Default: 20. Minimum: 1. Maximum: 50. 20 [offset] The index of the first result to return. Default: 0 0 [market] An ISO 3166-1 alpha-2 country code or the string from_token. \"de\" Returns a SearchItem which contains the properties Paging FullArtist Artists , Paging FullTrack Tracks , Paging SimpleAlbum Albums , Paging SimplePlaylist Playlists . They are filled based on your search-type. Usage SearchItem item = _spotify.SearchItems( roadhouse+blues , SearchType.Album | SearchType.Playlist);\nConsole.WriteLine(item.Albums.Total); //How many results are there in total? NOTE: item.Tracks = item.Artists = null", + "title": "SearchItems" + }, + { + "location": "/SpotifyWebAPI/tracks/", + "text": "GetSeveralTracks\n\n\n\n\nGet Spotify catalog information for multiple tracks based on their Spotify IDs.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nids\n\n\nA list of the Spotify IDs for the tracks. Maximum: 50 IDs.\n\n\nnew List\nString\n {\"6Y1CLPwYe7zvI8PJiWVz6T\"}\n\n\n\n\n\n\nmarket\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nSeveralTracks\n object which has one property, \nList\nFullTrack\n Tracks\n\n\nUsage\n \n\n\nSeveralTracks severalTracks = _spotify.GetSeveralTracks(new List\nString\n {\n6Y1CLPwYe7zvI8PJiWVz6T\n});\nseveralTracks.Tracks.ForEach(track =\n Console.WriteLine(track.Name));\n\n\n\n\n\n\nGetTrack\n\n\n\n\nGet Spotify catalog information for a single track identified by its unique Spotify ID.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the track.\n\n\n\"6Y1CLPwYe7zvI8PJiWVz6T\"\n\n\n\n\n\n\nmarket\n\n\nAn ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking.\n\n\n\"DE\"\n\n\n\n\n\n\n\n\nReturns a \nFullTrack\n\n\nUsage\n \n\n\nFullTrack track = _spotify.GetTrack(\n6Y1CLPwYe7zvI8PJiWVz6T\n);\nConsole.WriteLine(track.Name);\n\n\n\n\n\n\nGetAudioAnalysis\n\n\n\n\nGet a detailed audio analysis for a single track identified by its unique Spotify ID.\n\n\n\n\nParamters\n \n\n\n\n\n\n\n\n\nName\n\n\nDescription\n\n\nExample\n\n\n\n\n\n\n\n\n\n\nid\n\n\nThe Spotify ID for the track.\n\n\n\"6Y1CLPwYe7zvI8PJiWVz6T\"\n\n\n\n\n\n\n\n\nReturns a AudioAnalysis. This object is currently lacking Spotify documentation but archived \nEchoNest documentation\n is relevant.\n\n\nUsage\n \n\n\nAudioAnalysis analysis = _spotify.GetAudioAnalysis(\n6Y1CLPwYe7zvI8PJiWVz6T\n);\nConsole.WriteLine(analysis.Meta.DetailedStatus);", + "title": "- Tracks" + }, + { + "location": "/SpotifyWebAPI/tracks/#getseveraltracks", + "text": "Get Spotify catalog information for multiple tracks based on their Spotify IDs. Paramters Name Description Example ids A list of the Spotify IDs for the tracks. Maximum: 50 IDs. new List String {\"6Y1CLPwYe7zvI8PJiWVz6T\"} market An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a SeveralTracks object which has one property, List FullTrack Tracks Usage SeveralTracks severalTracks = _spotify.GetSeveralTracks(new List String { 6Y1CLPwYe7zvI8PJiWVz6T });\nseveralTracks.Tracks.ForEach(track = Console.WriteLine(track.Name));", + "title": "GetSeveralTracks" + }, + { + "location": "/SpotifyWebAPI/tracks/#gettrack", + "text": "Get Spotify catalog information for a single track identified by its unique Spotify ID. Paramters Name Description Example id The Spotify ID for the track. \"6Y1CLPwYe7zvI8PJiWVz6T\" market An ISO 3166-1 alpha-2 country code. Provide this parameter if you want to apply Track Relinking. \"DE\" Returns a FullTrack Usage FullTrack track = _spotify.GetTrack( 6Y1CLPwYe7zvI8PJiWVz6T );\nConsole.WriteLine(track.Name);", + "title": "GetTrack" + }, + { + "location": "/SpotifyWebAPI/tracks/#getaudioanalysis", + "text": "Get a detailed audio analysis for a single track identified by its unique Spotify ID. Paramters Name Description Example id The Spotify ID for the track. \"6Y1CLPwYe7zvI8PJiWVz6T\" Returns a AudioAnalysis. This object is currently lacking Spotify documentation but archived EchoNest documentation is relevant. Usage AudioAnalysis analysis = _spotify.GetAudioAnalysis( 6Y1CLPwYe7zvI8PJiWVz6T );\nConsole.WriteLine(analysis.Meta.DetailedStatus);", + "title": "GetAudioAnalysis" + }, + { + "location": "/SpotifyWebAPI/util/", + "text": "Paging-Methods\n\n\nThe \nSpotifyWebAPI\n features two paging-helper Methods, \nGetNextPage(Paging\nT\n page)\n and \nGetPreviousPage(Paging\nT\n page)\n.\nBoth are an easy way to receive the next/previous page of a Paging-Object.\n\n\nSample:\n\n\nvar playlistTracks = _spotify.GetPlaylistTracks(\n1122095781\n, \n4EcNf2l8rXInbJOf3tQdgU\n, \n, 50);\nwhile (true)\n{\n Console.WriteLine(playlistTracks.Items.Count);\n if (!playlistTracks.HasNextPage())\n break;\n playlistTracks = _spotify.GetNextPage(playlistTracks);\n}", + "title": "- Util" + }, + { + "location": "/SpotifyWebAPI/util/#paging-methods", + "text": "The SpotifyWebAPI features two paging-helper Methods, GetNextPage(Paging T page) and GetPreviousPage(Paging T page) .\nBoth are an easy way to receive the next/previous page of a Paging-Object. Sample: var playlistTracks = _spotify.GetPlaylistTracks( 1122095781 , 4EcNf2l8rXInbJOf3tQdgU , , 50);\nwhile (true)\n{\n Console.WriteLine(playlistTracks.Items.Count);\n if (!playlistTracks.HasNextPage())\n break;\n playlistTracks = _spotify.GetNextPage(playlistTracks);\n}", + "title": "Paging-Methods" + }, + { + "location": "/SpotifyLocalAPI/", + "text": "Getting started\n\n\nThis API provides some access to the local running Spotify-Client (Windows only).\n\nYou can fetch details for the current track, play/pause, skip/previous track and\nget notified on various events.\n\n\nNOTE:\n This API is unofficial, things may brake in the future and there is no\nguarantee everything works out of the box.\n\n\n\n\nFirst steps\n\n\nImports\n\nSo after you added the API to your project, you may want to add following imports to your files:\n\n\nusing SpotifyAPI.Local; //Base Namespace\nusing SpotifyAPI.Local.Enums; //Enums\nusing SpotifyAPI.Local.Models; //Models for the JSON-responses\n\n\n\n\nBasic-Usage\n\nNow you can actually start fetching infos from your spotify client, just create a new Instance of SpotifyLocalAPI:\n\n\nprivate static SpotifyLocalAPI _spotify;\n\npublic static void Main(String[] args)\n{\n _spotify = new SpotifyLocalAPI();\n if (!SpotifyLocalAPI.IsSpotifyRunning())\n return; //Make sure the spotify client is running\n if (!SpotifyLocalAPI.IsSpotifyWebHelperRunning())\n return; //Make sure the WebHelper is running\n\n if(!_spotify.Connect())\n return; //We need to call Connect before fetching infos, this will handle Auth stuff\n\n StatusResponse status = _spotify.GetStatus(); //status contains infos\n}\n\n\n\n\nConfiguration\n\n\nDifferent spotify versions often require different configuration. Some versions run their web-helper on port \n4371\n, others on \n4381\n. Also, some use \nhttps\n, and others use \nhttp\n. You can use \nSpotifyLocalAPIConfig\n to configure the API:\n\n\n_spotify = new SpotifyLocalAPI(new SpotifyLocalAPIConfig\n{\n Port = 4371,\n HostUrl = \nhttps://127.0.0.1\n\n});\n\n\n\n\nAnti-Virus Blocking Response\n\n\nSome Anti-Virus Software blocks the response from spotify due wrong headers.\nCurrently, it's confirmed for AVG's LinkScanner and Bitdefender.\nAdding \nhttp://SpotifyAPI.spotilocal.com:4380\n to the URL-Exceptions seems to fix it for most users.\nMore infos can be found \nhere\n\n\nClient Status\n\n\nCalling \n_spotify.GetStatus()\n after connecting returns the following \nStatusResponse\n:\n\n\npublic int Version { get; set; }\n\npublic string ClientVersion { get; set; }\n\npublic bool Playing { get; set; }\n\npublic bool Shuffle { get; set; }\n\npublic bool Repeat { get; set; }\n\npublic bool PlayEnabled { get; set; }\n\npublic bool PrevEnabled { get; set; }\n\npublic bool NextEnabled { get; set; }\n\npublic Track Track { get; set; }\n\npublic double PlayingPosition { get; set; }\n\npublic int ServerTime { get; set; }\n\npublic double Volume { get; set; }\n\npublic bool Online { get; set; }\n\npublic bool Running { get; set; }\n\n\n\n\nMost of the properties are self-explanatory, some notes:\n\n\n\n\nShuffle\n and \nRepeat\n currently always return \nfalse\n\n\n\n\nCurrent Track\n\n\nThe current Track can be fetched via \n_spotify.GetStatus().Track\n and contains following properties/methods:\n\n\n\n\nTrackResource\n - \nSpotifyResource\n which contains Track \nName\n and \nUri\n\n\nAlbumResource\n - \nSpotifyResource\n which contains Album \nName\n and \nUri\n\n\nArtistResource\n - \nSpotifyResource\n which contains Artist \nName\n and \nUri\n (Only the main artist will be listed)\n\n\nIsAd()\n will check whether the current track is an AD\n\n\nVarious methods for getting the album art:\n\n\nstring GetAlbumArtUrl(AlbumArtSize size)\n\n\nTask\nBitmap\n GetAlbumArtAsync(AlbumArtSize size)\n\n\nBitmap GetAlbumArt(AlbumArtSize size)\n\n\nTask\nbyte[]\n GetAlbumArtAsByteArrayAsync(AlbumArtSize size)\n\n\nbyte[] GetAlbumArtAsByteArray(AlbumArtSize size)\n\n\n\n\nEvents\n\n\nTo receive events, make sure you listen for them \n_spotify.ListenForEvents = true;\n\nYou can set a \nSynchronizingObject\n, then the events will be called on the specific context\n\n\nFollowing events can be overriden:\n\n\n\n\nOnPlayStateChange\n - triggers when the player changes from \nplay\n to \npause\n and vice versa\n\n\nOnTrackChange\n - triggers when a new track will be played\n\n\nOnTrackTimeChange\n - triggers when a track is playing and track-time changes\n\n\nOnVolumeChange\n - triggeres when the internal volume of spotify changes\n\n\n\n\nMethods\n\n\nFurthermore, following methods are available:\n\n\n\n\nvoid Mute()\n - will mute the Spotify client via WindowsAPI\n\n\nvoid UnMute()\n - will unmute the Spotify client via WindowsAPI\n\n\nbool IsSpotifyMuted()\n - will return wether the Spotify client is muted\n\n\nvoid SetSpotifyVolume(float volume = 100)\n - sets the windows volume of spotify (0 - 100)\n\n\nfloat GetSpotifyVolume()\n - returns the windows volume of spotify (0 - 100)\n\n\nvoid Pause()\n - will pause spotify's playback\n\n\nvoid Play()\n - will resume spotify's playback\n\n\nvoid PlayURL(string uri, string context = \"\")\n - will play a spotify URI (track/album/playlist) in the specifc context (can be a album/playlist URI)\n\n\nvoid Skip()\n - will skip the track via an emulated media key\n\n\nvoid Previous()\n - will play the previous track via an emulated media key\n\n\nbool IsSpotifyRunning()\n - returns true if a spotify client instance is running, false if not\n\n\nbool IsSpotifyWebHelperRunning()\n - returns true if a spotify web-helper instance is running, false if not\n\n\nvoid RunSpotify()\n - will attempt to start a Spotify instance\n\n\nvoid RunSpotifyWebHelper()\n - will attempt to start a Spotify web-helper instance", + "title": "SpotifyLocalAPI" + }, + { + "location": "/SpotifyLocalAPI/#getting-started", + "text": "This API provides some access to the local running Spotify-Client (Windows only). \nYou can fetch details for the current track, play/pause, skip/previous track and\nget notified on various events. NOTE: This API is unofficial, things may brake in the future and there is no\nguarantee everything works out of the box.", + "title": "Getting started" + }, + { + "location": "/SpotifyLocalAPI/#first-steps", + "text": "Imports \nSo after you added the API to your project, you may want to add following imports to your files: using SpotifyAPI.Local; //Base Namespace\nusing SpotifyAPI.Local.Enums; //Enums\nusing SpotifyAPI.Local.Models; //Models for the JSON-responses Basic-Usage \nNow you can actually start fetching infos from your spotify client, just create a new Instance of SpotifyLocalAPI: private static SpotifyLocalAPI _spotify;\n\npublic static void Main(String[] args)\n{\n _spotify = new SpotifyLocalAPI();\n if (!SpotifyLocalAPI.IsSpotifyRunning())\n return; //Make sure the spotify client is running\n if (!SpotifyLocalAPI.IsSpotifyWebHelperRunning())\n return; //Make sure the WebHelper is running\n\n if(!_spotify.Connect())\n return; //We need to call Connect before fetching infos, this will handle Auth stuff\n\n StatusResponse status = _spotify.GetStatus(); //status contains infos\n}", + "title": "First steps" + }, + { + "location": "/SpotifyLocalAPI/#configuration", + "text": "Different spotify versions often require different configuration. Some versions run their web-helper on port 4371 , others on 4381 . Also, some use https , and others use http . You can use SpotifyLocalAPIConfig to configure the API: _spotify = new SpotifyLocalAPI(new SpotifyLocalAPIConfig\n{\n Port = 4371,\n HostUrl = https://127.0.0.1 \n});", + "title": "Configuration" + }, + { + "location": "/SpotifyLocalAPI/#anti-virus-blocking-response", + "text": "Some Anti-Virus Software blocks the response from spotify due wrong headers.\nCurrently, it's confirmed for AVG's LinkScanner and Bitdefender.\nAdding http://SpotifyAPI.spotilocal.com:4380 to the URL-Exceptions seems to fix it for most users.\nMore infos can be found here", + "title": "Anti-Virus Blocking Response" + }, + { + "location": "/SpotifyLocalAPI/#client-status", + "text": "Calling _spotify.GetStatus() after connecting returns the following StatusResponse : public int Version { get; set; }\n\npublic string ClientVersion { get; set; }\n\npublic bool Playing { get; set; }\n\npublic bool Shuffle { get; set; }\n\npublic bool Repeat { get; set; }\n\npublic bool PlayEnabled { get; set; }\n\npublic bool PrevEnabled { get; set; }\n\npublic bool NextEnabled { get; set; }\n\npublic Track Track { get; set; }\n\npublic double PlayingPosition { get; set; }\n\npublic int ServerTime { get; set; }\n\npublic double Volume { get; set; }\n\npublic bool Online { get; set; }\n\npublic bool Running { get; set; } Most of the properties are self-explanatory, some notes: Shuffle and Repeat currently always return false", + "title": "Client Status" + }, + { + "location": "/SpotifyLocalAPI/#current-track", + "text": "The current Track can be fetched via _spotify.GetStatus().Track and contains following properties/methods: TrackResource - SpotifyResource which contains Track Name and Uri AlbumResource - SpotifyResource which contains Album Name and Uri ArtistResource - SpotifyResource which contains Artist Name and Uri (Only the main artist will be listed) IsAd() will check whether the current track is an AD Various methods for getting the album art: string GetAlbumArtUrl(AlbumArtSize size) Task Bitmap GetAlbumArtAsync(AlbumArtSize size) Bitmap GetAlbumArt(AlbumArtSize size) Task byte[] GetAlbumArtAsByteArrayAsync(AlbumArtSize size) byte[] GetAlbumArtAsByteArray(AlbumArtSize size)", + "title": "Current Track" + }, + { + "location": "/SpotifyLocalAPI/#events", + "text": "To receive events, make sure you listen for them _spotify.ListenForEvents = true; \nYou can set a SynchronizingObject , then the events will be called on the specific context Following events can be overriden: OnPlayStateChange - triggers when the player changes from play to pause and vice versa OnTrackChange - triggers when a new track will be played OnTrackTimeChange - triggers when a track is playing and track-time changes OnVolumeChange - triggeres when the internal volume of spotify changes", + "title": "Events" + }, + { + "location": "/SpotifyLocalAPI/#methods", + "text": "Furthermore, following methods are available: void Mute() - will mute the Spotify client via WindowsAPI void UnMute() - will unmute the Spotify client via WindowsAPI bool IsSpotifyMuted() - will return wether the Spotify client is muted void SetSpotifyVolume(float volume = 100) - sets the windows volume of spotify (0 - 100) float GetSpotifyVolume() - returns the windows volume of spotify (0 - 100) void Pause() - will pause spotify's playback void Play() - will resume spotify's playback void PlayURL(string uri, string context = \"\") - will play a spotify URI (track/album/playlist) in the specifc context (can be a album/playlist URI) void Skip() - will skip the track via an emulated media key void Previous() - will play the previous track via an emulated media key bool IsSpotifyRunning() - returns true if a spotify client instance is running, false if not bool IsSpotifyWebHelperRunning() - returns true if a spotify web-helper instance is running, false if not void RunSpotify() - will attempt to start a Spotify instance void RunSpotifyWebHelper() - will attempt to start a Spotify web-helper instance", + "title": "Methods" + } + ] +} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 00000000..58869f1f --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,108 @@ + + + + + + / + 2017-10-27 + daily + + + + + + + /SpotifyWebAPI/gettingstarted/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/examples/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/auth/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/albums/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/artists/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/browse/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/follow/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/library/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/player/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/playlists/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/profiles/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/search/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/tracks/ + 2017-10-27 + daily + + + + /SpotifyWebAPI/util/ + 2017-10-27 + daily + + + + + + + /SpotifyLocalAPI/ + 2017-10-27 + daily + + + + \ No newline at end of file