24 Commits

Author SHA1 Message Date
swcs da892067ad resolve conflicts; make GetAccessCode obsolete 2013-10-26 13:16:35 +02:00
swcs 3992a988fc Merge branch 'master' of github.com:ScottIsAFool/PocketSharp into ScottIsAFool-master 2013-10-26 13:05:14 +02:00
ScottIsAFool 2a98cfb0e4 Added new method to return username too 2013-10-25 15:49:47 +01:00
swcs 3057612872 update contributors 2013-10-25 15:22:13 +02:00
swcs 56180b5829 update contributors 2013-10-25 15:21:26 +02:00
swcs 2a08adef45 update version 2013-10-25 15:19:42 +02:00
swcs abfb9f6d78 remove unused using 2013-10-25 15:05:47 +02:00
swcs a1f6637e9d retrieve API usage limits; rename Statistics() to GetUserStatistics(); 2013-10-25 00:52:29 +02:00
swcs 8bce874504 Merge branch 'ScottIsAFool-master' 2013-10-25 00:05:46 +02:00
swcs 50ee8905c5 add PORTABLE constant to SgmlReader 2013-10-25 00:05:42 +02:00
swcs 4d2650072f Merge branch 'master' of github.com:ScottIsAFool/PocketSharp into ScottIsAFool-master 2013-10-24 22:40:18 +02:00
ScottIsAFool 65e31ac2e2 Missed files for propertychanged 2013-10-24 21:37:52 +01:00
swcs 456c4f17f2 Merge branch 'master' of github.com:ScottIsAFool/PocketSharp into ScottIsAFool-master 2013-10-24 21:55:40 +02:00
ScottIsAFool ee1e32b9ab Added Fody/PropertyChanged 2013-10-24 18:44:22 +01:00
swcs 9d677eea5a Merge pull request #7 from ScottIsAFool/master
Made CallbackUri public
2013-10-24 00:44:11 -07:00
ScottIsAFool 64098518fa Made CallbackUri public 2013-10-24 06:52:09 +01:00
swcs cc6aab227d Update README.md 2013-10-23 20:27:19 +02:00
swcs 543b3e8191 Update README.md 2013-10-23 20:26:40 +02:00
swcs 2186561fd8 update readme 2013-10-22 21:46:55 +02:00
swcs 8650883975 Merge branch 'master' of github.com:ceee/PocketSharp 2013-10-22 21:46:35 +02:00
swcs 6ede86c367 allow PocketSharp to be used in .NET 4.0 2013-10-22 21:46:24 +02:00
swcs d373bdd9bf Update README.md 2013-10-21 22:12:53 +02:00
swcs b4ae55d8ab update assembly information 2013-10-20 22:20:37 +02:00
swcs aae43cf00d bump version; update docs 2013-10-19 16:40:14 +02:00
42 changed files with 414 additions and 123 deletions
+18
View File
@@ -1,3 +1,21 @@
### 2.2.0 (2013-10-26)
- Made `GetAccessCode` obsolete
- Return username after authentication with `GetUser` (thanks to [ScottIsAFool](https://github.com/ScottIsAFool))
### 2.1.0 (2013-10-25)
- Rename `Statistics()` to `GetUserStatistics()`
- Made `CallbackUri` public (thanks to [ScottIsAFool](https://github.com/ScottIsAFool))
- Added Fody/PropertyChanged (thanks to [ScottIsAFool](https://github.com/ScottIsAFool))
- Method `GetUsageLimits()` to retrieve API usage limits
- Add PORTABLE constant to SgmlReader
### 2.0.1 (2013-10-19)
- Catch HttpRequestExceptions and provide as InnerException for PocketException
- Read Article from URI (method overload)
### 2.0.0 (2013-10-17) ### 2.0.0 (2013-10-17)
- Add Reader API _(does not use the official Article View API, which is private. The PocketReader is based on a custom PCL port of NReadability and SgmlReader)_ - Add Reader API _(does not use the official Article View API, which is private. The PocketReader is based on a custom PCL port of NReadability and SgmlReader)_
+9
View File
@@ -151,5 +151,14 @@ namespace PocketSharp.Tests
Assert.True(statistics.CountAll > 0); Assert.True(statistics.CountAll > 0);
} }
[Fact]
public async Task AreLimitsRetrieved()
{
PocketLimits limits = await client.GetUsageLimits();
Assert.True(limits.RateLimitForConsumerKey > 9999);
}
} }
} }
+2 -1
View File
@@ -33,7 +33,7 @@
<p class="app-description"> <p class="app-description">
PocketSharp is a C#.NET class library, that integrates the Pocket API v3 PocketSharp is a C#.NET class library, that integrates the Pocket API v3
<br><br> <br><br>
Current version: <b>2.0.0</b><br> Current version: <b>2.0.1</b><br>
<a href="https://www.nuget.org/packages/PocketSharp/">@ nuget</a> <a href="https://www.nuget.org/packages/PocketSharp/">@ nuget</a>
</p> </p>
<div class="app-nuget"> <div class="app-nuget">
@@ -126,6 +126,7 @@ using PocketSharp.Models;</code></pre>
<h2>Release History</h2> <h2>Release History</h2>
<ul> <ul>
<li><b>2.0.1</b> (2013-10-19) Catch HttpRequestExceptions and provide as InnerException for PocketException + Read Article from URI (method overload)</li>
<li><b>2.0.0</b> (2013-10-17) Add Reader API</li> <li><b>2.0.0</b> (2013-10-17) Add Reader API</li>
<li><b>1.5.1</b> (2013-09-30) <code>RetrieveFilter.All</code> didn't work; improve search speed</li> <li><b>1.5.1</b> (2013-09-30) <code>RetrieveFilter.All</code> didn't work; improve search speed</li>
<li><b>1.5.0</b> (2013-09-28) add statistics and registration API</li> <li><b>1.5.0</b> (2013-09-28) add statistics and registration API</li>
+1
View File
@@ -48,6 +48,7 @@ Global
{817200C3-A327-4E35-9B5F-63A51C088577}.Release|x86.ActiveCfg = Release|Any CPU {817200C3-A327-4E35-9B5F-63A51C088577}.Release|x86.ActiveCfg = Release|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.Build.0 = Debug|Any CPU {775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|ARM.ActiveCfg = Debug|Any CPU {775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|ARM.ActiveCfg = Debug|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|x86.ActiveCfg = Debug|Any CPU {775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Debug|x86.ActiveCfg = Debug|Any CPU
{775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {775569C2-987F-4AC4-8BA5-A315A21ED1B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+22 -7
View File
@@ -65,36 +65,51 @@ namespace PocketSharp
/// <summary> /// <summary>
/// Requests the access code after authentication /// Requests the access code after authentication
/// The access code has to permanently be stored within the users session, and should be added as a parameter for all future PocketClient initializations. /// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations.
/// </summary> /// </summary>
/// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param> /// <param name="requestCode">The requestCode. If no requestCode is supplied, the property from the PocketClient intialization is used.</param>
/// <returns>The permanent access code, which is used to authenticate the user with the application</returns> /// <returns>The permanent access code, which is used to authenticate the user with the application</returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception> /// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
[Obsolete("Please use GetUser instead")]
public async Task<string> GetAccessCode(string requestCode = null) public async Task<string> GetAccessCode(string requestCode = null)
{
await GetUser(requestCode);
return AccessCode;
}
/// <summary>
/// Requests the access code and username after authentication
/// The access code has to permanently be stored within the users session, and should be passed in the constructor for all future PocketClient initializations.
/// </summary>
/// <param name="requestCode">The request code.</param>
/// <returns>The authenticated user</returns>
/// <exception cref="System.NullReferenceException">Call GetRequestCode() first to receive a request_code</exception>
public async Task<PocketUser> GetUser(string requestCode = null)
{ {
// check if request code is available // check if request code is available
if(RequestCode == null && requestCode == null) if (RequestCode == null && requestCode == null)
{ {
throw new NullReferenceException("Call GetRequestCode() first to receive a request_code"); throw new NullReferenceException("Call GetRequestCode() first to receive a request_code");
} }
// override property with given param if available // override property with given param if available
if(requestCode != null) if (requestCode != null)
{ {
RequestCode = requestCode; RequestCode = requestCode;
} }
// do request // do request
AccessCode response = await Request<AccessCode>("oauth/authorize", new Dictionary<string, string>() PocketUser response = await Request<PocketUser>("oauth/authorize", new Dictionary<string, string>()
{ {
{ "code", RequestCode } {"code", RequestCode}
}, false); }, false);
// save code to client // save code to client
AccessCode = response.Code; AccessCode = response.Code;
return AccessCode; return response;
} }
+16 -7
View File
@@ -11,13 +11,22 @@ namespace PocketSharp
/// </summary> /// </summary>
public partial class PocketClient public partial class PocketClient
{ {
/// <summary> /// <summary>
/// Retrieves items from pocket /// Retrieves items from pocket
/// with the given filters /// with the given filters
/// </summary> /// </summary>
/// <param name="parameters">parameters, which are mapped to the officials from http://getpocket.com/developer/docs/v3/retrieve </param> /// <param name="state">The state.</param>
/// <returns></returns> /// <param name="favorite">The favorite.</param>
/// <exception cref="PocketException"></exception> /// <param name="tag">The tag.</param>
/// <param name="contentType">Type of the content.</param>
/// <param name="sort">The sort.</param>
/// <param name="search">The search.</param>
/// <param name="domain">The domain.</param>
/// <param name="since">The since.</param>
/// <param name="count">The count.</param>
/// <param name="offset">The offset.</param>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<List<PocketItem>> Get( public async Task<List<PocketItem>> Get(
State? state = null, State? state = null,
bool? favorite = null, bool? favorite = null,
-1
View File
@@ -1,5 +1,4 @@
using PocketSharp.Models; using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
namespace PocketSharp namespace PocketSharp
-2
View File
@@ -1,7 +1,5 @@
using PocketSharp.Models; using PocketSharp.Models;
using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Linq;
namespace PocketSharp namespace PocketSharp
{ {
+42 -1
View File
@@ -14,9 +14,50 @@ namespace PocketSharp
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
/// <exception cref="PocketException"></exception> /// <exception cref="PocketException"></exception>
public async Task<PocketStatistics> Statistics() public async Task<PocketStatistics> GetUserStatistics()
{ {
return await Request<PocketStatistics>("stats"); return await Request<PocketStatistics>("stats");
} }
/// <summary>
/// Statistics from the user account.
/// </summary>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
[Obsolete("Please use GetUserStatistics instead")]
public async Task<PocketStatistics> Statistics()
{
return await GetUserStatistics();
}
/// <summary>
/// Returns API usage statistics.
/// If a request was made before, the data is returned synchronously from the cache.
/// Note: This method only works for authenticated users with a given AccessCode.
/// </summary>
/// <returns></returns>
/// <exception cref="PocketException"></exception>
public async Task<PocketLimits> GetUsageLimits()
{
string rateLimitForConsumerKey = TryGetHeaderValue(lastHeaders, "X-Limit-Key-Limit");
if (rateLimitForConsumerKey == null)
{
// this is the fastest way to do a non-failing request to receive the correct headers
await Get(count: 1);
}
return new PocketLimits()
{
RateLimitForConsumerKey = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-Key-Limit")),
RemainingCallsForConsumerKey = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-Key-Remaining")),
SecondsUntilLimitResetsForConsumerKey = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-Key-Reset")),
RateLimitForUser = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-User-Limit")),
RemainingCallsForUser = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-User-Remaining")),
SecondsUntilLimitResetsForUser = Convert.ToInt32(TryGetHeaderValue(lastHeaders, "X-Limit-User-Reset"))
};
}
} }
} }
+89
View File
@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Choose>
<When Condition="$(NCrunchOriginalSolutionDir) != '' And $(NCrunchOriginalSolutionDir) != '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(NCrunchOriginalSolutionDir)</FodySolutionDir>
</PropertyGroup>
</When>
<When Condition="$(SolutionDir) != '' And $(SolutionDir) != '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(SolutionDir)</FodySolutionDir>
</PropertyGroup>
</When>
<When Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">
<PropertyGroup>
<FodySolutionDir>$(MSBuildProjectDirectory)\..\</FodySolutionDir>
</PropertyGroup>
</When>
</Choose>
<Choose>
<When Condition="$(KeyOriginatorFile) != '' And $(KeyOriginatorFile) != '*Undefined*'">
<PropertyGroup>
<FodyKeyFilePath>$(KeyOriginatorFile)</FodyKeyFilePath>
</PropertyGroup>
</When>
<When Condition="$(AssemblyOriginatorKeyFile) != '' And $(AssemblyOriginatorKeyFile) != '*Undefined*'">
<PropertyGroup>
<FodyKeyFilePath>$(AssemblyOriginatorKeyFile)</FodyKeyFilePath>
</PropertyGroup>
</When>
<Otherwise >
<PropertyGroup>
<FodyKeyFilePath></FodyKeyFilePath>
</PropertyGroup>
</Otherwise>
</Choose>
<PropertyGroup>
<IntermediateDir>$(ProjectDir)$(IntermediateOutputPath)</IntermediateDir>
<FodyMessageImportance Condition="$(FodyMessageImportance) == '' Or $(FodyMessageImportance) == '*Undefined*'">Low</FodyMessageImportance>
<FodySignAssembly Condition="$(FodySignAssembly) == '' Or $(FodySignAssembly) == '*Undefined*'">$(SignAssembly)</FodySignAssembly>
<FodyPath Condition="$(FodyPath) == '' Or $(FodyPath) == '*Undefined*'">$(MSBuildThisFileDirectory)</FodyPath>
</PropertyGroup>
<UsingTask
TaskName="Fody.WeavingTask"
AssemblyFile="$(FodyPath)\Fody.dll" />
<Target
AfterTargets="AfterCompile"
Name="WinFodyTarget"
Condition=" '$(OS)' == 'Windows_NT'">
<Fody.WeavingTask
AssemblyPath="@(IntermediateAssembly)"
IntermediateDir="$(IntermediateDir)"
KeyFilePath="$(FodyKeyFilePath)"
MessageImportance="$(FodyMessageImportance)"
ProjectDirectory="$(ProjectDir)"
SolutionDir="$(FodySolutionDir)"
References="@(ReferencePath)"
SignAssembly="$(FodySignAssembly)"
ReferenceCopyLocalPaths="@(ReferenceCopyLocalPaths)"
DefineConstants="$(DefineConstants)"
/>
</Target>
<Target
AfterTargets="AfterBuild"
Name="NonWinFodyTarget"
Condition=" '$(OS)' != 'Windows_NT'">
<Fody.WeavingTask
AssemblyPath="$(TargetPath)"
IntermediateDir="$(IntermediateDir)"
KeyFilePath="$(FodyKeyFilePath)"
MessageImportance="$(FodyMessageImportance)"
ProjectDirectory="$(ProjectDir)"
SolutionDir="$(FodySolutionDir)"
References="@(ReferencePath)"
SignAssembly="$(FodySignAssembly)"
ReferenceCopyLocalPaths="$(ReferenceCopyLocalPaths)"
DefineConstants="$(DefineConstants)"
/>
</Target>
<!--Support for ncrunch-->
<ItemGroup>
<None Include="$(FodyPath)\*.*" />
</ItemGroup>
</Project>
+4
View File
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<Weavers>
<PropertyChanged />
</Weavers>
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using System;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization; using System.Runtime.Serialization;
@@ -1,8 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Linq;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -4,7 +4,6 @@ using System.Reflection;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Linq; using System.Linq;
using System.Collections; using System.Collections;
using Newtonsoft.Json;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -1,8 +1,4 @@
using System; using System.Runtime.Serialization;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;
using System.Linq;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -1,6 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization; using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
+2 -3
View File
@@ -1,13 +1,12 @@
using System; using System;
using System.Collections.Generic; using PropertyChanged;
using System.Linq;
using System.Text;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
/// <summary> /// <summary>
/// Readable article /// Readable article
/// </summary> /// </summary>
[ImplementPropertyChanged]
public class PocketArticle public class PocketArticle
{ {
/// <summary> /// <summary>
+2 -1
View File
@@ -1,6 +1,6 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -8,6 +8,7 @@ namespace PocketSharp.Models
/// Author /// Author
/// </summary> /// </summary>
[JsonObject] [JsonObject]
[ImplementPropertyChanged]
public class PocketAuthor public class PocketAuthor
{ {
/// <summary> /// <summary>
+2 -1
View File
@@ -1,6 +1,6 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -8,6 +8,7 @@ namespace PocketSharp.Models
/// Image /// Image
/// </summary> /// </summary>
[JsonObject] [JsonObject]
[ImplementPropertyChanged]
public class PocketImage public class PocketImage
{ {
/// <summary> /// <summary>
+2 -1
View File
@@ -1,7 +1,7 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -10,6 +10,7 @@ namespace PocketSharp.Models
/// see: http://getpocket.com/developer/docs/v3/retrieve /// see: http://getpocket.com/developer/docs/v3/retrieve
/// </summary> /// </summary>
[JsonObject] [JsonObject]
[ImplementPropertyChanged]
public class PocketItem public class PocketItem
{ {
/// <summary> /// <summary>
+67
View File
@@ -0,0 +1,67 @@
using Newtonsoft.Json;
using PropertyChanged;
namespace PocketSharp.Models
{
/// <summary>
/// API Limitation Statistics
/// </summary>
[JsonObject]
[ImplementPropertyChanged]
public class PocketLimits
{
/// <summary>
/// Gets or sets the rate limit.
/// </summary>
/// <value>
/// Rate limit for current consumer key.
/// </value>
[JsonProperty("X-Limit-Key-Limit")]
public int RateLimitForConsumerKey { get; set; }
/// <summary>
/// Gets or sets the remaining calls.
/// </summary>
/// <value>
/// Remaining calls for current consumer key.
/// </value>
[JsonProperty("X-Limit-Key-Remaining")]
public int RemainingCallsForConsumerKey { get; set; }
/// <summary>
/// Gets or sets the reset seconds.
/// </summary>
/// <value>
/// Seconds until limit resets for current consumer key.
/// </value>
[JsonProperty("X-Limit-Key-Reset")]
public int SecondsUntilLimitResetsForConsumerKey { get; set; }
/// <summary>
/// Gets or sets the rate limit.
/// </summary>
/// <value>
/// Rate limit for current user.
/// </value>
[JsonProperty("X-Limit-User-Limit")]
public int RateLimitForUser { get; set; }
/// <summary>
/// Gets or sets the remaining calls.
/// </summary>
/// <value>
/// Remaining calls for current user.
/// </value>
[JsonProperty("X-Limit-User-Remaining")]
public int RemainingCallsForUser { get; set; }
/// <summary>
/// Gets or sets the reset seconds.
/// </summary>
/// <value>
/// Seconds until limit resets for current user.
/// </value>
[JsonProperty("X-Limit-User-Reset")]
public int SecondsUntilLimitResetsForUser { get; set; }
}
}
+2 -1
View File
@@ -1,5 +1,5 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -7,6 +7,7 @@ namespace PocketSharp.Models
/// Statistics /// Statistics
/// </summary> /// </summary>
[JsonObject] [JsonObject]
[ImplementPropertyChanged]
public class PocketStatistics public class PocketStatistics
{ {
/// <summary> /// <summary>
+15 -14
View File
@@ -1,21 +1,22 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
/// <summary>
/// Tag
/// </summary>
[JsonObject]
public class PocketTag
{
/// <summary> /// <summary>
/// Gets or sets the name. /// Tag
/// </summary> /// </summary>
/// <value> [JsonObject]
/// The name. [ImplementPropertyChanged]
/// </value> public class PocketTag
[JsonProperty("tag")] {
public string Name { get; set; } /// <summary>
} /// Gets or sets the name.
/// </summary>
/// <value>
/// The name.
/// </value>
[JsonProperty("tag")]
public string Name { get; set; }
}
} }
@@ -1,5 +1,5 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -7,7 +7,8 @@ namespace PocketSharp.Models
/// Access Code /// Access Code
/// </summary> /// </summary>
[JsonObject] [JsonObject]
internal class AccessCode [ImplementPropertyChanged]
public class PocketUser
{ {
/// <summary> /// <summary>
/// Gets or sets the code. /// Gets or sets the code.
@@ -24,7 +25,7 @@ namespace PocketSharp.Models
/// <value> /// <value>
/// The username. /// The username.
/// </value> /// </value>
[JsonProperty] [JsonProperty("username")]
public string Username { get; set; } public string Username { get; set; }
} }
} }
+31 -30
View File
@@ -1,40 +1,41 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System; using System;
using System.Runtime.Serialization; using PropertyChanged;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
/// <summary>
/// Video
/// </summary>
[JsonObject]
public class PocketVideo
{
/// <summary> /// <summary>
/// Gets or sets the ID. /// Video
/// </summary> /// </summary>
/// <value> [JsonObject]
/// The ID. [ImplementPropertyChanged]
/// </value> public class PocketVideo
[JsonProperty("video_id")] {
public string ID { get; set; } /// <summary>
/// Gets or sets the ID.
/// </summary>
/// <value>
/// The ID.
/// </value>
[JsonProperty("video_id")]
public string ID { get; set; }
/// <summary> /// <summary>
/// Gets or sets the external ID. /// Gets or sets the external ID.
/// </summary> /// </summary>
/// <value> /// <value>
/// The external ID. /// The external ID.
/// </value> /// </value>
[JsonProperty("vid")] [JsonProperty("vid")]
public string ExternalID { get; set; } public string ExternalID { get; set; }
/// <summary> /// <summary>
/// Gets or sets the URI. /// Gets or sets the URI.
/// </summary> /// </summary>
/// <value> /// <value>
/// The URI. /// The URI.
/// </value> /// </value>
[JsonProperty("src")] [JsonProperty("src")]
public Uri Uri { get; set; } public Uri Uri { get; set; }
} }
} }
-1
View File
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
-1
View File
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
@@ -1,5 +1,4 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
-1
View File
@@ -1,6 +1,5 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization;
namespace PocketSharp.Models namespace PocketSharp.Models
{ {
+16 -3
View File
@@ -5,9 +5,7 @@ using System.Net;
using System.Net.Http; using System.Net.Http;
using System.Threading.Tasks; using System.Threading.Tasks;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json.Serialization; using Newtonsoft.Json.Serialization;
using System.Diagnostics;
using System.Net.Http.Headers; using System.Net.Http.Headers;
namespace PocketSharp namespace PocketSharp
@@ -22,6 +20,11 @@ namespace PocketSharp
/// </summary> /// </summary>
protected readonly HttpClient _restClient; protected readonly HttpClient _restClient;
/// <summary>
/// Caches HTTP headers from last response
/// </summary>
private HttpResponseHeaders lastHeaders;
/// <summary> /// <summary>
/// The base URL for the Pocket API /// The base URL for the Pocket API
/// </summary> /// </summary>
@@ -35,7 +38,7 @@ namespace PocketSharp
/// <summary> /// <summary>
/// callback URL for API calls /// callback URL for API calls
/// </summary> /// </summary>
protected string CallbackUri { get; set; } public string CallbackUri { get; set; }
/// <summary> /// <summary>
/// Accessor for the Pocket API key /// Accessor for the Pocket API key
@@ -54,6 +57,7 @@ namespace PocketSharp
public string AccessCode { get; set; } public string AccessCode { get; set; }
/// <summary> /// <summary>
/// Initializes a new instance of the <see cref="PocketClient"/> class. /// Initializes a new instance of the <see cref="PocketClient"/> class.
/// </summary> /// </summary>
@@ -144,6 +148,9 @@ namespace PocketSharp
// validate HTTP response // validate HTTP response
ValidateResponse(response); ValidateResponse(response);
// cache headers
lastHeaders = response.Headers;
// read response // read response
var responseString = await response.Content.ReadAsStringAsync(); var responseString = await response.Content.ReadAsStringAsync();
@@ -267,6 +274,11 @@ namespace PocketSharp
{ {
string result = null; string result = null;
if (headers == null || String.IsNullOrEmpty(key))
{
return null;
}
foreach (var header in headers) foreach (var header in headers)
{ {
if (header.Key == key) if (header.Key == key)
@@ -275,6 +287,7 @@ namespace PocketSharp
headerEnumerator.MoveNext(); headerEnumerator.MoveNext();
result = headerEnumerator.Current; result = headerEnumerator.Current;
break;
} }
} }
+1 -1
View File
@@ -37,7 +37,7 @@ namespace PocketSharp
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip,deflate"); _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip,deflate");
// add user agent (default for Opera with PocketSharp identifier appended) // add user agent (default for Opera with PocketSharp identifier appended)
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.4 Safari/537.36 OPR/18.0.1284.2 PocketSharp/2.0"); _httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.4 Safari/537.36 OPR/18.0.1284.2 PocketSharp/2.2");
} }
+13 -2
View File
@@ -11,11 +11,12 @@
<RootNamespace>PocketSharp</RootNamespace> <RootNamespace>PocketSharp</RootNamespace>
<AssemblyName>PocketSharp</AssemblyName> <AssemblyName>PocketSharp</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile104</TargetFrameworkProfile> <TargetFrameworkProfile>Profile96</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir> <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
<RestorePackages>true</RestorePackages> <RestorePackages>true</RestorePackages>
<FodyPath>..\packages\Fody.1.17.4.0</FodyPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols> <DebugSymbols>true</DebugSymbols>
@@ -36,12 +37,14 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!-- A reference to the entire .NET Framework is automatically included --> <!-- A reference to the entire .NET Framework is automatically included -->
<None Include="Fody.targets" />
<None Include="packages.config" /> <None Include="packages.config" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Components\Statistics.cs" /> <Compile Include="Components\Statistics.cs" />
<Compile Include="Models\Parameters\RegisterParameters.cs" /> <Compile Include="Models\Parameters\RegisterParameters.cs" />
<Compile Include="Models\PocketArticle.cs" /> <Compile Include="Models\PocketArticle.cs" />
<Compile Include="Models\PocketLimits.cs" />
<Compile Include="Models\PocketStatistics.cs" /> <Compile Include="Models\PocketStatistics.cs" />
<Compile Include="Utilities\PocketException.cs" /> <Compile Include="Utilities\PocketException.cs" />
<Compile Include="Components\Add.cs" /> <Compile Include="Components\Add.cs" />
@@ -60,7 +63,7 @@
<Compile Include="Models\PocketItem.cs" /> <Compile Include="Models\PocketItem.cs" />
<Compile Include="Models\PocketTag.cs" /> <Compile Include="Models\PocketTag.cs" />
<Compile Include="Models\PocketVideo.cs" /> <Compile Include="Models\PocketVideo.cs" />
<Compile Include="Models\Response\AccessCode.cs" /> <Compile Include="Models\PocketUser.cs" />
<Compile Include="Models\Response\Add.cs" /> <Compile Include="Models\Response\Add.cs" />
<Compile Include="Models\Response\Modify.cs" /> <Compile Include="Models\Response\Modify.cs" />
<Compile Include="Models\Response\RequestCode.cs" /> <Compile Include="Models\Response\RequestCode.cs" />
@@ -81,6 +84,10 @@
<Reference Include="Newtonsoft.Json"> <Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath> <HintPath>..\packages\Newtonsoft.Json.5.0.8\lib\portable-net40+sl4+wp7+win8\Newtonsoft.Json.dll</HintPath>
</Reference> </Reference>
<Reference Include="PropertyChanged">
<HintPath>..\packages\PropertyChanged.Fody.1.41.0.0\Lib\portable-net4+sl4+wp7+win8+MonoAndroid16+MonoTouch40\PropertyChanged.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="System.IO"> <Reference Include="System.IO">
<HintPath>..\packages\Microsoft.Bcl.1.1.3\lib\portable-net40+sl4+win8+wp71\System.IO.dll</HintPath> <HintPath>..\packages\Microsoft.Bcl.1.1.3\lib\portable-net40+sl4+win8+wp71\System.IO.dll</HintPath>
</Reference> </Reference>
@@ -106,6 +113,9 @@
<Name>NReadability</Name> <Name>NReadability</Name>
</ProjectReference> </ProjectReference>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="FodyWeavers.xml" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\Portable\$(TargetFrameworkVersion)\Microsoft.Portable.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" /> <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
@@ -119,6 +129,7 @@
<Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" /> <Error Condition="!Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
<Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" /> <Error Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.10\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
</Target> </Target>
<Import Project="Fody.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild"> <Target Name="BeforeBuild">
+4 -4
View File
@@ -7,11 +7,11 @@ using System.Runtime.InteropServices;
// set of attributes. Change these attribute values to modify the information // set of attributes. Change these attribute values to modify the information
// associated with an assembly. // associated with an assembly.
[assembly: AssemblyTitle("PocketSharp")] [assembly: AssemblyTitle("PocketSharp")]
[assembly: AssemblyDescription("PocketSharp is a .NET class library that integrates the Pocket API v3")] [assembly: AssemblyDescription("PocketSharp is a .NET class library that integrates the Pocket API v3 (support a custom Article View API)")]
[assembly: AssemblyConfiguration("")] [assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("cee")] [assembly: AssemblyCompany("cee")]
[assembly: AssemblyProduct("PocketSharp")] [assembly: AssemblyProduct("PocketSharp")]
[assembly: AssemblyCopyright("Copyright © 2013")] [assembly: AssemblyCopyright("Copyright © cee 2013")]
[assembly: AssemblyTrademark("")] [assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")] [assembly: AssemblyCulture("")]
@@ -25,5 +25,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("2.0.0")] [assembly: AssemblyVersion("2.2.0")]
[assembly: AssemblyFileVersion("2.0.0")] [assembly: AssemblyFileVersion("2.2.0")]
-3
View File
@@ -1,9 +1,6 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
using System; using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PocketSharp namespace PocketSharp
{ {
-1
View File
@@ -1,5 +1,4 @@
using System; using System;
using System.Runtime.Serialization;
namespace PocketSharp namespace PocketSharp
{ {
-1
View File
@@ -1,6 +1,5 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using PocketSharp.Models;
namespace PocketSharp namespace PocketSharp
{ {
+2
View File
@@ -1,8 +1,10 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="Fody" version="1.17.4.0" targetFramework="portable-net403+sl40+wp71+win" />
<package id="Microsoft.Bcl" version="1.1.3" targetFramework="portable-net45+sl40+wp71+win" /> <package id="Microsoft.Bcl" version="1.1.3" targetFramework="portable-net45+sl40+wp71+win" />
<package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="portable-net45+sl40+wp71+win" /> <package id="Microsoft.Bcl.Async" version="1.0.16" targetFramework="portable-net45+sl40+wp71+win" />
<package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="portable-net45+sl40+wp71+win" /> <package id="Microsoft.Bcl.Build" version="1.0.10" targetFramework="portable-net45+sl40+wp71+win" />
<package id="Microsoft.Net.Http" version="2.2.15" targetFramework="portable-net403+sl40+wp71+win" /> <package id="Microsoft.Net.Http" version="2.2.15" targetFramework="portable-net403+sl40+wp71+win" />
<package id="Newtonsoft.Json" version="5.0.8" targetFramework="portable-net45+sl40+wp71+win" /> <package id="Newtonsoft.Json" version="5.0.8" targetFramework="portable-net45+sl40+wp71+win" />
<package id="PropertyChanged.Fody" version="1.41.0.0" targetFramework="portable-net403+sl40+wp71+win" />
</packages> </packages>
@@ -11,7 +11,7 @@
<RootNamespace>PocketSharp.Ports.NReadability</RootNamespace> <RootNamespace>PocketSharp.Ports.NReadability</RootNamespace>
<AssemblyName>PocketSharp.Ports.NReadability</AssemblyName> <AssemblyName>PocketSharp.Ports.NReadability</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile104</TargetFrameworkProfile> <TargetFrameworkProfile>Profile96</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup> </PropertyGroup>
-1
View File
@@ -397,7 +397,6 @@ namespace PocketSharp.Ports.Sgml
private string m_rootElementName; private string m_rootElementName;
private string m_href; private string m_href;
private string m_errorLogFile;
private Entity m_lastError; private Entity m_lastError;
private string m_proxy; private string m_proxy;
private TextReader m_inputStream; private TextReader m_inputStream;
+2 -2
View File
@@ -11,7 +11,7 @@
<RootNamespace>PocketSharp.Ports.SgmlReader</RootNamespace> <RootNamespace>PocketSharp.Ports.SgmlReader</RootNamespace>
<AssemblyName>PocketSharp.Ports.SgmlReader</AssemblyName> <AssemblyName>PocketSharp.Ports.SgmlReader</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkProfile>Profile104</TargetFrameworkProfile> <TargetFrameworkProfile>Profile96</TargetFrameworkProfile>
<FileAlignment>512</FileAlignment> <FileAlignment>512</FileAlignment>
<ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
</PropertyGroup> </PropertyGroup>
@@ -20,7 +20,7 @@
<DebugType>full</DebugType> <DebugType>full</DebugType>
<Optimize>false</Optimize> <Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath> <OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants> <DefineConstants>TRACE;DEBUG;PORTABLE</DefineConstants>
<ErrorReport>prompt</ErrorReport> <ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel> <WarningLevel>4</WarningLevel>
</PropertyGroup> </PropertyGroup>
+43 -13
View File
@@ -1,13 +1,8 @@
![PocketSharp](https://raw.github.com/ceee/PocketSharp/master/PocketSharp.Website/Assets/Images/github-header.png) ![PocketSharp](https://raw.github.com/ceee/PocketSharp/master/PocketSharp.Website/Assets/Images/github-header.png)
**PocketSharp** is a C#.NET class library, that integrates the [Pocket API v3](http://getpocket.com/developer). **PocketSharp** is a C#.NET portable class library that integrates the [Pocket API v3](http://getpocket.com/developer).
**Website:** [pocketsharp.frontendplay.com](http://pocketsharp.frontendplay.com/) ## Install using [NuGet](https://www.nuget.org/packages/PocketSharp/)
<br>
**NuGet:** [nuget.org/packages/PocketSharp](https://www.nuget.org/packages/PocketSharp/)
## Install using NuGet
``` ```
Install-Package PocketSharp Install-Package PocketSharp
@@ -15,31 +10,66 @@ Install-Package PocketSharp
## Documentation ## Documentation
See [wiki](https://github.com/ceee/PocketSharp/wiki) or [website](http://pocketsharp.frontendplay.com/). See [wiki](https://github.com/ceee/PocketSharp/wiki)
---
## Usage Example:
A search for items containing `CSS`:
```csharp
PocketClient client = new PocketClient("[YOUR_CONSUMER_KEY]", "[YOUR_ACCESS_CODE]");
List<PocketItem> items = await client.Search("css");
items.ForEach(
item => Debug.WriteLine(item.ID + " | " + item.Title)
);
```
Which will output:
330361896 | CSS Front-end Frameworks with comparison : By usabli.ca
345541438 | Editr - HTML, CSS, JavaScript playground
251743431 | CSS Architecture
343693149 | CSS3 Transitions - Thank God We Have A Specification!
...
---
## Supported platforms ## Supported platforms
PocketSharp is a **Portable Class Library** (since 1.0.0), therefore it's compatible with multiple platforms: PocketSharp is a **Portable Class Library** (since 1.0.0), therefore it's compatible with multiple platforms:
- **.NET** >= 4.0.3 (including WPF) - **.NET** >= 4.5 (including WPF)
- **Silverlight** >= 4 - **Silverlight** >= 4
- **Windows Phone** >= 7.5 - **Windows Phone** >= 7.5
- **Windows Store** - **Windows Store**
You can find examples for Silverlight 5, WP8 and WPF in the `PocketSharp.Examples` ([@github](https://github.com/ceee/PocketSharp/tree/master/PocketSharp.Examples)) folder. You can find examples for Silverlight 5, WP8 and WPF in the `PocketSharp.Examples` ([@github](https://github.com/ceee/PocketSharp/tree/master/PocketSharp.Examples)) folder.
--- ## What's next?
- `cancellationToken` support for all methods
## Dependencies ## Dependencies
- [Microsoft.Bcl.Async](https://www.nuget.org/packages/Microsoft.Bcl.Async/) - [Microsoft.Bcl.Async](https://www.nuget.org/packages/Microsoft.Bcl.Async/)
- [Microsoft.Net.Http](https://www.nuget.org/packages/Microsoft.Net.Http/) - [Microsoft.Net.Http](https://www.nuget.org/packages/Microsoft.Net.Http/)
- [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/) - [Newtonsoft.Json](https://www.nuget.org/packages/Newtonsoft.Json/)
- [PropertyChanged.Fody](https://github.com/Fody/PropertyChanged)
## Forked Dependencies
- [NReadability](https://github.com/marek-stoj/NReadability) - converted to a PCL with minor adaptations
- [SgmlReader](https://github.com/MindTouch/SGMLReader) - converted to a PCL
## Contributors ## Contributors
| [![twitter/artistandsocial](http://gravatar.com/avatar/9c61b1f4307425f12f05d3adb930ba66?s=70)](http://twitter.com/artistandsocial "Follow @artistandsocial on Twitter") | | [![ceee](http://gravatar.com/avatar/9c61b1f4307425f12f05d3adb930ba66?s=70)](https://github.com/ceee "Tobias Klika") | [![ScottIsAFool](http://gravatar.com/avatar/6df656872a87b09a7470feb4867ed927?s=70)](https://github.com/ScottIsAFool "Scott Lovegrove") |
|---| |---|---|
| [Tobias Klika @ceee](https://github.com/ceee) | | [ceee](https://github.com/ceee) | [ScottIsAFool](https://github.com/ScottIsAFool) |
## License ## License